Александр Дракон ([info]aldragon) wrote,
@ 2005-09-25 21:00:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Гибель "Маринера-1": запятая или дефис?

Между прочим, в середине двадцатого века тоже была история
с неправильной точкой. Только точка была в программе на
Фортране. А вместо мухи была дура-секретарша, которая
эту программу перепечатывала. Из-за ее опечатки
американский космический корабль промахнулся
мимо Венеры. Восемьдесят лимонов
баксов улетели нафиг.

Мерси Шелли, "Паутина"

21 июля 1962 с Мыса Канаверал был произведен запуск ракеты-носителя "Атлас", несущей аппарат "Маринер-1", который должен был отправиться к Венере.

Через несколько минут после взлета ракета отклонилась от курса и была подорвана из соображений безопасности.

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

Широкое распространение получила "фортрановская" версия "ошибки на миллиард долларов" . Например,
в этой статье
рассказывается об устроенной однажды на международной конференции компьютерного профиля своего рода викторине. Вопрос номер тринадцать и "правильный" ответ на него:

Вопрос 13: Как ошибка программиста привела к потере венерианского зонда "Маринер"?
Ответ 13: В программе на Фортране, вместо "DO 3 I = 1,3" было набрано "DO 3 I = 1.3", что было воспринято компилятором как присвоение значения 1.3 переменной DO3I [Annals of the History of Computing, 1984, 6(1), p. 61]

Cтатья, на которую дана ссылка, называется "Fortran anecdotes" (напоминаю, что "anecdote" не обязательно подразумевает вымышленность, в отличие от русского "анекдот", и переводится скорее как "байка").
Её абстракт можно найти здесь. Полный текст, увы, в свободный доступ не выложен.

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

Выдержки из форума "Forum on Risks to the Public in Computers and Related Systems":
(Перевод мой, местами достаточно свободный; указаны ссылки на оригинальные тексты)

--- http://catless.ncl.ac.uk/Risks/5.65.html ---
Mariner I and computer folklore
Jon Jacky <jon@june.cs.washington.edu>
Tue, 24 Nov 87 22:13:08 PST


Марк Брэйдер спрашивает, что в действительности произошло с "Маринером-1", венерианским зондом,который был подорван после того, как вскоре после взлета отклонился от курса. Одни версии обвиняют в случившемся пропущенный дефис, другие - замену запятой на точку.

Я интересовался этим около года назад. Я потерял следы обеих версий, так и не найдя их общего начала. Вот то, что мне удалось раскопать. Байка рассказывается так часто, что действительно надо разобраться в этом раз и навсегда.

New York Times, July 23, 1962, p. 1 col. 2: "Атлас", несущий "Маринер", отклонился от курса и был уничтожен дежурным офицером безопасности

New York Times, July 28, 1962, p. 1 col. 4: Маринер-1 потерян из-за некорректных команд бортового компьютера. Проблема описана как "пропущенный дефис".

Потеря "Маринера-1" связана с заменой запятой на точку и программе на ФОРТРАНе. Henry S. Tropp, "FORTRAN Anecdotes," ANNALS OF THE HISTORY OF
COMPUTING, Vol 6, No. 1, Jan 1984 pps. 61,62.
Тропп, очевидно, цитирует Jim Horning in ACM SOFTWARE ENGINEERING NOTES, 4(4) Oct. 1979 p. 6,
который, в свою очередь, цитирует G.J. Myers, SOFTWARE RELIABILITY: PRINCIPLES AND PRACTICES, New York,
John Wiley, 1976, p. 275.


