What this book covers
Chapter 1, Evolution of Domain-Driven Design, introduces the origins of DDD, tracing its development from early software engineering practices to its current role in addressing complexity. This chapter explores the fundamental challenges that DDD aims to solve and provides an overview of its key principles, including ubiquitous language and bounded contexts.
Chapter 2, Understanding Complexity: Problem and Solution Space, dives into the nature of complexity in software systems and teaches you how to distinguish between essential and accidental complexity. This chapter introduces tools such as the Cynefin framework and EventStorming, equipping you to navigate problem and solution spaces effectively.
Chapter 3, Strategic Patterns, covers the strategic aspects of DDD, focusing on dividing domains into bounded contexts and defining clear relationships between them. This chapter teaches you how to apply techniques such as context mapping and how to create a ubiquitous language that fosters collaboration and reduces ambiguity.
Chapter 4, Tactical Patterns, provides an overview of the tactical building blocks of DDD, such as entities, value objects, aggregates, repositories, and domain services, with practical examples of implementing these patterns in code while maintaining alignment with business rules.
Chapter 5, Introducing Refactoring Principles, teaches you how to identify and address technical debt in legacy systems using DDD principles. This chapter introduces key refactoring strategies, emphasizing the importance of modularity and incremental change to improve the maintainability and scalability supported by various kinds of tests.
Chapter 6, Transitioning from Chaos, focuses on transforming monolithic systems into modular architectures. This chapter explores practical steps for decoupling tightly coupled services, identifying bounded contexts, and implementing clear interfaces to simplify interactions.
Chapter 7, Integrating Events with CQRS, shows you how to implement Command Query Responsibility Segregation with EventSourcing (CQRS+ES). This chapter explains how to use events to decouple systems, ensure scalability, and maintain consistency while managing eventual consistency challenges.
Chapter 8, Refactoring the Database, provides strategies for aligning database schemas with bounded contexts and refactoring shared tables, as well as introducing patterns such as Expand/Contract. This chapter also covers techniques for handling data consistency in distributed systems.
Chapter 9, DDD Patterns for Continuous Integration and Continuous Refactoring, explores how to integrate DDD with continuous integration and delivery practices. This chapter focuses on automation, iterative design, and maintaining alignment between domain models and technical implementation.
Chapter 10, When and Why You Should Transition to a Microservices Architecture, provides guidance on transitioning from a modular monolith to a microservices architecture. This chapter highlights the trade-offs and complexities of distributed systems and explains how DDD principles can help with this evolution.
Chapter 11, Dealing with Events and Their Evolution, explains how to manage event versioning in event-sourced systems to ensure compatibility and adaptability over time. This chapter introduces strategies such as upcasting, schema evolution, and content negotiation.
Chapter 12, Orchestrating Complexity: Advanced Approaches to Business Processes, explores advanced DDD techniques for managing distributed systems and business processes. Topics covered in this chapter include sagas, choreography versus orchestration, and ensuring system consistency in the face of failures.