In the print dialog, choose “Save as PDF”.
Adservio

Domain-driven design (DDD): principles, patterns and benefits

Domain-driven design principles: ubiquitous language, bounded contexts, aggregates, event storming. When to adopt DDD and the benefits you can expect.

ADSERVIO INSIGHTS · DEVSECOPS

CATEGORYDevSecOps
READING TIME8 min
DATE8 November 2022
FORMATAdservio Insights article
CONTACThello@adservio.fr

KEY POINTS

  • Domain-driven design (DDD) places business understanding at the heart of the code: the software model reflects the concepts, rules and vocabulary of the domain.
  • Strategic design structures the organisation: ubiquitous language, bounded contexts and context mapping between teams.
  • Tactical design provides the model's building blocks: entities, value objects, aggregates, repositories and domain events.
  • DDD is justified on genuinely complex domains; distilling the core domain concentrates the effort where it differentiates the company.
  • In 2026, a clear domain model serves teams and AI coding assistants and agents alike: it is the best context you can give them.

SECTION 1

Domain-driven design, an answer to the business complexity of modern systems

Domain-driven design (DDD) is a software design approach that places business understanding at the heart of the code. Introduced by Eric Evans in 2003 in Domain-Driven Design: Tackling Complexity in the Heart of Software, it has been refined for more than twenty years by the software engineering community, from Eric Evans to Vaughn Vernon and Vlad Khononov, and is enjoying a clear resurgence: microservices, internal platforms and AI-assisted development all need explicit business boundaries to last.

Two notions structure the approach. Domain logic, or business logic, refers to the rules that govern business-critical decisions: calculating an insurance premium, assessing credit eligibility, orchestrating an order. Domain modelling, for its part, surfaces the concepts and relationships that carry those rules, so that the code faithfully reflects the reality of the business rather than technical concerns or the structure of a database.

In 2026, this refocusing on the business is more strategic than ever. Coding assistants generate implementations in minutes: the bottleneck is no longer producing code, but the clarity of the model and context you feed them. A well-modelled domain, with a stable vocabulary and explicit boundaries, serves developers and the AI agents working on the codebase alike, and protects against business regressions that no technical test will ever catch.

SECTION 2

Strategic design: ubiquitous language, bounded contexts and context mapping

Strategic design answers an organisational question: how do you split a large system and distribute teams so that each one reasons over a coherent model, without stepping on each other's toes? It is the part of DDD with the greatest impact at enterprise scale, well ahead of any code pattern: get the boundaries wrong, and no amount of clean code inside them will save the system.

### The ubiquitous language

The ubiquitous language establishes a common vocabulary, understood and used by all stakeholders, developers, product managers, domain experts. Every term of the model appears verbatim in the code, the tests, the tickets and the conversations. This shared vocabulary removes the implicit translations between business and technology, which are the primary source of misunderstandings and defects in complex systems. When a domain expert can read a test name aloud and recognise their own business rule, the language is doing its job.

### Bounded contexts

The bounded context sets the boundary within which a model and its language remain valid. The "customer" of the billing context is not the "customer" of the support context, and that is precisely what DDD embraces: rather than a single monolithic model that ends up incoherent, local models that are precise and maintainable, connected to each other through explicit contracts.

### Context mapping to connect teams

Context mapping documents the relationships between contexts: partnership, customer-supplier, conformist, or an anticorruption layer to shield yourself from the model of a legacy system. Combined with the lessons of Team Topologies, it aligns the architecture with the real structure of the teams and makes visible the organisational dependencies that slow delivery down, often far more than the technical ones.

SECTION 3

Tactical design: entities, aggregates and domain events

Tactical design provides the model's building blocks inside a context. Entities carry their own identifier and lifecycle, an order, a contract, a customer file. Value objects, immutable and identity-free, encapsulate concepts such as an amount, a period or an address: used well, they eliminate entire classes of bugs by making invalid states simply unrepresentable in the type system. This is the level most developers discover first, but it only delivers its full value inside boundaries that strategic design has set correctly.

### Aggregates and transaction boundaries

The aggregate groups entities and value objects behind a single root that guarantees the business invariants: every modification goes through it, and a transaction modifies only one aggregate at a time. Factories control the creation of these object clusters, repositories manage their persistence, and domain services carry the logic that naturally belongs to no entity. A well-sized aggregate, as small as possible, is the best protection against contention and locking in production.

### Domain events and event-driven architectures

Domain events record the significant business facts, order confirmed, payment received, contract terminated, and form the natural bridge to event-driven architectures. They feed the CQRS and event sourcing patterns, decouple contexts from one another and provide an audit log that is invaluable for compliance and analytics alike. This event-based structuring pairs naturally with hexagonal architecture, which isolates the domain model from infrastructure details.

@cite:architecture-hexagonale-principes-et-benefices

SECTION 4

When to adopt DDD: and when to refrain

