воскресенье, 6 января 2013 г.

Web-разработка на Clojure


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

Легче всего убедить начальство в случае, если предстоит небольшой fixed-price проект, на который, предположительно, ресурсов выделено или впритык, или меньше, чем нужно. Ваш главный аргумент здесь – время (оно же – деньги). Вы берете предложенную вам оценку сроков и поясняете начальству, что вот на этом, этом и этом этапах (итерациях, модулях, системах и т.д.) можно сократить сроки разработки на 30-40%, если отказаться от Java в пользу Clojure. Любой умный начальник (ну а зачем вам работать у глупого?) как минимум выслушает ваше предложение о том, как сократить сроки.

Будьте готовы ответить на вопрос, за счет чего уменьшатся сроки. Это самый шаткий момент, здесь нужна максимальная предметность. Не стоит рассказывать о вредности мутабельного состояния или славном прошлом лиспа. Идеальный вариант – на примерах показать насколько меньше в Clojure различных церемоний, а также насколько проще в Clojure автоматизировать всю ручную работу, привычную Java-программистам.

В этот раз мне повезло сыграть на контрасте. Во-первых, я показал, насколько проще в Clojure работать с REST-сервисами, по сравнению с “правильным” способом на Java – библиотекой JAX-RS. Во-вторых, я немного рассказал о применении макросов для автоматизации, а также о том, насколько просто получить доступ к данным из БД (на примере библиотеки Korma).

Следующий вопрос, который необходимо будет решить – кто будет поддерживать ваш исходник, ведь Clojure кроме вас никто и не знает. Я предложил провести небольшой мастер-класс по Clojure, чтобы научить людей хотя бы читать и немного понимать Clojure-код. Главное здесь – избавить коллектив от страха перед скобочками. Кроме того, я раздумываю над тем, чтобы написать небольшую методичку, максимально приближенную к практике, о применении Clojure в web-разработке. Алекс Отт написал введение в сам язык (http://alexott.net/ru/clojure/clojure-intro/), но я думаю, есть смысл добавить описание популярных библиотек, а также рассказать о распространенных приемах разработки на Clojure.

Само собой, не рекомендую ввязываться во всю эту авантюру, если не опробовали Clojure раньше в хобби-проектах. Крах будет фатальным как для вас, так и для репутации Clojure на вашей фирме.

Помимо текущего, у меня уже есть один коммерческий проект на Clojure в продакшене и два хобби-проекта, поработавшие в продакшене какое-то время. Но последний из них я писал в сентябре 2012, с тех пор кое-что поменялось. Ниже я расскажу, что, с моей точки зрения, изменилось, а также о том, какие грабли бывают с Clojure.

Самое заметное изменение – смерть микро-фреймворка Noir. Как известно, Крис Гранжер собрал на Kistsarter-е нужную сумму для своего стартапа и сейчас во всю пилит экспериментальную супер-модерновую IDE LightTable. Поэтому на веб-фреймворк Noir и ORM Korma времени у него не осталось. Общими усилиями выпустили версию Noir 1.3, и на этом развитие фреймворка прекратилось.

К счастью, теперешний мейнтейнер Noir – Raynes (Энтони Гримс) – исхитрился разделить этот фреймворк на две части: сам Noir и библиотеку lib-noir. Так вот, библиотека lib-noir, которая содержит полюбившиеся всем “батарейки”, жива и развивается. Теперь её используют в связке с Compojure.

 Энтони Гримс

 Библиотеку Korma постигла более счастливая судьба. Пару недель назад в чате #clojure на irc.freenode.net Алекс Барановский предложил взять развитие Korma в свои руки. Ему дали права мейнтейнера, и теперь он по-стахановски постит в гитхаб коммит за коммитом. Пару дней назад Алекс опубликовал новую версию Korma – 13-ю бету, которая вышла вслед за 11-й спустя несколько месяцев.

Алекс Барановский
 
Compojure и Enlive ничем особенным не отметились за последние месяцы. Зато вышло несколько бет библиотеки Enfocus (ClojureScript-версии Enlive). Автор Enfocus Крейг Киркендалл полностью переработал архитектуру библиотеки. И теперь, в 1.0 версиях, в отличие от 0.9, для доступа к элементам DOM используется библиотека Domina. В целом, 1.0-версия Enfocus лучше и стабильнее 0.9 несмотря на значительные архитектурные изменения.

 Крейг Киркендалл

Ну и пара слов о личных впечатлениях. Когда разрабатываешь Single-Page Application на Clojure, наиважнейшее значение приобретают unit-тесты. В jvm-версии Clojure все не так печально. Худо-бедно, стектрейс вам подскажет где и что отвалилось, хотя и здесь функциональное тестирование лишним не будет (статической типизации-то нету). Но в ClojureScript типизация настолько слабая, что на определенном этапе это может даже быть неудобным. Сизифов труд вам покажется лёгким и осмысленным по сравнению с рефакторингом работающего ClojureScript-приложения. Компилятор почти ни в чем вам не поможет, и основной способ докопаться до сути – как-то запустить засбоивший фрагмент, найти поломанную функцию и долго медитировать над её исходником.

Чтобы рефакторинг ClojureScript-кода был менее болезненным, необходимо писать юнит-тесты. Причем, юнит-тестами нужно проверять не столько логику, сколько количество полученных параметров и даже наличие вызываемой функции впринципе (возможно вы все переименовали, но до сих пор где-то сохранился код, вызывающий старые, несуществующие функции).
Юнит-тесты на ClojureScript – это, пока что, пичалька. ClojureScript – инструмент молодой, развивающийся. На сегодняшнем этапе нет устоявшейся практики правильного написания юнит-тестов. Местами можно наткнуться на использование библиотеки PhantomJS. Но, признаюсь честно, мне не удалось найти толкового руководство по тому, как её завести. Да и у самого ничего не получилось. Поэтому, в моих проектах юнит-тесты ClojureScript достаточно кустарные.

Завершить обзор хотелось бы на приятной ноте. В 2012-м году вышли еще две очень классные книжки по Clojure.

Очень полезная и практическая книжка Clojure Programming. Помимо самого языка, в ней есть обзор основных популярных библиотек и практик разработки на Clojure.

И вторая, но единственная в своем роде, – ClojureScript: up and running. В ней всего 116 страницы, тянет на крупный туториал. Зато все по делу, без воды. Подробно рассказано, как завести ClojureScript и как разрабатывать на нем приложения.


2 комментария:

  1. Clojure Programming сейчас переводится на русский язык, издательство ищет людей для вычитки (у меня в блоге детали)

    ОтветитьУдалить
  2. Спасибо, отправил им письмо.

    ОтветитьУдалить