Похоже, что версия о пропущенном дефисе гораздо старше. Я не смог отследить версию "точка-вместо-запятой" дальше статьи Майерса. Однако, я не готов считать версию о дефисе подтвержденной. У меня нет копии заметки в NY TIMES - мне пришлось делать записи с микрофильмов - но я помню, что она выглядела слегка запутанной, как если бы журналист не полностью изложил то объяснение, которое ему дали. Кроме того, мне кажется, я встречал версию "точка-вместо-запятой" и задолго до статьи Майерса,
когда я учился в колледже в 1970. Может, кто нибудь найдет более старые цитаты?
[...]
Интересно, как один случай может породить две противоречивые версии. Теперь они живут независимой жизнью — the RISKS index in ACM SOFTWARE ENGINEERING NOTES, 12(1) Jan 1987 p. 23 приводит обе версии, как если бы это были два разных события. Версии продолжают множиться, порождая все более противоречивые варианты.
Часто упоминается "Маринер-18", потерпевший неудачу из-за пропущенного "НЕ" в программе. Не очень понятно, откуда это взялось — возможно, еще одно искажение истории "Маринера-1", или же "Маринера-8", о котором имеющиеся у меня источники говорят "был утерян при старте". Однако, "Маринера-18" не существовало — последним из Маринеров был десятый, запущенный к Венере в 1973.

--- http://catless.ncl.ac.uk/Risks/5.66.html ---
Mariner I
Eric Roberts <roberts@src.dec.com>
Wed, 25 Nov 87 18:33:14 pst


Когда Стив Берлин и я писали главу для новой книги "Computers in Battle", я попытался найти более полную информацию о истории Маринера-1. Похоже, что версия о замене запятой на точку в операторе ФОРТРАНа DO впервые появляется в следующей цитате из G.J.Meyers, _Software Reliability: Principles and Practice_ (New York: John Wiley, 1976):

"В программе на ФОРТРАНе, управляющей первоей венерианской миссией Штатов, программист записал оператор DO в примерно таком виде:

DO 3 I = 1.3

Он совершил ошибку - поставил точку вместо запятой. Однако, компилятор воспринял это как допустимое выражение, поскольку в ФОРТРАНе нет зарезервированных выражений, пробелы игронируются, и переменные не должны быть предватерительно задекларированы. Хотя оператор, очевидно, является некорректно записанным оператором DO, компилятор интерпретировал его как присвоение новой переменной DO3I значения 1.3. Эта "мелкая" ошибка привела к провалу миссии. Конечно, часть ответственности за эту ошибку на миллиард долларов лежит на программитсе, но не следует ли также винить в ней и разработчиков ФОРТРАНа?"



К сожаление, Мейерс не приводит ссылок на эту историю. Несколько лет назад, во время работы над презентацией "Reliability and Risk", его спросили об этом. Мейерс не смог точно вспомнить источник.

После того, как долгие поиски в этом направлении так и не внесли ясности, я просмотрел подшивки NY Times за 1962 год. Наиболее информативная статья появилась в NY Times в субботу, 28 июля - через шесть дней после неудачного запуска:

Из-за дефиса потеряна венерианская ракета.
Глэдвин Хилл, специально для NY Times
Лос-Анджелес, 27 июля
Как признали сегодня ученые, отсутствие дефиса в неких математических данных привело к потере запущенного к Венере аппарата стоимостью $18500000.
Аппапат, "Маринер-1", отклонился от курса через четыре минуты после запуска с Мыса Канаверал, и был вынужденно подорван в атмосфере.
Ошибка ислледовалась на протяжении этой недели [...]
Следующая попытка запуска состоится в августе. Работы были приостановлены до выяснения, что пошло не так во время первого пуска.
Дефис, как объяснил представитель лаборатории, был символом, который должен был быть введен в компьютер наряду с массой других закодированных инструкций. Первая фаза полета контролировалась по радиосигналам, основанным на расчетах этого компьютера.
Как утверждается, ракета стартовала штатно. Однако непредвиденное отсутствие пробела привело к подаче компьютером некорректных сигналов...


Первый абзац звучит так, как будто это была ошибка входных данных, а вовсе не ошибка в программе. Дальше, однако, говорится, что это была часть "закодированных инструкций". Другие газетные заметки [...] по-видимому, подтверждают, что это была ошибка в программе.

Это мнение согласуется с недавней заметкой Генри Спенсера (RISKS-5.64), который цитирует "Far Travellers", Oran W. Nicks. В целом, это объяснение выглядит более документальным свидетельством, чем "фортрановская" версия, изложенная Мейерсом. Другие несоответствия в тексте Мейерса (в частности, $18,500,000 << $1,000,000,000), также уменьшают его достоверность.

