В работе программиста есть один минус, который одновременно является и плюсом. С одной стороны, клиент и конечные пользователи находятся где-то там, за океаном, поэтому ты не услышишь звонка с благодарностью за хорошо проделанную работу. Это минус. С другой стороны, если по твоей вине случается проблема, то тысячи километров и водная толща океана как бы демпфируют удар. Все-таки, крики по e-mail переносятся проще, чем по телефону. Это помогает не слишком стрессовать на работе. Но не каждому уготована ненапряжная атмосфера. Дальше поговорим о тех исторических событиях, когда из-за допущенных ошибок IT-специалистам приходилось здорово понервничать.
Дорогой Integer overflow
Сбой в программе ракеты-носителя Ariane 5, которая в 1996 году должна была вывести на орбиту несколько спутников, закончился взрывом ракеты в воздухе. С учетом установленного на борту оборудования авария обошлась в 500 млн долларов. Строительство и разработка ракеты длилась 10 лет и стоила 7 млрд долларов. Все эти усилия и траты пошли коту под хвост из-за ошибки integer overflow.
Когда горизонтальное ускорение превысило допустимое значение, программа попыталась впихнуть
Во время расследования инцидента была проведена симуляция полета Ariane 5 с использованием другой инерциальной платформы — баг воспроизвели. Программа сбойнула точь-в-точь как в случае с реальной ракетой.
С одной стороны, причиной сбоя можно назвать оптимизацию кода, который не проверял допустимые значения для той конкретной переменной — программисты не предполагали, что число, описывающее горизонтальную скорость, может быть настолько великим.
С другой стороны, провинились и тестировщики — хоть и были произведены сотни тестов и тысячи последующих корректировок, никто не сделал полноценного анализа опорной инерциальной системы. Проблема была в том, что на Ariane 5, чья траектория полета сильно отличалась от Ariane 4, поставили навигационный софт от Ariane 4. Тот случай, когда железо проапгрейдили, а софтину обновить забыли.
Миссия Aполлон-8
Наверняка этого диалога очень не хватало Джеймсу Ловеллу — члену экипажа Аполлон-8, который во время навигационного прицеливания и маневрирования случайно удалил из памяти данные о положении модуля. В результате гиростабилизатор «подумал», что корабль находится на той же позиции, что и до старта, и включил двигатель, чтобы «исправить» положение модуля.
Когда космонавты поняли, почему модуль изменил свою позицию, им ничего не осталось, кроме как вводить данные вручную. Ловеллу потребовалось около 10 минут, чтобы сделать необходимые расчеты, и еще около 15 минут — чтобы ввести данные в компьютер. К счастью, все выжили. Но эта история могла иметь совсем другой финал.
Один символ стоимостью в 135 миллионов долларов
В 1962 году для первого полета вокруг Венеры был запущен космический аппарат Mariner 1. Запуск с мыса Канаверал прошел успешно, но через несколько минут корабль начало уводить в сторону. Из-за сбоя навигационной программы рулить стало невозможно, поэтому, чтобы избежать падения обломков над морскими путями или населенными пунктами, было решено ракету взорвать. Прям как в голливудских блокбастерах, оператор успел отдать команду об уничтожении за 6 секунд до расстыковки.
Расследование не дало четких ответов о причинах аварии. Считается, что виной всему оказалась комбинация двух бед: неисправность антенны и глюки в бортовом ПО
По одной из версий, проблема была в том, что программист, который переписывал формулу, забыл дописать верхнюю черту:
Упущенное надчеркивание привело к тому, что небольшие отклонения скорости воспринимались программой как значительные. Это вызывало избыточную корректировку траектории, и ракета сошла с курса. Вероятно, по той причине, что надчеркивание «‾» внешне похоже на тире «-», в прессе, все-таки, чаще упоминалось тире.
Среди других версий указывается также точка вместо запятой, из-за чего, например, «DO 5 K=1. 3
» мог быть интерпретирован как «DO5K = 1.3
». Хотя, нет никаких достоверных источников, подтверждающих, что на борту использовался Fortran.
Также ходили слухи о пропущенной запятой и лишней точке с запятой.
Но что бы это за символ ни был, его стоимость равняется 135 миллионам долларов и сорванной миссии. Неплохая цена за одну синтаксическую ошибку.
Этот взрыв чем-то напоминает пропущенное надчеркивание
Подели меня на ноль в Windows NT
Технология «умный корабль», которую в 1996 году запустили на крейсере USS Yorktown, позволила оптимизировать процессы и значительно облегчить морякам их труд. На корабле была установлена сеть из нескольких десятков Pentium-Pro, на которых стояла Windows NT 4.0.
Все было хорошо до 1997 года, когда во время маневров один из членов экипажа ввел в одно из полей базы ноль. Зачем он это сделал — история умалчивает. Но дальше было деление на ноль и, как следствие, buffer overflow, который вырубил все компы и оставил корабль в дрейфе почти на три часа. Хорошо, что это случилось не в бою.
Но нельзя сказать, что дело было исключительно в недоработке программного обеспечения корабля. Сам заместитель технического директора военно-морского флота Рон Редман впоследствии заявлял, что у них на крейсере то и дело возникали ошибки, связанные с Windows NT. По его словам, установка NT была политическим решением, а он сам скорее выбрал бы Unix, потому что он лучше себя проявляет в управлении техникой, тогда как NT хороша разве что для передачи данных.
В итоге имеем недоработку ПО крейсера и лобби Билла Гейтса на установку его продукта на корабль, которые и стали причиной аварии.
Здесь разрешается пустить скупую слезу ностальгии. Но только одну
Взрыв газопровода в Сибири
В 1982 году добрые молодцы из ЦРУ получили от Канады слив инфы о том, что КГБ планирует украсть у них систему управления газопроводом. Видимо, желая проучить советских коллег, ЦРУ подсунуло в систему троян и позволило её украсть. Коллеги клюнули. Установленная на некоторых газопроводах СССР программа поначалу работала нормально, в штатном режиме управляя насосами, турбинами и другими газо-транспортными приблудами. Но при отработке режима тестирования троян сделал свое грязное дело, что привело к разрыву газопровода и последующему взрыву силой в три килотонны.
Это был самый сильный неядерный взрыв и пожар, которые было видно из космоса. Мониторы NORAD (North American Aerospace Defense Command) даже сообщили о ядерном взрыве, но спутники не засекли характерного электромагнитного импульса.
В СССР об этой аварии ничего не сообщалось, так что эта история до сих пор кормит умы конспирологов.
По этой версии СССР не воровал, а покупал систему управления газопроводом
Race condition
Не зря на собеседованиях одни из самых часто задаваемых вопросов — о многопоточности. В 2003 году на северо-востоке Америки из-за сбоя в энергосистеме один за другим начало вырубать электричество.
Эта вторая в мире по масштабам авария оставила без света 10 миллионов канадцев и 45 миллионов американцев. В некоторых районах остановились поезда, прекратилась подача воды, остановились фабрики, закрылись аэропорты. Из сотен поездов метро Нью-Йорка пришлось эвакуировать тысячи людей. Стояла влажная жара в 33 °C, кондиционеры не работали, сотовая связь была почти мертва. К таксофонам выстраивались очереди.
Этот интересный кошмар закончился через два дня, когда неполадки устранили, и в большинстве районов было возобновлено электроснабжение.
Главной причиной аварии стал баг в системе управления энергетической компании FirstEnergy в Огайо. Деревья, которые находятся под линиями электропередач, периодически подстригают. Но в Кливленде этого не сделали. В результате высокого уровня электропотребления провода нагрелись и расширились, из-за чего провисли ниже обычного и коснулись деревьев. Случилось замыкание, и электростанция в Кливленде вышла из строя. Аварийная система не предупредила персонал о перегрузках, и поэтому случилось каскадное отключение еще около сотни электростанций.
В ходе разбора полетов в построенной на базе Unix автоматизированной системе управления обнаружили race condition, который вызывал подвисание сигнализации в комнате персонала на целый час. Таким образом, сотрудники станции не получали никаких сигналов о том, что произошла беда.
Ущерб составил порядка 6 миллиардов долларов, зато теперь даже кошка директора электростанции знает, что такое race condition и с чем его едят.
Проблемы с многопоточностью в программе вызвали проблемы с многопоточностью в реальном мире
Истории известны многие другие более фатальные и дорогие случаи — в медицине, в армии. Это издержки многих профессий, в том числе таких безобидных, казалось бы, как программирование и тестирование. Поэтому перед трудоустройством на новый проект полезным будет прозондировать его на предмет ответственности и степень нервозности, предварительно подсчитав количество уже седых волос. Может случиться и так, что овчинка не стоит выделки.