История IT строится не на великих замыслах корпоративных комитетов. Она строится на банальной лени, скуке и желании инженеров побыстрее закрыть задачу. Идеальная архитектура существует только в презентациях. В реальности самые живучие инструменты рождаются из хаоса.
С Днём программиста! 13 сентября — тот самый 256-й день года, когда особенно уместно вспомнить: большие технологии часто начинаются с маленькой личной задачи.
Игровая зависимость C и UNIX
Кен Томпсон просто хотел играть в Space Travel. Машинное время на корпоративных мейнфреймах стоило непозволительно дорого: игра съедала примерно 75 долларов вычислительного времени на GE-635.
Механика была простой. Томпсон нашёл в углу малоиспользуемый мини-компьютер PDP-7 и вместе с Деннисом Ритчи перенёс игру туда. Заодно пришлось написать для неё файловую систему и другие части операционной системы. Эту систему позже назвали UNIX.
Первую версию UNIX писали на ассемблере. Деннис Ритчи развил язык B в C, добавив типы и другие конструкции, чтобы системный код можно было писать на более удобном языке. Потом ядро UNIX переписали на C — и получили переносимость, которой у ассемблера не было.
Последствие: игрушка на старом железе породила операционную систему и язык программирования. Сегодня C лежит под огромным куском низкоуровневой инфраструктуры — от ядра Linux до прошивок сетевого железа. Под капотом всё ещё много ручной работы с памятью.
Новогодняя скука Python
В декабре 1989 года в амстердамской лаборатории CWI было нечем заняться. Точнее, лаборатория закрылась на рождественские каникулы, а у Гвидо ван Россума появился домашний проект.
Он решил написать интерпретатор нового скриптового языка. Взял идеи из ABC, добавил расширяемость и обработку исключений, которая пришла из опыта с Amoeba и языка Modula-3. Назвал проект в честь британского скетч-шоу «Летающий цирк Монти Пайтона». Рептилии тут ни при чём.
Первую версию ван Россум начал за рождественскую неделю, а до публичного релиза доводил чуть больше года. В феврале 1991 года Python вышел в Usenet. Официальная история Python звучит менее романтично, зато точнее.
Последствие: пет-проект, начатый от скуки, стал языком для автоматизации, анализа данных и машинного обучения. Сегодня он обучает тяжёлые нейросети и управляет корпоративной инфраструктурой, заставляя весь мир считать отступы вместо скобок.
Десятидневный марафон JavaScript
В 1995 году браузер Netscape Navigator был в основном статичным. Маркетологам срочно понадобилось заставить кнопки нажиматься, а картинки двигаться.
Механика: Брендан Эйх получил задачу быстро добавить язык в браузер и за десять дней собрал прототип. В нём смешались синтаксис C, объекты из Self и функциональные идеи Scheme. Это был сырой прототип. Его единственная цель заключалась в том, чтобы успеть к релизу Netscape Navigator 2.0.
Последствие: наспех сшитый Франкенштейн захватил мир. Сегодня на этом языке работает весь современный веб, серверные приложения, банковские клиенты и тяжёлый энтерпрайз. Спустя тридцать лет его уже не перепишешь с нуля: слишком много страниц, библиотек и контрактов завязано на странности ранних решений.
Лингвистическая лень Perl
Ларри Уолл работал системным администратором и постоянно склеивал разрозненные инструменты для обработки текста. Писать для каждой такой задачи отдельную утилиту на C было слишком долго.
Будучи по образованию лингвистом, Уолл создал язык, который собирал идеи из C, awk, sed, оболочек Unix и других инструментов. В истории Perl это называют эклектичным наследием. Более точное слово подобрать трудно.
Последствие: появился мощный текстовый процессор восьмидесятых. Проблема кроется в синтаксисе. Код на Perl может выглядеть как ругательства из комиксов, а прочитать его через неделю после написания иногда физически невозможно.
Телефонная надёжность Erlang
В Ericsson хотели понять, на каком языке лучше писать телекоммуникационные системы. В начале восьмидесятых инженеры перебрали больше двадцати языков. Вывод оказался неприятным: существующие языки не давали одновременно высокой производительности разработки, конкурентности и восстановления после ошибок.
Механика: команда взяла хорошие идеи Lisp, Prolog и Parlog, выкинула лишнее и начала делать собственный язык. В 1987 году появились первые эксперименты с Erlang. Телефонная станция не может ждать, пока разработчик перезапустит весь процесс из-за одной неисправной линии.
Последствие: язык из лабораторного эксперимента вырвался в реальные проекты Ericsson. В нём отказ отдельного процесса — штатная ситуация, а не конец света. Для телефонных сетей это не философия, а должностная инструкция.
Конфигурационная луна Lua
В бразильской лаборатории TeCGraf инженеры помогали Petrobras вводить данные для старых симуляторов. До этого специалисты редактировали файлы с колонками чисел: одна ошибка в позиции — и программа получала не то значение, а человек видел только ещё одну цифру.
Механика: для форм ввода и отчётов сделали два маленьких языка — DEL и Sol. Пользователи попросили циклы, условия и более сложные правила, поэтому языки объединили в один встраиваемый инструмент. Один из авторов предложил назвать его Lua — «луна» по-португальски, как противоположность Sol, «солнцу». Авторы подробно описали эту историю.
Последствие: язык, который начинался как средство описания данных для нефтяных симуляторов, стал лёгким встраиваемым языком для конфигурации, сценариев и расширения приложений. Никакого большого плана. Просто таблицы чисел надоели всем.
Онлайн-резюме PHP
В 1994 году Расмус Лердорф хотел считать посетителей своего онлайн-резюме. Для этого он написал несколько CGI-программ на C и назвал набор Personal Home Page Tools.
Механика: посетителям понадобились формы, базы данных и гостевые книги. Лердорф постепенно расширял набор скриптов, а в 1995 году выложил исходный код. Другие разработчики начали добавлять свои исправления и функции. Счётчик посещений перестал быть личным инструментом и превратился в язык для динамических страниц. Официальная история PHP выглядит именно так.
Последствие: огромный кусок раннего веба вырос из задачи «узнать, кто открыл мою страницу». Архитектура получилась неровной, зато интернет получил способ быстро превращать HTML в работающий сайт.
Сорокапятиминутная сборка Go
В Google инженеры жили внутри больших C++-проектов. Программа могла работать быстро, но сборка занимала десятки минут. По легенде самого проекта, идея Go родилась во время 45-минутной компиляции.
Механика: 21 сентября 2007 года Роб Пайк, Роберт Гриземер и Кен Томпсон начали рисовать на доске новый язык. Им нужны были скорость разработки, безопасность, простая сборка и конкурентность для многопроцессорных серверов. В FAQ Go причина сформулирована без романтики: существующие языки и системы сборки стали слишком сложными для больших проектов.
Последствие: язык, придуманный из раздражения на время компиляции, стал инструментом для сетевых сервисов и облачной инфраструктуры. Иногда лучший способ ускорить сборку — написать новый язык.
Инструменты, которые мы получили в итоге
- Python работает как отличный клей для инфраструктуры. Ломается, когда проект перерастает масштаб одного кабинета.
- JavaScript запускается на любом утюге. Заставляет инженеров годами бороться с неявным приведением типов.
- Perl проглатывает любые объёмы текста. Превращает поддержку легаси-кода в археологические раскопки.
- Lua встраивается почти куда угодно. Делает конфигурацию программ настоящим языком, а не лесом из JSON-файлов.
- PHP превращает личный счётчик посещений в веб-приложение. Заодно оставляет будущим поколениям странный синтаксис.
- Erlang переживает падение отдельных процессов. Требует привыкнуть к тому, что ошибка — часть штатной работы системы.
- Go быстро собирается и спокойно работает с конкурентными задачами. Отнимает у программиста любимые сложные конструкции.
- C даёт абсолютный контроль над памятью. Одно неверное движение приводит к краху всей системы.
Худшие языки проектируются годами в душных переговорках. Лучшие часто начинаются как попытка закрыть конкретную дыру в системе. Если инструмент работает прямо сейчас — он уже прав.