
Помните, в 2016 сотрудник NASA Крис Гарри опубликовал код миссии Apollo 11 на GitHub? Его можно изучать, загружать и изменять. Ну и, конечно, использовать для полета на Луну в собственных целях. Речь идет об исходниках кода командного модуля Comanche 055 и лунного модуля Luminary 099. Это «живой» код из 1969 года с комментариями инженеров.
Так вот. Если открыть этот проект сегодня, становится ясно, почему он до сих пор считается эталоном. Это живой пример настоящей инженерной школы, где каждое решение продиктовано жесткой практической необходимостью. Сегодня философия программирования изменилась, поэтому особенно интересно взглянуть на то, как изменился подход к написанию кода за 50+ лет.
Не спешите ругаться, что статья о коде Apollo 11 уже была на Хабре в далеком 2016. Тогда шуму наделал сам факт публикации легендарного проекта в открытом доступе. Сегодня, когда интерес к лунным миссиям разгорелся с новой силой, кажется уместным оценить успешный инженерный подход более чем полувековой давности.
Код был встроен в железо
Apollo Guidance Computer представлял собой специализированный бортовой вычислитель, спроектированный под конкретные задачи полета. У него была оперативная память на ферритовых сердечниках и постоянная память, реализованная по технологии прошивочных матриц (core rope). Вот только считали объем памяти тогда не в гигабайтах, а в словах. Например, объем оперативки составлял 2 048 слов, а постоянной — 36 864 слова (в пересчете на привычные единицы это около 70 килобайт). Процессор работал с тактовой частотой порядка 1 МГц и выполнял несколько десятков тысяч операций в секунду, чего хватало для непрерывного расчета ориентации, скорости и траектории.
Постоянную память нельзя было «записать» в привычном смысле — ее создавали вручную еще на этапе сборки. Программу буквально вплетали в железо: если провод проходит через магнитное кольцо, получается единица, если мимо — ноль. Такой метод делал систему невероятно живучей: ей были не страшны ни дикая вибрация при старте, ни космическая радиация, ни перепады температур. Но был и минус — код становился монолитом. После того как блок заливали защитным составом, изменить в программе нельзя было ни единого бита. Если в коде находили ошибку, приходилось заново переплетать весь модуль целиком.

Жесткие ограничения памяти и вычислительных ресурсов определяли всю архитектуру системы. Программа разбивалась на компактные подпрограммы, повторно использовала участки кода и максимально экономно расходовала каждый разряд. Для хранения данных применялись строго фиксированные области памяти, а структура программ подчинялась требованиям предсказуемости и детерминированности выполнения. Даже арифметические операции и работа с векторами оптимизировались на уровне отдельных инструкций, чтобы не тратить лишние машинные циклы.
Разработка велась с учетом того, что система должна работать в реальном времени и сохранять устойчивость при перегрузках. Программисты точно знали, какие участки кода выполняются чаще всего и сколько времени они занимают, и подстраивали логику под эти ограничения. В результате получилась система, способная одновременно выполнять навигационные расчеты, управлять ориентацией корабля и обрабатывать данные датчиков без сбоев. Именно такой подход обеспечил стабильную работу во время посадки, когда вычислительная нагрузка резко возросла, а ресурсы оставались прежними.
Планировщик задач умел жертвовать лишним
В основе системы лежал планировщик, который распределял задачи по строго заданным приоритетам. Каждой программе заранее назначался уровень важности, и вычислитель постоянно следил за тем, чтобы ключевые процессы получали ресурсы в первую очередь. Для хранения текущего состояния использовались так называемые core sets — фиксированные области памяти по 12 слов, а для расчетов с векторами выделялись отдельные рабочие области.
Когда оперативной памяти начинало не хватать, система освобождала ресурсы, прекращая выполнение второстепенных задач и оставляя только то, что необходимо в данный момент. Такая ситуация возникла во время спуска на поверхность Луны, когда дополнительная нагрузка от радара привела к серии предупреждений.
Сигналы с номерами 1201 и 1202 означали перегрузку вычислителя. Первый указывал на нехватку областей core sets, второй — на отсутствие свободных участков памяти для вычислений. Причина была в том, что радар сближения оставался активным в режиме перемещения. Его блоки формирования данных создавали поток прерываний, которые поступали на счетчики углов и отнимали процессорное время. В результате около 15% вычислительных ресурсов уходило на обработку лишних сигналов.
Несмотря на это, вычислитель продолжал выполнять основные задачи по управлению траекторией. Экипаж получил подтверждение, что посадку можно продолжать. Успех миссии во многом обеспечила именно такая организация работы: система не прекращала работу при перегрузке, а снижала объем второстепенных операций, сохраняя ресурсы для критически важных функций.