DDD is aimed at genuinely complex domains: shifting regulations, multiple workflows, business rules that evolve faster than the technology. On a simple CRUD application or a generic domain, the modelling burden is not justified, a standard framework and a direct data schema will do better, faster. DDD's value appears when business complexity is real, lasting and differentiating. The right question is never whether DDD is good in the abstract, but whether this particular domain deserves the investment it demands.

### Distilling the domain: core, supporting and generic

Not everything has the same strategic value. The core domain, what differentiates the company from its competitors, deserves the best developers and the finest modelling. Supporting subdomains are handled pragmatically, and generic subdomains (authentication, standard billing, notifications) are bought or outsourced rather than redeveloped. This distillation avoids spreading the design effort where it yields nothing.

Adoption is ultimately an organisational decision as much as a technical one: DDD requires regular access to domain experts, teams that remain stable on their contexts and an architecture governance capable of arbitrating boundaries, decisions that reach well beyond the development team alone.

@cite:decisions-architecturales-logicielles-qui-doit-etre-implique

SECTION 5

DDD and microservices: splitting along bounded contexts

The bounded context has become the reference unit for splitting microservice architectures: one service per context, one model per service, explicit contracts between them. It is the answer to the classic trap of the distributed monolith, where services split along technical lines share the same data model, fail together and must be deployed together, accumulating the drawbacks of both worlds with the benefits of neither.

### One service per context, not one context per service

The mapping is not mechanical, however: a bounded context may contain several deployment services if scale demands it, but a service should never straddle two contexts. The contracts between services, versioned APIs, event schemas, materialise the relationships of the context map and let each team evolve its internal model without breaking its consumers.

Yet DDD does not mandate microservices. A modular monolith with well-separated contexts is often the best first step: the logical boundaries laid down by DDD make the later extraction of a service almost mechanical, once the need for scale or team autonomy genuinely justifies it. Conversely, carving into services a domain you do not yet understand freezes wrong boundaries that will be very costly to move.

@cite:du-monolithe-aux-microservices

SECTION 6

Event storming: modelling the domain in a collaborative workshop

Modelling is not done alone in front of an IDE. Event storming, popularised by Alberto Brandolini, gathers domain experts and developers around a chronological wall of domain events: in a few hours, the workshop surfaces the real processes, the grey areas, the contention points and the natural boundaries of the contexts, far faster than weeks of written specifications. Sticky notes on a wall remain one of the cheapest and most effective architecture tools ever invented.

### From workshop to code

The practice has become well tooled: remote workshops on collaborative whiteboards, domain storytelling to narrate user journeys end to end, and now AI assistants that transcribe the workshop, extract a glossary from it and propose a first draft of the model that the team critiques and corrects. The deliverable itself does not change: a shared language and candidate boundaries, validated by the people who genuinely know the business.

SECTION 7

The concrete benefits of DDD for the organisation

The benefits of DDD are lasting and observable. Frictionless communication, as the ubiquitous language removes the silos between business and technology. Complexity kept under control, with each context small enough to be fully understood by one team. An architecture aligned with strategy, as the design effort concentrates on the differentiating core. And a codebase that is safer to evolve, including by AI agents, properly constrained by an explicit model and tested invariants.

These benefits can be measured: a lower rate of defects caused by functional misunderstandings, a shorter delay between a business request and its release to production, fewer blocking dependencies between teams at delivery time. Organisations that track the four key metrics of software delivery generally see the effect of context boundaries on deployment frequency and change failure rate.

At Adservio, we support organisations through this journey: event storming workshops, context mapping, core domain distillation and translation into a target architecture, modular monolith or microservices depending on the context and the maturity of the teams. The goal is never DDD for its own sake, but a system the business understands, that teams evolve without fear and that stays aligned with the company's strategy.

FAQ

Frequently asked questions

What is domain-driven design?

DDD is a software design approach that solves real-world business problems through code, relying on an expressive model, a common language and bounded contexts. Introduced by Eric Evans in 2003, it prioritises the business using the application over the technology.

What is the difference between tactical and strategic design?

Strategic design structures the organisation: ubiquitous language, bounded contexts and context mapping between teams. Tactical design provides the model's building blocks inside a context: entities, value objects, aggregates, factories, repositories, services and domain events.

When should you use domain-driven design?

DDD is justified on genuinely complex and differentiating domains: rich business rules, multiple workflows, shifting regulations. On a simple CRUD application or a generic subdomain, its modelling burden is not justified.

Does DDD require a microservices architecture?

No. The bounded context is an excellent unit for splitting microservices, but a modular monolith with well-separated contexts is often the best first step. DDD's logical boundaries make the later extraction of a service straightforward, if the need is confirmed.

What is event storming?

A collaborative workshop, popularised by Alberto Brandolini, in which domain experts and developers map the domain's events together on a chronological wall. In a few hours it surfaces the real processes, the shared vocabulary and the candidate boundaries of the contexts.

ABOUT ADSERVIO

Adservio is an AI-native digital transformation partner: AI-augmented IT departments, software engineering, DevOps, MLOps, cybersecurity and AI governance.

Let's talk about your project: hello@adservio.fr · adservio.fr/contact