Во время очередного спора знакомый озвучил мысль, которая меня очень сильно задела. «В большинстве популярных ЯПов существует очень много разных путей сделать одно и то же. Это приводит к проблемам. А вот в Go всё не так. Философия языка такова, что на Go разные разработчики решают одинаковые проблемы одинаковым образом. Поэтому их код легко читаем, предсказуем и надежен. И поэтому крупный бизнес выбирает Go». Это достаточно мощный аргумент, над которым нужно как следует поразмыслить, прежде чем опровергать.
Поэтому я в два счета размазал его, прицепившись к отсутствию дженериков, а умную мысль унес, пожил с ней несколько дней, и в какой-то момент сформировал свое мрачное видение.
Моя работа — выбрать как можно более подходящее решение из бесконечного числа комбинаций. Это то, за что мне платят, и это то, за что я люблю свою работу, а потому и свою жизнь. Но мне говорят — супер решение не нужно. Нужно обычное. Потому что готовый продукт важнее его реализации.
Если меня вышвырнут на улицу, и возьмут на моё место какого-нибудь дурачка, он легко сможет работать с моим кодом. Так компании будет намного комфортнее. Бизнес не хочет зависеть от случайностей. Мысль, что плохое настроение ведущего разраба отнимет у бизнеса кусочек прибыли, не нравится топ-менеджерам. Они стали топ-менеджерами, потому что хорошо умеют избегать ситуаций, когда их священный бизнес теряет деньги. А мы сейчас живем в то время, когда «хорошо сделанное» и «прибыльное» — разные вещи.
И я прекрасно понимаю, как мы к этому пришли. Сейчас объясню, следите за пальцами:
Я, как и большинство инженеров, верю, что творю великие вещи. Что изобретаю, автоматизирую, делаю своим трудом и мозгами жизнь всего человечества лучше, пока всякие мракобесы только мелят языком. Но потом я вытаскиваю нос из своего редактора кода, и прихожу в ужас от того, как жестоко ошибаюсь.
Что я вообще нахрен делаю?
Вот я продумываю архитектуру высоконагруженной системы, но в 95% случаев ее будут применять, чтобы быстрее отсортировать на телефоне селфики с узорами и фоточки любимой собаки. Вот я разрабатываю VPN-клиент, и что с ним будут делать? Смотреть всякую порнуху и тупые пиратские фильмы?
Мои мозги обслуживают мелкие ежеминутные хотелки, чтобы люди принесли мне деньги, чтобы я тоже удовлетворил свои хотелки.
В ИТ делают хорошие вещи, но их процент ничтожно мал. Большинство обслуживает дурацкие потребности, которых раньше просто не существовало, потому что не существовало ИТ. То есть, инженеры не делают великие вещи, инженеры просто поддерживают инфраструктуру перекачки бабла между людьми.
В таких условиях писать хороший код перестает быть необходимым. Это нужно только для того, чтобы мне было веселее работать, и я подольше не выгорал. Но рано или поздно приходит топ-менеджер и говорит: «Все, заколотите гвоздями и пуляйте. Пора стричь бабло».
Вместо абстрактного «всеобщего блага» ИТ научилось потакать низменным хотелкам и только за счет этого выросло в гигантскую индустрию, где работают сотни миллионов людей. Раньше программирование было делом избранных, сейчас любой лох посидит на курсах годик и пойдет писать код.
И когда он попадет в индустрию, времени копать глубоко уже не будет — продукт нужен сегодня вечером, иначе мы упустим деньги. Копать глубоко и изучать технологии превращается в хобби, нужное только для того, чтобы не свихнуться от осознания собственной никчемности.
В системе, где надо раз в неделю выкидывать на рынок новую фичу, нужны простые подходы и примитивные инструменты. Когда какой-нибудь крутой разработчик придумывает новую технологию, он старается сделать её так, чтобы она была востребованной большинством, потому что востребованность большинством — главная ценность современного мира. Вот почему появляются такие вот философии и такие вот Go.
А я думаю — мне это всё нахрен не нужно. Это все вызывает отторжение.
Если хорошо присмотреться, мой VSCode набит опасными симптомами. Мой tslint не разрешает добавить мне лишний пробел. Мой код не билдится, если я назвал переменную не с той буквы. Мой компилятор не будет работать, потому что я не добавил комментарии к публичному методу. Тут все просто — пишите, ребята, одинаковый код. Безликий код. Это вам не роман, какой к чёрту авторский стиль?!
Я в целом согласен, что подобные конвенции — хорошая штука, но только до тех пор, пока они касаются внешнего вида кода. Момент, когда у тебя забирают возможность выбирать, как этот код будет работать — мой самый страшный кошмар. Представьте кейс: вы написали сложный перфоманс сенситив модуль, а вам говорят: «Послушай, он слишком сложный. Давай ты сделаешь его попроще, не важно, что работать будет хуже». Звучит абсурдно? Вот так и будет. Серьёзно. Да так уже есть. Они не добавили дженерики в Go, потому что дженерики — сложные.
Go — это бизнес-эффект, а не инженерное решение. Он сам себе противоречит. Вот он хочет надёжности, и за этим уходит от сложности. Но сложность в индустрии появилась ради надёжности. Дженерики существуют именно ради надёжности, чтобы предвосхищать потенциальные баги dev-time. И да, они довольно сложны.
Программируя, я хочу заниматься творчеством. Хочу иметь огромное число опций, когда дизайню систему. Мы моделируем реальность в мире машин, а я точно знаю: реальность — это не простая штука, в ней нет правильных и неправильных ответов. И у меня есть ощущение, что технологии вроде Go — это поиск простых ответов. Типа, давайте на каждую задачу будет одно правильное решение. Но это же обман! Пусть он и сработает, но всегда есть решение лучше. А под давлением того, что у нас нет бюджетов на качественные решения, мы сами убиваем софт, и потом разочаровываемся, что все плохо работает.
Философия безликого кода хочет сделать из меня машину, которая копипастит бойлерплейт. И думая об этом, я прихожу к еще более страшному противоречию.
Я всегда верил, что базовый посыл разработки звучит так: «Все, что может быть автоматизировано, должно быть автоматизировано». Но вот ирония — мой посыл тоже фатален.
Я не готов делать что-то, что могла бы делать машина, которую я могу построить. Это нерационально, а меня учили быть рациональным. Но раз я должен все автоматизировать, выходит должен автоматизировать и автоматизацию — то есть разработку. И получается должен быть рад языкам, которые постепенно нас к этому подводят. То есть моя профессия, как и большинство других, в идеальном мире существовать не должна.
Прогресс не остановить. Но он может идти разными путями, в этом я уверен точно. Если программирование сейчас свернет на дорожку Go и безликих практик, то мы придем к самой кривой и не оптимизированной автоматизации, какую только можно представить.
Мое решение проблемы — утопическое, и не выдержит никакой критики. Я понимаю, что его уже поздно предлагать, но все же.
Я бы разделил бизнес и ИТ, чтобы программированием могли заниматься только некоммерческие организации. И чтобы их приоритетом было глубокое совершенствование технологии, свободное от ежедневного потока. Чтобы требование «выпускаем что есть, иначе прибыль уйдет» было морально недопустимым. Я бы всеми силами держал порог входа в программирование как можно выше, чтобы инструменты не подстраивались под усредненного разработчика, когда опытный инженер и вчерашний выпускник курсов вынуждены писать одинаковый код.
Да, это затормозит прогресс на века и лишит нашу жизнь всех приятных плюшек, на которые мы ежедневно залипаем. Но по крайней мере это вернет идею прогресса к тому виду, в который мы верим в моменты наших самых сильных идеалистических порывов.