Domain-Driven Design (DDD) and Agile: The Powerful Combination
DDD (Domain-Driven Design) and Agile don’t compete — they complement each other. DDD solves what to build correctly; Agile solves how to deliver it efficiently.
What Is DDD
DDD is a software design approach that:
- Models the business domain — understanding real rules, entities, and processes
- Uses ubiquitous language — the same terminology between devs and business
- Divides into bounded contexts — each context has its own model and responsibility
DDD + Agile: Why They Work Together
Ubiquitous Language + User Stories
User Stories written with the domain language are clearer:
With DDD: “As a merchant, I want to reject the order when the reserved stock expires…” Without DDD: “As a user, I want to cancel the order when stock runs out…”
The DDD version is more precise because it uses domain terms.
Bounded Contexts + Feature Teams
Each bounded context can be owned by a squad:
Squad Checkout: "Payment" context
Squad Catalog: "Product" context
Squad Logistics: "Delivery" context
Each squad has autonomy over its context. Dependencies are explicit (anti-corruption layer between contexts).
Event Storming + Planning Poker
Event Storming is a workshop where the team maps domain events:
"Order Created" → "Payment Processed" → "Stock Reserved" → "Item Shipped"
After Event Storming, estimating with Planning Poker is natural — each domain event becomes one or more user stories.
Estimates with DDD
Mature vs. New Bounded Contexts
- Existing context: precise estimates because the model is clear
- New context: add +30-50% to discover the domain model
Integration Complexity
“Integrating the Payment context with the Delivery context: 8 points” Includes defining the anti-corruption layer, contracts, and events.
Model Refactoring
If the domain model is wrong (late discovery):
“Refactor the ‘Customer’ model to separate Individual from Business: 13 points”
DDD in Sprints
| Sprint | DDD Activity | Agile Activity |
|---|---|---|
| 1 | Domain Event Storming | Refine stories based on the map |
| 2 | Define bounded contexts | Implement the first context |
| 3-5 | Iteratively refine the model | Deliver features within the context |
| 6+ | Identify new contexts | Expand to the next context |
Anti-Patterns
DDD for Everything
“Every feature needs aggregates, value objects, domain events.” Simple CRUD doesn’t need DDD. Use it for complex domains.
DDD Without Agile
“Let’s model the entire domain before coding.” DDD should evolve iteratively, not in Big Design Upfront.
Conclusion
DDD and Agile together produce software that reflects the real business domain (DDD) delivered incrementally and tested (Agile). Use DDD to understand what. Use Agile to deliver how.