Облачная инфраструктура для ваших проектов
Виртуальные машины в Москве, Санкт-Петербурге и Новосибирске с оплатой по потреблению.
Команды звучали как человеческий язык
Астронавты общались с бортовым компьютером через устройство DSKY — панель с небольшим цифровым дисплеем и кнопочной клавиатурой. Все управление строилось на оригинальной системе команд из двух чисел, которые называли «Глагол» и «Существительное». Первое число (Глагол) ставило задачу — что именно нужно сделать, а второе (Существительное) указывало на данные, к которым это действие относится. Например, одна комбинация цифр заставляла систему вывести на экран параметры работы двигателя, а другая — запускала сложный расчет сближения с другим модулем. Такой формат был предельно простым и исключал путаницу: каждой паре чисел соответствовала строго одна конкретная операция.

Такая схема позволяла экипажу полноценно управлять кораблем, не вникая во внутреннее устройство программного кода. Любая команда вводилась буквально парой нажатий, а результат тут же отображался на светящихся цифровых индикаторах. Для многих стандартных операций не нужно было вводить даже данные — системе хватало одного короткого кода, чтобы сразу начать выполнение. Благодаря этому взаимодействие человека с машиной оставалось быстрым и предсказуемым даже в самые напряженные моменты полета, когда на долгие раздумья просто не было времени.
Такой способ управления создали инженеры лаборатории при MIT специально для условий пилотируемого космического полета. Главная цель была в том, чтобы человек мог мгновенно отдавать приказы и получать понятные ответы без лишних телодвижений. Эта логика прослеживается и в самом коде: все команды и их назначение прописаны максимально прозрачно. Программисты сделали все, чтобы полностью исключить любые двусмысленности, которые могли бы привести к ошибке в реальном времени.
А что сейчас
Маргарет Гамильтон, руководитель группы разработки бортового программного обеспечения Apollo в MIT, требовала, чтобы код был понятен, предсказуем и удобен для разбора в критических ситуациях. По сути, именно благодаря ее работе программирование в этом проекте стало восприниматься как строгая инженерная дисциплина, а не вспомогательная часть разработки.
Сегодня программное обеспечение для ответственных систем нередко занимает гигабайты памяти и строится на большом количестве готовых компонентов. Разработчики активно используют библиотеки, сторонние модули и многоуровневые архитектуры, что действительно ускоряет разработку. Однако вместе с этим растет и общая сложность системы: появляется множество зависимостей, промежуточных слоев и скрытых связей между частями кода.
Каждый такой слой добавляет новые точки возможного сбоя. В результате значительная часть времени уходит не на основную логику, а на разбор того, как взаимодействуют между собой отдельные компоненты. Если в системе возникает ошибка, ее источник может находиться на любом уровне, и поиск причины превращается в долгий и не всегда предсказуемый процесс.
Это особенно заметно в сложных инженерных проектах, включая космическую технику. На этапе испытаний подобные системы иногда ведут себя нестабильно, и выяснение причин занимает много времени именно из-за их внутренней сложности. В обычных условиях такие решения работают исправно, но при отклонении от штатных сценариев их поведение становится труднее предсказать.
На этом фоне особенно хорошо видны преимущества подхода, который использовался в Apollo. Ограниченные ресурсы заставляли концентрироваться только на необходимом и заранее продумывать архитектуру. Приоритеты задач, распределение ресурсов и поведение системы при перегрузке закладывались сразу, а не добавлялись позже. Это делало систему более предсказуемой и устойчивой в критических ситуациях.
Не менее важным было отношение к самому коду. Его писали так, чтобы другой инженер мог разобраться в логике без длительного погружения. Понятная структура, аккуратные комментарии и отсутствие лишних усложнений упрощали сопровождение и снижали риск ошибок при доработке. Такой подход напрямую влиял на надежность всей системы.
История Apollo 11 хорошо показывает, что в критически важных задачах программирование — это полноценная инженерная работа, где важны не только функции, но и предсказуемость поведения. И в этом смысле опыт прошлого остается актуальным: даже при современных возможностях избыточная сложность может стать источником проблем.
Код по-прежнему доступен в открытом виде, и его можно изучить напрямую. Это редкая возможность увидеть, как строилась система, от которой зависел исход миссии, и понять, какие решения лежали в ее основе.
Комментарии (28)

