Разработка фронтенда на веб катится не туда.
«Спасибо скажем мы Аллаху,
за то, что он наполнил мир глупцами,
Иначе не увидели бы мы мудрецов»Омар Хайям.
Потребовалось мне на днях запилить динамический веб на стеке React + Redux. Полез посмотреть, чем нынче пользуется уважаемая общественность. Оказывается, стандартно используют Javascript ES-2015, он же ES6. Чтобы запустить это счастье нужно, следите за руками: туго перевязанная упаковка с npm + nodejs, Webpack, Babel. npm доставит вам различные пакаджи, библиотеки типа react, redux, webpack нужен для динамической сборки и предкомпиляции приложения, babel позволит вам писать код на модных стандартах джаваскрипта не особо заботясь о совместимости с предыдущими браузерами.
Ну ок, хорошо, webpack позволяет динамически пересобирать модули с зависимостями при изменении кода и автоматически подгружает/перегружает код в браузере.
Теперь про боль.
Окунулся по локоть в Джаваскрипт. Синтаксис. Сахар. Синтаксический сахар. Больше сахара. Еще больше сахара. Ожирение.
Я вот сейчас даже статью с Хабра процитирую про новый синтаксис для вызова функций.
○ p1 => expr отлично подходит, если параметр один;
○ p1 => expr имеет неявный оператор return для выражения expr;
○ чтобы неявно вернуть объект, нужно обернуть его в круглые скобки () => ({ foo: ‘bar’ }), иначе получите ошибку;
○ круглые скобки необходимы, когда у вас 0, 2 или больше параметров () => expr or (p1, p2) => expr;
○ фигурные скобки в правой части представляют блок кода, в котором может содержаться несколько инструкций () => {};
○ при использовании такого синтаксиса неявного return нет, его нужно писать () => { return ‘foo’ }.
Что? Что это было?
После чего, конечно, начинают появляться статьи из серии «Почему я все еще использую слово function вместо модного синтаксиса». И это естественно, потому что еще после Perl люди поняли, что злоупотребление уличной магией в разработке до добра не доводит. Но, похоже, уже подросло новое поколение программистов, которым нужно заново пройтись по тем же граблям.
Или вот в описании Redux, говорят, в редьюсерах не используйте функции, изменяющие состояние, генерите новые значения. Иммутабельность делайте. Но все равно остается прекрасная возможность выстрелить себе в ногу.
Мой ответ такой: потому что Javascript идет не туда. Потому что асинхронность + мутабельный стейт = проблемы. Именно с этим пытается бороться React. Но React это библиотека, а не язык. Библиотека может только упрашивать и рекомендовать, но не заставлять.
Так получилось, что я довольно сильно два года назад погрузился в Clojure и ClojureScript. Вот про что мне сегодня хочется рассказать, так это про то приятное ощущение, когда понимаешь, что люди очень сильно думали, чтобы сделать правильно и красиво.
Все, о чем могли мечтать большевики, в Clojure/ClojureScript есть – структуры данных иммутабельные по-умолчанию, синтаксис языка НЕ ИЗМЕНЯЕТСЯ, просто потому что незачем это делать, есть прекрасный интероп с Java/Javascript, что открывает обширные возможности использования достояния человечества в виде maven, npm инфраструктуры, при чем активно поощряется использование библиотеки Google Closure, а это, я вам скажу, наверное более правильный путь сохранять совместимость со старыми браузерами, чем Babel. Плюс из коробки отличная минификация через вычисление и отрезание неиспользуемых участков кода при сборке большого js. Все вот эти modular-css пытаются решить проблему code as data и data as code, всунуть в JS возможность использовать CSS как код, при том, что для любого lisp, которым является также и Clojure это нативное свойство языка. Модульность и разделение кода на куски в Clojure вообще сделана гениально: namespace + имя сущности однозначно адресует нужную сущность. Про clojure.spec я вообще промолчу, недооцененная многими библиотека, которая решает фундаментальную проблему несовместимости зависимостей. Что такое правильный подход: основу языка оставлять по-максимуму без изменений, а новые фишки добавлять через библиотеки, так как это сделали, например, с core.async для добавления coroutines как в go. И правильно, если это будут использовать 2% пользователей, то зачем это догружать остальным 98%?
В общем, жаль, что коммьюнити не так активно делает маркетинг Clojure/ClojureScript и в целом порог для входа остается очень и очень высоким для среднего разработчика с одной стороны из-за недостаточного количества примеров, которые бы давали быстрый результат, а с другой стороны понимание функционального подхода требует определенных умственных усилий. Нужна новая кровь в такие проекты. Чтобы начать послушайте бесплатные онлайн курсы по Clojure. Может и понравится, %username%.