Программировать в 90-х было сложно, но этот концерт был достаточно милым. Они предоставили нам станции SPARC, а целевой платформой был Solaris. Так что да, нам пришлось использовать C++, но тогда это было современно. Управление памятью, ctors и dtors. Мы читали нашего Скотта Мейерса.
Но затем появились Bean Counters.
Сказали, что заключили сделку с HP. Сладкий. Новые серверы обойдутся на десятки тысяч дешевле. Это было слишком хорошо, чтобы пропустить.
Они не знали, что сделали.
На серверах HP был древний компилятор с этапом предварительной компиляции, который преобразовывал C++ в C перед тем, как передать его в обычный компилятор C. То, что эта штука сделала с шаблонами Cpp, было достаточно, чтобы заставить взрослых мужчин плакать. И это было медленно. Так медленно. То, что на Solaris занимало 20 минут, теперь занимает часы.
Это было не самое худшее. Мы все еще разрабатывали на SPARC, но поставляли на HP-UX. Объектный код, выдаваемый компиляторами, зависит от платформы. Это будет работать на SPARC. Мы пересылали их по FTP на ящики HP. Потребуется целая вечность, чтобы скомпилировать, а затем сломать и сжечь: SIG SEGV.
Теперь код был замусорен правилами предварительной обработки:
#ifdef __sun Выполните некоторые действия, характерные для Solaris
#else, если определено HPUX Сделайте что-нибудь еще (вероятно, мерзость)
Были даже #прагмы. Я даже не могу вспомнить, почему. И мне все равно.
Разрыв между средами разработки и продакшена перерос в пропасть, в которую мы регулярно попадали: компилировать, тестировать, ftp, компилировать, тестировать, фейл.
В конце концов, сами Sun положили конец этому безумию. У них была новая игрушка. Назвал это Java, как в кофе. И пахло хорошо. Сборка мусора, никаких указателей, обработка исключений. API менялись с каждым второстепенным релизом, ломая весь наш код, но нас это не волновало, потому что у Java был свой секрет — JVM.
WORA: Напиши один раз, беги куда угодно. Это было похоже на волшебство. Компилятор записал байтовый код, а не объектный код. Везде, где вы можете запустить JVM, вы можете запустить свой код Java. Просто сверните его в банку.
По крайней мере, такова была теория.
На практике это обычно срабатывало, но когда не срабатывало — ну что ж, удачи. В любом случае проблема только что сдвинулась — управление зависимостями, пути к классам, загрузчики классов. Спустя годы такие извращения, как OSGi, исказят состояние Java-искусства, пытаясь решить эти проблемы. А пока мы просто прошлись по списку заместителей, ожидая, кто из них The One. О Плюще мы и мечтать не могли.
По крайней мере, нам не пришлось использовать make с его психозом пробела/табуляции. И у нас был Eclipse, так что Emacs можно было взять в поход. В языке были многопоточные примитивы. Жизнь была хороша. Кто-то даже написал книгу Эффективная Java в честь Мейерса.
Но этого было недостаточно. Различия в ОС сохранились. Версии компилятора различались. Версии зависимостей различались. Версии зависимостей зависимостей различались. Зависимости ваших коллег отличались. Зазор остался.
VirtualBox поразил меня. ПК под управлением Windows трансформировался в Solaris. Удивительно, но я не сразу разглядел новинку.
Снимки. Как обезвоженные машины. Просто добавь воды. Один и тот же результат каждый раз. Твоя машина, его машина, живая машина.
Однако совместное использование снимков было проблемой, а запуск нескольких ОС на машинах с несколькими гигабайтами памяти был еще хуже. ВМ тяжелые. Тестирование? да. Разработка? Нет.
Память дешевела, а потом появился Бродяга. Виртуальные машины, поддерживающие сценарии, с репозиторием полезных моментальных снимков, описанных в цветном YAML. Vagrant, и у всех нас была одинаковая среда разработки.
Когда у нас стало достаточно памяти для запуска нескольких виртуальных машин, микросервисы потребовали больше. Антисоциальный. Изолируйте нас!
Они говорят, что ответ был вокруг в течение долгого времени.
Контейнеры. Меня познакомил Докер. Казалось, что за одну ночь все им воспользовались. Я мог понять, почему.
Как виртуальные машины, с локальными и удаленными репозиториями; толкай и тяни. Файловая система Union сделала его эффективным, общее ядро сделало его легким. Наконец, мы могли запускать одно и то же в разработке, тестировании и производстве.
Разрыв закрылся.