На днях в обычном офисном разговоре я сказал: «То, что у нас тут склад костылей — это нормально, во всех ИТ-проектах так. Наверное, из всего софта, который сделало человечество, только в программах посадки на Луну было все красиво». Сказав это, я полез в интернет, найти дополнительные факты к краткому научно-популярному рассказу для коллег о компьютерах и программах лунного модуля. Но одной из первых попалась ссылка, из которой выяснилось, что костыли, и, страшно сказать, баги были и в отшлифованном программном обеспечении, которое позволило человеку высадиться на Луну. А «Аполлоны» -11 и -12 смогли сесть, оказывается, только по счастливой случайности.
Софт и железо
Слева — компьютер, справа — дисплей и клавиатура
На командном и лунном модулях «Аполлонов» стояли идентичные компьютеры, но с разным набором программ. По тем временам это был фантастический хайтек, использовавший интегральные схемы, а не отдельные диоды и транзисторы. «Цикл памяти», примерно соответствующий тактовой частоте современных процессоров, занимал 11,7 микросекунд. Но практически все операции требовали два цикла, поэтому эффективная тактовая частота получалась равной 23,4 микросекундам, или 43 килогерцам, в 100 000 раз медленнее современных процессоров. Память компьютера составляла 36 тысяч 14-битных слов, что примерно соответствовало 64 килобайтам.
Постоянная память на проволоке и ферритовых сердечниках
Софт для лунного модуля разрабатывали примерно 300 человек в течение семи лет. Программа посадки на Луну имела название LUMINARY и хранилась в постоянной памяти на ферритовых сердечниках, провода сквозь которые продевались вручную. Создание такого блока памяти занимало несколько месяцев, поэтому софт должен был быть готов заранее. За годы «Аполлонов» программы модифицировались. На «Аполлоне-11» стоял блок с программой версии 99, а финальная версия (очевидно, посадившая Аполлон-17) имела номер 209. Главным дизайнером программы посадки был Алан Кламп (Allan Klumpp), недавний выпускник Массачусетского технологического института.
Процедура посадки
Посадка на Луну с точки зрения компьютера проходила в три этапа:
Программа P63 отвечала за торможение с орбитальной скорости.
P64 занималась выводом лунного модуля в район посадки.
P65 отвечала за финальный этап посадки.
На участке работы программы P64 пилот лунного модуля называл число, которое показывал на дисплее компьютер. Командир мысленно отмечал это число на шкале, которая была нарисована на иллюминаторе, и получал расчетную точку посадки.
Байка первая: ошибки 1201 и 1202
Довольно известен тот факт, что, когда Армстронг и Олдрин начали торможение с лунной орбиты, их компьютер выдал ошибку 1202. Это был очень нервный момент, потому что сами астронавты не знали значения этого кода. К счастью, специалист ЦУПа Стив Бейлс (Steve Bales) заранее написал список всех ошибок и быстро нашел расшифровку — компьютер не успевал справляться со всей работой. Компьютер «Аполлона» был системой реального времени, и он начал игнорировать некоторые низкоприоритетные задачи, выдавая сообщение об ошибке. Спустя еще минуту появилась новая ошибка — 1201. Но она относилась к этому же типу и не срывала посадку.
Уже после посадки была найдена причина. Как это часто бывает в сложных технических системах, причиной оказалась целая цепочка событий. Во-первых, после начала торможения инструкция требовала включить стыковочный радар на случай аварийного прерывания посадки. Стыковочный радар работал от другого источника питания, нежели компьютер. Этот источник питания имел ту же частоту, но не был синхронизирован по фазе с источником питания компьютера. Небольшие смещения фазы на радаре выглядели для компьютера как дрожания неподвижной в реальности антенны. В норме при посадке процессор компьютера был загружен на ~85%. «Дрожащая антенна» добавила еще 13%. А когда Олдрин дал команду компьютеру посчитать разницу между реальной и рассчитанной высотой по посадочному радару, компьютер оказался в условиях перегрузки. Уже потом посчитали, что это событие «украло» примерно минуту процессорного времени, а из 10 раз в секунду компьютер управлял стабильностью лунного модуля 9 раз. Кстати, баг с дрожащей антенной был замечен на тестировании, но его оставили, потому что он проявился всего один раз, а замена оборудование на новое могла создать более опасные баги.
Та самая посадка, видео повернуто для удобства восприятия, и добавлено много полезной информации. В видео упоминается программа P66, это альтернативный вариант одной из программ
А здесь можно посмотреть на посадку виртуально, с разных сторон.
Байка вторая, счастливая ошибочная оптимизация
Как известно, «Аполлоны» -11 и -12 сели успешно. Однако впоследствии, уже после возвращения астронавтов, по телеметрии в двигателях посадочной ступени обнаружились опасные колебания — тяга то поднималась вверх, то падала вниз. К счастью, колебания не стали слишком сильными и не вызвали проблем с управлением или двигателем. Расследование показало, что причиной колебаний являлось программное обеспечение. Программистам был доступен специальный документ, в котором описывались параметры и свойства лунного модуля. В разделе о двигателе было указано, что он имеет инерционность 0,3 секунды. То есть через 0,3 секунды после команды на изменение тяги он должен был выйти на новый уровень. Это надо было отразить в программе, поэтому была написана специальная подпрограмма, которая измеряла тягу двигателя по данным акселерометра и выполнялась за 0,3 секунды. Но финальная версия этой подпрограммы писалась другим программистом, который решил ее улучшить и сделать быстрее. Новая версия успевала выполниться за 0,2 секунды. Ее протестировали на симуляторе, и она показала себя там отлично. Однако разработчики двигателя улучшили его, и время задержки упало до 0,075 секунды. А внести это изменение в документ для программистов просто забыли. Последующие тесты показали, что, если бы подпрограмма определения тяги работала изначальные 0,3 секунды, то система бы оказалась нестабильной, и колебания становились бы все больше и больше, что привело бы к прыжкам тяги двигателя от минимальной до максимальной и обратно, а это бы, наверняка, сорвало высадку.
Байка третья, о проблемах интерполяции
Напоминаю, что программа P64 нацеливала лунный модуль в точку над местом посадки. Однако, поскольку для расчета траектории использовались полиномы высоких степеней, траектория, выходя в точку прицеливания, могла оказаться под поверхностью Луны. Потому что полином высокой степени мог «прыгнуть» в сторону (это знают математики и инженеры):
Чем выше степень, тем больше может быть этот «прыжок», несмотря на то, что график проходит через все желтые точки
Ирония с этим багом состоит в том, что его никак не исправили. Программа не отслеживала потенциально опасные кривые. Баг не проявился в реальных посадках, но его мог вызвать не такой уж невозможный случай. Если бы лунный модуль немного сбился с курса и оказался над неучтенным достаточно глубоким кратером, компьютер, получая данные от посадочного радара, мог бы подумать, что оказался выше траектории, пересчитать кривую на более крутую и направить лунный модуль к прицельной точке, нырнув сначала в Луну. Отдельно доставляет рецепт борьбы с багом, если бы он проявился — астронавтам надо было бы переместить точку прицеливания за предел досягаемости по запасам топлива и подержать ее там некоторое время. Вы когда-нибудь совершали странные действия, чтобы переупрямить глючную программу? Можете себя поздравить, астронавтам возможно пришлось бы делать то же самое…
Комментарии (58)
ayurtaykin
27.05.2016 08:28+11Я где-то читал такую историю:
Дейкстра пропогандировал свою методологию программирования, то как кодили в 70ых он считал небезопасным т.к. не было контроля за кодом.
Как-то его пригласили в США на конференцию и там же были программисты отвечавшие за софт на апполонах. И вот преисполненный значимостью Дейкстра спрашивает у них:
-Какую методологию вы используете? У вас же должен быть идеальный код! Как вы сделали такую идеальную программу?
-Ха-ха, идеальную, за 2 недели до полета, при тесте мы узнали что наша программа считает у Луны отрицательная гравитация!
Дейкстра тогда сильно разочаровался))lozga
27.05.2016 08:42Вряд ли это дословно было, все-таки тестировали там очень много, и программа должна была быть готова за месяцы до полета. Но забавно :)
ayurtaykin
27.05.2016 08:46+1На русском не нашел, но вспомнил что видел это в фильме про Дейкстру.
https://www.reddit.com/r/programming/comments/91vki/don_eyles_a_23yearold_selfdescribed_beatnik_who/c0b54v3
Zzzuhell
27.05.2016 09:03на ферритовых сердечниках, провода сквозь которые продевались вручную
Придираюсь, но может поправить?
«Продевать сквозь сердечники» по-русски криво звучит. Может заменим «сердечники» на «ферритовые кольца» (если именно они там были)? А если там были классические сердечники, тогда — «наматывали вручную»lozga
27.05.2016 09:06+6Память на магнитных сердечниках (англ. magnetic core memory) или ферритовая память (англ. ferrite memory) — запоминающее устройство, хранящее информацию в виде направления намагниченности небольших ферритовых сердечников, обычно имеющих форму кольца.
REPISOT
27.05.2016 09:40+5Сердечник в индуктивности может быть любой формы, в том числе и тороидальной, который называют «кольца».
Andy_Big
27.05.2016 09:50Сердечники могут быть самой разной формы :)
Zzzuhell
27.05.2016 10:29Да я согласен, что фактически можно продевать сквозь сердечники. Просто звучит шероховато. Но, может, это у меня профессиональная деформация :)
LSDtrip
27.05.2016 13:58Дело в том, что их именно продевали, а не наматывали. Намотка подразумевает 1 или более витков. А их там не было.
Wingtiger
06.06.2016 09:53когда я учился в техникуме, у меня были практические занятия на одном заводе в одном городе, нужно было советскую машину по печати результатов теста памяти заменить на современный ПК (первый пень, когда существовал третий). И в соседнем цеху вручную наматывали эту память для кое-каких ракет (имхо она в любых ракетах будет одинаковой :) ) — тонкая проволока в ферритовом кольце в несколько витков. Я смотрел пока 2-3 витка не намотали (всего вроде бы было 5-10), потом меня позвали «Посмотрел? Иди отсюда!»
Но соединения ячеек проводами на чистой, без печатных дорожек, плате впечатляет, да…
Wesha
27.05.2016 22:39+1> на ферритовых сердечниках, провода сквозь которые продевались вручную
Для этого есть специальный древний термин — «прошивка» (которая действие от слова «прошивать», а не программа): https://ru.wikipedia.org/wiki/Встроенное_программное_обеспечение#История
QWhisper
27.05.2016 09:30+2На примере управления тягой, можно как раз рассматривать те самые нетривиальные проблемы, связанные с восстановлением давно потерянных технологий. Сколько там еще таких багов в железе может быть скрыто никто не знает. А если попытаться сейчас все собрать по старым чертежам, то может оказаться, что и вовсе взлететь даже не может, потому что какой нибудь вентиль не указали на схемах.
lozga
27.05.2016 09:54+7А вышивать вручную такую память в 21 веке — мазохизм.
QWhisper
27.05.2016 09:58+1А её и вышивать не надо, чтоб такой баг словить. Если бы не обнаружили его в этой истории, то при новой сборке ориентировались бы на 0.3с, ибо разработчик двигателя ничего не задокументировал. И легко могла бы катастрофа случится. Ибо в симулятор тоже бы сунули данные из документов. А фактически другое было бы совершенно.
lozga
27.05.2016 20:05Ну, эта история могла всплыть при изучении опыта, полученного в программе Apollo. Но мог и всплыть баг, который тогда не нашли и не заметили. Вот смеху-то было бы…
impetus
27.05.2016 14:15+2по старым чертежам — не собирается. американцы так утеряли технологию производства термоядерных бомб (точнее работы с плутониевым инициатором) и вынуждены были не так давно изобретать её с 0 заново на современном оборудовании — выяснилось что большой объём знаий, был не задокументирован ибо был у работников в головах и воспринимался ими как само собой разумеющееся очевидное. (их система секретности позволяет такие факты/обсоятельства публиковать и открыто обсуждать)
REPISOT
27.05.2016 09:38+4Главным дизайнером программы посадки был
Когда уже переводчики начнут различать «дизайнер» и «разработчик»?
В русском языке это разные понятия.lozga
27.05.2016 09:57+1У него должность «principal designer», это не то разработчик, не то архитектор, не то вобще непонятно кто. В то время не было стандартизованных названий.
petrovnn
29.05.2016 00:54-2Не хочу вас разочаровывать, но дизайн в переводе означает не «картинка», а «задумка». В данном контексте значение слова: «проектирование / план / рассчет».
Более того, в веб-разработке дизайнер не тот кто «рисует картинку», а тот кто «думает» (значение: «замысел»). Поэтому хороший дизайнер не тот кто красиво рисует, а тот кто осмысленно рисует.REPISOT
29.05.2016 10:37+2Не хочу вас расстраивать, но нормальные переводчики переводят по смыслу, а не дословно.
А статья, уж конечно, не про веб-дизайн.
Може, вам хочется получить комментарий от профессионального переводчика?
Fedorkov
27.05.2016 09:51Была холодная война, люди делали всё бегом-бегом и рисковали своими жизнями, чтобы обогнать друг друга. Из всего ПО надёжными были только системы управления ядерным оружием. Надеюсь…
22sobaki
27.05.2016 09:58+3пилот лунного модуля называл число, которое показывал на дисплее компьютер. Командир мысленно отмечал это число на шкале, которая была нарисована на иллюминаторе, и получал расчетную точку посадки.
Шлем командира как-то фиксировался? Ведь от того, ближе или дальше голова от иллюминатора, и точка прилунения будет попадать в разные места на поверхности.QwertyQwerton
27.05.2016 11:40Дак и люди не настолько стандартны чтобы глаза всегда в одно место попадали, даже с фиксацией
возможно для уточнения данных использовалась удача
MACman_84
27.05.2016 12:19Предположу, что непосредственно шлем не фиксируется. Это осложнит управление.
Да и нет необходимости в столь точной фиксации. Полагаю, расстояние от разметки до глаз много больше возможного перемещения головы пристёгнутого астронавта. Кроме того, вряд ли ошибка от смещения глаз (в текущих условиях) сильно ухудшит общую точность расчёта места посадки.
lozga
27.05.2016 12:21+5Фиксировалось место стояния астронавтов (их специальными тросиками притягивали к полу). А поправку на рост можно ввести в программу. И идеальная точность не нужна — в конце все равно переходить на P65 и сажать руками.
DrZlodberg
27.05.2016 12:48А в чём проблема просто сделать ещё одно стёклышко с отметкой, чтобы всегда знать, куда именно смотреть?
lozga
27.05.2016 13:29+4Для этого стеклышко или метку нужно выносить вперед или назад. Вообще это дурацкая идея, уже в начале 40-х появились коллиматоры, прекрасно решающие эту задачу. Была бы нужна точность — поставили бы коллиматор.
22sobaki
27.05.2016 15:42А астронавтов так же жестко тренировали в смысле посадки, как наших потенциальных лунных космонавтов?
«В ЛИИ мы с Алексеем Леоновым освоили пилотирование вертолета Ми-4. Методика тренировки заключалась в следующем: я летел с инструктором, передо мной шторкой все было закрыто. Инструктор выбирал
площадку для посадки и резко на нее снижался в режиме авторотации по кривой, близкой к той, по которой должен был спускаться лунный корабль. На высоте около 70 метров инструктор открывал шторку, и я должен был определить место, на которое можно было бы сесть, и произвести посадку. Это необходимо было сделать за 30–40 секунд. Именно такой резерв времени был у лунного корабля по запасам топлива. Мы не имели права на ошибку даже на тренировке…»lozga
27.05.2016 17:24У американцев был запас топлива. Армстронг, перелетая валуны, его тратил и еще чуть-чуть осталось.
Randl
27.05.2016 12:44+1Пошел писать тесты и прогонять код через статический анализатор, а также править все "временные" решения.
impetus
27.05.2016 13:48+4Главным дизайнером программы посадки был Алан Кламп (Allan Klumpp), недавний выпускник Массачусетского технологического института.
так-так-так… Чего-то я видимо упустил самого главного-важного про их образование и систему принятия кадровых решений — НЕДАВНЫЙ ВЫПУСКНИК стал руководителем одной из наиважнейших частей всей «луной программы»? Это что ж за образование такое у них, что недавние выпускники, (даже если это аспирантура имеется в виду) — могут руководить разработками на «переднем крае»? И — что ж у них за система назначения, что такого выпускника до такой работы допустили? — кто его назначил и почему никакой генерал/политик/кадровик/рогозин/ит.п. этому не воспрепятствовал?
Ну и — всё же вы достаточно владеете русским и англиским, что бы не путать дизайнера и конструктора (разработчкиа, инженера) и хотя в данном конкретном случае понятно что это не по эстетке специалист, всё же такие вещи надо отслеживать. типа «главныйконструктор» (в нашей традиции это не столько конструктор, сколько интегратор).lozga
27.05.2016 14:05В то время инженеры и программисты были сразу после университета, и это было нормой, зря удивляетесь.
В источнике не указан точный фронт его работ, он мог быть ведущим разработчиком, тимлидом, CTO, product owner'ом.impetus
27.05.2016 14:18не зря удивляюсь — мы тогда с ними шли ~нога в ногу — те же инженеры и программисты, но свежего выпускника у нас ближе чем к рутинным расчётам под отвественность старшего близко бы не подпустили.
lozga
27.05.2016 20:03Значит, у них было по-другому. В уже упомянутых тут Moon Machines рассказывается, какая вольница была в MIT и как из-за этого чуть сроки не сорвали.
Whisky667
03.06.2016 07:30Было бы интересно почитать о советских СУ, где цифра появилась на целых 10 лет позже, чем в США, но при этом умевших в автоматическую стыковку.
saboteur_kiev
27.05.2016 13:52+5Посмотрел видео с посадкой. Сколько всего с тех пор прошло, а момент до ужаса напряженный. Прямо прослезился, когда они сели.
motpac
27.05.2016 13:59А ведь есть достаточной старый сюжет на National Geographics как раз про эти программы и про ошибки, и там это преподносится непосредственными участниками событий вообще ни как байки, а вполне реальными событиями!
impetus
27.05.2016 14:07Если бы лунный модуль немного сбился с курса и оказался над неучтенным достаточно глубоким кратером, компьютер, получая данные от посадочного радара, мог бы подумать, что оказался выше траектории
одно из не то что бы версий. но скажем, «обстоятельств» гибели самолёта Качиньского — перед аэродромом был большой пологий овраг, глубиной до 50метров, соотв. радиовысотомер давал плюс, хотя фактически они уже были ниже полосы. (в базе Jeppesen этого аэродрома не было, поэтому заход был «вручную»)Yggaz
03.06.2016 07:58Да. А давление аэродрома они не выставили, и барометрический высотомер безбожно врал.
Symphel
До прочтения этой статьи моя вера в человечество, научно-технический прогресс и NASA в частности была выше.
Зато сегодня я буду тщательней тестировать свой код. И обязательно поправлю доки.
igruh
И не буду брезговать комментариями и говорящими именами процедур и переменных.