Конечно, "фортрановская" версия впоследствии получила широкое распространение (это, в конце концов, очень симпатичная история); можно, например, назвать следующие источники:
o Jim Horning, "Note on Program Reliability," _Software
Engineering Notes_, 4:4, October 1979, p. 6.
o Peter Neumann, "Letter from the Editor," _Software Engineering
Notes_, 8:5, October 1983, p. 4 (credited to David Smith of
CMU, who heard it from his instructor in 1970 or 1971).
o H.S. Tropp, "Fortran Anecdotes," _Annals of the History of
Computing_, 6:1, January 1984, p. 61.
o Peter Neumann, "Risks to the Public," _Software Engineering
Notes_, 11:5, October 1986, p. 17.


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

В "Computers in Battle" я лично написал:

Вскоре после запуска 22 июля 1962 года, венерианский зонд "Маринер-1" отклонился от курса и был уничтожен.
Как выяснилось позже, проблема была в ошибке в одном знаке в контролирующей программе.

Это покрывает обе версии и выглядит достаточно достоверным утверждением.

FORTRAN pitfalls (Re: RISKS-5.63)
Jim Duncan <jim@xanth.cs.odu.edu>
Thu, 26 Nov 87 13:40:20 EST


(К вопросу о проблеме с DO ... I=1.3:)

Я тоже слышал эту байку много раз, и каждый раз у аппарата другое название и он летит к другой планете.
[...]


--- http://catless.ncl.ac.uk/Risks/5.73.html ---
Mariner 1 from NASA reports
Doug Mink <mink%cfa@harvard.harvard.edu>
Tue, 8 Dec 87 11:42:36 EST


В окончательном отчете по проекту "Маринер-Венера" (NASA SP-59, 1965) приводится хронология последних минут "Маринера-1":

4:21.23 Отрыв
4:25 Нештатный маневр по тангажу и рысканью
"...команды управления подавались, но неверная форма записи уравнений движения привела к уходу аппарата с курса"
4:26:16 Аппарат уничтожен дежурным офицером безопасности за 6 секунд до того, как разделение "Атласа" и "Агены" сделало бы это невозможным.

В этом отчете не уточняется, что именно пошло не так, но "неверная форма записи уравнений движения" определенно указывает на компьютерную ошибку.В "Astronautical and Aeronautical Events of 1962", отчете НАСА от 12 июня 1963 года, говорится:

"При "разборе полетов" было установлено, что отсутствие дефиса в закодированных компьютерных командах привело к подаче некорректных управляющих сигналов аппарату "Маринер", запущенному с помощью двухступенчатого носителя "Атлас"-"Агена" с Мыса Канаверал 21 июля 1962 года. Отсутствие дефиса в обрабатываемых данных привело к выполнению компьютером серии ненужных коррекций курса, в результате чего аппарат ушел с расчетной траектории и его пришлось уничтожить".

Итак, это все-таки был дефис.

Давая показания Правительственному Комитету по Науке и Космонавтике 31 июля 1962 г., Ричард Б.Моррисон, NASA's Launch Vehicles Director, сообщил, что ошибка в компьютерной программе для венерианского зонда "Маринер Р-1" привела в итоге к его уничтожению, когда он отклонился от курса.

Обратите внимание, что внутренняя комиссия была созвана и пришла к заключению через ШЕСТЬ ДНЕЙ после неудачного запуска. У меня не было времени просмотреть записи показаний Моррисона, но я ожидаю, что в них содержится больше деталей. Скорость, с которой межведомственная комисиия собралась для решения проблемы - так что второй запуск мог быть осуществлен до закрытия расчетного 45-дневного "окна", и медлительность, с которой подобные происшествия расследовались впоследствии (не только взрыв "Челленджера", но и проблемы с "Титаном", "Атласом" и "Арианой"), могут сказать нам кое-что о том,
1). сколь большой риск был приемлем в 60-х годах;
2). как выросла сложность связанного с запусками hardware и software;
3). как вырос бюрократический аппарат, какждый член которого стремится избежать ответственности. Возможно, человек, который сделал опечатку (версия о замене дефиса на минус выглядит разумной) был уволен, но в целом все документы, с которыми я ознакомился, показывают, что потеря аппарата была воспринята как неизбежная часть цены покорения космоса.

