Skip to content
José da Cruz

Enterprise Architect, and Life Thinker

José da Cruz

Enterprise Architect, and Life Thinker

Essential Reading: Domain-Driven Design — Taming Complexity With a Shared Language

josedacruz, October 13, 2026October 13, 2026

TL;DR: Eric Evans’ Domain-Driven Design argues that software should be modeled directly around the real-world business concepts it serves, using the business’s own language, rather than around whatever data structures happen to be convenient. For IT professionals, it’s the clearest, most durable answer to the question of why some codebases stay understandable for a decade and others turn into a swamp within eighteen months.

Cover of Domain-Driven Design by Eric Evans
Cover: Domain-Driven Design by Eric Evans.

The core idea

Evans’ central claim is that the hardest part of building software isn’t the code — it’s understanding the “domain,” meaning the specific business problem the software exists to solve (loan underwriting, cargo shipping, hospital scheduling, whatever it is). Most teams shortcut this. They talk to a business expert once, write down a rough understanding, and then let the software drift away from that understanding as deadlines bite and shortcuts accumulate. Six months later, the code uses one vocabulary and the business uses another, and every new feature requires a translation exercise before anyone can even agree on what’s being built.

Evans’ fix is what he calls a “ubiquitous language” — a shared vocabulary that the business experts and the engineers both use, word for word, in conversation, in documentation, and in the code itself. If the business calls something a “shipment,” the class is named Shipment, not OrderContainer or DeliveryPayload. If a business rule says a shipment can’t be “released” until it’s been “inspected,” the code has a release() method that checks an isInspected flag, not a generic updateStatus(4) call. The payoff is that the code becomes a kind of executable documentation of how the business actually works — and when the business explains a new rule, there’s already a home for it in the model, instead of a scramble to figure out where it should go.

A classic example from the book’s world: a naive e-commerce system might have one Product class used everywhere — in the catalog, in the cart, in the warehouse, in billing. It looks efficient. But “product” means something different in each of those contexts (the catalog cares about descriptions and photos; the warehouse cares about bin location and weight; billing cares about tax category and price history), and cramming all of that into one shared class creates a model that satisfies nobody well and breaks in subtle ways whenever one context’s needs change. Evans’ answer is to let each context have its own model of “product” — a concept he calls a “bounded context” — and to be explicit about how those contexts translate between each other at their edges.

Mindmap of Domain-Driven Design's core concepts: ubiquitous language, bounded context, model-driven design, and strategic design

What this means for IT work

The practical payoff for architects and engineers is a discipline for deciding where a system’s internal seams should go — and that decision shows up constantly, whether you’re splitting a monolith into services, designing a module boundary, or just naming a class. DDD’s answer is: don’t split along technical lines (all the database code here, all the business logic there); split along meaning. A boundary should sit wherever the vocabulary changes — wherever “customer” or “account” or “order” stops meaning the same thing to the people using it.

This is also the most useful lens DDD offers for the microservices era, even though the book predates microservices by a decade. “Bounded context” is a strong candidate for the right unit of service decomposition — far stronger than “whatever fits on one team’s sprint board” or “whatever the existing database tables suggest.” A service boundary drawn around a bounded context tends to stay stable, because it’s drawn around a genuine seam in how the business thinks, not around an accident of the current org chart.

A few places this shows up in everyday IT work:

  • A “god class” that keeps growing. When one entity (User, Account, Product) accumulates fields and methods for every team that touches it, that’s usually a sign multiple bounded contexts have been forced into a single model.
  • Endless translation code at integration points. If two systems or teams constantly argue about what a field means (“is `status` the shipping status or the payment status?”), that’s a missing explicit boundary, not a naming bug to patch over.
  • A data model that technical and business people can’t discuss together. If a product manager can’t read your core domain classes and roughly follow what they do, the ubiquitous language has broken down somewhere.
  • Services split by technical layer instead of business capability. A “database service,” a “validation service,” and a “notification service” sitting where a “billing service” and a “fulfillment service” should be is a classic sign of boundaries drawn along the wrong axis.

None of this requires adopting DDD’s full vocabulary (aggregates, repositories, factories, and the rest) to get value. Even just asking “whose language does this class speak, and does it still match theirs?” during a code review catches a meaningful share of the drift DDD is worried about.

Where it falls short

The honest limitation is that the book is dense, written in 2003’s enterprise-Java idiom, and front-loads a lot of pattern vocabulary (aggregates, value objects, repositories, specifications) before it gets to the ideas that actually matter most — bounded contexts and ubiquitous language don’t show up in force until well into the book. Many engineers who pick it up cold get lost in the pattern catalog and never reach the payoff. It’s also easy to over-apply: plenty of small services or simple CRUD apps genuinely don’t have enough domain complexity to justify the full DDD toolkit, and teams that reach for aggregates and domain events on a problem that’s really just “store a record and show it back” tend to create more ceremony than clarity. DDD is a tool for taming real business complexity, not a default architecture for every project.

This one is squarely for mid-level and senior engineers and architects working on systems with genuine business complexity — anyone who’s felt a codebase’s vocabulary slowly diverge from the business it’s supposed to serve, or who’s been handed the job of drawing service boundaries and wants a better compass than “however the team happens to be organized today.” If that’s not your problem yet, it’s fine to come back to this one later; when it is your problem, it’s hard to find a better guide to it.

Related

architecture bookdomain-driven-designessential-readingsoftware architecture

Post navigation

Previous post

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

  • architecture (156)
  • artificial-intelligence (6)
  • books (2)
  • courses (4)
  • decision-frameworks (4)
  • finances (1)
  • java (8)
  • life-improvement (20)
  • metrics (3)
  • observability (2)
  • puzzles and challenges (3)
  • reviews (1)
  • security (8)
  • spring-boot (36)
  • Systems Thinking (3)
  • Essential Reading: Domain-Driven Design — Taming Complexity With a Shared Language
  • GitHub Weekly: 10 Rising Stars You Haven’t Heard Of Yet (October 5 – October 11, 2026)
  • GitHub Weekly: MCP Tools Trending Right Now (September 28 – October 4, 2026)
  • The Bulkhead Pattern: Why One Slow Dependency Shouldn’t Sink the Whole Ship
  • Essential Reading: A Philosophy of Software Design — Fighting Complexity One Module at a Time
©2026 José da Cruz | WordPress Theme by SuperbThemes