На днях в обычном офисном разговоре я сказал: «То, что у нас тут склад костылей — это нормально, во всех ИТ-проектах так. Наверное, из всего софта, который сделало человечество, только в программах посадки на Луну было все красиво». Сказав это, я полез в интернет, найти дополнительные факты к краткому научно-популярному рассказу для коллег о компьютерах и программах лунного модуля. Но одной из первых попалась ссылка, из которой выяснилось, что костыли, и, страшно сказать, баги были и в отшлифованном программном обеспечении, которое позволило человеку высадиться на Луну. А «Аполлоны» -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)


  1. Symphel
    27.05.2016 08:01
    +24

    До прочтения этой статьи моя вера в человечество, научно-технический прогресс и NASA в частности была выше.
    Зато сегодня я буду тщательней тестировать свой код. И обязательно поправлю доки.


    1. igruh
      27.05.2016 10:00
      +2

      И не буду брезговать комментариями и говорящими именами процедур и переменных.


  1. ayurtaykin
    27.05.2016 08:28
    +11

    Я где-то читал такую историю:
    Дейкстра пропогандировал свою методологию программирования, то как кодили в 70ых он считал небезопасным т.к. не было контроля за кодом.
    Как-то его пригласили в США на конференцию и там же были программисты отвечавшие за софт на апполонах. И вот преисполненный значимостью Дейкстра спрашивает у них:
    -Какую методологию вы используете? У вас же должен быть идеальный код! Как вы сделали такую идеальную программу?
    -Ха-ха, идеальную, за 2 недели до полета, при тесте мы узнали что наша программа считает у Луны отрицательная гравитация!

    Дейкстра тогда сильно разочаровался))


    1. lozga
      27.05.2016 08:42

      Вряд ли это дословно было, все-таки тестировали там очень много, и программа должна была быть готова за месяцы до полета. Но забавно :)


      1. ayurtaykin
        27.05.2016 08:46
        +1

        На русском не нашел, но вспомнил что видел это в фильме про Дейкстру.

        https://www.reddit.com/r/programming/comments/91vki/don_eyles_a_23yearold_selfdescribed_beatnik_who/c0b54v3


        1. lozga
          27.05.2016 09:08

          Спасибо, надо будет глянуть.


  1. Zzzuhell
    27.05.2016 09:03

    на ферритовых сердечниках, провода сквозь которые продевались вручную

    Придираюсь, но может поправить?
    «Продевать сквозь сердечники» по-русски криво звучит. Может заменим «сердечники» на «ферритовые кольца» (если именно они там были)? А если там были классические сердечники, тогда — «наматывали вручную»


    1. lozga
      27.05.2016 09:06
      +6

      Память на магнитных сердечниках (англ. magnetic core memory) или ферритовая память (англ. ferrite memory) — запоминающее устройство, хранящее информацию в виде направления намагниченности небольших ферритовых сердечников, обычно имеющих форму кольца.


    1. REPISOT
      27.05.2016 09:40
      +5

      Сердечник в индуктивности может быть любой формы, в том числе и тороидальной, который называют «кольца».


    1. Andy_Big
      27.05.2016 09:50

      Сердечники могут быть самой разной формы :)


      1. Zzzuhell
        27.05.2016 10:29

        Да я согласен, что фактически можно продевать сквозь сердечники. Просто звучит шероховато. Но, может, это у меня профессиональная деформация :)


        1. LSDtrip
          27.05.2016 13:58

          Дело в том, что их именно продевали, а не наматывали. Намотка подразумевает 1 или более витков. А их там не было.


          1. Wingtiger
            06.06.2016 09:53

            когда я учился в техникуме, у меня были практические занятия на одном заводе в одном городе, нужно было советскую машину по печати результатов теста памяти заменить на современный ПК (первый пень, когда существовал третий). И в соседнем цеху вручную наматывали эту память для кое-каких ракет (имхо она в любых ракетах будет одинаковой :) ) — тонкая проволока в ферритовом кольце в несколько витков. Я смотрел пока 2-3 витка не намотали (всего вроде бы было 5-10), потом меня позвали «Посмотрел? Иди отсюда!»
            Но соединения ячеек проводами на чистой, без печатных дорожек, плате впечатляет, да…


    1. Wesha
      27.05.2016 22:39
      +1

      > на ферритовых сердечниках, провода сквозь которые продевались вручную

      Для этого есть специальный древний термин — «прошивка» (которая действие от слова «прошивать», а не программа): https://ru.wikipedia.org/wiki/Встроенное_программное_обеспечение#История


  1. QWhisper
    27.05.2016 09:30
    +2

    На примере управления тягой, можно как раз рассматривать те самые нетривиальные проблемы, связанные с восстановлением давно потерянных технологий. Сколько там еще таких багов в железе может быть скрыто никто не знает. А если попытаться сейчас все собрать по старым чертежам, то может оказаться, что и вовсе взлететь даже не может, потому что какой нибудь вентиль не указали на схемах.


    1. lozga
      27.05.2016 09:54
      +7

      А вышивать вручную такую память в 21 веке — мазохизм.


      1. QWhisper
        27.05.2016 09:58
        +1

        А её и вышивать не надо, чтоб такой баг словить. Если бы не обнаружили его в этой истории, то при новой сборке ориентировались бы на 0.3с, ибо разработчик двигателя ничего не задокументировал. И легко могла бы катастрофа случится. Ибо в симулятор тоже бы сунули данные из документов. А фактически другое было бы совершенно.


        1. lozga
          27.05.2016 20:05

          Ну, эта история могла всплыть при изучении опыта, полученного в программе Apollo. Но мог и всплыть баг, который тогда не нашли и не заметили. Вот смеху-то было бы…


      1. Eklykti
        27.05.2016 20:15
        +1

        Да никто и не потащит такую память в 21 веке, ибо МАССА.


    1. DrZlodberg
      27.05.2016 10:36

      Зато какой простор для конспирологов сразу появится!


    1. impetus
      27.05.2016 14:15
      +2

      по старым чертежам — не собирается. американцы так утеряли технологию производства термоядерных бомб (точнее работы с плутониевым инициатором) и вынуждены были не так давно изобретать её с 0 заново на современном оборудовании — выяснилось что большой объём знаий, был не задокументирован ибо был у работников в головах и воспринимался ими как само собой разумеющееся очевидное. (их система секретности позволяет такие факты/обсоятельства публиковать и открыто обсуждать)


  1. REPISOT
    27.05.2016 09:38
    +4

    Главным дизайнером программы посадки был

    Когда уже переводчики начнут различать «дизайнер» и «разработчик»?
    В русском языке это разные понятия.


    1. lozga
      27.05.2016 09:57
      +1

      У него должность «principal designer», это не то разработчик, не то архитектор, не то вобще непонятно кто. В то время не было стандартизованных названий.


      1. locutus
        27.05.2016 10:34

        Ведущий проектант?


      1. REPISOT
        27.05.2016 14:49
        +2

        Гугл переводит как «главный конструктор»
        Дизайнер в русском языке — рисовальщик картинок.
        При чем тут то время? Статья когда переведена?


        1. REPISOT
          27.05.2016 14:53
          +4

          Или «ведущий конструктор»


      1. Zenitchik
        27.05.2016 16:41
        +2

        Этим же они называли акад.Королёва.


      1. beavole
        27.05.2016 17:23
        -1

        Прораб, без шуток.


    1. petrovnn
      29.05.2016 00:54
      -2

      Не хочу вас разочаровывать, но дизайн в переводе означает не «картинка», а «задумка». В данном контексте значение слова: «проектирование / план / рассчет».

      Более того, в веб-разработке дизайнер не тот кто «рисует картинку», а тот кто «думает» (значение: «замысел»). Поэтому хороший дизайнер не тот кто красиво рисует, а тот кто осмысленно рисует.


      1. REPISOT
        29.05.2016 10:37
        +2

        Не хочу вас расстраивать, но нормальные переводчики переводят по смыслу, а не дословно.
        А статья, уж конечно, не про веб-дизайн.
        Може, вам хочется получить комментарий от профессионального переводчика?


  1. Fedorkov
    27.05.2016 09:51

    Была холодная война, люди делали всё бегом-бегом и рисковали своими жизнями, чтобы обогнать друг друга. Из всего ПО надёжными были только системы управления ядерным оружием. Надеюсь…


    1. lozga
      27.05.2016 09:57
      +18

      Надейтесь :)


    1. g0dlike
      27.05.2016 10:14

      https://ru.wikipedia.org/wiki/Ложное_срабатывание_системы_предупреждения_о_ракетном_нападении_%281983%29
      Да, надейтесь:)


      1. Zenitchik
        27.05.2016 12:34

        Для этого она многоуровневая. Ложноположительный сигнал от спутникового компонента СПРН — как бы не новость и не неожиданность.


  1. 22sobaki
    27.05.2016 09:58
    +3

    пилот лунного модуля называл число, которое показывал на дисплее компьютер. Командир мысленно отмечал это число на шкале, которая была нарисована на иллюминаторе, и получал расчетную точку посадки.

    Шлем командира как-то фиксировался? Ведь от того, ближе или дальше голова от иллюминатора, и точка прилунения будет попадать в разные места на поверхности.


    1. QwertyQwerton
      27.05.2016 11:40

      Дак и люди не настолько стандартны чтобы глаза всегда в одно место попадали, даже с фиксацией

      возможно для уточнения данных использовалась удача


    1. MACman_84
      27.05.2016 12:19

      Предположу, что непосредственно шлем не фиксируется. Это осложнит управление.
      Да и нет необходимости в столь точной фиксации. Полагаю, расстояние от разметки до глаз много больше возможного перемещения головы пристёгнутого астронавта. Кроме того, вряд ли ошибка от смещения глаз (в текущих условиях) сильно ухудшит общую точность расчёта места посадки.


    1. lozga
      27.05.2016 12:21
      +5

      Фиксировалось место стояния астронавтов (их специальными тросиками притягивали к полу). А поправку на рост можно ввести в программу. И идеальная точность не нужна — в конце все равно переходить на P65 и сажать руками.


      1. DrZlodberg
        27.05.2016 12:48

        А в чём проблема просто сделать ещё одно стёклышко с отметкой, чтобы всегда знать, куда именно смотреть?


        1. lozga
          27.05.2016 13:29
          +4

          Для этого стеклышко или метку нужно выносить вперед или назад. Вообще это дурацкая идея, уже в начале 40-х появились коллиматоры, прекрасно решающие эту задачу. Была бы нужна точность — поставили бы коллиматор.


      1. 22sobaki
        27.05.2016 15:42

        А астронавтов так же жестко тренировали в смысле посадки, как наших потенциальных лунных космонавтов?

        «В ЛИИ мы с Алексеем Леоновым освоили пилотирование вертолета Ми-4. Методика тренировки заключалась в следующем: я летел с инструктором, передо мной шторкой все было закрыто. Инструктор выбирал
        площадку для посадки и резко на нее снижался в режиме авторотации по кривой, близкой к той, по которой должен был спускаться лунный корабль. На высоте около 70 метров инструктор открывал шторку, и я должен был определить место, на которое можно было бы сесть, и произвести посадку. Это необходимо было сделать за 30–40 секунд. Именно такой резерв времени был у лунного корабля по запасам топлива. Мы не имели права на ошибку даже на тренировке…»


        1. lozga
          27.05.2016 17:24

          У американцев был запас топлива. Армстронг, перелетая валуны, его тратил и еще чуть-чуть осталось.


          1. Eklykti
            27.05.2016 17:40
            +1

            Осталось даже не настолько «чуть-чуть», как показывали датчики. После посадки выяснилось, что датчики выдавали заниженное значение из-за колебаний топлива в баке, возникших при маневрировании.


            1. lozga
              27.05.2016 20:04

              Да, но в тот момент это бы ему не факт, что помогло


  1. Randl
    27.05.2016 12:44
    +1

    Пошел писать тесты и прогонять код через статический анализатор, а также править все "временные" решения.


  1. impetus
    27.05.2016 13:48
    +4

    Главным дизайнером программы посадки был Алан Кламп (Allan Klumpp), недавний выпускник Массачусетского технологического института.
    так-так-так… Чего-то я видимо упустил самого главного-важного про их образование и систему принятия кадровых решений — НЕДАВНЫЙ ВЫПУСКНИК стал руководителем одной из наиважнейших частей всей «луной программы»? Это что ж за образование такое у них, что недавние выпускники, (даже если это аспирантура имеется в виду) — могут руководить разработками на «переднем крае»? И — что ж у них за система назначения, что такого выпускника до такой работы допустили? — кто его назначил и почему никакой генерал/политик/кадровик/рогозин/ит.п. этому не воспрепятствовал?


    Ну и — всё же вы достаточно владеете русским и англиским, что бы не путать дизайнера и конструктора (разработчкиа, инженера) и хотя в данном конкретном случае понятно что это не по эстетке специалист, всё же такие вещи надо отслеживать. типа «главныйконструктор» (в нашей традиции это не столько конструктор, сколько интегратор).


    1. lozga
      27.05.2016 14:05

      В то время инженеры и программисты были сразу после университета, и это было нормой, зря удивляетесь.

      В источнике не указан точный фронт его работ, он мог быть ведущим разработчиком, тимлидом, CTO, product owner'ом.


      1. impetus
        27.05.2016 14:18

        не зря удивляюсь — мы тогда с ними шли ~нога в ногу — те же инженеры и программисты, но свежего выпускника у нас ближе чем к рутинным расчётам под отвественность старшего близко бы не подпустили.


        1. lozga
          27.05.2016 20:03

          Значит, у них было по-другому. В уже упомянутых тут Moon Machines рассказывается, какая вольница была в MIT и как из-за этого чуть сроки не сорвали.


          1. impetus
            30.05.2016 19:15

            вот-вот, не является ли этот момент ключевым в плане скорости инноваций


          1. Whisky667
            03.06.2016 07:30

            Было бы интересно почитать о советских СУ, где цифра появилась на целых 10 лет позже, чем в США, но при этом умевших в автоматическую стыковку.


  1. saboteur_kiev
    27.05.2016 13:52
    +5

    Посмотрел видео с посадкой. Сколько всего с тех пор прошло, а момент до ужаса напряженный. Прямо прослезился, когда они сели.


    1. impetus
      27.05.2016 14:06

      del, ошибся веткой


  1. motpac
    27.05.2016 13:59

    А ведь есть достаточной старый сюжет на National Geographics как раз про эти программы и про ошибки, и там это преподносится непосредственными участниками событий вообще ни как байки, а вполне реальными событиями!


    1. lozga
      27.05.2016 14:13
      +1

      Moon Machines? Отличный фильм.


      1. motpac
        27.05.2016 14:14

        Именно! Совсем недавно его снова повторяли, поэтому и свежи воспоминания.


  1. impetus
    27.05.2016 14:07

    Если бы лунный модуль немного сбился с курса и оказался над неучтенным достаточно глубоким кратером, компьютер, получая данные от посадочного радара, мог бы подумать, что оказался выше траектории
    одно из не то что бы версий. но скажем, «обстоятельств» гибели самолёта Качиньского — перед аэродромом был большой пологий овраг, глубиной до 50метров, соотв. радиовысотомер давал плюс, хотя фактически они уже были ниже полосы. (в базе Jeppesen этого аэродрома не было, поэтому заход был «вручную»)


    1. Yggaz
      03.06.2016 07:58

      Да. А давление аэродрома они не выставили, и барометрический высотомер безбожно врал.