Олег тут почитал
вот это про
Максима и их наработки в synrc
и прифигел, а я хочу заметить, что это очень показательный пример:
Чтобы сделать что-то существенное, не обязательно нужно много кода.
Если взять язык, в котором почти ничего нет (Эрленг), то кода автоматически будет получаться мало - логично. Неочевидно, что это не обязательно идет в ущерб функциональности. Код может делать все, что нужно, только малыми средствами.
Поэтому я так не люблю дебаты про языки программирования, в которых обсуждают языковые фичи. В Эрленге ничего нет (серьезно, вообще ничего, даже свой тип не объявишь), то есть крутым его делают не языковые фичи, а те примитивы, которые он предоставляет.
Выбор примитивов критически важен. Базовые примитивы Эрленга качественно меняют пространство возможных решений. То, что на других языках невозможно или делается ценой сотни человеко-лет, сотен тысяч строк кода (например, распределенная БД) и с врожденными пороками качества (сегфолты, уязвимости переполнения буфера), при правильном выборе инструмента можно уместить в 2000 строк кода и осилить руками одного-двух программистов. Это не отменяет того, что они должны понимать, что делают, но если понимают, то процесс самого кодирования, вся эта борьба с ветряными мельницами, ручная разгрузка щебня, все это превращается в отдых на пляже. Вообще, забавно, как суперсовременными считаются возможности, заложенные в язык 29 лет назад.
Как-то так и должно программирование в моем понимании выглядеть: сам процесс кодирования должен быть простейшим, даже тривиальнейшим шагом. Тогда можно куда-то двигаться. Грубо говоря, если тебе нужен час, чтобы объяснить все идеи своей программы на доске, почему ты не можешь их воплотить в коде за тот же час? Это не значит, что процесс создания программы займет час - нет, гораздо дольше, нужно собрать входные данные, сделать предварительные тесты, провести исследования, придумать, решить, перебрать варианты, прототипов пару сделать. Но когда уже все решено и понятно, кодирование не должно занимать так долго, как сегодня. Почему считается нормальным, что любое написание программы - это перемещение горы? Вот
хороший манифест на эту тему.
Все это немножко другой, нетрадиционный вид программирования. Тот, где существенные вещи создаются на коленке. Где весь веб-стек можно создать мимоходом в процессе создания карточной онлайн-игры, просто потому что ну вот понадобилось. В котором правильные вещи - не те, на которые сотня программистов положила свои жизни, чтобы добиться в борьбе со сложностью собственного процесса хоть какого-то уровня качества и хотя бы немного, инкрементально возвыситься над статусом кво. Правильные вещи идут в обход, копают вглубь, а не вширь. Можно потратить месяц, и на выходе получить 1000 строк, но на этих 1000 строках потом «за час долететь».
Когда кода мало, начинают качественные вещи лезть. Один человек его может серьезно поменять в течение часов, а не отдел в течение трех спринтов. Можно занять или переписать кусок реализации под свои нужды. Если кода мало, его не жалко выкинуть, это тоже важно. Хорошая разработка, достойная, по крайней мере, та, что грузит мозг - это копание вглубь, это переписывание, доведение до совершенства. Часто чтобы исправить код надо его выкинуть, а не прикрутить свеху шаблон «фабрика».
Простые, минимальные вещи, как правило, гораздо лучше соединяются. Самым бесполезный труд - библиотеки по интеграции. Когда меня просят - сделайте, чтобы X работал с Y, очень обидно - ты сделал прекрасный X, и прекрасный Y, и они каждый могут использоваться в миллионе собственных контекстов, X+Y только один из частных случаев, ну напиши ты у себя в приложении две строчки, которые перекладывают из одного в другое. В конце концов, в этом ведь и смысл - вот примитивы, используй их как тебе нужно. Сама просьба об интеграции - сигнал, что X и Y неправильно сделаны. Конечно, нужно очень много мастерства, чтобы сделать правильно, чтобы примитивы были достаточно примитивными, чтобы интеграция стала тривиальной. Но это хотя бы достойная цель, ради нее можно ночами не спать. А вот строчить библиотеки X for Y - это в никуда путь, только если руки нечем занять.
Самое важное, что я хочу о всем этом сказать: так действительно можно жить, это не утопия, не сказки из параллельной реальности. Я наблюдаю подобное и в Erlang мире, и в Clojure. Весь CouchDB - это 20K строк на Эрленге, у них в репозитории bash-скриптов вокруг этого больше, чем собственно приложения. В репозитории Kotlin 300 000 (триста тыщ) строк Java, В Scala тоже триста (из них 270 000 на самой Scala - какой-то не очень компактный язык, да?). А в Clojure всего 60 000. Datomic написали 2 человека, все ключевые подсистемы не больше 1000 строк кода. Я сам, когда понял, что нам не хватает возможностей Twitter Storm, за месяц по вечерам написал распределенный job manager на Clojure. И так далее. Именно подобные вещи должы считаться нормой, а не самодеятельностью. Да, для этого нужно долгий путь пройти, нужны те самые примитивы, на которых серьезные вещи можно было бы строить играючи, их нужно накопить, нужно чтобы их кто-то сделал. Кое-что уже есть, но в целом многого не хватает, и часто слишком большое трение при склеивании всего вместе, есть куда улучшать. Но путь, конечная цель - если вам интересно - какая-то такая.