Когда ошибка в коде стоит ракеты: Ariane 5, Therac-25 и Y2K
Программные ошибки обычно стоят нам пары минут раздражения. Но иногда одна строчка кода взрывает ракету за полмиллиарда долларов или убивает пациента. Три легендарные истории о том, как мелкий баг превращается в катастрофу.
Полмиллиарда долларов превратились в облако обломков за 37 секунд — из-за числа, которое не поместилось в отведённую ему ячейку памяти.
Самые дорогие баги в истории — это не «синий экран». Это напоминание, что код управляет ракетами, медицинскими аппаратами и банками, и цена ошибки бывает не нулевой.
Ariane 5: число, которое не поместилось
4 июня 1996 года европейская ракета Ariane 5 стартовала и через 37 секунд самоликвидировалась. Причина оказалась почти издевательски простой. В системе навигации работал код, унаследованный от старой ракеты Ariane 4. Этот код брал значение горизонтальной скорости — большое 64-битное число — и записывал его в 16-битную переменную.
У Ariane 5 скорость нарастала куда быстрее, чем у предшественницы. Число просто не поместилось в маленькую ячейку — это называется переполнением. Программа выдала ошибку, бортовой компьютер счёл данные бессмысленными, ракета резко довернула и развалилась от перегрузки, после чего сработала автоматическая самоликвидация. Самое горькое: тот код вообще не был нужен после старта — он остался включён «на всякий случай».
Therac-25: когда баг убивает
Therac-25 — аппарат лучевой терапии 1980-х. В период с 1985 по 1987 год он как минимум шесть раз облучил пациентов чудовищными дозами радиации; несколько человек погибли. Виновата была ошибка, которую программисты называют состоянием гонки (race condition).
Если опытный оператор слишком быстро вводил команды и исправлял опечатку, две части программы успевали «разойтись во времени»: аппарат думал, что защитный экран на месте, хотя его не было, и выдавал пучок в сотни раз мощнее нужного. На экране при этом светилась невнятная ошибка вроде MALFUNCTION 54, к которой все привыкли и которую игнорировали. Трагедия Therac-25 стала хрестоматийным примером в учебниках: нельзя доверять безопасность людей одному только софту без аппаратных предохранителей.
Y2K: апокалипсис, которого не случилось
Третья история — про экономию двух символов. Десятилетиями программисты хранили год двумя цифрами: 99 вместо 1999. Память была дорогой, и так казалось разумным. Но при переходе в 2000 год 99 + 1 давало 00 — и компьютер мог решить, что наступил 1900-й.
Боялись всего: что встанут банки, упадут самолёты, перестанет начисляться зарплата. На исправление по всему миру потратили, по оценкам, сотни миллиардов долларов — программисты вручную перелопачивали старый код. В ночь на 1 января 2000-го почти ничего не сломалось — и это породило миф, будто «угроза была выдумана». На самом деле наоборот: катастрофы не случилось именно потому, что её предотвратили колоссальным трудом.
Что объединяет эти истории
Во всех трёх случаях баг был не в «сложной математике», а в скучных мелочах: размер переменной, порядок действий, формат даты. Отсюда главные уроки индустрии:
- Проверяй границы значений — что будет, если число окажется слишком большим?
- Не доверяй критичные вещи одному софту — нужны аппаратные предохранители.
- Старый код, перенесённый в новые условия, опасен: проверяй заново все допущения.
Каждый из этих провалов сделал последующие системы безопаснее. Цена уроков, к сожалению, оказалась очень высокой.