Книга «Clojure на производстве»

    Неделю назад в издательстве "Ридеро" вышла книга "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 изменит ваше мнение о программировании. Обнаружит вопросы там, где, казалось бы, всё решено.

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 35

      0

      Спасибо! Читаю ваш блог иногда, если б писал на кложе, обязательно купил бы книгу :)

        0
        Обложка огонь!
          +1
          Есть ли по мнению автора у Кложи реальные киллер-фичи, ради которых стоить затевать перестройку мозгов и подтягивание нового языка в прод?
            0
            Фичи есть, но расписывать сейчас не могу, извините. Для этого и публикую книгу. Лишних знаний не бывает — не понравится, не делайте перестройку, а книгу подарите или отдайте в библиотеку.
              0
              Подумаю, пока жду версию для читалок)
              0
              0

              1) Я так понимаю, что ClojureScript Вы не рассматриваете?
              2) И ещё, может стоило написать книгу (может будущую) в стиле Cookbook? Раньше такой формат был распространён, и лично мне нравился, но в последние лет десять что-то не встречается (поправьте, если ошибаюсь).

                +1
                1) ClojureScript в книге нет, только серверная Clojure. Для ClojureScript нужен полный контекст, включая браузер и фронтенд в целом, что тянет на отдельную книгу.
                2) Напротив, я старался избежать стиля cookbook. Цель была выпустить что-то связанное, а не набор советов. Я не издатель, но предполагаю, что по этой причине подобные книги хуже продаются (примерно как сборники рассказов — их выпускают редко и только для состоявшихся авторов). Для Clojure есть cookbook на английском, он легко гуглится.

                  0

                  Ясно. Спасибо!

                    0

                    Если хорошо пойдёт это издание, можно надеяться на опус про ClojureScript? :)

                      0
                      Пока что в планах другая книга, но я буду иметь в виду.
                  0

                  Автор провел большую работу. Вне любых похвал!

                    0

                    Иван, спасибо! Не разделяю ваш восторг от Clojure и уж точно не разделяю агрессивные выпады в сторону Python в блоге.


                    Но то, что вы написали качественную книгу, не для начинающих, на русском — класс! Купил просто чтобы поддержать.

                      +1
                      Извините за Python, сейчас бы я так уже не писал.
                      0
                      Поздравляю с публикацией книги!
                      А с чем связан именно выбор Ридеро?
                        +1
                        Поиск издательсва это долгая история: нужно проговорить штук двадцать вопросов, и они, как правило, не расписаны на сайте. Ридеро это больше для любителей, но у них хорошо налажен процесс, и дело пошло. Плюс они сами предложили пару хороших вещей уже в полете. С другими издательствами не получилось найти диалог: где-то молчали, где-то был очень долгий процесс, и так далее.

                        0
                        С одной стороны, Ломоносов ввёл в русский язык 200 новых слов («газ», «атмосфера» и т.д.). С другой, если всякий будет так делать… Вообще, если слово «маркер» воспринимается как более русское — значит, дело плохо.
                          0

                          Потрясно! Выглядит хорошо!

                            0
                            Привет, я — Андрей и я — фанат Clojure :).
                            По нашему опыту, задачи на Clojure решаются в 2-3 раза быстрее, чем на Java (без потери качества).
                            Субъективно, года 2 назад был бум Clojure, но сейчас этот бум почему-то стих. Нет ли у вас такого ощущения? И если есть, то какие вы бы могли назвать причины этого?
                              +2
                              Мне трудно судить, был бум или нет. Даже если был, такие вещи всегда волнообразны. Вот пытаюсь сделать маленький бумчик.
                                +1
                                По нашему опыту, задачи на Clojure решаются в 2-3 раза быстрее, чем на Java

                                Простите, не смог удержаться) Просто само вспоминается…

                                  0
                                  Clojure как раз по-середине :).
                                  Как только модель данных полностью сформулирована и пазл сошелся, ничто не мешает в Clojure коде перейти на static typing.
                                0
                                Купил книжку, хотя Clojure пока что не знаю, но давно хочу приобщиться. Надеюсь, наличие книжки будет мотивировать.
                                  0
                                  Последний релиз Clojure вышел год назад.
                                  Кажется, что язык находится в стагнации.
                                  Или я не прав?
                                    0

                                    Скорее связано с тем что язык крайне стабильный и новые фичи в него почти не добавляются т.к. внезапно не нужно. Синтаксически в языке вообще мало что меняется потому что у него универсальный синтаксис, позволяющий внедрить любую конструкцию удобно не внося новые формы синтаксиса и это очень хорошо.
                                    Некоторые библиотеки дополняющие язык активно развиваются.
                                    Хотя конечно у разработчиков языке не так много ресурсов как у Java и C# чтобы каждые полгода внедрять очередную хайповую "фичу".

                                      0
                                      Взгляните на Python: все его последние изменения — паттерн матчинг, неизменяемые классы и другое — обусловлены тем, что их нельзя сдедать библиотекой из-за синтаксиса. В Clojure с ее макросами это не проблема. Поэтому нет смысла делать релиз на каждую фичу.

                                      0
                                      Этот метод оценки не работает в Clojure. Она устроена так, что самые базовые вещи можно менять библиотеками, и они активно развиваются.

                                      (UPD ответ cornerot)
                                        0
                                        Понял, спасибо.
                                        0
                                        А что можете посоветовать в качестве full stack веб фреймворка?
                                        Из того что находится в первую очередь — Pedestal, Hoplon и Fulcro.
                                          0
                                          Для full stack в основном берут Luminus, но чаще всего строят свое решение на базе отдельных библиотек.
                                            0

                                            Лучше возмите класику:



                                            В качестве веб сервера immutant-web 2(http://immutant.org/documentation/current/apidoc/guide-web.html). immutant ещё и други удобные модули содержит.
                                            Не советую альтернативные приведенным библиотеки, достаточно долго изучал что есть для clojure пришел к списку перечисленному выше. То что перечислил полностью покрывает нужны современного веба и достаточно просто, хорошо документировано и стабильно.
                                            Luminus можно посмотреть как обзор но использовать не советую. Это генератор и он вам создаст массу лишнего в чем можно запутаться, хотя можно все подключить и завести парой строчек на каждую из перечисленых либ.

                                            0
                                            Подскажите, пожалуйста, при таком использовании Яндекс.Деньги, обязательно регистрировать ИП?
                                              +1
                                              Нет, это обычная кнопка из раздела «сбор денег». Учетку в Яндексе лучше идентифицировать, есть способ через Сбер (если фио и телефон в них совпадают).
                                            0

                                            Спасибо, Иван, с удовольствием приобрёл электронную версию.

                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                            Самое читаемое