Маргарет Хэмилтон, руководившая разработкой бортового ПО для лунных миссий Apollo, умерла 30 сентября в возрасте 90 лет. Написанная её командой защита от перезапуска позволила Apollo 11 продолжить посадку на Луну в 1969 году, когда бортовой компьютер оказался перегружен задачами; для разработчиков это по-прежнему очень практичная история о приоритетах, отказоустойчивости и неизбежных ошибках пользователя.
О смерти инженера сообщает The Register. Хэмилтон руководила созданием программного обеспечения для командного и лунного модулей Apollo в MIT Instrumentation Laboratory. Её имя давно знают по фотографии 1969 года: она стоит рядом со стопкой распечаток кода, почти равной ей по росту. Но за эффектным снимком скрывается работа, которая в критический момент помогла экипажу Нила Армстронга и Базза Олдрина не отменить историческую посадку.
За несколько минут до касания поверхности Луны компьютер лунного модуля начал выдавать тревоги. Причина была не в «падении системы» в привычном современному разработчику смысле: вычислитель получал лишние данные от радара сближения и не успевал выполнить весь набор назначенных задач. Сработал режим executive overflow — переполнение исполнительной системы. Астронавты запросили подтверждение, можно ли продолжать спуск. Компьютерный инженер Джек Гарман объяснил, что тревога не требует прерывать миссию, а руководитель наведения Стив Бейлс передал экипажу: посадку можно продолжать.
Ключевой деталью стала архитектура ПО. Система не пыталась героически обработать всё сразу и не уходила в бесконечный перезапуск. Она отбрасывала менее важную работу, восстанавливалась и возвращалась к критическим задачам наведения и посадки. Именно это часто теряется в легендах об Apollo: успех обеспечил не безошибочный компьютер, а программа, рассчитанная на ситуацию, когда ресурсов уже недостаточно. В инженерных терминах команда заранее заложила деградацию сервиса, очередность задач и предсказуемое восстановление.
Ошибка оператора — не экзотика, а требование к системе
Подход Хэмилтон формировался не только на бумаге. В MIT она отвечала и за программу аварийного прекращения миссии. Эту задачу коллеги отдали начинающему сотруднику, поскольку считали сценарий маловероятным. Хэмилтон назвала программу Forget It. Позже беспилотный полёт действительно был прерван и использовал написанный ею код — после этого её экспертизу в команде стали воспринимать заметно серьёзнее.
Ещё более показательная история связана с защитой от действий экипажа. Четырёхлетняя дочь Хэмилтон во время симуляции включила программу, которую следовало запускать до старта, уже после условного выхода в полёт. Симулятор дал сбой. Инженер предложила добавить защиту от такого сценария, но её идею сначала отклонили: предполагалось, что астронавт подобного не сделает. Позднее аналогичное действие совершил астронавт Apollo 8, и программу всё-таки изменили. Для любой команды, спорящей о валидации «невозможного» пользовательского пути, это почти готовый кейс для ретро.
Хэмилтон пришла в MIT в 1959 году. Она работала с Эдвардом Лоренцем, будущим исследователем теории хаоса, и программировала компьютеры LGP-30 и PDP-1 для метеорологических расчётов. В 1965-м она узнала о программе Apollo и сразу подала заявку в команду. Сначала работала над ПО для беспилотных миссий, затем возглавила разработку для пилотируемых полётов. По данным MIT, после Apollo она основала и соосновала несколько технологических компаний, занимавшихся отказоустойчивыми системами.
Сама Хэмилтон настаивала на названии «инженер по программному обеспечению» в период, когда написание кода многие ещё не считали инженерной дисциплиной. Сегодня термин кажется настолько обычным, что трудно представить, насколько его приходилось отстаивать. В 2016 году президент США Барак Обама вручил ей Президентскую медаль Свободы. Белый дом тогда отдельно отметил её вклад в асинхронное ПО, планирование по приоритетам и проектирование систем, где человек остаётся участником принятия решений.
Почему Apollo 11 всё ещё полезнее многих постмортемов
История Apollo 11 не предлагает разработчикам романтизировать работу на пределе. Наоборот, она напоминает о скучных, но дорогих вещах: определять критические функции до инцидента, отделять их от второстепенных, не считать операторов безошибочными и проверять поведение продукта при перегрузке. Веб-сервис, банковская платформа или промышленная система не обязаны быть космическим кораблём, чтобы столкнуться с теми же вопросами: что мы выключим первым, какие данные проигнорируем, можно ли безопасно продолжить работу и кто примет решение в условиях неполной информации.
Наследие Маргарет Хэмилтон — не только код из эпохи, когда память и вычислительное время приходилось беречь почти физически. Это требование проектировать системы для реальных людей и реальных сбоев, а не для идеальной презентации. Чем больше автономных компонентов появляется в продуктах, тем важнее остаётся вопрос, на который её команда ответила ещё в 1969-м: что именно система должна сохранить, когда сохранить всё уже невозможно?