Разработка ПО полвека назад

Так Фредерик Брукс описывает разработку и тестирование софта примерно полвека назад:

Мы централизовали все наши машины и библиотеку магнитных лент и создали для обслуживания их работы профессиональную и опытную команду машинного зала. С целью максимизации скудного времени S/360 мы выполняли все отладочные прогоны пакетно на любой системе, которая была свободной и подходящей. Мы проводили четыре попытки в день (с оборотом в два с половиной часа) и запрашивали четырехчасовой оборот.

(…)

Отладка системы всегда становилась уделом ночной смены, как астрономия. Двадцать лет назад на 701-й я был посвящен в продуктивную неформальность предрассветных часов, когда начальники машинного зала крепко спят дома, а операторы нарушают правила.

Люди работали круглосуточно, чтобы машины не простаивали. Еще 20-30 лет назад крупное ПО полностью компилировалось раз в сутки и код выкладывался на тестирование. Там же:

Программист составлял тщательный дизайн своей процедуры отладки, планируя, где остановиться, какие области памяти проверять, что там найти и что делать, если он не найдет. Это дотошное программирование отладочной логики само по себе могло занимать половину времени от написания отлаживаемой программы.

Смертный грех состоял в том, чтобы смело нажимать кнопку START, не разбив программу на тестовые секции с запланированными остановами.

(…)

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

Сейчас по ночам обычно спят, а инструменты всего цикла разработки ПО поменялись. У почти каждого разработчика в арсенале виртуальные машины, контейнеры и прочие докеры для экспериментов и не только. Тестировать и выкладывать даже большой код можно настолько часто, насколько это позволяет местный DevOps.

Несмотря на изменение технологий, часть книги про организационные вопросы разработки актуальна и сейчас. И не только для разработки.

Преимущество электромобиля

В чём главное преимущество электромобиля? Экология? Нет. Его система управления.

Система трансмиссии полностью электрическая, а значит можно избавиться от коробки передач. Кроме этого, колёсами можно управлять отдельно, а значит не нужно никаких раздаток, дифференциалов и их блокировок. Всё это вместе облегчает электромобиль на сотни килограмм и при этом ещё повышает управляемость. А управляется всё электроникой с достаточно сложным софтом. Именно по этой причине электричка была невозможна 100 лет назад и возможна теперь.

Аналогичное произошло ранее с железнодорожной тягой. Были паровозы, стали строить железные дороги. Далее Рудольф Дизель разработал двигатель и у него была мечта перевести ж/д-тягу на дизель, которую он не успел осуществить. Паровой двигатель развивает мощность с нулевых оборотов, а дизель работает минимум от 1500 rpm. В автомобиле это решается с помощью трансмиссии с коробкой передач, а для ж/д-аналога вся трансмиссия будет слишком массивной. Решение нашли в переходе на электрическую трансмиссию: тепловоз по сути это дизель-генератор и электродвигатели с достаточно простой системой управления. Потом перешли на полностью электрическую тягу, что позволило сцеплять несколько электровозов (опять система управления!) и тягать намного более тяжёлые составы.

Теперь стали доступны компактные компьютеры с хорошим ПО, что позволяет избавиться от механической трансмиссии в автомобиле. И заодно повышает управляемость и дает возможность сделать качественный автопилот.

Экология? Батарейки — их производство весьма грязное, утилизация тоже. Электронные компоненты тоже грязные. В целом на весь цикл использования электромобиля не экологичнее бензиновых и дизеля. И энергия "в розетку" поступает в большой степени с тепловых электростанций с углеродных следом.

Безопасность? Электрички прекрасно горят и взрываются, зачастую в самый неподходящий момент.

Отказоустойчивость? Сомнительно, это хорошее решение для крупных городов с умеренным климатом. Вдали от цивилизации с экстремальными температурами электричка это дорогая и опасная игрушка.

Самым живучий транспорт сейчас это вероятно гибридный мобиль: с маломощным и лёгким ДВС и небольшой батареей (наверное не литиевой) для компенсации низкой мощности ДВС. Без массивных литиевых батарей и без сказок про "экологию".

Н. В. Гоголь

Еще падет обвинение на автора со стороны так называемых патриотов, которые спокойно сидят себе по углам и занимаются совершенно посторонними делами, накопляют себе капитальцы, устроивая судьбу свою на счет других; но как только случится что-нибудь, по мненью их, оскорбительное для отечества, появится какая-нибудь книга, в которой скажется иногда горькая правда, они выбегут со всех углов, как пауки, увидевшие, что запуталась в паутину муха, и подымут вдруг крики: «Да хорошо ли выводить это на свет, провозглашать об этом? Ведь это все, что ни описано здесь, это все наше, — хорошо ли это? А что скажут иностранцы? Разве весело слышать дурное мнение о себе? Думают, разве это не больно? Думают, разве мы не патриоты?» На такие мудрые замечания, особенно насчет мнения иностранцев, признаюсь, ничего нельзя прибрать в ответ.