LavaLava
19.04.2026 10:14Не туда мы свернули, когда перешли на принцип : сегодня в продашкен, завтра апдейтом исправим косяк.
Современный софт рассчитан на постоянные переделки в апдейтах, пока Windows NT выпускала редкие сервис паки, у майков тоже был неплохой код. Сейчас имеем что имеем.
Звучит контринтуитивно , но современная возможность оперативно устранять баги стала причиной ухудшения кода

Astus
19.04.2026 10:14Современный софт рассчитан на постоянные переделки в апдейтах
Сначала прочёл как "перделки в апдейтах", и даже не удивился, только мысленно добавил "и свистелки".

opusmode
19.04.2026 10:14Это всё следствия.
Первопричиной стал именно подход бизнеса «главное запустить, а там разберёмся»
Когда пытался разрабатывать на джаве, очень удивился, что многие энтерпрайз компании пишут не так, как учат и их код выглядел хуже, чем у меня.
Мне ответили просто - залить железом избыток памяти стоит тупо дешевле, чем тратить время на вылизывание архитектуры и кода
А второй момент - в отрасль волнами заходили самоучки и не то, чтобы это плохо, просто велосипед был перепридуман пару сотен раз из-за этого, а носителей истины истины осталось немного, не говоря о едином источнике
Вот в целом и всё - бизнес, который гонит вперёд и люди, которые не против так делать

doitagain3
19.04.2026 10:14Вообщем вы желаете повсеместно вайбкодеров заменить на demoscene 64k. Но кто за это заплатит? Кого устроят кратно возросшие сроки исполнения?

technomancer
19.04.2026 10:14Тех, например, кому (образно) для загрузки обновления надо ехать за полярный круг и бурить вечную мерзлоту.

RedCatX
19.04.2026 10:14А с чего вы собственно взяли, что сроки кратно возрастут, и что придётся платить больше?
Возьмём ту же Microsoft: как-то не поворачивается язык сказать, что они экономят на программистах, и нанимают кого попало, лишь бы подешевле... По крайней мере, они не пытаются отдать разработку винды на аутсорс или на удалёнку в Индию, ну или хотя бы в Россию, где программистам можно платить меньше. По срокам у них тоже ничего особо не изменилось - не выкатывают они офигенные фичи каждый день, а вот качество продукта значительно просело...
Непонятно, откуда взялась уверенность, что те же демосценеры это какие-то небожители сидящие на золотых горах, и чтобы заинтересовать их работой, нужно как минимум предложить им личный остров в океане и яхту в придачу. По факту, хороший программист, желающий писать эффективный код обойдётся нанимателю во столько же, как и недопрограммист делающий всё как попало, лишь бы запустилось...
Проблема современного софта исключительно в некомпетентном руководстве: в менеджерах, смутно представляющих себе их собственный продукт, в специалистах по найму, отбирающих претендентов с помощью карт Таро, в высшем руководстве, которому глубоко фиолетово чем там занимается компания, лишь бы акции росли, и т.д. Если будет воля и желание, никто не мешает нанять настоящих специалистов, и сделать качественный продукт в срок. Нет никаких препятствий писать эффективный код - это не дольше, и не дороже, просто цели надо правильно расставлять...

MTyrz
19.04.2026 10:14Те же демосценеры, из общих соображений, чаще всего закрыли свои потребности до устраивающего их уровня. И пишут демосцены потому, что им по кайфу, а не чтобы не допустить просрочки по ипотеке.
И никто не сказал, что человеку, которому по кайфу писать демосцену, будет так же по кайфу писать модуль учета KPI к очередному корпоративному поделию, попутно тратя время и нервы на митинги, корпоративные созвоны, командные тренинги и прочую отчетность.

randomsimplenumber
19.04.2026 10:14качество продукта значительно просело
В чем выражается проседание качества? Раньше качественный продукт Windows нужно было регулярно чистить и переустанавливать. С просевшим качеством - просто работает.

anshdo
19.04.2026 10:14они не пытаются отдать разработку винды на аутсорс или на удалёнку в Индию
А зачем им, они и так половину Индии, по ощущениям, в Редмонд перевезли.

