Неделю назад в издательстве "Ридеро" вышла книга "Clojure на производстве". Как ее автор, расскажу о ней подробнее: что внутри и кому она полезна.
Общие сведения
Это книга о том, как применять Clojure в настоящих условиях: не сортировать списки в олимпиадных задачах, а поднимать веб-приложения, строить системы, писать тесты. Мой опыт с Clojure показывает, что переход от теории к практике происходит болезненно. Руководства обещают чистоту и неизменяемость, но на практике нам дают код, полный побочных эффектов и состояния.
Это книга — попытка облегчить погружение в практику. Одновременно хочу развеять ложные надежды: Clojure — прекрасный язык, но и в нем не бывает чудес.
От других материалов по Clojure книга отличается следующим. Прежде всего, это не перевод. Я не зря делаю на этом акцент во вступлении. Проблема переводов в том, что в издательствах не понимают технические термины и пытаются их адаптировать. Token становится маркером, trait — чертой, persistence — сохранностью. Формально перевод корректный, но пропадает живость описания, и к нему падает интерес. В своей книге я не срезал углы: если у слова нет однозначного перевода, я ставил английский вариант — тот, в котором мы видим его каждый день.
Это не очередное введение в язык. В книге нет инструкций, где скачать и настроить Clojure. Нет в ней и той части, где учат основам языка. Уверен, это обрадует читателя, потому что введения вы найдете в интернете сами. Книга не ставит цель научить Clojure с нуля. Предполагается, что вы знакомы с языком или хотя бы имеете о нем базовое представление.
Это решает проблему бесконечного введения. Купите десять книг по Питону, и в каждой из них половину занимают азы синтаксиса, списки-словари-кортежи. Глубокие знания о языке приходится искать в блогах и докладах, и это неправильно. Должны быть книги, где вместо введения сразу приступают к сложным темам, и эта — одна из них.
Книга о Clojure особенна уже тем, что затрагивает этот язык. Clojure мало известен в России, и это сказывается на числе публикаций о нем. До сих пор читатель мог купить только "Программирование на Clojure" издательства ДМК-Пресс. Это хорошая книга, но она выпущена в 2013 году, а время не стоит на месте. Если предположить, что авторы писали оригинал на год-два раньше, получим разницу с сегодняшним днем в девять лет, что очень много по IT-меркам.
Конечно, Clojure это не JavaScript, где один год идет за три. Недавно я пролистал "Программирование на Clojure" и убедился, что материал актуальный. Однако многих вещей, которые сейчас используют в Clojure, на тот момент не было. Книга, которую я предлагаю, закрывает этот недостаток. В ней описаны современные подходы, библиотеки, паттерны. Конечно, и в моем случае есть отставание: с момента, как я начал писать, прошло полтора года. Все же это меньше, чем девять лет.
Что внутри
В "Clojure на производстве" семь глав. В каждой из них я рассматриваю конкретную тему, с которой вы столкнетесь на практике. В отличии от других книг, я ставил цель не охватить как можно больше тем, а продвинуться вглубь насколько это возможно (избегая только совсем узких моментов). Когда читатель знакомится с новой техникой, он сразу узнает, в каком контексте ее применять, ее плюсы и минусы, и что делать, если на данный случай техника не ложится.
Короткий список глав, которые вас ожидают.
Основы веб-разработки
Обзор протокола HTTP, знакомство с фреймворком Ring. Маршруты на примере Compojure и Bidi. Концепция middleware и его стека. Стриминг и проксирование. Другие решения для веба.
Spec
Понятие спеки и валидации. Спеки различного типа (скаляры, коллекции). Комбинирование сложных спек. Вывод значений по спеке. Понятные сообщения об ошибке. Парсинг кода на Clojure. Спецификация функций. Обзор сторонних решений и дополнений.
Исключения
Базовые принципы исключений в Clojure, параллели с Java. Семантика исключений, их сбор, печать, передача в Sentry. Логика на исключениях, решения на предикатах. Другие техники для работы с исключениями.
Изменяемость
Плюсы и минусы состояния. Изменяемые типы в Clojure: атом, volatile, динамические переменные, alter-var-root и другие техники. Сценарии их использования, макросы, тесты.
Конфигурация
Понятие конфигурации, простой загрузчик. Переменные среды в Clojure. Обзор и сравнение форматов данных. Библиотеки для конфигурации проекта.
Системы
Введение в компоненты и системы. Обзор библиотек Mount, Component и Integrant.
Тесты
Понятие тестов, их виды. Покрытие и анализ. Тестовый фреймворк Clojure. Фикстуры для базы данных и систем. Полезные практики, тестирование интерфейса. Сторонние решения для тестов.
Код
Код в книге занимает такое же важное место, как и текст. Меньше всего мне хотелось залить книгу листингами, в которых "все очевидно". Этим грешат айтишный книги, где код просто печатают моноширинным шрифтом. Восприятие кода с бумаги и экрана разное. Программисты привыкли читать код с экрана, и бумажная версия должна повторять свойства IDE или редактора.
Код я подсветил с помощью Pygments и специального стиля для черно-белой печати, который написал отдельно. Pygments поддерживает много языков, в том числе и Clojure. В книге подсвечены все блоки кода, включая SQL, JSON, XML и другие второстепенные технологии.
Вы не найдете листинга длиной более половины страницы, да и такие случаи редки. Текст идет вперемешку с небольшими вкраплениями кода. Я следил за тем, чтобы из-за длинного кода читатель не потерял мысль. Большие фрагменты кода я разбиваю на смысловые части и объясняю, что происходит.
В фирме, где я работаю, проекты на Clojure устроены как описано в книге. Во многих случаях я копировал код из боевых проектов и адаптировал для книги. Все техники и приемы, о которых речь в книге, я опробовал лично. Каждую строчку кода выполнил в репле.
Купить и скачать
Теперь о том, где и в каком виде можно купить книгу.
Печатная версия
Интернет-магазин Ридеро, формат А5, 360 страниц, мягкая обложка. Книгу печатают по технологии print on demand. Это значит, сразу после заказа ее оперативно печатают на специальном станке. На этой же странице можно купить электронную версию, но для этого я рекомендую Gumroad (см. ниже).
На Озоне в аналогичном формате. Книга стоит немного дороже, но Озон компенсирует это удобной доставкой. При заказе от 1000 рублей доставка бесплатна, так что это повод заказать другую книжку, которую вы приметили в прошлый раз.
Заказать у меня лично. Ссылка перекинет вас на страницу книги с кнопкой Яндекс.Денег. Заполните форму и переведите 800 рублей. Я вышлю вам книгу в твердой обложке и подписью по указанному адресу. Вышлю в любую страну, детали отправки обсудим в личке. К предзаказу прилагается подарок – бесплатный доступ к электронному бандлу. Аккаунт в Яндексе идентифицирован. Если не получается оплатить через Яндекс, пишите – скину альтернативные способы.
Электронная версия
- Доступна на Gumroad. При покупке вы получите набор PDF-файлов под разные устройства. Сейчас доступны версия для печати и для планшета. Последняя отличается тем, что у нее срезаны поля, нет QR-кодов, а все ссылки нажимаются. Сейчас я готовлю версии для читалки и телефона. У них меньше размер страницы и по-другому набран код, чтобы уместиться без искажений. Вы можете купить бандл сейчас, а позже скачать обновление.
Галерея
Вот как выглядит мягкая обложка:
А так — твердая (ух!):
Страницы:
Толщина:
С планшета:
Читалка и телефон в процессе подготовки:
Обратная связь
Коротко обо мне как об авторе. Программист, последние пять лет пишу на Clojure на регулярной основе. Работаю удаленно в европейской фирме, где язык преобладает над другими технологиями. Поддерживаю несколько библиотек. Веду блог о Clojure и удаленной работе.
Если вы нашли в книге ошибки и опечатки, сообщите их любым удобным способом — почтой, Телеграмом, личкой на Хабре. Я сделаю все, чтобы обновить макет между тиражами, и, если вы не против, добавлю вас в раздел "благодарности".
Дальнейшая работа
С выпуском книги я не закончил работу над ней. Параллельно я запустил перевод на английский язык. Планирую обратиться с ним в издательство Pragmatic Programmer или в сервис Lulu.com. Вместе с помощником мы работаем над версией под мобильные устройства. Наконец, в планах перечитать книгу еще раз и через год выпустить улучшенную версию.
С языком ситуация особая: я долгое время колебался: писать на английском и потом перевести на русский, либо наоборот. Английский привлекает охватом аудитории; все же я выбрал второй вариант, потому что именно на русском я выражаю мысли максимально точно. Русская аудитория особо ценна для меня: книга изначально нацелена на нее, и английский перевод отталкивается оригинала на русском, а не наоборот.
Все новости о книге я собираю на официальной странице.
О Clojure
Коротко напомню, что за язык Clojure и почему он будет вам интересен. Это современный диалект Лиспа на платформе JVM. Код на Clojure компилируется в байткод и работает как обычная программа на Java. Clojure взаимодействует с JVM: можно создавать объекты из классов, вызывать их методы, обращаться к проверенным библиотекам.
Clojure это не только паразитирование на JVM. Язык предлагает неизменяемые коллекции и средства асинхронного программирования. Автор языка ставил цель создать такой дизайн, в котором было бы легко решать трудные задачи. В Clojure программирование сводится к структурам и функциям. Большую роль играет интерактивные программирование в REPL, когда вы проверяете код сразу после того, как написали его.
Некоторое время развивалась версия языка на платформе .Net, но теперь работа над ней остановлена. Автор языка и его окружение решили сосредоточить силы на одной реализации под JVM. Одновременно набирает силу компилятор Clojure в JavaScript, названный ClojureScript. В отличии от других языков, это не очередная забава something.js. ClojureScript используют большие и малые фирмы. Его библиотеки предлагают удобный способ писать фронденд.
Старожилы любят поворчать, что Clojure это не Лисп. Не удивлюсь, если кто-то напишет это в комментариях, не дочитав статью. Все зависит от того, что поднимать под термином "Лисп". Clojure действительно нарушает традиции старых диалектов, например, того же Common Lisp. С другой стороны, в одном только повторении прошлого нет смысла — не будет движения вперед. С нами по-прежнему S-выражения, макросы и REPL, но кроме них — иммутабельные коллекции, асинхронность из коробки, и многое другое, чего нет в других диалектах. Моя цель — не выяснить, похож ли Clojure на Лисп или нет, а предложить читателю материал, из которого он вынесет это сам. А может быть (и я сам так считаю), вопрос о диалекте на самом деле не важен.
Замысел и история
Написать книгу меня побудил случай два года назад. Я ревностно скупал книги по Clojure на английском, следил за анонсами в блогах и Твиттере. От одной из них я ожидал особенно много, но книга разочаровала — это было очередное введение в язык, и новых знаний я почти не получил.
Я сел писать разгромный пост на английском, но вовремя понял, что это путь неудачника. Хейтерский пост сдует в ленте, а книга останется. Ради интереса я решил проверить, сколько напишу о Clojure сам, и неожиданно вышло сорок страниц. Это воодушевило меня, и я продолжил писать на другие темы, тезисы к которым набросал в тетради.
Со временем стало ясно, что материал получается связанный — следующие главы опирались на прошлые. Возникла идея объединить написанное в книгу. Чтобы закрыть план, ушло около года. Черновики я выкладывал в блог, потому что мне было все равно: если брошу, то хоть что-то останется. Еще полгода я потратил на редактирование, верстку и издание. Это было интересно и изнуряюще, но сейчас не будем об этом.
Заключение
Книга — все еще отличный подарок для себя, коллеги или второй половины. Если ваш знакомый увлекается скобочками, подарите ему книжку. Это будет стопроцентное попадание, потому что, как мы выяснили, на рынке не так много книг о Clojure, чтобы можно было выбирать.
Закончу цитатой из вступления к книге. Даже если вы не любите Лисп, и книга попала к вам случайно, не спешите её откладывать. Clojure — это новые правила и другой мир, а книга — шанс туда попасть. Может быть, Clojure изменит ваше мнение о программировании. Обнаружит вопросы там, где, казалось бы, всё решено.