Если вы собрались плотно погрузиться в тему Doman Driven Design (DDD), о том как его применять, как использовать, для чего он нужен, и как с ним связаны Command and Query Responsibility Segregation (CQRS), Event Sourcing то можно воспользоваться планом обучения, который последовательно погрузит вас в эти темы и поможет сориентироваться. Часть информации на русском, часть на английском языке, так как русскоязычных аналогов я не смог найти.
Я рекомендую сначала ознакомиться с Базовыми видео, от основателя этого термина Эрика Эванса, чтобы понять его философию и причины возникновения.
Основы DDD от основателя. Видео.
Что такое DDD от Эрика Эванса https://www.youtube.com/watch?v=pMuiVlnGqjk
Ограниченные контексты от Эрика Эванса https://www.youtube.com/watch?v=am-HXycfalo
Хорошая архитектура - не идеальная архитектура от Эрика Эванса https://www.youtube.com/watch?v=lY54TmmEllY
Боремся со сложностью в сердце программного обеспечения от Эрика Эванса https://www.youtube.com/watch?v=dnUFEg68ESM&t=2270s
Пример моделирования DDD от Эрика Эванса https://www.youtube.com/watch?v=T29WzvaPNc8&t=1718s
Канал конференции по DDD где можно найти другие выступления Эрика Эванса и других спикеров https://www.youtube.com/channel/UC3PGn-hQdbtRiqxZK9XBGqQ
Погружаемся в DDD
Быстрая обзорная статья по DDD от Microsoft
Статьи на русском по основным принципам DDD
https://habr.com/ru/post/316438/ часть 1
Книги по DDD, "о которых все говорят"
Эти книги точно стоит приобрести и прочитать, а потом много-много раз в процессе работы к ним возвращаться. Когда вас спрашивают, насколько вы знаете DDD, можете щеголять цветами прочитанных книг, посвященные в тему вас поймут :)
-
Зеленая книга Вернона (для начала) Domain-Driven Design Distilled 1st Edition by de Vaughn Vernon
Красная книга Вернона (для погружения); Implementing Domain-Driven Design 1st Edition by Vaughn Vernon
Синяя книга Эванса (для полного просветления); Domain-Driven Design: Tackling Complexity in the Heart of Software by Eric Evans
https://martinfowler.com/books/eaa.html Паттерны в Enterprise приложениях от Мартина Фаулера
План обучения
Я бы даже назвал его план последовательного освоения материала, чтобы именно погружаться в тему постепенно, а не бултыхнуться в нее с кучей неизвестных терминов.
Для части пунктов не приведены ссылки сознательно, обычно одна статья покрывает несколько пунктов, поэтому воспользуйтесь ссылкой из пункта выше, чем тот который вас интересует.
-
Введение в DDD
Что такое DDD? https://blog-programmista.ru/post/132-ddd-what-is-it.html
Почему вы должны заботиться о каком-то DDD? https://habr.com/ru/post/497656/
Важность коммуникации в DDD
Единый язык (ubiquitos language) https://habr.com/ru/post/232881/
Пример домена/субдомена https://mtsepkov.org/images/7/7e/CUSTIS-Tsepkov-SoftwarePeople-2013.pdf
https://www.youtube.com/watch?v=CR9mLGN9jh0Плюсы / Минусы Подводные камни DDD
-
Проблемы моделирования в ПО
Перечисление проблем
Что такое домен? https://qastack.ru/software/359592/what-is-a-domain
Как разбить домен на субдомены https://habr.com/ru/company/otus/blog/566742/
Определение Bounded Context (ограниченный контекст)
Различие между субдоменом и ограниченным контекстом
Единый язык ограниченного контекста
Закон Конвея https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%9A%D0%BE%D0%BD%D0%B2%D0%B5%D1%8F
EventStorming https://habr.com/ru/company/oleg-bunin/blog/537862/
-
Элементы доменной модели
Анемичные и Богатые модели https://habr.com/ru/company/dododev/blog/532628/
Сущности (Entities) в DDD и ограниченном контексте https://habr.com/ru/post/316890/
Принцип Single responsibility (единственной ответственности) сущностей
Ассоциации или связи
Value Object https://habr.com/ru/post/316890/
Отличие Entity от Value Object https://habr.com/ru/post/275599/
Domain Services (службы домена) https://habr.com/ru/post/316890/
-
Агрегаты в DDD
Определение и цели использования https://habr.com/ru/company/dododev/blog/532628/
Корневые агрегаты
-
Репозитории в DDD https://martinfowler.com/eaaCatalog/repository.html
Определение и назначение https://docs.microsoft.com/ru-ru/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-design
Сравнение репозиториев с фабриками
Виды репозиториев
Unit of work https://martinfowler.com/eaaCatalog/unitOfWork.html
-
Доменные события и Анти-Коррупционный Слой
-
Доменные события https://docs.microsoft.com/ru-ru/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/domain-events-design-implementation
Грег Янг (Greg Young). Что такое событие предметной области? https://cqrs.files.wordpress.com/2010/11/cqrs_documents.pdf#page=25
Границы доменных событий
Анти-коррупционный уровень https://russianblogs.com/article/2365847005/
-
Eventual Consistency https://star-wiki.ru/wiki/Eventual_consistency
-
Слои в DDD приложении https://ademcatamak.medium.com/layers-in-ddd-projects-bd492aa2b8aa#:~:text=Layers%20in%20DDD%20Projects&text=In%20projects%20developed%20with%20the,try%20to%20explain%20with%20examples
Назначение слоев
Presentation Layer
Application Layer
Business Logic Layer
Domain Layer
Infrastructure Layer
-
CQRS паттерн
Определение https://microservices.io/patterns/data/cqrs.html
Контекст и проблема
Решение
Подводные камни
Когда использовать CQRS паттерн https://martinfowler.com/bliki/CQRS.html
https://www.objectivity.co.uk/blog/when-to-use-and-not-to-use-cqrs/
-
Event Sourcing паттерн https://docs.microsoft.com/en-us/azure/architecture/patterns/event-sourcing
Контекст и проблема
Решение
Подводные камни
Когда использовать CQRS паттерн https://martinfowler.com/eaaDev/EventSourcing.html
-
CQRS + EventSourcing
-
Пример совместного использования
-
Пример трансформации обычного приложение с “лапша-кодом” в DDD-style с пошаговыми пояснениями (Супер!) https://slides.silverfire.me/2017/yiiconf-ddd/#/
Пример полного сжатого изложения с примерами https://habr.com/ru/company/jugru/blog/440772/
-
Другие паттерны используемые при разработке микросервисов
Более полное погружение в DDD
Грег Янг (Greg Young). Что такое событие предметной области? https://cqrs.files.wordpress.com/2010/11/cqrs_documents.pdf#page=25
Ян Стенберг (Jan Stenberg). События предметной области и итоговая согласованность https://www.infoq.com/news/2015/09/domain-events-consistency
Джимми Богард (Jimmy Bogard). Улучшенный шаблон событий предметной области https://lostechies.com/jimmybogard/2014/05/13/a-better-domain-events-pattern/
Вон Вернон (Vaughn Vernon). Эффективная конструкция агрегата. Часть II. Организация совместной работы агрегатов https://dddcommunity.org/wp-content/uploads/files/pdf_articles/Vernon_2011_2.pdf
Джимми Богард (Jimmy Bogard). Усиление предметной области: события предметной области https://lostechies.com/jimmybogard/2010/04/08/strengthening-your-domain-domain-events/
Тони Чыонг (Tony Truong). Пример шаблона событий предметной области https://www.tonytruong.net/domain-events-pattern-example/
Уди Дахан (Udi Dahan). Создание полностью инкапсулированных моделей предметной области https://udidahan.com/2008/02/29/how-to-create-fully-encapsulated-domain-models/
Уди Дахан (Udi Dahan). События предметной области. Попытка 2 https://udidahan.com/2008/08/25/domain-events-take-2/
Уди Дахан (Udi Dahan). События предметной области. Спасение https://udidahan.com/2009/06/14/domain-events-salvation/
Ян Кронквист (Jan Kronquist). Не публикуйте события предметной области, а возвращайте их! https://blog.jayway.com/2013/06/20/dont-publish-domain-events-return-them/
Сезар де ла Торре (Cesar de la Torre). События предметной области Интеграция событий в DDD и архитектуры микрослужб https://devblogs.microsoft.com/cesardelatorre/domain-events-vs-integration-events-in-domain-driven-design-and-microservices-architectures/
Другие полезные ресурсы о DDD, CQRS, EventSourcing
https://itnext.io/1-year-of-event-sourcing-and-cqrs-fb9033ccd1c6
https://www.semicolonworld.com/question/1310/cqrs-command-return-values
https://danielwhittaker.me/2016/04/20/how-to-validate-commands-in-a-cqrs-application/
https://teivah.medium.com/event-sourcing-and-concurrent-updates-32354ec26a4c
https://medium.com/@sderosiaux/cqrs-what-why-how-945543482313
https://docs.microsoft.com/ru-ru/azure/architecture/reference-architectures/saga/saga
https://medium.com/nexa-digital/my-journey-into-cqrs-and-event-sourcing-4bd7d0c1c670
https://www.sitepen.com/blog/architecture-spotlight-event-sourcing
https://www.confluent.io/blog/event-sourcing-cqrs-stream-processing-apache-kafka-whats-connection/
https://eventuate.io/post/eventuate/2020/02/24/why-eventuate.html
https://kickstarter.engineering/event-sourcing-made-simple-4a2625113224
https://livebook.manning.com/book/microservices-patterns/chapter-7/25
Сборники ресурсов по DDD
https://github.com/heynickc/awesome-ddd#contents
Сборник ресурсов по eventStorming
https://virtualddd.com/learning-ddd/awesome-eventstorming
Курсы
Курс обучения (10 дней бесплатно, потом $29/месяц)
Domain-Driven Design Fundamentals
https://www.pluralsight.com/courses/domain-driven-design-fundamentals
Буду рад комментариям и дополнениям.
Комментарии (2)
altexxx
27.02.2022 19:17Хорошая статья, много полезных ссылок, спасибо.
Я сам тоже собирал ссылки на тему DDD, и многие из них уже в статье есть, но некоторыми хотел поделиться дополнительно для полноты картины.
PS. Ссылки на книги не реферальные, а для быстрого поиска.Книга "Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series)" - https://www.amazon.com/Clean-Architecture-Craftsmans-Software-Structure/dp/0134494164
Отличная книжка про архитектуру от автора принипов SOLID. Так же рассказывает про дальнейшее развитие этих принципов на более высокие уровни, например, при переходе с уровня классов к уровню модулей и компонентов. Хорошо перекликается с другими книжками по архитектуре (много общего с DDD и MDD). Читал в оригинале, про переводы не знаю. Английский среднего уровня, много новых слов. Легендарный автор рассказывает что такое архитектура, и как её правильно готовить. При этом не важно какой язык программирования, и даже какой его тип, потому что принципы не поменялись с того времени, когда он стал программистом, 50+ лет назад. В очередной раз с другого ракурса объясняет и демонстрирует, что архитектура - это не про фреймворки, и не обязательно они не должны оказывать влияние на архитектуру.-
Patterns, Principles, and Practices of Domain-Driven Design - https://www.wiley.com/en-ie/Patterns,+Principles,+and+Practices+of+Domain+Driven+Design-p-9781118714706
Книга затрагивает не только DDD, но и ES и CQRS, с упором на практическое применение. Логическое продолжение книги "Реализация методов предметно-ориентированного проектирования".
Открывает новые архитектурные подходы, в виде ES, CQRS, на примерах с современным набором инструментов, в виде REST протокола, мессаджингом и так далее. Опять же упор на практику, в более современном виде.
Не уверен что есть перевод, по крайней мне не удалось его найти. Но английский не сложный, проблем с ним не должно возникнуть. Тем более после предыдущей книжки.
Хорошие статьи Mattias Noback про DDD и архитектуру, на тему того как менялось понимание хорошей архитектуры, двигаясь от активной пропаганды конкретного фреймворка, через углубление в DDD и Hexagonal Architecture, к пониманию, что фреймворк это не главное, и надо строить архитектуру не завязываясь на него, по возможности
* https://php-and-symfony.matthiasnoback.nl/2017/07/layers-ports-and-adapters-part-1-introduction/
* https://php-and-symfony.matthiasnoback.nl/2017/08/layers-ports-and-adapters-part-2-layers/
* https://php-and-symfony.matthiasnoback.nl/2017/08/layers-ports-and-adapters-part-3-ports-and-adapters/“Microservices for everyone” - Mattias Noback
https://leanpub.com/microservices-for-everyone
Книга про то, как современные технологии объединяют основные подходы в DDD, ES, CQRS и гармонично выливаются в теорию и практику микросервисов.-
(Видео курсы) Domain Driven Design, CQRS, and Event Sourcing
http://subscriptions.viddler.com/GregYoungВидео курсы на тему DDD/ES/CQRS и архитектуру. От автора самого термина CQRS.
Конечно, книжки лучше, но тем, кому некогда или не хочется читать, или хочется понять общую картину без углубления в детали, то рекомендую посмотреть.
-
DDD, Hexagonal, Onion, Clean, CQRS, … How I put it all together
https://herbertograca.com/2017/11/16/explicit-architecture-01-ddd-hexagonal-onion-clean-cqrs-how-i-put-it-all-together/
Статья, в которой собрано всё вместе, с хорошей схемой, иллюстрирующей как все эти подходы соотносятся друг с другом.
xini
Большое спасибо! Бесценно иметь все в одном месте под рукой