Date: 2020-02-10 Author: @morozzzko
Дочитал книгу Domain Modelling Made Functonal от Скотта Влашина. Потратил на это почти год — читал неспешно и с большими перерывами. Эта заметка — конспект, в котором я описываю не только мысли из самой книги, но и своё отношение к ним.
В DMMF много примеров с кодом, но я не могу сказать, что она для программистов. Если человек умеет читать и писать код даже на уровне скриптов, есть все шансы понять и оценить тему. Но я бы не рекомендовал — для того, чтобы осознать ценность написанного всё же лучше иметь бэкграунд в написании софта.
Я выделяю две группы людей, которые получат максимум от этой книги.
Практикам DDD, которые хотят посмотреть на один из подходов к проектированию в функциональных языках. Для них покажут способы обеспечить соблюдение инвариантов, описать конечные автоматы, организовать бизнес-логику и переходы на границах системы.
Начинающим в DDD. Им простым языком расскажут про основные концепции: bounded context, value object, entity, aggregate, domain, domain event, domain expert, ubiquitious language. Покажут, как моделировать предметную область: превращать требования в данные и процессы. В конце книги покажут, как работать с границами системы и выходить за пределы «идеального» мира.
Книга постепенно вводит в контекст. Не бросает читателя в сложный жаргон, а постепенно наращивает сложность и рассказывает о ценности DDD и вводит новые понятия
Повествование фокусирует на важном. В этой книге предлагается конкретный подход к проектированию, но его нужно сначала понять. Программисты могут захотеть проектировать через таблицы, либо через классы. Чтобы этого не было, автор заостряет на этом внимание и подсказывает, как направить мышление в нужное русло.
Рекомендации по использованию доменных событий. Например, рекомендует не использовать их внутри одного контекста — потому что это создаёт неявную зависимость. Вместо этого предлагается добавить ещё одну функцию в цепочку.
Понятие Railway-Oriented Programming. Тот самый подход к проектированию пошёл именно отсюда — Скотт Влашин популяризовал этот термин и дал ему имя.
Идеи из фунционального программирования. Если программист никогда не писал на Rust, OCaml, F#, Haskell или Scala (там это уже есть), то будут новые концепции:
- Типы-суммы. Также известны как variant type, choice type, or-type, sum type. Мне очень понравилось, как их вводят
- Тип Result — его используют, чтобы выразить успешность или неуспешность вычислений. А ещё он монадичен
- Тип Async для асинхронных вычислений. Как и Result, он монадичен
- Railway oriented programming для организации пайплайнов, которые могут быть успешными или нет. Скотт — основной популяризатор этого подхода.
- Как пользоваться Result + Async и не страдать
Рассказывает, как использовать типы. Это одна из причин, почему я вообще захотел её прочитать. Мне близко проектирование через типы, и в этой книге этого много. По сути, его цель — сделать так, чтобы типы документировали предметную область и гарантировали соблюдение инвариантов.
Примеры, как быть. Иногда DDD критикуют за то, что это абстрактная идея, и непонятно, как к ней подойти. Скотт в конце книги рассказывает:
- Как организовать границы контекста: как валидировать, как парсить
- Как работать с базой данных: читать и писать. Больше акцента на «писать» — с этим вопросов больше
- Как быть, когда процессы усложняются и разрастаются. Рассказывает о конкретных усложнениях и предлагает варианты
Легко читается. Можно даже пропускать участки кода и будет нормально.
Автор ссылается на более широкие темы. Например, на ивент-сорсинг, CQRS и похожие архитектуры. Упоминает, что вместе с его идеями отлично сочетаются и другие. Например:
Слишком много типов. Одна из идей — уйти от строкотипизированных структур. В итоге почти все строковые типы получают специализированные обёртки — PhoneNumber, Email, Name. Это хорошо ложится в систему ценностей, но мне так писать не понравилось
Да и в общем-то всё. Можно придираться, что чего-то не хватило, но это уже за скоупом книги
8/10 для своего уровня, берите