Я написал книгу, предварительный релиз, о создании веб-приложений с нуля.


Я прочитал много книг по программированию, но, часто, после прочтения у меня оставался только один вопрос — Как мне применить эти знания на практике?


Предположим, вы разработчик системы автоматизации, портала или интернет-магазина.
Добавление новой функциональности осложняется наслоениями кода. Запуск тестов занимает полчаса, а релиз — час. Идея о переходе на новую версию фреймворка вызывает нервные подергивания. Вы узнаёте, что PostgreSQL имеет поддержку массивов, jsonb, полнотекстового поиска и lateral join, но ORM не позволяет использовать их в полную силу. Вы прочитали про TDD, но как писать в таком стиле, когда аналитик описывает сценарии, а фреймворк требует создания модели, контроллера и представления?


Как применить SOLID, если сущности наследуют от ORM?


Как избавиться от боли?


Постепенно, по мере изучения Clojure, и, наконец после прочтения Clean Architecture, я понял, как без боли написать приложение, где на первом месте стоит предметная область, а не фреймворк, где я принимаю решения, а не создатели фреймворков навязывают свои.


В какой-то степени книгу можно рассматривать как практический самоучитель по Clojure,
так что знание этого языка не требуется.


Книга, как минимум, научит читать Clojure код.


Мы разберем основополагающие моменты, а именно: полиморфизм и управление состоянием.
В качестве практики реализуем монаду Either.


Во второй главе я познакомлю с базовыми идеями дизайна:


  • Объектно ориентированным проектированием
  • Принципами SOLID
  • Clean Architecture
  • Domain Driven Design
  • Dependency Injection
  • Приемами для работы с БД

В последующих главах я опишу, как создать приложение на этих принципах.


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


Реализуем доставку приложения пользователю с помощью web-технологий.
Разберем работу с формами, валидацией.


Рассмотрим реализацию абстракции хранилища на основе паттернов Data Maper, Identity Map и Unit of Work.


Я старался делать акценты на действительно важных вещах, а не перепечатывать документацию.
При чтении придется искать и изучать дополнительный материал, для этого я даю ссылки.


Книга содержит практические упражнения. Доступен проект, на основе которого она написана.


Важно понимать, что это предварительный релиз.


Наверняка есть проблемы с изложением, и мне важно как можно раньше собрать обратную связь.
На текущий момент у книги отсутствует сайт, нет pdf и epub.


Ссылка на книгу


Присылайте свои комментарии на m.kuzmin+afs@darkleaf.ru

