Раздел 2.2. Интерлюдия «Цена ошибки»: Apollo vs Space Shuttle
драматическая пауза между рассказами о UNIX и базах данных. Здесь мы поговорим о жизни и смерти. В этом разделе мы столкнем лбами две философии разработки, каждая из которых спасла жизни астронавтов, но совершенно разными способами.
Раздел 2.2. Интерлюдия «Цена ошибки»: Apollo vs Space Shuttle
Это не просто история о ракетах. Это история о двух религиях программирования.
В обычной жизни цена программной ошибки — это раздражение. Если у вас завис Word, вы потеряете час работы. Если упал сервер Instagram, подростки не выложат фото. Если в банковском приложении баг, компания потеряет деньги, но вернет их страховкой.
В космосе цена ошибки — это смерть. Мгновенная и гарантированная. Когда вы летите со скоростью 28 000 км/ч в вакууме, перезагружать компьютер уже поздно.
История освоения космоса дала нам два диаметрально противоположных ответа на вопрос: «Как написать надежный код, если ставки максимально высоки?».
- Философия Apollo (1960-е): «Ошибки неизбежны. Человек ошибается, железо ломается. Система должна быть спроектирована так, чтобы проглатывать ошибки и выживать».
- Философия Shuttle (1980-е): «Ошибки недопустимы. Код должен быть математически совершенным. Мы не будем исправлять баги, мы будем доказывать, что их нет».
А. Маргарет Гамильтон и Apollo 11: Искусство выживания в хаосе
1. Контекст: Вязаная память
Чтобы понять подвиг программистов Apollo, нужно понять, на чем они работали. Бортовой компьютер AGC (Apollo Guidance Computer) был чудом миниатюризации 60-х.
- Память: Около 72 КБ (килобайт!) постоянной памяти и 4 КБ оперативной.
- Носитель: Это не были чипы. Это была Core Rope Memory — ферритовая память. Программы были буквально сшиты вручную. Женщины на ткацкой фабрике (которых называли «Little Old Ladies») продевали медные провода через крошечные магнитные кольца.
- Провод прошел сквозь кольцо = 1.
- Провод прошел мимо кольца = 0.
- Исправление багов: Если вы нашли ошибку в коде, вы не могли нажать Ctrl+Z. Вам нужно было ждать месяцы, пока женщины переплетут физические провода в блоке памяти.
В таких условиях, когда память стоила миллионы долларов за килобайт, код должен был быть шедевром оптимизации.
2. Сцена: Три минуты до Луны
20 июля 1969 года. Лунный модуль «Орел» отделился от командного модуля и начал спуск. На борту Нил Армстронг и Базз Олдрин. Они летят ногами вперед, иллюминаторами вниз, глядя на проносящиеся кратеры.
До поверхности 2000 метров. Топлива осталось критически мало — компьютер вел их в каменистую зону, и Армстронгу пришлось перехватить управление, чтобы найти ровную площадку. В этот момент перегрузки и стресса на крошечном дисплее загорается желтая аварийная лампа PROG и код: 1202.
Армстронг передает в ЦУП: «Give us a reading on the 1202 Program Alarm». В его голосе напряжение. Никто в модуле не знает, что это. Они тренировали сотни отказов, но этот код появлялся редко.
3. Человек, который сказал «GO»
В Центре управления полетами в Хьюстоне сидит Стив Бейлс, 26-летний инженер по навигации (GUIDO). У него есть примерно 15 секунд на решение.
- Если это критический сбой памяти — нужно кричать ABORT.
- Если они отменят посадку сейчас, взлетная ступень отстрелится, и они вернутся на орбиту. Миссия будет провалена. Кеннеди не выполнит обещание. Миллиарды долларов сгорят.
- Если он разрешит посадку, а компьютер зависнет через 10 секунд — Армстронг и Олдрин разобьются.
Бейлс смотрит на своего помощника Джека Гармана, у которого под стеклом стола лежит шпаргалка со всеми кодами ошибок. Гарман шепчет: «Это переполнение исполнителя (Executive Overflow). Если оно не постоянно, мы можем лететь».
Бейлс нажимает кнопку микрофона и произносит историческое: «We're GO on that alarm!».
4. Техническая суть: Почему это случилось?
Виноват был не софт, а «железный» баг и ошибка в чек-листе астронавтов. Радар стыковки (Rendezvous Radar) нужен для того, чтобы найти корабль-матку на орбите при возвращении. При посадке он не нужен. Но чек-лист требовал оставить его переключатель в положении «AUTO». Из-за электрической наводки (неправильного заземления) радар начал сходить с ума. Он начал посылать процессору тысячи прерываний в секунду, требуя вычислить угол сближения с орбитальным модулем.
Компьютер AGC должен был управлять посадкой (считывать данные гироскопов, управлять тягой двигателя). Это сложная математика. А тут еще и радар кричит: «Посчитай меня!». Буфер задач переполнился. Процессор захлебнулся.
5. Гений Маргарет Гамильтон: Асинхронность
Почему компьютер не завис, как Windows с «Синим экраном смерти»? Потому что Маргарет Гамильтон, главный инженер софта Apollo, спроектировала операционную систему на основе Приоритетов.
В системе не было жесткого цикла. Был «Менеджер задач». Когда произошла ошибка 1202 (переполнение), ОС сделала следующее:
- Остановила все вычисления.
- Посмотрела на список задач в очереди.
- Увидела задачу «Обработка радара». Приоритет: Низкий.
- Увидела задачу «Управление тягой двигателя». Приоритет: Высокий.
- Она убила процесс радара, очистила память и перезапустила процесс двигателя.
Все это заняло доли секунды. Для Армстронга это выглядело как мигание экрана. Компьютер как бы говорил: «Я тут немного занят ерундой, сейчас сброшу лишнее и вернусь к управлению двигателем. Не волнуйся, мы не разобьемся».
Это называется Graceful Degradation (Изящная деградация). Система пожертвовала второстепенной функцией (радаром и обновлением цифр на экране), чтобы спасти главную функцию (жизнь экипажа).
Наследие: Сегодня так работает Netflix или Amazon. Если у них падает база данных с историей ваших просмотров, сайт не падает целиком. Он просто показывает вам главную страницу, но без надписи «Вам может понравиться».
Б. Харлан Миллс и Space Shuttle: Монастырь чистого кода
Прошло 12 лет. Технологии шагнули вперед. На смену капсулам пришел Space Shuttle. Это была совсем другая машина. И требовала она совсем другой философии.
1. Кирпич с крыльями: Почему человеку нельзя доверять
Аполлон был стабилен. Если отпустить ручку управления, он просто продолжал лететь по инерции. Шаттл — это аэродинамический кошмар. Это 100-тонный планер с маленькими крыльями, который не летит, а падает с орбиты на скорости 27 000 км/ч.
Он аэродинамически нестабилен. Чтобы удержать его нос по курсу, рули и закрылки должны совершать сотни микрокоррекций в секунду. Человек физически не может реагировать с такой скоростью. Шаттл — это первый корабль, построенный по принципу Fly-by-Wire (Электродистанционное управление). Между ручкой пилота и крыльями нет тросов. Ручка — это джойстик, который посылает сигнал компьютеру, а компьютер решает, как повернуть крыло.
Если компьютер зависнет хотя бы на 200 миллисекунд во время входа в атмосферу, Шаттл начнет кувыркаться, и его разорвет на части перегрузкой. Перезагрузка (как у Маргарет Гамильтон) здесь невозможна. Времени нет.
2. Монастырь IBM: Метод «Чистой комнаты»
Софт для Шаттла (систему PASS) писало подразделение IBM Federal Systems в Хьюстоне. Ими руководил Харлан Миллс.
Миллс был фанатиком дисциплины. Он считал, что программирование — это не творчество, а ветвь математики. Он посмотрел на то, как пишут код в Кремниевой долине (написал — запустил — упало — поправил), и назвал это «тыканьем пальцем в небо».
Он внедрил методологию Cleanroom Software Engineering:
- Запрет на запуск: Программистам запрещалось компилировать и запускать свой код. Вообще. Они не имели права видеть, как он работает.
- Спецификации: Прежде чем написать строчку кода, они писали сотни страниц спецификаций на псевдо-математическом языке.
- Доказательство: Они должны были логически доказать, что их код соответствует спецификации.
- Человеческий компилятор: Код проходил через изнурительные инспекции (Code Review). Команда из 4-5 человек собиралась в комнате и читала код вслух, строчка за строчкой, неделями. Они играли роль компьютера в голове.
Только после того, как код был «доказан», его передавали в отдел тестирования. Если тестировщики находили баг, это считалось ЧП. Программист должен был не просто исправить баг, а объяснить, почему его процесс мышления допустил эту ошибку.
3. Архитектура Паранойи: 4 + 1
Но даже идеальному коду нельзя доверять. Вдруг космический луч ударит в процессор и переключит бит? Вдруг в самом процессоре Intel есть брак?
Инженеры создали систему голосования. На Шаттле стояло 5 компьютеров (модифицированные IBM AP-101).
- Четыре компьютера работали параллельно. Они выполняли один и тот же код IBM. 400 раз в секунду они сверялись друг с другом.
- Сценарий: Компьютеры А, Б и В говорят: «Поднять нос на 5 градусов». Компьютер Г говорит: «Опустить нос».
- Решение: Система «демократическим голосованием» решает, что Г сошел с ума. Компьютер Г отключается от управления. Экипаж видит желтую лампу.
- Пятый компьютер (BFS - Backup Flight System): А что, если в коде IBM есть фундаментальная ошибка? Например, они неправильно поняли формулу гравитации? Тогда все 4 компьютера ошибутся одинаково и убьют корабль.
- Для этого был пятый компьютер.
- Его софт писала другая компания (Rockwell Collins).
- Им было запрещено общаться с программистами IBM.
- Они использовали другие компиляторы и другие алгоритмы.
- В случае паники пилот мог нажать красную кнопку, и управление передавалось этому «запасному мозгу», который не имел ничего общего с основным.
4. Результат и Экономическая смерть
Система Шаттла считается вершиной программирования. В коде объемом 500 000 строк (на языке HAL/S) за всю историю полетов была найдена одна ошибка (и та в редком сценарии синхронизации, который никогда не случился в полете). Это уровень качества «Шесть сигм». Абсолютное совершенство.
Почему мы не пишем так сегодня? Потому что это экономически невозможно для бизнеса.
- Стоимость разработки по методу IBM оценивалась в $1,000 за одну строку кода (в долларах 80-х это безумные деньги).
- Изменение одной функции занимало год.
Представьте, что вы делаете стартап. Если вы будете писать приложение так, как писали для Шаттла, вы потратите $100 млн и выпустите продукт через 10 лет. Ваш конкурент выпустит «глючную» версию через месяц, захватит рынок и исправит баги патчами.
Индустрия сделала выбор: Мы отказались от Совершенства (Шаттл) в пользу Скорости и Устойчивости (Аполлон).
- Мы знаем, что в Windows и iOS тысячи багов.
- Но мы научились обновлять их через интернет.
- Мы научились делать системы, которые перезагружаются за секунды.
Шаттл остался памятником эпохе, когда программисты были математиками, а код писали как священное писание — медленно, дорого и навека.