Mariner I
"Marty Moore" <mooremj@aim.rutgers.edu>
11 Dec 87 16:54:00 EST


У меня есть кое-что сказать по поводу Маринера-1, основываясь на опыте моей работы на Мысе:

1. Маринер-1 был до меня, но я слышал эту историю от математика, работавшего на Мысе с 1960 года. Он говорил, что записанный математическими формулами алгоритм включал булевскую переменную "R". В месте, где была допущена ошибка, математик написал написал "NOT-R", т.е. букву R с чертой над ней; программист же, использующий алгоритм, не заметил черту, и, таким образом, исопльзовал "R" вместо "NOT-R". Это объяснение впоследствии превратилось в "пропущенный дефис", "пропущенное НЕ" или "ошибочные входные данные", которые мы видим в последующих обсуждениях.

2. Я полагаю, что "фортрановская" версия крайне неправдоподобна. Вспомним, что ошибка содержалась в бортовом компьютере. Очень непохоже, чтобы такой компьютер был запрограммирован на ФОРТРАНе в 1962 году, с учетом того, что первое использование ФОРТРАНа в наземных системах на Мысе я видел не раньше 1978 года! (Конечно, я не следил за всеми используемыми компьютерами, так что ФОРТРАН мог использоваться и раньше - но я бы очень удивился, узнав, что это началось более чем на пару-тройку лет раньше). Возможно, что "фортрановская" версия произошла от какой-то другой ошибки, связанной с заменой запятой на точку. Поскольку проблема "Маринера" также являлась "ошибкой в одном символе", истории могли "слиться" одна с другой.


Finally, a primary source on Mariner 1
John Gilmore <hoptoad.uucp!gnu@cgl.ucsf.edu>
Sun, 13 Dec 87 05:30:10 PST


Мой друг Тэд Флинн из НАСА раскопал эту ссылку о катастрофе "Маринера-1": "Far Travelers — The Exploring Machines", by Oran W. Nicks, NASA, 1985. Никс в то время был руководителем Лунной и Планетной Программ НАСА.

Первая глава, озаглавленная "Виновен дефис", повествует:

"Мы наблюдали за первым запуском с Мыса Канаверал аппарата, направляющегося к иной планете. Целью была Венера, аппарат назывался "Маринер-1".
[...]
"Вскоре была проведена пресс-конференция; все, что можно было сказать — все, что было с определенностью известно — то, что по неизвестной причине аппарат отклонился от курса и был подорван дежурным офицером безопасности в соотвествии с предписаниями"
[...]
"Инженеры, проанализировавшие записи телеметрии, вскоре обнаружили, что причиной послужили две независимых ошибки. Антенна ведения на "Атласе" была изготовленна некачественно, с параметрами ниже заявленных. Когда получаемый ракетой сигнал стал слабым и зашумленным, ракета потеряла привязку к сигналу с Земли, посредством которого передавались команды поворота. Такая возможность была предусмотрена; в случае потери сигнала радиоведения бортовой компьютер должен был игнорировать сигналы с неисправной антенны и выполнять собственную программу, которая, возможно, смогла бы обеспечить успешный запуск. Однако, в этот момент проявилась вторая ошибка. Каким-то образом в программе ведения оказался пропущенным дефис, что привело к некорректному управлению ракетой - уходу влево и опусканию носа. Дефис был пропущен и во время предыдущих успешных запусков "Атласа", но эта часть программы не использовалась, т.к. не происходило разрыва радиосвязи. Таким образом, первая попытка Штатов осуществить межпланетный перелет потерпела крах из-за пропущенного дефиса."

—————————
Александр Дракон
25.09.2005
Слава Багу!