Комментарии (14)


  1. tmnhy
    16.10.2018 09:25

    Стыдно писать книги и не знать, что

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


    А набор возможностей (функций), которые предоставляет данная система или устройство — это ФУНКЦИОНАЛЬНОСТЬ!


    1. Wilk
      16.10.2018 14:44

      Здравствуйте!

      У меня каждое упоминание функционала вызывает сходные эмоции.


    1. f0ks
      16.10.2018 14:50

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


    1. CheY
      16.10.2018 19:01

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


  1. leahch
    16.10.2018 11:24

    О! Как раз последний месяц смотрю на clojure (после С, java, python и кучи всего). Вот было бы очень интересно затронуть тему инструментария. Мне, как старому хрену, удобен eclipse, на котором сижу уже лет 20. Но посмотрев последние обзоры вижу emacs и IDEA в фаворитах. Первый хорош, но что-то на него пока не тянет обратно, второй не хочется по идеологическим соображениям. И собственно, пока только это и останавливает начать пользовать clojure по-взрослому.
    Так что был бы безмерно признателен за обзор или главку, как на нем взлетать, и на чём. Если emacs или что-то другое, так и написать «лучше ничего нет, ставьте и не пудрите мозги, все знакомые команды настоятельно советуют начинать с ХХХ». Думаю, такая глава была бы очень полезна и начинающим, вроде меня, и совсем начинающим.


    1. mkuzmin Автор
      16.10.2018 11:30

      В книге есть параграф про окружение.


      Например, там описан отдельный repl, не встраиваемый в редактор, и плагин для расстановки скобок и выравнивания кода.


      По поводу emacs — без нормальной клавиатуры, вроде kinesis, с ним очень сложно.


      Надеюсь, это поможет.


      1. leahch
        16.10.2018 16:29

        REPL — это хорошо, я не про него. Что нужно (возможно я и ошибаюсь) современному программисту? (телевизор!)
        1) Какой(ие)-то редактор(ы), которым пользуется большинство разработчиков
        2) В нем же — поддержка git/mercurial
        3) Важное для меня — автокомплит, про рефакторинг наверное в плане clojure говорить не стоит, хотя я же ламер, могу и не знать
        4) Навигация по проекту, инструменты отладки, пусть даже такие, как в Go
        5) Инструменты мониторинга — типа, а сколько у нас тута потоков, а к чему они, ресурсы там всякие… Да-да, наверное это как-то через JMX делается, или как-то иначе? (подозреваю)
        6) Ну и как нам теперь всю эту написанную хрень развернуть удаленно…
        7) Что там с производительностью, можно ли как-то мерить?
        8) И не последнее — вот не все любят тесты, но иногда их нужно. Что там взамен (x)unit и mock?

        Я понимаю, что большинство из этих вопросов к самому языку не относятся. Но… Взять любой стартинггайд по node.js, python, Go… И мы увидим все вот это…

        Про clojure читаю уже как месяц, язык — супер! И люди на нем работают, и интенсивно. Вот и хотелось бы знать тот workflow (а лучше и пару альтернатив), с которого принято начинать. Я же вот прямо с явы вваливаюсь, мне и шашечки, и ехать. И да, 10-15 лет уже прошли — пора. :-)


        1. mkuzmin Автор
          16.10.2018 16:45

          1) emacs + sider или idea + cursive, я пользуюсь первым. Кто-то пишет в ms vs code, там есть какие-то плагины.
          2) На любителя, кто-то просто git использует в терминале. Для emacs есть magit.
          3) Автокомлит в редакторе делается плагинами, тем же cider. Есть clj-refactor, но он не работает с новым cider =(
          4) Навигация зависит от редактора. Для emacs есть projectile.
          5) Есть java interop, т.е. из repl можно дергать java код.
          6) Например, запаковать в докер.
          7) да, есть бенчмарки, которые умеют прогревать JVM. В книге есть пример.
          8) вот пример теста


          Можно помотреть мой emacs.d.


          Взять любой стартинггайд по

          У меня нет цели писать стандартный гайд, иначе я бы никогда не закончил книгу.
          Для этого есть глава о материалах для самостоятельно чтения.


          1. https://clojurecourse.by/ — отличные русскоязычные курсы
          2. https://www.braveclojure.com/clojure-for-the-brave-and-true/

          Если просто написать web приложение, вот чтобы сразу ехать, то можно посмотреть в сторону luminus. Но как спроектировать архитектуру там не расскажут.


          1. leahch
            16.10.2018 16:55

            Отлично! Жаль, не могу карму увеличивать. А можно сразу в pdf рендерить? Чтобы по md не тыркаться, или в Wiki? Хотя, и так большое спасибо за труд!


            1. mkuzmin Автор
              16.10.2018 17:06

              Да, есть планы на сайт, pdf, epub и т.п. Спасибо.



  1. tungus28
    16.10.2018 19:21

    Из вступления: «ORM генерирует крайне неэффективные запросы». Вроде бы ORM и в теории не сможет генерировать очень эффективные запросы? Где нужна производительность, лучше использовать чистый SQL?


  1. ggo
    16.10.2018 19:30
    +1

    Для публикаций — readthedocs.org

    По работе, молодец.


    1. mkuzmin Автор
      18.10.2018 21:34

      спасибо за совет
      https://app-from-scratch.darkleaf.ru