“Что может быть проще времени?” спрашивал нас Клиффорд Саймак. Да всё проще времени. Время — самая сложная концепция в мире. Мы его плохо учитываем и не имеем интуиции. Но все становится просто отвратительно, когда время накладывается на сложные системы.
Это Сальвадор Дали. Он хорошо понимал динамику.
Мы очень плохо понимаем, как изменяется сложная система со временем. Давайте возьмем программную систему (для простоты). Со статической картинкой еще как-то более-менее можно разобраться. Нарисовал диаграмму классов, поглядел на взаимодействия модулей, ну и что-то понял. Но предсказать и понять, насколько текущий дизайн системы плох или хорош с точки зрения динамического развития системы — невероятно сложно. Это одна из главных причин, почему системы деградируют и умирают. Низкая предсказательная сила не позволяет управлять будущими свойствами системы, мы редко можем их осмыслить и заложить в дизайн.
Хуже всего, что когда мы пытаемся это делать, на сцену выходят люди с криками “BDUF!”, “KISS!”, “YAGNI!”. И сложно же удержаться, черт возьми. Ты начинаешь думать, что и на самом деле KISS, и на самом деле YAGNI. И вот через год ты саркастично бросаешь “BDUF” на очередном собрании. Твой горизонт времени сокращается до месяцев и недель. Ты не смотришь дальше. И тут тебе конец, ты больше не инженер.
Одна из самых главных и самых сложных задач инженера — понять систему в динамике, наложить временную ось и заглянуть в будущее. Во что превратится твоя прекрасная архитектура через 5 лет? Что с ней будет, когда за дело возьмутся посредственные разработчики? Какие новые задачи с высокой вероятностью будут поставлены перед системой в ближайшем будущем? Как на нее повлияют технологические тренды? Я понимаю, что все это космос, что большинство разработчиков в лучшем случае умеют собирать конструкторы из Hibernate и Spring, но когда-то же надо начинать.
Мы все время торопимся и строим системы из говна и палок, надеясь все поправить потом. Иногда это прекрасное “потом” наступает, и система переписывается. Но чаще всего она умирает и хоронит под собой бизнес, да и глобальные переписывания редко заканчиваются хорошо по самым разным причинам. Ребята из Эрикссон делали Erlang почти 10 лет, пока он не попал в продакшн. И он жив до сих пор, великолепно решая поставленную перед ним проблему. Ребята из Netscape сделали JavaScript на коленке за несколько месяцев, и вся цивилизация сейчас мучается с этим совершенно ебанутым языком программирования, который по воле случая стал стандартом веб-разработки. Javascript становится лучше путем неимоверных усилий, но всю эту энергию можно было бы направить на более интересные вещи.
К огромному сожалению распространение Agile процессов во многом негативно повлияло на инженерную культуру. Это парадоксально, потому что разработчики получили больше свободы, но у них отобрали букву R из R&D.