System Design Space
Knowledge graphSettings

Updated: June 24, 2026 at 6:44 PM

Learning Domain-Driven Design (short summary)

medium

DDD matters not because of its vocabulary, but because it helps teams see model boundaries before the system gets split into services.

In real design work, the chapter shows how bounded contexts, ubiquitous language, and strategic design become the basis for API boundaries, team contracts, and cleaner ownership lines.

In interviews and engineering discussions, it helps talk about shared models, semantic mismatch, and accidental coupling between domains without drifting into abstract theory.

Practical value of this chapter

Design in practice

Use bounded contexts as the base for API boundaries and team contracts.

Decision quality

Apply ubiquitous language to reduce semantic mismatch in integrations.

Interview articulation

Map DDD artifacts to practical choices: events, anti-corruption layers, and ownership.

Failure framing

Control shared-model and accidental-coupling risks between domains.

Review from Alexander

Strategic and tactical design

A review of the first part of the book: how DDD connects business subdomains, model language, and context boundaries.

Read review

Learning Domain-Driven Design

Authors: Vlad Khononov
Publisher: O'Reilly Media, 2021
Length: 342 pages

Practical DDD from Vlad Khononov: bounded contexts, ubiquitous language, tactical patterns, microservices, and Data Mesh.

Original
Translated

DDD usually drowns in a vocabulary of patterns. This chapter treats it as a way to agree on a model before the argument moves to code: identify business subdomains, build a ubiquitous language, and draw bounded contexts along the lines where rules, ownership, and pace of change diverge. Where those lines stay blurry, the boundary later grows through the code and gets expensive.

From there the book connects service boundaries, event-driven architecture, and Data Mesh into one practical picture — not four unrelated sets of terms, but one way of domain thinking carried through to architecture.

Book structure

The book moves from finding domain boundaries to the architecture decisions that follow from them: understand the domain first, then choose services, events, and data — not the other way around.

Part I: Strategic Design

Where to start: business subdomains, ubiquitous language, bounded contexts, and how team shape shapes the model.

Part II: Tactical Design

Ways to implement business logic, architecture styles, and integration between contexts.

Part III: DDD in Practice

Design heuristics, solution evolution, Event Storming, and work in brownfield systems.

Part IV: Architecture Relationships

Where it leads next: microservices, event-driven architecture, and Data Mesh as extensions of domain thinking, not separate disciplines.

Part I: Strategic Design

Business subdomains

Vlad Khononov starts with a simple question: which parts of the business are truly unique, and which can be implemented more simply or bought. The answer decides where engineering time goes.

Core subdomain

Where the competitive advantage lives — this is where the best engineering effort should go.

  • High complexity
  • Cannot simply be bought
  • Worth developing in-house

Supporting subdomain

The business needs it, but the market won't reward it; over-engineering here just burns effort.

  • Medium complexity
  • Can often be simplified
  • Does not always need perfect design

Generic subdomain

The same problem everyone has; writing your own costs more than buying an existing product.

  • Low uniqueness
  • Off-the-shelf tools fit well
  • Should not become the system core

Ubiquitous language and bounded contexts

Ubiquitous language keeps domain experts and developers on the same model and the same words — without it, the same term starts meaning different things in conversation and in code. It only works inside a single bounded context, no wider.

Business subdomains usually already exist in the company, but context boundaries are a design decision the team makes. That is where one model ends and another begins — draw the line in the wrong place and you pay for it later.

Team relationship patterns

Cooperation

  • Partnership — teams develop the solution together and keep the model aligned
  • Shared Kernel — a small shared part of the model is maintained jointly

Customer and supplier

  • Conformist — the downstream team accepts the upstream model
  • Anti-Corruption Layer — a translation layer protects the local model from foreign concepts
  • Open-Host Service — a stable public interface defines the integration rules

These relationships are easiest to lay out on a context map. Behind the system links it shows the dependency shape between teams — and teams are usually what decides which integration survives.

Part II: Tactical Design

Business logic implementation options

Transaction Script

Procedural logic organized around a concrete business action or transaction.

Active Record

An object combines data, simple rules, and knowledge of its persistence.

Domain Model

A rich model with entities, value objects, aggregates, and encapsulated business rules.

Event-Sourced Domain Model

State is rebuilt from an event history rather than only from the latest row.

Architecture patterns

Layered Architecture

Classic presentation, business-logic, and data-access layers.

Ports & Adapters

The domain is isolated from external systems through ports and adapters.

CQRS

Commands and reads are separated when they need different models and requirements.

Integration between bounded contexts

Model translation

  • Stateless Translation — each request is translated independently
  • Stateful Translation — the adapter keeps an intermediate model or aggregates data

Aggregate integration

  • Outbox Pattern — an event is published reliably together with the data change
  • Saga — a long-running process is split into steps and compensations
  • Process Manager — a separate component coordinates a complex business process

Part III: DDD in Practice

Tactical design decision tree

In the book, a heuristic is not a perfect rule, but a good-enough guide for the next decision.

1. Identify the subdomain type: core, supporting, or generic.

2. Choose a business-logic implementation style, from a simple script to a rich domain model.

3. Select an architecture style: layers, ports and adapters, or command/read separation.

4. Align the testing strategy with the cost of mistakes and the expected pace of change.

Vectors of change

Domain changes

  • A core subdomain can become generic when the market catches up.
  • A supporting area can become core when it creates new advantage.
  • A purchased product may need a local model when the business becomes more specialized.

Organizational changes

  • A team partnership can turn into a customer-supplier relationship.
  • Teams may diverge in goals, release cadence, and ownership.
  • Team mergers and splits should trigger a review of context boundaries.

Event Storming

