?

Log in

No account? Create an account

Стой под стрелой

Поступки и мысли, о которых могу вспомнить не краснея

Previous Entry Поделиться Next Entry
Clojure impresses
усы2
tonsky
Нашему Clojure-проекту исполнилось полгода, из них последние три месяца его используют заказчики. Пора подводить промежуточные итоги.

Кложа со всех сторон такой правильный язык, что мне даже неудобно.

С одной, это правильный Питон — писать быстро, динамично, код компактный, легкий, лаконичный. Куда более лаконичный, чем питоновский, за счет ФП, макросов и прекрасной стандартной библиотеки.

Удобный перочинный нож на каждый день. Присылают .docx файл с табличкой — копирую его в Sublime, парой регэкспов подчищаю до регулярного формата (в sublime я этому научился-таки, а в vim регэкспы запомнить так и не могу, к вопросу о юзабилити vim-а), потом тремя-пятью трехстрочными функциями паршу и генерю что мне нужно.

Короче, когнитивного оверхеда никакого нет (особенно если repl уже запущен), и мне кажется, вообще всё надо на Кложе писать. Какой-нибудь енвайромент соорудить заместо bash, в котором все будет просто, логично и все главные нужные, но забытые в линуксе вещи будут, какой-нибудь feature-full process/task management framework, желательно network-transparent; и оттуда строить светлое будущее.

С другой стороны, Кложа одновременно и правильная Джава — вся та же Джавовая инфраструктура, доступ к любым библиотекам, maven-репозиториям, генерация Джава-кода, прямой интероп. Тоже минимум оверхеда, всё, что нужно сделать — выучить язык, и уже можно мягко и нежно продолжать достраивать Джава-проект на Кложе, без революций.

Плюс скорость. Тут сразу получается чуть хуже, чем у Скалы (по слухам) и голой Джавы, и иногда для разгона надо приложить усилия — типы кое-где дописать, инты анбокснуть, ленивости убрать или, наоборот, добавить. Написать джава-класс, в конце концов. Я в этом плохого ничего не вижу, потому что мы уже получили два в одном — быстрый прототип можно плавно и инкрементально перевести в производительное промышленное приложение. Такой мостик, которого нет у Питона, Руби (мы же не считаем всерьез мостиком возможность «переписать на C»?), Джавы.

С третьей стороны, и совсем не так давно, Кложа — это еще и правильный Джаваскрипт. Я на 100% оценил идею, что код сервера и клиента должны быть на одном языке, только кто решил, что это должен быть Джаваскрипт?

На бытовом уровне ClojureScript круче js хотя бы потому, что в js ты постоянно вошкаешься в поисках библиотеки, объединяющей строки или еще чего-то банального, но забытого разработчиками Netscape. Ну, по крайней мере, пока ты не профессионал и не написал свой utils.js. В cljs все сразу под рукой в стандартной библиотеке.

На промышленном уровне cljs, как наследник clojure, гораздо адекватнее, практичнее и однозначнее, чем js. На нем можно что-то строить, поддерживать и развивать, а не прыгать по плитам на одной ноге вокруг замаскированных ловушек, и не тратить дни на изобретение тысяча сто дватцать восьмого способа превратить код, сделанный из палок и соломы, во что-то, похожее на инженерное сооружение.

Ну и он, надо сказать, прёт вперед с каждым месяцем. Сейчас source maps прикручивают, скоро никаких аргументов за js не останется.

В-четвертых, изучение Кложи прокачивает внутреннего инженера. Хватаешься всяких полезных вещей — composable abstractions, примеров хорошей декомпозиции, учишься отличать важное от неважного, выделять среди моментов чистого хипстерства вещи, которые влияют на реальные, измеримые эксплутационные характеристики. Понимаешь, как важно, когда абстракции помещаются в голове.

Вот чему я научился бы, свяжи я свою карьеру с Питоном? The Zen of Python (хорошая штука, чего уж там), Джанге, WSGI и PyPy? А если бы с Руби, так вообще нахватался бы плохого. Вот в нашем Кложе-мире много новых взглядов на старые проблемы. Они, хоть и практичный язык, на самом деле на Джаве только бутстрапились, а сейчас потихоньку всё переписывают. Datomic, core.logic, reducers, cljs, enlive, lighttable, в самом языке stm, protocols, подход к стейту, много интересного короче и пищи для размышлений. Не любой код на Кложе — идеал, конечно, но это тоже работает в плюс — смотришь на хорошее, смотришь на плохое, анализируешь, почему так и в чем существенная разница. Да даже просто наблюдение сложности maven на фоне изящного lein подарило мне немало минут медитации об устройстве мира. Правда, как они ТАК всё зафакапили на ровном месте?

