Why DDD Still Fails to Deliver Business‑Friendly Code When Treated as a Mere Architecture Pattern
The article argues that Domain‑Driven Design is not an architectural style but a two‑layer framework—strategic design defines bounded contexts and ubiquitous language, while tactical design supplies the modeling tools—explaining common misreadings and showing how DDD complements Clean, Hexagonal, CQRS, and Event Sourcing approaches.
DDD is presented as the flagship of the domain‑architecture family, but the author asks whether it is truly an "architectural style". The core problem is not how to layer code, but how to make the code speak the business language.
Strategic Design: Let the Code Speak the Business Language
Strategic design establishes the bounded context and the ubiquitous language. Evans (2003) defines the ubiquitous language as the shared terminology used by developers and domain experts within a bounded context, and Vernon (2013) systematizes the two‑layer framework that separates strategic (boundary) and tactical (inside‑boundary) concerns.
Example: in an e‑commerce system the business term "下单" becomes the method name PlaceOrder, and "发货" becomes ShipOrder. A generic method such as ProcessBusinessFlow is rejected because it does not reflect the business vocabulary.
Ubiquitous Language: The Soul of DDD
The ubiquitous language is built through continuous collaboration between developers and domain experts. Evans stresses that it is not a naming convention imposed by developers; it is a co‑created model that eliminates translation gaps. When code contains terms that business people cannot understand, the ubiquitous language has broken.
Bounded Context: The Language Border
A bounded context draws a semantic border: inside the border the same terminology and rules apply, outside each context evolves independently. The same word can have different meanings in different contexts (e.g., "product" in sales vs. manufacturing).
Tactical Design: Modeling Tools Inside the Boundary
Within a bounded context, tactical design provides seven core building blocks:
Aggregate : a consistency boundary; external code can only access the aggregate through its root (Evans, 2003).
Entity : an object with a unique identifier that persists across its lifecycle.
Value Object : immutable, defined solely by its attributes (e.g., Money(100, CNY)).
Domain Event : a business‑meaningful occurrence that decouples aggregates (e.g., OrderPlaced triggers inventory deduction).
Domain Service : stateless logic that does not belong to any entity or value object.
Repository : a collection‑like interface for persisting aggregate roots, not a generic DAO.
Application Service : orchestrates use‑cases by coordinating aggregates, domain services, and repositories without containing business rules.
Aggregates should be kept small; Vernon (2013) advises that an aggregate should contain only the objects that must be updated together, otherwise consistency costs and contention rise.
DDD and Other Architectures: Complementary, Not Mutually Exclusive
DDD can be combined with Clean Architecture (Robert C. Martin, 2012) and Hexagonal Architecture (Alistair Cockburn, 2005) to organize code inside a bounded context. CQRS (Greg Young, 2010) can separate read and write models within a context, and Event Sourcing uses domain events as the event source to rebuild aggregate state.
Three Common Misreadings
"DDD is just rich domain models" – the strategic layer (bounded context and ubiquitous language) is the real soul; without it, a rich model is merely a technical artifact.
"DDD only fits complex systems" – strategic design adds value to any size system; tactical complexity can be trimmed as needed.
"DDD equals layered architecture" – layering is an implementation technique, not DDD itself; without a domain model, layers are empty shelves.
Practical Takeaway
Start by renaming a core domain concept in an existing project to match the business term, without changing logic. If business stakeholders can read the code, the ubiquitous language is taking effect. The final message: DDD is not a silver bullet, but a honest tool that forces you to acknowledge and manage complexity by first defining clear boundaries and then writing code that directly reflects business language.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
ZhiKe AI
We dissect AI-era technologies, tools, and trends with a hardcore perspective. Focused on large models, agents, MCP, function calling, and hands‑on AI development. No fluff, no hype—only actionable insights, source code, and practical ideas. Get a daily dose of intelligence to simplify tech and make efficiency tangible.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
