Domain-Driven Design
Domain-Driven Design (DDD) is an approach to building software for complex businesses by modeling code around the same concepts, rules, and vocabulary that domain experts use. It gives teams a shared language and clear boundaries so a large system does not collapse into one tangled model where the same word means different things in different places.
itSoftware engineering | OpenSkills.info
Course pathWalk it in order
Look it upDip in anytime
Go furtherLeaves this page
Don't Panic
Don't Panic — Domain-Driven Design
Domain-Driven Design is an approach to building software that starts from an uncomfortable observation: in most complex applications, the hard problem is not the technology. It is the business domain itself — the activity or process the software serves. The method, introduced by Eric Evans in 2003, says you should center your entire design effort on a shared, precise model of that domain, built in ongoing collaboration between the people who write code and the people who understand the business.
The two or three ideas everything else hangs off: Ubiquitous Language (a shared vocabulary between developers and domain experts, enforced in code), Bounded Contexts (the boundary within which one model and one language hold consistently), and Aggregates (consistency boundaries that define what must stay in sync within one transaction). If you remember only one thing a week later, make it this: a Bounded Context is not a technical boundary. It is a business boundary. The word "account" can mean different things in different parts of your system, and that is not a bug — it is two domain experts using the same word for two different concepts. DDD draws a boundary instead of forcing one meaning.
The thing that will surprise you: the hardest part is not learning the pattern names. It is getting domain experts into a room regularly and keeping them there. DDD is a collaboration methodology dressed up as a design pattern. Without that collaboration, you are building a rich domain model that nobody who understands the business has ever seen, which is a particularly expensive way to build a CRUD system.
Strategic design — naming subdomains, drawing bounded contexts, mapping how they relate — pays off independent of your coding style, because it is conceptual work that shapes the system before you choose a technology. Tactical design — entities, value objects, aggregates, domain events — pays off in proportion to how much real behavior and invariant-checking your domain actually needs. Full tactical modeling on a generic subdomain (user accounts, invoicing, authentication) is usually not worth it. That is exactly what "generic subdomain" means.
What to read next: the Slides tab walks through the strategic and tactical patterns with a visual overview. The Cheatsheet is the dense reference you will reach for when modeling a real system. The Quiz tests whether the distinctions stuck. And if you want to see the patterns in working code rather than diagrams, the Awesome Links tab points at the DDD Sample reference application and the tools practitioners actually use.
Where this skill leads
Relevant careers
See how this topic contributes to broader role-level skill maps.
Sources
- https://martinfowler.com/bliki/DomainDrivenDesign.html
Supports
- Definition of Domain-Driven Design as centering development on a rich domain model
- Origin of the term in Eric Evans's 2003 book
- The Evans classification of entities, value objects, and service objects
- Aggregates as a pattern Evans identified to fill a gap in object-oriented thinking
- Bounded contexts as strategic design and their applicability beyond object-oriented code
- https://martinfowler.com/bliki/BoundedContext.html
Supports
- Bounded Context as the pattern dividing a large domain model into smaller, self-contained units
- Infeasibility of total unification of a domain model for a large system
- Coexistence of multiple models across contexts with explicit translation between them
- https://martinfowler.com/bliki/UbiquitousLanguage.html
Supports
- Ubiquitous Language as a shared vocabulary built by developers and domain experts
- Requirement for precision, since software does not tolerate ambiguity
- Two-way obligation between domain experts and developers to flag awkward or ambiguous terms
- The language evolving as domain understanding deepens
- https://martinfowler.com/bliki/AnemicDomainModel.html
Supports
- Definition of the Anemic Domain Model anti-pattern
- Domain objects with relationships but no behavior, logic held in separate service objects
- The anti-pattern paying the costs of a domain model without its benefits
- Evans's point that a thin service layer should coordinate while the domain layer holds business rules
- https://www.dddcommunity.org/learning-ddd/what_is_ddd/
Supports
- Definition of DDD as connecting implementation to an evolving model of core business concepts
- Framing of domain complexity, not technology, as the central challenge
- The three foundational DDD practices — core domain focus, model-based design, and expert collaboration
- https://learn.microsoft.com/en-us/azure/architecture/microservices/model/domain-analysis
Supports
- Strategic vs. tactical DDD phases
- Domain analysis and event storming as ways to build a shared domain understanding
- Core, supporting, and generic subdomain classification with the drone delivery example
- Bounded contexts as the boundary for a specific domain model within a domain
- Context map relationship patterns — Customer-Supplier, Open Host Service, Published Language, Anti-Corruption Layer, Separate Ways
- Conway's Law and aligning team ownership to bounded contexts
- Ubiquitous Language scoped per bounded context, illustrated with the "account" example
- https://learn.microsoft.com/en-us/azure/architecture/microservices/model/tactical-domain-driven-design
Supports
- Entity definition, identity persistence, and the requirement to encapsulate behavior
- Value object definition, immutability, and default-choice guidance over entities
- Aggregate definition, aggregate root, small-aggregate design rule, and identity-only references between aggregates
- Domain service vs. application service distinction
- Domain event definition and internal vs. integration event distinction, illustrated with the drone delivery DeliveryCompleted event
- Anemic domain model as a named antipattern within tactical DDD guidance
- https://learn.microsoft.com/en-us/azure/architecture/patterns/anti-corruption-layer
Supports
- Anti-Corruption Layer pattern originating in Eric Evans's Domain-Driven Design book
- Use case of isolating a modern system from a legacy system's outdated schema or API
- Guidance to keep the layer limited to translation rather than business rules
- https://github.com/heynickc/awesome-ddd
Supports
- Curated list membership and one-line descriptions for the awesome-links entries
- DDD Sample as a joint effort of Domain Language (Eric Evans's company) and Citerus
- Domain Language eLearning as video lessons taught by Eric Evans
- https://github.com/citerus/dddsample-core
Supports
- DDD Sample as the original reference DDD application, moved from SourceForge to GitHub
- Cargo shipping as the modeled business domain
- Joint authorship by Eric Evans's company Domain Language and Citerus
- https://www.eventstorming.com
Supports
- EventStorming as a workshop format for exploring complex business domains across silos
- Alberto Brandolini as its creator
- EventStorming's stated connection to Domain-Driven Design and microservice boundary design
- https://github.com/ddd-crew/context-mapping
Supports
- Context Mapping Cheatsheet covering nine context-map relationship patterns
- Miro-based starter kit for running context-mapping sessions
- https://virtualddd.com
Supports
- Virtual DDD as a community-driven platform for systems and software design knowledge sharing
- Community activities including sessions, book club, and open-space events
- https://virtualddd.com/ddd-heuristics
Supports
- DDD Heuristics as a library of design, guiding, and value-based heuristics
- Heuristics framed as fallible aids rather than guaranteed rules
- https://dddeurope.com
Supports
- Domain-Driven Design Europe as a leading DDD conference with an associated Academy and video archive
- https://grokipedia.com/page/Domain-driven_design
Supports
- DDD history timeline including Evans 2003 book, first DDD Exchange 2009, Vernon 2013, Brandolini Event Storming 2013
- DDD Sample as a joint effort of Domain Language and Citerus
- Event Storming as a timeline-based workshop technique by Alberto Brandolini
- https://marabesi.com/software-engineering/ddd.html
Supports
- DDD publication timeline from Evans 2003 through Khononov 2021
- CQRS formalization by Greg Young in 2009
- Event Storming introduction by Brandolini in 2013
- DDD Quickly by Marinescu and Avram in 2006
- https://www.axoniq.io/axon-framework
Supports
- Axon Framework as a Java-native framework for DDD, CQRS, and event sourcing
- First-class support for aggregate design, command buses, and event stores
- https://www.eventstore.com/
Supports
- EventStoreDB as a database built for event sourcing with immutable event storage
- https://contextmapper.org/
Supports
- Context Mapper DSL for modeling bounded contexts and context-map relationships
- Strategic DDD tooling for version-controlled domain models
- https://abp.io/
Supports
- ABP Framework as a .NET application framework with DDD layered architecture support
- Built-in aggregate root, domain event, and repository abstractions
- https://eventuous.dev/
Supports
- Eventuous as a lightweight event-sourcing library for .NET
- Aggregate base classes and event store abstraction
- https://bsmarted.com/en/topics/domain-driven-design/common-challenges-in-ddd
Supports
- Common DDD challenges including complexity management, stakeholder alignment, and testing
- Resistance to change as an organizational barrier to DDD adoption
- https://zlianhua.github.io/ddd-blog/2024-01-28-Anti-PatternsAndCommonPitfalls/
Supports
- DDD anti-patterns including anemic domain model, over-engineering, wrong bounded context boundaries
- Ubiquitous Language inconsistency as a common failure mode