Тут секрет еще в чем? Чтобы выучить Кложу, надо посмотреть хотя бы пяток лекций Рича Хики. То есть, можно конечно и по-другому выучить, но тогда я не понимаю в чем смысл. А Рич Хики крутой чувак и все время правильные вещи говорит, универсальные. Если и есть надежда, что кто-то нашу software industry спасет, так это может быть он. Ну не DHH же в конце концов. И, давайте будем реалистичными, не Хаскель. Хаскель больше про объяснения и рефлексию, чем про спасение.

В лекции про муравьев, например, Рич раскрыл практическую сторону Кложи — симуляцию колонии муравьев можно сделать и на Джаве (JVM же общая), но очень сложно. Кложа дает правильные примитивы, в терминах которых можно мыслить — stm, транзакции, стейт, его изменение и синхронизация (например, традиционные actors здесь называются agents, плюс много других concurrent примитивов). Когда этого нет, никто конечно не мешает их написать, но люди, у которых есть жизнь, скорее вляпают глобальный лок на время рендеринга или еще какую-нибудь гадость. Потому что просто и идиоматично для Джавы. И потом будут бодаться с бизнесом — и тормозит, и ненадежно, и исправляется только выбрасыванием. Чтобы сделать правильно, надо было с самого начала правильно идти по довольно тонкой тропке выверенных решений; в условиях реальных проектов кто ж так сумеет? Нужен правильный инструмент.

Пользуясь случаем, хочу сказать, что мыслить в терминах Кложи про стейт и его изменение легко, удобно, и трудно ошибиться. Мне когда-то казалось, что STM это что-то толстое, серьезное и страшное, вроде БД, но нет, удобное и понятное, и пригождается даже в мелочах.

Спешу развеять и остальные страхи: Кложа не такая уж строгая и суровая, а скорее практичная, так что мутабельное состояние там есть и вполне используется (да еще и сделано правильно).

Иммутабельность и персистентные структуры совсем не просаживают производительность, по крайней мере мне заметить пока не удалось. Видимо, если хоть как-то вовлечено io, всё нивелируется. Естественно, плюсы от них бесконечны.

Макросы — простые и понятные пушистые зверьки, позволяющие кое-где срезать углы или отложить вычисления. Адское непонянтное программирование на них (как в Midje) считается какашкой, обычно за макросом просматривается все, во что он разворачивается.

Скобки перестают напрягать и парить через несколько дней, а Кложевский способ вызова функций начинает казаться более логичным, чем традиционный, очень быстро. К тому же, скобки в Кложе оптимизированы по сравнению с Лиспом — их нужно меньше, и они бывают нескольких видов. Читается значительно лучше.

С синтаксисом всё в порядке — управляющих конструкций больше, чем в любом языке, что я видел (любят заточенные под разные случаи частные случаи макросы вроде ->> или condp).

И немного приятных мелочей. Кложа — это действительно очень прикольный язык трансформации данных. Его надо каким-то DSL, мне кажется, оформить и во все остальные языки встраивать, или в базы данных, или в NoSQL вместо js.

(->>
  (str "http://api.twitter.com/1/users/lookup.json?screen_name=" (str/join "," names))
  slurp
  json/read-json
  (map (juxt (comp str/lower-case :screen_name) :id_str))
  (into {}))

(reduce #(min %1 (@emitted %2 0)) limit ins)

(reduce #(%2 %1) (update-in record [:rules] conj name) actions)

(reduce (fn [s [f t r]] (str (subs s 0 f) r (subs s t)))
        (:text tweet)
        (reverse (sort replacements)))

Это действительно очень компактный код. Мне, например, нравится, что я могу свой любимый шрифт Nitti поставить (а он блистает на крупных размерах) и все равно многое на экран входит, несколько логических блоков как минимум. В Джаве этому количеству информации соответствуют три-четыре разных файла, какой шрифт не ставь, хреново.

Это нормальные-дефисы-в-именах вместо уродливых_подчеркиваний или ВерблюжьегоРегистра, да и вообще много прикольных спецсимволов в именах можно использовать. ->> например вполне валидный идентификатор.

В общем, я пока в полном кайфе от того, что нашел идеальный язык. Рекомендую, если не использовать, то ознакомиться.



> Скобки перестают напрягать и парить через несколько дней

Увы, это не так. Так и не перестали.

Всё остальное же есть и в Scala. Правда, надо отдать кложе должное, её автор — прагматик, и любит решать насущные проблемы, а не рассуждать теоретически. И ещё трудоголик.

(симуляция колонии муравьёв делается на скале несколькими разными способами и очень компактно, хотя дело не в этом — мы не каждый день пишем симуляторы колоний муравьёв).

Это как пример нетривиальной распределенной задачи над шареным стейтом, требующий координации и производительности.

> Вот чему я научился бы, свяжи я свою карьеру с Питоном? Джанге, WSGI и PyPi? А если бы с Руби, так вообще нахватался бы плохого.

Не очень понятен смысл этой фразы, если честно. Как-то она положительное впечатление обо всём посте сразу уничтожает.

Ну вы смотрите не на впечатления, а на факты. Я как бы впечатлить никого особо не хотел.

"""Макросы — простые и понятные пушистые зверьки, позволяющие кое-где срезать углы или отложить вычисления."""

Отложить вычисления можно через замыкания. Бывают какие-нибудь полезные применения макросов, не сводящиеся к замыканиям?

1) type providers, хотя к Кложуре это не относится.

2) настройка синтаксиса под себя, создание DSL. Замыканиями тупо неудобно пользоваться.