Николай Васильевич Гоголь, "Мёртвые души". 1842 год, почти 2 века прошло.

Послушать, век наш — век свободы

Послушать: век наш — век свободы,
А в сущность глубже загляни —
Свободных мыслей коноводы
Восточным деспотам сродни.

У них два веса, два мерила,
Двоякий взгляд, двоякий суд:
Себе даётся власть и сила,
Своих наверх, других под спуд.

У них на всё есть лозунг строгой
Под либеральным их клеймом:
Не смей идти своей дорогой,
Не смей ты жить своим умом.

Когда кого они прославят,
Пред тем — колена преклони.
Кого они опалой давят,
Того и ты за них лягни.

Свобода, правда, сахар сладкий,
Но от плантаторов беда;
Куда как тяжки их порядки
Рабам свободного труда!

Свобода — превращеньем роли —
На их условном языке
Есть отреченье личной воли,
Чтоб быть винтом в паровике;

Быть попугаем однозвучным,
Который, весь оторопев,
Твердит с усердием докучным
Ему насвистанный напев.

Скажу с сознанием печальным:
Не вижу разницы большой
Между холопством либеральным
И всякой барщиной другой.

16 мая 1860
Пётр Вяземский


Александр II читал это стихотворение и оставил пометку "По-моему, много есть правды и весьма полезных намек".

Взлет и падение проекта FreeBSD

В далёких нулевых годах, когда я только начинал работать с серверными системами, мейнстримом было использование FreeBSD. Более половины серверов под *nix в то время было FreeBSD и другмими BSD. Линукс в качестве серверной системы тогда встречался редко и на него смотрели с опаской. Даже на десктопах линукс считался выбором гиков. Адепты BSD считали только её варианты настощим unix и достойной серверной системой и на "пингвинятников" часто смотрели с большим презрением.

Всё изменилось в последующие годы — доля BSD на серверах уже в 2010-е неуклонно падала и сейчас её почти и не осталось, а если встретишь, то под разные специфичные/legacy задачи. Молодое поколение не всегда и знает об это операционке, для них это архаика сродни MS DOS или OS/2.

Почему так получилось, что хорошая ОС уступила лидерство?

Одна из ключивых причин отказа от этой операционной системы — система распространения софта в ней, она же система портов. По задумке проекта FreeBSD весь софт поставляется в исходниках, который необходимо собирать на каждой машине. Процесс установки происходит как скачивание необходимых портов, настройка make-конфигов для сборки, компиляция пакетов со всеми зависимостями и потом уже донастройка конфигурации установленного софта. Да, там уже была неплохо работающая система зависимостей, подтягивающая все нужные пакеты. Но компиляция на каждой машине занимала много времени: десятки минут, можно было её запускать и идти пить чай в прямом смысле. И так на каждой машине.

Даже потеря времени на компиляции не главное. Основной недостаток такого подхода — практическое отсутствие воспроизводимости системы. Скачиваемые исходники меняются и поставленная сегодня система с софтом могла отличаться от такой же, поставленной несколько дней назад. Также компиляция могла учитывать особенности железа и скомпилированные бинарники софта могли отличаться на разных машинах даже при установке в одно время. Компиляцией под конкретное железо очень гордились сторонники FreeBSD, мол это выигрывало несколько процентов в производительности. И это "преимущество" автоматически закладывало возможность возникновения трудноуловимых багов на разном железе и вообще отстутствие гарантии, что скомпилированное здесь можно перенести на другую машину.

Отдельной историей был buildworld и buildkernel, т.е. обновление самого самого "мира" и ядра. "Пересборка мира" занимала огромное количество времени и в результате можно было получить нерабочую систему. Или рабочую систему, в которой что-то не работает из прикладного софта и требует "доработки напильником", причём это не всегда можно было определить сразу после пересборки, иногда проблема всплывала потом. Поскольку результат такого обновления в общем случаем не предсказуем, было разумно из RAID-зеркала (если такая возможность была) вынуть один из дисков в качестве бэкапа, обновиться и вернуть в случае успеха.

И так на каждом сервере! Если в небольших проектах такое можно было делать относительно безболезненно, то на больших проектах или high-availability процесс обновления представлял собой уже нетривиальную задачу. А если серверов не несколько штук, а хотя бы десятки — поддержка превращалалась в проблему.

Линуксы с их пакетными менеджерами и уже скомпилированными и протестированными(!) ядром, библиотеками и софтом имели огромное преимущество, их обновление происходило предсказуемо, а саму систему со всем софтом и окружением можно было несложно воспроизвести из пакетов.

Только по этой причине многие компании отказались от freebsd в пользу систем с более предсказуемой поддержкой. Та же участь постигла и линуксы без пакетных менеджеров, вроде того же gentoo.

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

Казалось бы, история могла многому нас научить. Но и сейчас можно встретить много коммерческих и открытых решений, которые повторяют старые паттерны и их ошибки. Где-то даже такие паттерны преподносятся как благо.