Недавно мне поступило предложение от издательства Packt Publishing: оставить отзыв о книге Clojure web development essentials в обмен на эту самую книгу.
Естественно, я согласился, потому что давно уже положил глаз на Clojure и его в веб-стек в том числе, и через некоторое время книга появилась в моей учетной записи на packtpub.com. Удобно, что прямо оттуда можно послать книгу прямо в Kindle — я использую приложение на телефоне и планшете, прогресс чтения синхронизируется между ними.
Итак, на данный я прочитал 5 глав из 11 и здесь опишу впечатления.
Краткое содержание прочитанного
О чем вообще книга
Как следует из названия, о веб-разработке с применением Clojure, причем только серверной части (соответственно, ничего нет про ClojureScript).
В книге используется «фреймворк» Luminus, который фреймворком можно назвать условно. Luminus — это шаблон для Leiningen (главная система сборки и автоматизации для Clojure-проектов), который предлагает некоторый набор библиотек для веб-разработки на Clojure и несколько удобных уже написанных функций (вроде запуска\остановки встроенного сервера, умного рендеринга шаблонов) и собственно каркаса приложения.
Глава 1. Приступая к работе с Luminus
Установка окружения, генерация с помощью Luminus первого приложения. В общем, запускаем HelloWorld и осматриваемся.
Глава 2. Ring и Ring Server
Хотя автор и называет главу «самой сухой в книге», она одна из самых главных — здесь достаточно подробно рассматривается основы взаимодействия с HTTP-стеком: request maps, response maps, handlers, middleware.
Глава 3. Логгирование
Как, наверное, и во всех языках, логгирование — это вещь из серии «настроил и забыл». Тут так же: сначала немного рассказывается про библиотеку Timbre, затем вместо стандартного настраиваем date rolling appender.
Глава 4. URL маршрутизация и шаблоны
Как стандартом для HTTP является Ring, так Compojure — стандартный набор макросов для генерации правил URL-маршрутизации. В первой части главы рассказывается про маршрутизацию URL, обработку и деструктуризацию параметров. Во второй части — про шаблонизатор Selmer, с краткой демонстрацией его возможностей: переменные, фильтры, теги, наследование шаблонов. Selmer написан с оглядкой на встроенный в Django шаблонизатор. Это удобно, учитывая распространенность подобного синтаксиса (в отличие, например, от Hiccup, который является скорее DSL для HTML).
Глава 5. Обработка ввода
В этой главе описан подход к валидации входных данных из HTML формы с помощью библиотеки Validateur и созданию переиспользуемых функций валидации.
Общие впечатления и примечания
Некоторые вещи уже устарели. Например, из Luminus 2 убрана библиотека lib-noir; для валидации теперь по умолчанию используется Bouncer, а не Validateur, как в книге; немного изменился код генерируемого приложения и т.д. Хоть автор и предупреждает об этом и говорит, как зафиксировать версию Luminus, чтобы все примеры из книги работали, все равно хочется самое свежее на данный момент. В целом можно приспособиться.
Отсутствует введение в Clojure, и это хорошо, потому что вряд ли кому-то нужно очередной tutorial по Clojure за 15 минут. Есть много хороших книг и кратких онлайн-руководств по языку.
Перед чтением, помимо знакомства с Clojure и основами веб-разработки, хорошо бы иметь представление о Java Servlet и контейнерах сервлетов, чтобы понять, что происходит в промежутке между браузером и Ring (и увидеть всю красоту Ring).
Понравился подход, когда сначала в кратком виде излагается «Что?», а после «Как?» и «Зачем?» — это позволяет быстро вернуться назад, и окинуть взглядом основные концепции главы. При этом нет слишком долгого описания библиотек — для глубокого ознакомления присутствуют ссылки на отдельную документацию (или прямиком на исходный код ☺). Кстати, книга своей простотой и последовательностью мне напомнила «The Definitive Guide to Django».
Также хорошо, что в такой небольшой книге освещаются важные для production темы: логирование, тестирование, миграции БД, работу в разных окружениях (dev\prod).
Заключение (тоже предварительное)
Пока что книга оставляет преимущественно позитивные впечатления. Даже если я не буду использовать Clojure в качестве основного языка в рабочих проектах, просто приятно отвлечься от «enterprise» кода с Java, Spring и т.п. и иногда что-нибудь на красивом языке.