То есть так рассуждать, то можно докатиться до «всё равно всё процессор исполняет, давайте писать тупо на ассемблере». И некоторые ведь пишут, что самое ужасное.

без темы (Анонимно) Развернуть
Руби -> jruby -> jvm. Возможности те же в этом отношении.

Мне кажется, ты пропустил параграф про «важны инструменты и абстракции языка, а не то, на чем это в итоге исполняется».

Стоит отметить, что в Python тоже есть простые способы добавить производительности, см. ctypes и cython.

Это то что называется «переписать на C»?

О, а вот про лекции — спасибо.

http://alexott.net/ru/clojure/video.html - вот более-менее актуальный список видео-лекций, включая лекции автора данного журнала :-)

А что там с колонией муравьев? :)

Звучит как стандартная задача в разработке игр, который в основном на c/c++ пишется (есть ещё скрипты, но то что я видел - это такой же императивный код как и С++, только отдаётся менее опытным программистам).

https://gist.github.com/1093917 - эмуляция колонии муравьев, написаног почти в однотредовом стиле, но при этом оно автоматом скалируется на все доступные ядра

(Анонимно)
мне кажется, очень сложно читать и понимать вот такие штуки:

(reduce (fn [s [f t r]] (str (subs s 0 f) r (subs s t)))

вы привыкли уже?

Ну это я так, попугать скорее выложил :) Это мимолетный однострочник для замены в теле твита t.co cсылок на их развернутые аналоги.

А с чего посоветовали бы начинать знакомство если практически с нуля? Или лекций Рича Хики достаточно для начала?

http://alexott.net/ru/fp/books/#sec12 - "Для Clojure, наиболее актуальными книгами являются Clojure Programming (более детальная) и 2-е издание Programming Clojure. А вот после этих книг, я очень советую прочитать The Joy of Clojure. Thinking the Clojure Way — вы не пожалеете." :-)

(кроме того, не могу не отметить, что стиль программирования вышеприведённого примера ну очень напоминает хаскельный и фактически является его прямой трансляцией, только хаскель без скобок. Так что прозреваю скорый переход в ряды штангистов под знамёнами thesz, что, в принципе, не так и плохо, так как синтаксис хаскеля прекрасен, конечно).

>А Рич Хики крутой чувак и все время правильные вещи говорит, универсальные

Это плохо.

И самое важное:

>мне кажется, вообще всё надо на Кложе писать.

Хотел бы я увидеть хотя бы правильный синтаксический разбор языка Си, например.

Люблю трансляторы в качестве примера приводить.

>>А Рич Хики крутой чувак и все время правильные вещи говорит, универсальные
>Это плохо.

да, непригодный для практических задач кривохаскель гораздо лучше, ага.

без темы (Анонимно) Развернуть
1. мне вот в последние дни пришлось пописать на говнопитоне. прошу мне поверить, даже по сравнению с адом творящимся в рубях там полная и тотальная жопа и ортуреги. всё очень и очень плохо.

2. стоить заметить что вся прелесть кложи (как и любого лиспа) проявляется при использовании ктулхуугодных редакторов кода (ака emacs). саблайм? серьёзно?

3. а что за лекции рича? хотеть увидеть.

Datomic используете? Как впечатления?

Не используем. Впечатления супер :)

О фак, в приведённом примере количество всяких непонятных символов уже начинает напоминать Хаскель!!11

Со времен ФОРТа вывел для себя правило: если вместо 2+2 надо писать + 2 2 или 2 2 +, то этот язык обхожу стороной.

Ну и посмотрите на себя, где вы сейчас?

Вообще, обожаю, когда язык выбирают по даже не второстепенной, а по третьестепенной особенности синтаксиса. Это я и называю хипстерством. Именно поэтому наша индустрия в такой жопе.

Edited at 2012-12-10 14:55 (UTC)

без темы (Анонимно) Развернуть