A group session pulls domain knowledge out of people's heads in a couple of hours, lays the cause-and-effect chain on the wall, and checks along the way whether the team even names the same things the same way.

Workshop path
1
Chaotic exploration

Orange domain events

The team first captures facts that already happened in the domain without designing the system too early.

Order placed
Payment confirmed
Delivery requested
2
Timeline

Events left to right

Orange events are ordered by time and causality so the main flow and missing pieces become visible.

Order created
Stock reserved
Order delivered
3
Commands

Blue commands and yellow actors

Events get paired with the intentions and people or systems that trigger the action.

Customer
Place order
Order placed
4
Policies

Purple reactions

Automatic rules connect an event to the next command and make causality explicit.

Payment received
If paid, reserve stock
Reserve stock
5
External systems

Pink dependencies

Third-party systems are separated so the team can see control boundaries and integration risks.

Payment provider
Charge card
Payment rejected
6
Read models

Green views

The team marks the screens, reports, and read models people need for decisions.

Order status
Payment history
Order updated
7
Aggregates

Yellow rule groups

Aggregates group commands and events around objects that protect business invariants.

Order
Change address
Address changed
8
Bounded contexts

Dashed model boundaries

The board is grouped by language, rules, and responsibility without pretending a context has one canonical sticky color.

Sales
Payments
Logistics
Color legend
Domain eventsfacts that already happened
Commandsintentions to change state
Actors / aggregatesinitiators and rule holders
Policiesautomatic reactions
External systemsdependencies outside the domain
Views / read modelswhat users need to read or see
Bounded contextsdashed boundaries for language and ownership
Hotspotsquestions, risks, and contested spots

A red hotspot is not a separate stage: add it whenever a question, risk, or disputed rule appears.

Related book

Building Microservices

Sam Newman's practical view of how domain boundaries become services, contracts, and operational ownership.

Open chapter

Review from Alexander

DDD and microservices

A review of the relationship between Domain-Driven Design, public interface size, and real service boundaries.

Read review

Part IV: DDD and Microservices

What makes a service micro

“Micro” in the book is about the size of the public interface, not the line count inside. A service can be complex inside and still be good as long as it exposes a small, understandable surface — and that surface is exactly what other teams have to live with.

Deep service

  • Narrow public interface
  • Complex internal logic
  • Strong encapsulation
  • Controlled system complexity

Shallow service

  • Broad interface
  • Simple implementation
  • Weak encapsulation
  • Rising complexity across the whole system

Granularity and complexity

Smaller services are simpler in isolation, but the complexity does not disappear — it moves into the network of calls between them, paid back in latency, failures, and debugging.

So good decomposition aims at total system complexity, not at the smallest possible service size. The smallest service is almost never the cheapest one.

Heuristics for microservice boundaries

Deep service

a narrow public interface and rich internal logic

Shallow service

a broad interface, weak encapsulation, and rising system complexity

Bounded context

each microservice can be a context, but not every context has to become a service

Aggregates

a lower boundary below which a service is usually too small

Business subdomains

a strong heuristic for finding durable service boundaries

Review from Alexander

Event-driven architecture

How different event types help reduce coupling between contexts and services.

Read review

Event-Driven Architecture

Event-driven style and Event Sourcing

Event-driven architecture

  • Architecture style
  • Asynchronous interaction
  • Communication between system components

Event Sourcing

  • State storage pattern
  • Change history as a sequence of events
  • Usually applied inside one service or aggregate

Message types

Event

a fact that has already happened and is phrased in the past tense

Command

a request for action expressed as intent

Event notification

a minimal signal about a fact without unnecessary state

Event-carried state transfer

a message that includes data the consumer needs

Domain event

a business fact that matters inside the domain

Coupling types in event-driven architecture

The event type is a coupling decision. One choice keeps services loosely coupled; another quietly pulls them tighter, and you usually find out only in production.

Implementation coupling

the consumer depends on the supplier's internal details

Functional coupling

services are too tightly bound to the same business process

Temporal coupling

both sides must be available at the same time or in a strict order

Review from Alexander

Data Mesh and DDD

How domain boundaries and ubiquitous language help shape data products and federated governance.

Read review

Data Mesh and DDD

Analytical and transactional data models

Transactional model (OLTP)

  • Fine-grained records
  • Predictable queries
  • Normalized data
  • Optimized for writes

Analytical model (OLAP)

  • Aggregated data
  • Exploratory queries
  • Star or snowflake schema
  • Optimized for reads

Problems with centralized DWHs and data lakes

  • The central team becomes a bottleneck.
  • Hard coupling through ETL makes change expensive.
  • One model struggles to describe different domain contexts.
  • A data lake turns into a swamp without ownership and context.
  • Consumers lose the meaning of fields and quality rules.
  • Fixing data issues gets separated from the source team.

Four Data Mesh principles

Domain ownership

domain teams own their analytical data

Data as a product

data has consumers, documentation, quality expectations, and SLA

Self-serve platform

publishing and consuming data does not require a manual queue in a central team

Federated governance

shared standards coexist with local domain responsibility

Data Mesh maps onto DDD almost without a gap: bounded contexts become the basis for data products, while ubiquitous language fixes both the schema and the meaning of the data — not just column names.

Applying DDD in system design interviews

When DDD helps

  • Define service boundaries through bounded contexts.
  • Choose architecture by subdomain type and cost of error.
  • Design integrations through context maps and anti-corruption layers.
  • Use Event Storming during domain discovery.

Key concepts

  • Deep services — a narrow interface and a strong internal model
  • Aggregates — the smallest boundary for a consistent change
  • Context map — a map of relationships and integrations between models
  • Event patterns — tools for loose coupling between contexts

Additional materials

Related chapters

Where to find the book

Enable tracking in Settings