Бывало ли так, что вы предложили уникальный подход к решению проблемы и с нетерпением ждали возможности его применить, но натолкнулись на скептицизм?
Эта история о том, что произойдёт, если человек, страстно увлечённый LISP, попадёт в организацию, где на нём не принято писать софт.
Эта история о том, как LISP попал в космос.
На дворе 1988 год. СССР всё ещё существует. Рональд Рейган — президент США. А Рон Гаррет под началом своего научного руководителя работает над прототипом первого марсохода.
Введение
Адам: Привет, это подкаст CoRecursive, я Адам Гордон Белл. Каждый эпизод — это история о создании программного обеспечения.
Бывало ли так, что вы предложили уникальный подход к решению проблемы и с нетерпением ждали возможности его применить, но натолкнулись на скептицизм? Об этом сегодняшняя история. Что произойдёт, если человек, страстно увлечённый определённым подходом, попадёт в организацию, где вещи делают иначе? Сегодняшняя история о том, как LISP попал в космос.
Вы знаете LISP, не так ли? Язык с огромным количеством скобок, макросами и обработкой кода как данных. Мой сегодняшний гость — большой поклонник LISP, Рон Гаррет. На момент начала этой истории он завершает свою докторскую диссертацию в области робототехники и искусственного интеллекта. И искусственный интеллект, о котором идёт речь, не связан с машинным обучением, это ИИ в смысле автономии, например, автономные роботы для беспилотных автомобилей. Итак, мы отправляемся в прошлое.
Прототипы марсоходов
FANG, Futuristic Autonomous Navigation Gizmo.
"На самом деле он был Cybermotion K2A." — Рон
(Предоставлено Роном Гарретом)
На дворе 1988 год. СССР всё ещё существует. Рональд Рейган — президент США, а Рон под началом своего научного руководителя работает над прототипом очень значимого для NASA проекта.
Рон: Меня зовут Рон Гаррет.
Нашей целью было разработать программное обеспечение, которое позволило бы NASA отправить автономный планетоход на Марс. Работа на Марсе сопряжена с множеством трудностей, но одна из них заключается в задержке в 40 минут в оба конца из-за скорости света. По этой причине вы не можете просто дистанционно управлять марсоходом. Задержка во времени слишком, слишком велика. Так что марсоходу требуется определённый уровень автономности, потому что между моментом, когда вы отдаёте ему команду, и моментом, когда вы узнаёте, что он сделал в результате этой команды, проходит 40 минут. Чем больше задач марсоход может выполнить за один цикл команд, тем выше ваша продуктивность. Мы пытались увеличить уровень автономности, чтобы марсоход мог сделать больше за один цикл. Это была наша основная задача.
Адам: Всё это происходило в Лаборатории реактивного движения, JPL (Jet Propulsion Lab) в Лос-Анджелесе, где у Рона было довольно стандартное рабочее место в офисе.
Рон: Но за углом находился магазин электроники, в который я иногда заходил, когда нам нужно было собрать какое-нибудь железо, а в те времена нам часто приходилось собирать свою аппаратуру на заказ. Многие роботы из тех, которые мы собирали, были комнатными, и мы просто запускали их в офисе. Но время от времени мы выходили на улицу, где рядом с лабораторией было высохшее русло реки Арройо-Секо, что буквально означает "сухое русло". Иногда мы ходили туда, чтобы запустить роботов на открытом воздухе, поскольку окружающая среда там очень похожа на ту, что на Марсе. Несколько раз мы даже отправлялись в Долину Смерти, чтобы провести там эксперименты. Это было очень интересно.
Роботы
Tooth.
"Интересный факт: Tooth был построен Коллином Энглом, который впоследствии стал основателем и генеральным директором корпорации iRobot, создавшей робот Roomba." — Рон.
(Предоставлено Роном Гарретом)
Адам: Какого размера были эти роботы?
Рон: Самый маленький из них был примерно с коробку из-под обуви, наверное. Но, собственно, стоит начать с описания робота среднего размера — он был примерно в половину стандартного холодильника, большой и тяжёлый. И если он во что-то врезался, то мог нанести серьёзный ущерб. Поэтому мы называли его FANG, что являлось аббревиатурой от Futuristic Autonomous Navigation Gizmo. А маленький робот размером с коробку из-под обуви мы называли Tooth.
Адам: О, понятно.
Рон: А ещё была пара роботов для улицы. Первый из них был гигантским шестиколёсным чудовищем с шинами от грузовика. Он был размером с внедорожник и назывался Robbie. А также был ряд марсоходов поменьше, которые впоследствии превратились в первый настоящий марсоход — ровер Sojourner. Серия прототипов этого ровера называлась Rocky, существовали Rocky 1, 2, 3 и 4.
Робот Robbie
(Источник: NASA)
Использование LISP
Rocky IV, последний прототип перед полётом Sojourner, сфотографирован в Арройо-Секо неподалёку от JPL.
(Предоставлено Роном Гарретом)
Адам: Sojourner стал первым марсоходом. Сейчас мы знаем, что в 1997 году он высадился на Марс и считается большим успехом. Но за девять лет до этого, в 1988 году, марсоходы были лишь исследовательским проектом. Исследовались возможности, и подход команды Рона и их выбор языка программирования, а именно LISP, были непосредственно связаны с академическими исследованиями, которые они проводили. Однако одна из потенциальных проблем заключалась в том, что использование LISP на самом деле не было принятым в NASA способом создания программного обеспечения.
Рон: К LISP существовала некоторая предвзятость, потому что он был странным и непривычным, и в нём была эта странная технология сборки мусора, которая могла в любой момент остановить ваш процесс на полпути. А это может привести к катастрофе, если вы работаете во встраиваемом окружении, где необходимо реагировать в режиме реального времени. Кроме того, люди считали, что LISP очень требователен к памяти. Но в те дни восемь мегабайт ОЗУ считались огромным объёмом. И были люди, говорившие, мол, вы уверены, что ваши машины для разработки имеют восемь мегабайт, но вы никогда не запустите машины с таким размером ОЗУ в космос. Конечно же, сейчас сотни мегабайт — это норма. И, конечно, это было предсказуемо, потому что космическое оборудование следует закону Мура, как и всё остальное, просто отстаёт на пару лет. Поэтому я находил эти возражения очень раздражающими.
Адам: Понимаю. Бывало, я тоже оказывался тем человеком, который уверен, что у него есть отличный способ решения проблемы, но сталкивается со множеством препятствий при попытке убедить других людей в его эффективности. Однако Рон говорит о работе LISP на встраиваемом железе в роботах. Для этого, я полагаю, действительно нужен какой-то хитрый трюк.
Рон: На более крупных роботах с несколькими мегабайтами ОЗУ мы по сути запускали LISP на роботе. То есть фактический код, управляющий роботом, был написан на LISP. Другой способ использования LISP для маленьких роботов заключался в разработке специфичных языков, предназначенных для программирования роботов, и компиляции этих языков в код встраиваемого железа, который будет работать на небольших процессорах.
Адам: Для внешнего наблюдателя такой подход кажется очень интересным. Можно было бы погрузиться в детали аппаратного обеспечения робота и попытаться написать автономный код на этом уровне. Однако вместо этого Рон повышал уровень абстракции. Он создавал специализированный язык, который позволял наилучшим образом определить проблему, а затем компилировал его в код для фактического аппаратного обеспечения. Это изящный трюк, при котором любая проблема становится проблемой компилятора. Вероятно, это потребовало бы много работы в большинстве языков программирования, но Рон использовал LISP, которым он занимался с середины восьмидесятых годов.
Рон: Помните, тогда не было ни Java, ни Python, ни JavaScript, ни C++. Были Pascal, C, Basic и машинный код, и это по большому счёту полный список популярных языков. И что-либо сделать на любом из этих языков очень и очень сложно. В отличие от них, LISP предоставляет вам все высокоуровневые абстракции, которые вы можете спокойно использовать. Вам не нужно беспокоиться об управлении памятью, о висячих указателях. Гораздо быстрее и проще решать задачи, когда используемый язык предоставляет вам некоторые высокоуровневые абстракции. А в мире, где единственным языком, обладающим такими возможностями, является LISP, его знание на самом деле похоже на суперспособность. В те дни он был просто несравним с чем ли бы то ни было.
Тестирование Robbie
Рон Гаррет, Robbie и Rocky III на выставке в Вашингтоне, округ Колумбия.
(Больше фотографий с выставки в последнем разделе) (Предоставлено Роном Гарретом)
Адам: Итак, Рон был убеждённым адептом, но он также был талантливым разработчиком, и ставки были высоки, поскольку у NASA была конкурирующая команда, также работавшая над прототипами марсоходов. Команда Рона должна была сделать Robbie и FANG автономными, чтобы получить шанс на использование их подхода на настоящем марсоходе.
Рон: Итак, мы разрабатывали код вне железа на компьютерах Macintosh в среде, содержащей симулятор робота. Мы добивались того, что по большей части всё работало, и запускали тот же код на роботе, чтобы проверить, что он заработает на реальном железе. Причина такого подхода заключалась в том, что проведение экспериментов на реальном роботе, особенно на Robbie, было очень затратным по времени. Это требовало тщательного планирования: нам нужно было погрузить Robbie на бортовой грузовик, отвезти его в Арройо, разгрузить, всё подготовить и установить всё вспомогательное оборудование. На установку уходило несколько часов, потом мы проводили там бо́льшую часть дня в экспериментах, а в конце дня нужно было всё упаковать и увезти.
Так что это было серьёзным мероприятием. Запуск кода в симуляции помогал нам более эффективно использовать это время.
Адам: Группа Рона и проделанная ими работа были во многих отношениях новаторскими.
Рон: Цель заключалась в том, чтобы заставить эти марсоходы передвигаться в естественной среде совершенно автономно. Вы могли бы сказать ему: "Я хочу пойти туда-то". У Robbie была пара стереокамер. Фактически, он был первым в мире роботом, который ориентировался с помощью стереовидения. Так что в некотором смысле Robbie был предшественником многих современных автономных автомобилей. В них не используется стереозрение, в основном применяется LIDAR, но некоторые из них используют обработку изображений для обхода препятствий. Robbie был первым роботом, который так делал. А также в нём был код навигации, который на основе трёхмерных стереоданных и целевого местоположения планировал маршрут и претворял его в жизнь. Над этим я и работал.
Адам: То есть вы ставите его куда-нибудь, указываете целевую локацию и затем смотрите, что происходит?..
Рон: Да, именно так. И не забывайте, что Robbie двигался очень медленно. Так что да, он был большим и тяжёлым, но двигался медленнее, чем одна миля в час.
Адам: Окей.
Рон: Так что он не так уж и опасен. Если он начнёт делать что-то не так, у вас будет достаточно времени, чтобы нажать кнопку аварийной остановки. Но за ним было необходимо постоянно следить, потому что он был большим, дорогим и существовавшим в единственном экземпляре исследовательским оборудованием, и он легко мог въехать на камень, что могло его опрокинуть и, вероятно, уничтожить при падении. К счастью, такого не случалось. Да, нам приходилось постоянно следить за ним, но не нужно было волноваться о том, что он выйдет из себя и убьёт кого-то.
Адам: Разработка программного обеспечения реального времени для роботов в 1980-х годах могла быть непростым мероприятием.
Рон: Это был код с переднего края исследований, поэтому он содержал ошибки, иногда он вылетал и происходили неполадки. К счастью, у нас никогда не было катастроф. Кажется, однажды FANG вышел из-под контроля и пробил отверстие в гипсокартонной стене в офисе. Но это был самый худший случай, потому что FANG легко мог двигаться достаточно быстро, чтобы нанести ущерб. К счастью, он никому не причинил вреда.
Политика
Rocky III.
"Белая штука на мачте — это электронный компас. NCC-366R — это внутренняя шутка. Номер нашей группы был 366. Разместив этот номер на видном месте, мы хотели показать, что этот робот принадлежит нам, а не группе, с которой мы соревновались." — Рон
(Предоставлено Роном Гарретом)
Адам: Robbie, Rocky, Tooth и FANG на тот момент были одними из самых продвинутых автономных роботов. Многие первые шаги в области само-навигации были сделаны их командой. Но пока Рон ушёл с головой в работу над кодом, дела в команде пошли наперекосяк.
Рон: Рассказывать эту историю будет несколько неприятно, потому что она в какой-то степени была политической. Я был молод и наивен, с головой занырнул в код и смутно понимал, что ведутся политические битвы, но я не знал подробностей и не понимал, как ведётся политическая борьба. С тех пор я многое узнал об этом, но в то время я был довольно беспечен.
Адам: Дело в том, что существовала борьба за влияние между исследовательской группой Рона, занимающейся робототехникой и стремящейся к повышению уровня автономности, и другой группой.
Рон: Их подход заключался не в том, чтобы просто задать цель и заставить ровер самостоятельно её достичь, а в том, чтобы оператор описал точный маршрут, которому ровер должен следовать. У них был определённый уровень автономности, но также был и оператор, который сидит за пультом, где у него есть трёхмерное представление местности и описывает точный путь, по которому марсоход должен следовать в каждом цикле.
Адам: Построение прототипа марсхода любого вида — это, я уверен, очень сложная задача, но подход другой группы, в котором они описывают точный маршрут, представлял собой более простую задачу, чем установление пункта назначения и навигация робота к этой цели, что само по себе здо́рово, но чревато сложностями при развёртывании.
Рон: Вы не знаете, успешно ли выполнено задание, в течение часа после отправки команды. Вы сидите и грызёте ногти, надеясь, что ничего не испортили.
Адам: Операционная нагрузка при таком подходе очень высока, в то время как полностью автономный подход имеет гораздо более низкие операционные расходы. Более того, если бы роботы были самоуправляемыми, то потенциально можно было бы отправлять всё больше и больше роботов меньшего размера. Я имею в виду, что они должны быть очень надёжными, но каждый маленький робот может отправиться на разведку самостоятельно, и тогда можно будет сделать больше, используя меньшее количество ресурсов. Но существовала политическая проблема.
Рон: Существуют десятилетия производственного опыта, лежащего в основе методов тех дней. Это очень трудоёмкий процесс, а разработка технологии, цель которой — лишить людей работы, не сразу расположит к вам людей, чьи средства к существованию зависят от выполнения этой работы. Была целая инфраструктура людей, чьи средства к существованию зависели от того, чтобы эта технология не существовала.
Судьба Sojourner на Марсе
Адам: Не теряйте надежды, история продолжается. Этот код на LISP отправится в космос, но не на первом марсоходе, Sojourner. Победил подход с низкой автономностью и управлением оператором, но, возможно, это не так уж и плохо.
Рон: Даже сегодня я не уверен, что в NASA сделали неправильный выбор. И я сужу об этом исключительно по тому, чего им удалось добиться. Я смотрю на фотографии и на научные данные, полученные с этих марсоходов, и они просто поражают мой ум и восхищают меня настолько, что я с трудом нахожу слова. Вот я сижу за своим столом в своём доме и смотрю на фотографии, цветные фотографии высокого разрешения с другой планеты. Это просто потрясающе — жить в то время человеческой истории, когда такое возможно.
Адам: Чувствуете ли вы, что эти фотографии делают это место реальным, глядя на них? Кажется ли это место более реальным?
Рон: О да. Фотографии, получаемые сегодня, просто невероятного качества и дают вам реальное представление о месте. И одна из вещей, которая меня больше всего поражает, это то, насколько оно похоже на места на Земле, и, в частности, насколько оно похоже на места в Долине Смерти, где мы проводили некоторые из наших ранних тестов. И в частности, это действительно даёт мне представление о том, каково было бы на самом деле быть там и гулять по этим местам, и всё это убеждает меня в том, что я никогда не захочу там быть. Я проводил время в Долине Смерти и в других местах, очень похожих на Марс, только более благодатных, потому что вам не нужен скафандр, чтобы там выжить. Я могу сказать вам на собственном опыте, что колонизация Марса — это несбыточная мечта.
Адам: Правда?
Рон: Да, Нам действительно нужно заботиться об этой планете, которая у нас есть, потому что как бы плохо здесь ни было, здесь всё равно будет лучше. Всегда проще терраформировать Землю, чем терраформировать Марс.
Адам: Итак, миссия Sojourner завершилась успехом, пусть и без LISP. Код, с которым он был отправлен на Марс, был написан на C, а его автономность была сильно ограничена. Группа Рона распалась и многие её участники покинули JPL, хотя Рон остался. А через пару лет появилась новая возможность.
Программа New Millennium от NASA
Веб-сайт Deep Space 1
Рон: Были люди, считавшие, что некоторые из технологий автономного управления могут быть использованы для реальных космических аппаратов, летающих в космосе, и что некоторые из теорий эффекта масштаба могут применимыми для них. В частности, примерно в это время в NASA появился новый директор. Он был сторонником идеи использования эффекта масштаба для снижения стоимости полётов. Он запустил пилотную программу под названием New Millennium. Это была серия демонстрационных полётов, призванных показать технологии, которые можно было бы использовать в больших масштабах для снижения эксплуатационных расходов. И технология автономии, которую мы начали разрабатывать для марсоходов, была переориентирована для этой цели в рамках проекта, названного Remote Agent, выполненного совместно с Исследовательским центром Эймса, в котором люди работали над системами планирования и диагностики.
Было три или четыре, в зависимости от того, как считать, основных компонента этой системы, разработанных в JPL и Эймсе. Один из них пришёл из Карнеги-Меллона, и все они были объединены в Remote Agent.
Deep Space 1 и Remote Agent
Рекламное изображение JPL Deep Space 1
Адам: Его назвали Remote Agent, потому что у него должна была быть возможность управления. Как и прототипы марсоходов, он должен был иметь цель и предпринимать действия для её достижения. Но на этот раз это был контроллер полёта, а не контроллер марсохода.
Рон: Миссии New Millennium были разделены на две категории. Были миссии в глубокий космос за пределами околоземной орбиты, и миссии на околоземных орбитах. Мы должны были лететь на первой миссии в глубокий космос, корабле Deep Space 1, которому предстояло рандеву с кометой и астероидом. В этой миссии планировалось продемонстрировать целую кучу других передовых технологий, которые тоже должны были отправиться в космос. Изначально нашей задачей было управлять всей миссией с помощью Remote Agent.
Проблемы в менеджменте проекта
Адам: Но, к сожалению, проблемы возникли задолго до этапа полёта.
Рон: И тут снова будет несколько неловко. Я должен быть осторожен в высказываниях, потому что я действительно не хочу обидеть кого-либо из членов команды, потому что каждый в команде был очень хорош, умён и работал невероятно усердно. Проблемы были скорее управленческие, чем технические. Мы были четырьмя разными командами из трёх разных учреждений, собранными вместе для создания этой системы, и никто не отвечал за разработку и интеграцию конечной системы. Этим вещам позволяли происходить органически. Поэтому было много переговоров, уговоров и откровенных споров и внутренних конфликтов. А с технологической стороны три из четырёх компонентов были написаны на LISP, а один был написан на C. Компонент, написанный на C, изначально постоянно падал, потому что когда вы пишете на C, вам нужно беспокоиться о всяких низкоуровневых деталях, и такое часто происходит, когда вы пишете на C.
В конечном итоге они справились, но пока происходили сбои, они сильно замедляли разработку, потому что вы проводите эксперимент, и вдруг происходит сбой, приходиться перезагружаться, что стоит вам 10 минут, умножьте это на несколько десятков раз в день, и вы отстаёте от графика.
Адам: Что ж, полагаю, все поняли, что не следует использовать C.
Рон: Можно подумать, что этот урок они усвоили, но нет, этого не произошло. На данный момент, как мне известно, программное обеспечение для управления полётами написано на C и приходится очень тщательно его кодировать и использовать множество средств тестирования и анализа, чтобы заставить его работать. Его удаётся сделать работающим и надёжным, но это требует огромных усилий. К сожалению, в то время я не умел играть в политику и поэтому говорил об этом несколько более прямолинейно, чем следовало. В итоге я перессорился со многими людьми, и я думаю, что это в конечном итоге не повлияло на провал проекта больше, чем что-то ещё, потому что все эти старожилы, которые знали, как управлять космическими кораблями, просто недолюбливали меня и не хотели иметь рядом с собой этого несносного сопляка.
Адам: Конечно. Уверенность Рона, вероятно, взъерошила чьи-то перья в JPL, но именно попытка интеграции этих четырёх систем вызвала наибольшие задержки и привела к тому, что автономная система была низведена до уровня полётного эксперимента. Вместо управления Deep Space 1 на всём пути, она будет управлять им всего три дня. Но даже три дня управления космическим аппаратом — дело непростое. Поэтому разные команды усердно работали, чтобы программное обеспечение было максимально надёжным.
Исполнитель
Сборка Deep Space 1
(Источник: NASA)
Адам: Часть Рона называлась "исполнитель".
Рон: Это было программное обеспечение, которое решало, что мы будем делать дальше в ответ на входные данные и возможные события. Именно она решала, что будет делать космический аппарат в каждый момент времени. И она была написана с использованием ещё одного из этих доменно-специфичных языков, который был написан на LISP. И, как ни странно, я не могу сейчас вспомнить название этого языка, хотя он был моим детищем. Этот язык был разработан таким образом, чтобы, подобно LISP, его структура не позволяла вам писать код с определёнными видами проблем. Самой большой проблемой, которую он был призван предотвращать, были ошибки, возникающие при работе с многопоточным кодом, то есть кодом, выполняющим несколько действий одновременно. С таким кодом, как известно, трудно справиться.
Существует множество тонких проблем, которые могут в нём возникнуть и которые трудно выявить, и которые приводят к таким ошибкам, как состояния гонки и взаимные блокировки. И вот этот язык был разработан таким образом, чтобы сама его структура не позволяла столкнуться с подобными трудностями. Код даже проходил формальный анализ, у нас было формальное доказательство того, что безопасность и инварианты, разработанные для этого языка, действительно соблюдались.
Адам: Ого.
Рон: У нас было формальное доказательство и, конечно, обширные наземные испытания. Всё было протестировано в течение многих дней в симуляции. И когда я говорю "симуляция", я имею в виду, что всё выполнялось на копии летательного оборудования, и единственное, что симулировалось, — это то, что мы не находились в космосе, но все аппаратные средства были теми же или копиями тех, которые фактически летели. Таким образом, мы получили формальное доказательство корректности и провели обширные наземные испытания без каких-либо проблем.
Поэтому мы были точно уверены, что всё получится, но не получилось.
Провал в глубоком космосе
Антенны сети Deep Space Network в Канберре, Австралия
(Источник: NASA)
Шёл второй день трёхдневного эксперимента. Люди в это время спали, но не очень много. Я не очень хорошо помню детали, но это была ситуация вида "все на палубу", потому что сценарий был разработан с учётом мер предосторожности, так что вероятность потери космического корабля была очень низкой, даже если Remote Agent допустил ошибку.
Но тот факт, что он облажался, всё равно был если не красной, то по крайней мере оранжевой тревогой.
Адам: Он перестал принимать решения или просто завис?
Рон: Был момент, когда он должен был что-то сделать, и это время пришло и прошло, а он не сделал того, что должен был. Зазвонили тревожные сигналы, и...
Адам: Где это было?
Рон: В космосе. Расстояние до него составляло 150 миллионов миль. Время сигнала в пути туда и обратно составляло час.
Отладка в космосе
Адам: Ого. Пришло время отладить производственный инцидент, но это не код на сервере в облаке, этот код находится на расстоянии одного светового часа. Он работает в глубоком космосе, и чтобы решить проблему, есть Рон, который написал язык программирования, и тот парень, которого он нанял, чтобы помочь ему с кодом для космического корабля.
Рон: Я нанял его отчасти для того, чтобы переложить на него обязанности по программированию и отойти от процесса, потому что я понимал, что не очень-то эффективен. В тот момент я был молод, глуп и был очень, очень плохим менеджером. И я не очень хорошо справился с передачей ему этой задачи. Я просто сказал: "Вот что нужно сделать. Иди и делай".
Адам: И он сделал. Он что-то построил, но теперь этот код, про который доказано, что в нём нет взаимоблокировок, застыл в 150 миллионах миль от дома. Теперь настало время Рону вернуться и взять управление в свои руки.
Рон: Этот парень был во мне разочарован. Он действительно провёл в окопах несколько месяцев, выполняя за меня грязную работу. Ситуация была кризисной, и я, как белый рыцарь, вернулся, чтобы попытаться её исправить так, как я это умело делал много раз до этого. Парень послал меня к чёрту, что меня удивило, потому что я не понимал, что ситуация столь напряжённая. Оглядываясь назад, я думаю, его реакция вполне объяснима, но в тот момент она застала меня врасплох.
Адам: Эмоции накаляются, и пришло время устранить проблему. Чем больше времени проходит, тем больше Deep Space 1 отклоняется от цели.
Отправка S-выражений
Рон: Мы понятия не имели, что происходит. Всё, что мы знали, это то, что телеметрия, которую он должен был отправить, не была получена, и теперь мы должны решить, как действовать дальше. И всё, что мы делали, когда принимали какое-то решение, — мы претворяли его в жизнь, а затем сидели и час ждали результата.
Адам: Значит, к тому времени, когда вы узнали, что пропустили поворот, уже прошёл час.
Рон: Ну, это было полчаса назад — полчаса в пути туда и полчаса обратно. Странно думать про вещи таким образом, не так ли? Так что да, фактически прошёл час.
Адам: Как это работало? Как вы с ним взаимодействовали?
Рон: Это хороший вопрос. Вы знакомы с Python, не так ли?
Адам: Да.
Рон: Так вот, когда вы программируете на Python, у вас есть REPL, цикл чтения-выполнения-печати (read-eval-print loop). Таким образом, вы можете программировать на Python в интерактивном режиме, а не просто поместить код в файл и запустить его как обычную программу. Первопроходцем в этом деле был LISP. Обычным способом взаимодействия с LISP был REPL, и это был первый язык, имевший такую возможность, и единственный язык, обладающий такой возможностью на протяжении десятилетий. Это одна из причин, почему он был таким мощным инструментом на начальных этапах разработки, но и тогда REPL по-прежнему был, так что у нас была возможность взаимодействовать с космическим аппаратом через него. Однако доступ к этому REPL был не таким простым делом, как просто сесть за терминал и начать печатать. Для взаимодействия с ним нужно было пройти через сеть Deep Space и иметь дело с часовой задержкой в обратной связи.
Итак, процесс выглядел следующим образом: мы сидели в конференц-зале, думали, спорили и пытались решить, какие команды отправить. Наконец, мы приходили к соглашению относительно команд, и эти команды проходили процедуру рассмотрения, состоящую из нескольких уровней руководства, на каждом из которых нужно было получить одобрение. После этого они передавались фактическому оператору, обученному взаимодействию с сетью Deep Space. Он садился за консоль, подключенной к этой сети, вводил команды, а затем нажимал большую красную кнопку, чтобы передать их на космический аппарат. От консоли в здании JPL по специальной проводной сети сигнал поступал на одну из антенн сети Deep Space. Их было три по всему миру, чтобы обеспечить покрытие всего неба.
И это огромные антенны размером 70 метров, просто гигантские объекты инфраструктуры. Я не знаю подробностей того, что происходит на станции. Я не знаю, если ли в этот момент ещё один человек в контуре или всё автоматизировано, но в конце концов сигнал выходит из огромной 70-метровой антенны и летит через космос со скоростью света, где его принимает антенна на космическом корабле и он проходит через очень сложную систему, в которой сигнал декодируется и превращается в биты. Наконец, эти биты поступают в LISP-систему точно так же, как если бы вы сидели там физически с терминалом и вводили код. Это был очень сложный и формализованный процесс, в котором участвовали люди в наушниках, как в кино, осуществлявшие этот процесс: "Мы собираемся отправить эту команду на космический корабль", кто-то другой говорит "Да, вы можете отправить эту команду на космический корабль".
И затем оператор, сидящий у консоли, нажимает большую красную кнопку, а мы сидим и ждём результатов. А потом смотрим на результаты и повторяем всё сначала.
Адам: С ума сойти. Вы отправляли какое-то большое дерево LISP-выражений или?..
Рон: Да. Мы посылали S-выражения.
Адам: Что вы ему говорили? Приказывали перезагрузиться? Он же активно работал. Что вы делали?
Рон: Первое, что мы ему сказали, это отправить нам трассировку. Прислать нам дамп системного состояния, всех запущенных процессов. Процессы, которые чего-то ждут, чего именно они ждут? Мы сделали это в первую очередь. В ответ пришла информация, мы посмотрели на неё, и почти сразу стало ясно, что пошло не так, потому что был один процесс, который ждал чего-то, что уже должно было произойти. Это была важная зацепка. Оказалось, что проблема заключалась в состоянии гонки, которое, как считалось, должно было быть невозможным.
Доказательства и предположения
Адам: Было доказано, что это невозможно, не так ли?
Рон: Было доказано, что это невозможно, но доказательство основывалось на предположении. А предположение состояло в том, что при программировании этой штуки используются только те конструкции, которые есть в языке. Так что доказательство гласило, что если вы используете конструкции только этого специально разработанного языка, то у вас не будет взаимных блокировок. Это похоже на Rust, в котором есть безопасная часть языка и небезопасная часть. В принципе, у нас тоже так было, но мы этого явно не фиксировали. Но чего мы не ожидали, так это того, что есть человек, которому поручили написать часть кода...
Адам: Это тот самый парень, которого Рон нанял для создания программного обеспечения с использованием его языка.
Рон:… и ему нужно было сделать определённую вещь, он не смог понять, как её сделать с помощью конструкций в языке, поэтому он просто использовал более низкоуровневую конструкцию самого LISP, чтобы заставить её работать. Это позволило обойти гарантии безопасности языка. И это было моей ошибкой. Я не объяснил этому человеку, которого нанял для написания кода, и который работал под моим надзором, достаточно ясно, что он этого делать не должен. По сути, я просто сказал: "Вот что нужно сделать. Иди и делай". И он сделал, но из-за того, что я не подчеркнул… В свою защиту скажу, что я и не думал о том, что так нужно было поступить. Я думал, что этот парень сам разберётся. В ретроспективе очевидно, что это было нереалистичным ожиданием. Я не дал ему понять, что он не должен такого делать. И он сделал, не по своей вине, а по моей, что и послужило причиной ошибки.
Исправление
Адам: Вы что-то прервали, или перезапустили, или?..
Рон: Тогда нам нужно было решить, пытаться ли спасти эту сессию, внедрив какое-то событие, чтобы разблокировать её, что мы и сделали. Нам действительно удалась разблокировка и выполнение сценария продолжилось.
Адам: Итак, ручное введение события сработало. Благодаря магии LISP и умопомрачительной идее иметь живой REPL на космическом корабле миссия была спасена. Ещё мне кажется, здесь стоит подумать о шансах. Этот код был тщательно протестирован, и он ни разу не вошёл в состояние взаимоблокировки. Если бы вы запустили эту миссию сто раз, она могла зайти в тупик только в первый раз и больше никогда. Взаимоблокировки — это артефакты тайминга, и, очевидно, в тестовых сценариях тайминга, нужного на появление той конкретной ошибки, никогда не случалось. Вероятность того, что она произойдёт, очень мала, но миссия произошла только один раз, и взаимоблокировка случилась. Поэтому для людей вне команды, это, конечно, не выглядит как успех.
Последствия взаимоблокировки
Рон: Мы не потеряли космический аппарат и выполнили все поставленные перед нами задачи. Так что технически это был успех, но процесс разработки был очень болезненным и полным трудностей, и, опять же, не обошлось без политики. Поэтому несмотря на то, что нам удалось заставить его работать, проект автономного полёта был впоследствии отменён и больше никогда не поднимался в воздух.
Адам: Весь этот процесс, как вы можете себе представить, очень расстроил Рона.
Рон: Сказать, что я был расстроен — сильное преуменьшение. Это был сильный стресс, и в конечном итоге он привел к моему уходу. Я становился всё более и более отстранённым на своей роли, и мне становилось ясно, что всё меньше людей хотят работать со мной, а давления было всё больше и больше.
Появляется Google
Адам: В то время, когда Рону было хуже всего, он открыл для себя новую поисковую систему под названием Google.
Рон: Я читал новостную группу Usenet, comp.lang.lisp. И кто-то ответил на технический вопрос, который я уже не помню, и затем добавил "Слава богу, что есть Google". Я подумал, что же это за "Google"? И поступил так, как делали в те времена, когда сталкивались с чем-то незнакомым — открыл свой Netscape Navigator и ввёл www.google.com. И, конечно же, это была поисковая система, похожая на AltaVista, но уже через пять минут работы с ней мне стало ясно, что она на много световых лет опережает всё, что существовало в то время. Он был настолько хорош и настолько быстр, что моя челюсть просто отвисла от удивления: как, чёрт возьми, они это сделали? А внизу страницы была ссылка, где говорилось, что они набирают сотрудников. В порыве того, что Алан Гринспен назвал бы иррациональной эйфорией, я набросал резюме, и через 15 минут у меня зазвонил телефон.
Стоит ли использовать LISP?
Адам: Итак, Рон ушёл из JPL и начал работать в небольшой компании под названием Google. Но так как подкаст CoRecursive не о космических исследованиях, я хотел бы узнать, теперь, спустя годы и годы, остаётся ли Рон евангелистом LISP?
Рон: Одна из важных вещей, которые я понял, заключается в том, что LISP мне подходит, потому что он хорошо соответствует моему стилю мышления. Одной из причин этого соответствия является тот факт, что я начал использовать его ещё в старших классах. Таким образом, я погружен в LISP на протяжении 40 лет или около того. Но кому-то другому он может показаться странным. Все эти скобки и странная префиксная нотация могут казаться очень чуждыми, особенно в случае Common Lisp, в котором много исторического багажа, странных граничных случаев и потенциальных неприятных сюрпризов. В конечном итоге, продуктивность в значительной степени зависит от соответствия выбранных инструментов вашему мышлению, а не от поисков единственно верного инструмента, поскольку у разных людей разное мышление, разные подходы и разные предпочтения.
Лучшее, что LISP может вам предложить, — это глубокое понимание того, как всё работает в своей основе. Это понимание значительно облегчает освоение других областей. Однако в реальной практике гораздо важнее, насколько эффективно инструмент соответствует вашему индивидуальному стилю мышления, чем его технические преимущества.
Заключение
Адам: Большое спасибо Рону Гаррету за участие в подкасте. Ссылка на его веб-сайт есть в примечаниях к выпуску. А если вы хотите узнать больше о том, как Рон работал в Google во время бума доткомов, вам повезло. Я выпустил этот рассказ в качестве бонусного эпизода. Так что если вы перейдёте по ссылке для спонсоров corecursive.com/supporters, вы сможете получить доступ к этому эпизоду прямо сейчас. Сможет ли этот маленький стартап, Google, пережить крах доткомов начала 2000-х? Сможет ли Рон убедить их в красоте LISP? Вам не нужно долго ждать, чтобы узнать, выпуск доступен для спонсоров уже сейчас. До следующих встреч, спасибо за внимание!
Дополнительные материалы от Рона
Рон: Эти фотографии были сделаны на одном из мероприятий в Вашингтоне, округ Колумбия. Я не помню подробностей, но, кажется, оно проводилось совместно с Национальным музеем воздухоплавания и космонавтики. Это было большое событие. Перевезти всё оборудование через всю страну, особенно Robbie, было непростой задачей.
"Это я справа стою перед Robbie. Rocky III виден в левом нижнем углу, а над ним — Раджив Десаи и Роберт Ивлев, два других члена команды." — Рон
(Предоставлено Роном Гарретом)
"Это я и Раджив Десаи на том же мероприятии. Грунт оранжевого цвета — это песочница, сделанная так, чтобы быть похожей на Марс" — Рон
(Предоставлено Роном Гарретом)
"Rocky III в песочнице на том же мероприятии." — Рон
(Предоставлено Роном Гарретом)
"Это я показываю Rocky III толпе." — Рон
(Предоставлено Роном Гарретом)
"Rocky IV на макете посадочного аппарата и инженерная модель лунохода Surveyor на заднем плане (то есть реальное космическое оборудование, а не макет). Это с важного демонстрационного мероприятия в Арройо." — Рон
(Предоставлено Роном Гарретом)