sadPacman
19.04.2026 10:14У Майкрософта большой отдел разработки в Индии и в штатах больше всего разработчиков оттуда же. С аутсорсом тоже эпизодически работают, но это чаще поддержка и оно не всегда просачивается наружу в связи с размером компании.

nixtonixto
19.04.2026 10:14На этом фоне особенно хорошо видны преимущества подхода, который использовался в Apollo. Ограниченные ресурсы заставляли концентрироваться только на необходимом и заранее продумывать архитектуру.
Проблема в том, что сейчас вместо "изобретения велосипедов" используют готовые универсальные библиотеки, способные работать и на ракете, и на стиральной машине. Из-за этого у кода слишком много опциональных возможностей и связанных с этим потенциальных уязвимостей и недотестированных участков. В отличие от Apollo, когда код писали именно под эту машину, вносили только реально необходимые опции и не добавляли ничего ненужного, что в дальнейшем могло бы позволить с минимальными корректировками адаптировать библиотеку под работу в стиралке.

UstasAlex
19.04.2026 10:14А что здесь удивительного? Абсолютно аналогичный принцип использовался при построения боевых систем управления, разработанных в Союзе. И разработывались они полностью самостоятельно, без какого-либо копирования (тогда кодов в доступе не было). В одной конкретной системе фактически было только два существенных отличия: не было защиты от перегрузки ситемы и был придуман способ оперативной правки ошибок (в ограниченном объеме) через ОЗУ без перепрошивки ПЗУ.

achekalin
19.04.2026 10:14Честно говоря, когда вчера писал свою пародию, прямо приличный кусок текста именно про софт выкинул: а там было и сравнение монолита с микросервисами, и разработка в AWS, от чего к месту старта строили две резервированные линии связи от двух регионов AWS, и много прочей чуши, вплоть до идеи переписать весь стек на Erlang, потому что кто-то в конгрессе прочел в журнале фразу, что базовые станции сотовой связи не падают годами.
Написал, и выкинул. Подумал, что будет уже не пародия, а жизнь.

appet1te
19.04.2026 10:14"Голь на выдумки хитра"
Когда дефицит. Дефицит ресурсов, приходится с тем что есть выжать больше. А как это сделать??? Как это сделать? Такой организацией, что она выжимает эффективность, ресурс, выгоду из ничего. Все сдоить вообще что только возможно, и ни капли драгоценного ресурса не потратить. Впихнуть невпихуймое, и чтобы еще запас остался.
Космическая миссия на Луну это эталон такого подхода.
Сверхдорого, ультрадорого. Цена ошибки необычайно дорога. Потому "голь" придумала все чтобы влезть в необходимый результат/надежность, за определенный ограниченный ресурс.
Да и сама обычная разработка даже и не rocket science тех лет подразумевала дороговизну оборудования и дешевизну людского мыслительного ресурса относительно вычислительных мощностей. А теперь помножьте это на космические масштабы и получится подход к разработке Apollo 11

SeregaSA73
А от Бурана остался такой же код?
nixtonixto
От Бурана остался даже алгоритмический язык Дракон, разработанный в рамках этой программы. Он позволил разбираться в работе программы даже далёким от программирования.
Flux82
Решил почитать про Дракон.
Страничка Вики, посвящённая Дракону, вызывает самые тяжелые ощущения, после которых 1С кажется верхом разумности. По крайней мере в вики это сделано усилиями одного человека @Parondzhanov который на Хабре также обитает.
Подскажите, где можно посмотреть коды программы Бурана? Вот коды Аполло я открыл и проникся причастностью человечества к этому творению. Они чисты, структурированы и общедоступны. И не очень далеки от того, как человечество пишет код спустя более полувека. А Дракон... Мёртв. А его труп до сих пор зачем-то продолжают пытаться популяризовать для использования, вместо того чтобы достойно выложить старые труды в музее, как это сделано в предмете статьи выше.
DvoiNic
Еще в 2013 я спрашивал у Паронджанова - какие инструментальные средства использовались для т.н. "дракона" именно в программе Буран (ибо даже по рассказам Паронджанова года до 1996 не было никаких средств "рисования схем"). Ответ был простой: "нарисовали на бумаге и отдали программистам для кодирования". Так что и использование в программе Буран - похоже, старательно раздуваемый миф.
Ну а почему и зачем эта мертворожденная поделка появилась - разбирали неоднократно.
нечего выкладывать.
Выкладывали обрывки из "дальнейшего развития", "системы ГРАФИТ-ФЛОКС". Что не менее ужасно