Microservices, data, sagas: no best practices, only trade-offs, and a method to weigh them.
Why this book
While writing Fundamentals of Software Architecture, Ford and Richards kept setting aside problems that had no clean answer, only messy trade-offs. The pile got a name, "the hard parts", then two data experts (Sadalage, and Dehghani, the inventor of the data mesh) and a whole book. The title has a double meaning: hard as in difficult, and hard as in hardware, the parts that are hard to change later.
It is the logical floor above Clean Architecture: Martin teaches you to draw boundaries; this book is about what happens when every boundary you draw costs something.
The ideas that stick
1There are no best practices, only the least worst trade-offs
The opening chapter makes the book's bet explicit: if a practice were truly "best", everyone would apply it and the problem would be boring. The problems that remain are the ones without a general answer: "for architects, every problem is a snowflake" (ch. 1). So the skill to build is not picking the right pattern, it is weighing: "don't try to find the best design in software architecture; instead, strive for the least worst combination of trade-offs" (ch. 1).
Two tools carry that discipline through the book. ADRs (Architecture Decision Records: context, decision, consequences, so the "why" survives the people). And fitness functions: architecture rules turned into executable tests in the CI, that fail the build the moment a boundary is crossed.
// an architecture rule becomes a test (here ArchUnit, in Java)
noClasses().that().resideInAPackage("..domain..")
.should().dependOnClassesThat().resideInAPackage("..web..");
// business code importing the controller → CI goes red, not a review to catch
The whole book then follows one fictional team, the Sysops Squad, whose aging ticket monolith freezes for hours and threatens the whole business line.
2The architecture quantum: your shared database betrays you
The book's measuring unit: an architecture quantum is "an independently deployable artifact with high functional cohesion, high static coupling, and synchronous dynamic coupling" (ch. 2). Concretely: the smallest piece of your system you can deploy alone. And the count is brutal: a monolith is one quantum, obviously, but so are twenty "microservices" sharing one database. If the schema changes and everyone must move together, you have one quantum with extra network bills.
Underneath sits the book's reading grid for runtime coupling, three dimensions with two values each: communication (synchronous or asynchronous), consistency (atomic or eventual), coordination (orchestrated or choreographed). Hold that thought: 2 × 2 × 2 returns in idea 7.
3Splitting the database is harder than splitting the code
"Breaking apart a database is hard—much harder, in fact, than breaking apart application functionality" (ch. 6). Code has imports you can list; data has foreign keys, views, triggers, and the awkward fact that it is the company's most precious asset. The book's argument to a skeptical DBA is numerical: a monolith with 200 database connections, redistributed across 50 services with their connection pools and minimum instances, asks for 1,000 to 1,700 connections for the same workload.
The method is five steps that never break production: group tables into data domains, move them into separate schemas, untangle the cross-domain connections, then (and only then) move schemas onto their own servers, and switch over. The slogan of the chapter: make the data follow the domains, not the technology.
4Granularity is an equilibrium, not a threshold
How small should a service be? The book refuses the question and replaces it with two opposing lists. Six reasons to split (disintegrators): single-purpose scope, code volatility, divergent scalability needs, fault isolation, security boundaries, planned extensibility. Four reasons to merge (integrators): database transactions, chatty workflows between the parts, heavily shared code, tightly related data.
The demonstration runs on one notification service: sending SMS, emails and postal letters looks cohesive, until you learn the letter templates change weekly while SMS code sleeps for six months (volatility says: split), and the system pushes 220,000 SMS a minute against one letter (scalability says: split). But five customer services chained in one workflow add up 1,500 ms of pure network latency (workflow says: merge). "The secret of arriving at the appropriate level of granularity for a service is achieving an equilibrium between these two opposing forces" (ch. 7). Bonus test: if the leftover service can only be named "Other Stuff Service", the split was wrong.
5Reuse is coupling wearing a nice suit
The most quotable law of the book: "reuse is derived via abstraction but operationalized by slow rate of change" (ch. 8). You can safely depend on an OS, a framework, JUnit: they are abstractions that change slowly and predictably. A shared internal Customer class changes every sprint; share it across services and every change ripples everywhere. That single sentence is the post-mortem of 2000s SOA and its dream of the one reusable enterprise Customer service, which the book calls out as an architectural disaster.
Four honest options are weighed: copy the code (fine for code that never changes), shared library (compile-time safety, versioning pain), shared service (good for volatile code, but a runtime risk for everyone), and sidecars for the operational plumbing (logging, monitoring, auth), which is the only place reuse is unconditionally cheap because it carries no domain logic.
6ACID does not survive distribution
The chapter every microservices team should read before the first incident: once a business transaction spans services, every letter of ACID quietly dies. No global rollback (each service commits its own part), no isolation (committed data is visible before the "transaction" finishes), no cross-service foreign keys. What you get instead is BASE: basic availability, soft state, eventual consistency.
Since there is no automatic rollback anymore, YOU have to write the undo, by hand, step by step, what we call a saga:
try {
payment.charge() // service 1: committed right away, no global rollback
stock.reserve() // service 2: fails here…
} catch {
payment.refund() // …you must COMPENSATE step 1 by hand (and if that fails?)
}
Three patterns deliver that "eventual": a background batch that reconciles (slow, and it tramples every bounded context, those self-contained business areas), an orchestrator that calls everyone while the user waits (consistent, but compensation can itself fail), or events on a durable broker (responsive and decoupled, but the error path ends in a dead letter queue, the queue of failed messages a human must handle). The book's running gag is borrowed from Gregor Hohpe's classic title: "Starbucks Does Not Use Two-Phase Commit". Neither should you.
7The eight sagas: naming your troubles
Cross the three runtime dimensions (sync/async × atomic/eventual × orchestrated/choreographed) and you get exactly eight possible transactional sagas. The book names each one after the kind of story it puts you in, and the names do real work in meetings.
The diagnosis behind the colors: distributed atomicity is the expensive column. "Distributed transactions present a host of difficulties and thus are best avoided if possible" (ch. 12). The Horror Story deserves its name because it is well-intentioned: an architect speeds up a slow Epic Saga with async messaging and no coordinator, while keeping atomicity, and lands on the worst complexity of the table.
8Build your own analysis, and flee the evangelists
The last chapter turns the whole book into a reusable method in three steps: find which parts are entangled (what changes together), analyze how they couple, then assess by playing concrete "what if" scenarios from your domain. With two guardrails: MECE lists (Mutually Exclusive, Collectively Exhaustive: options that don't overlap and cover every case, so you compare comparable things and forget nothing) and the out-of-context trap (a generic winner can lose badly once your real constraints enter the room).
And one law that explains years of frustration: "an architect can never reduce semantic coupling via implementation, but they can make it worse" (ch. 11). If the business workflow is inherently tangled, no technology untangles it; tools can only mirror the domain or add accidental complexity on top. Hence the closing advice: "an architect adds real value to an organization not by chasing silver bullet after silver bullet but rather honing their skills at analyzing the trade-offs as they appear" (ch. 15).
🎨 Illustration to generate : copy this prompt into ChatGPT :
Flat illustration, warm ivory background (#faf7f2), muted green and terracotta palette, no text, minimalist editorial style, a flashy street vendor with a slicked mustache selling shiny silver bullets from an ornate cart, while next to him a calm architect ignores the show and carefully weighs two small building blocks on an old-fashioned balance scale, deadpan humor, 3:2 aspect ratio
Planned caption: "Silver bullets sell better. Scales work better. The book is 460 pages on the side of the scales."
Three things I didn't know
- The data mesh chapter was written by its actual inventor, Zhamak Dehghani, before her own dedicated book existed; the epub still contains a leftover "TODO: url for data mesh book" where the reference should go.
- "Tactical forking" (named by Fausto De La Torre) decomposes a Big Ball of Mud backwards: clone the whole monolith per team and delete what you don't need, because in tangled code deleting is safer than extracting.
- The book's last word is not about architecture but about tests: "Testing is the engineering rigor of software development", the tool that turns trade-off analysis "from speculation to engineering" (ch. 15).
My take, honestly
This book did something rare: it made me feel better about saying "it depends". Not as a dodge, but as the start of a method: depends on what, weighed how, decided by whom. The eight saga names alone are worth the price; "we built a Horror Story" is a diagnosis a whole team understands in three seconds.
The honest downsides: it is dense, visibly written by four hands, and the Sysops Squad dialogues read like an architecture telenovela (characters gasp at trade-off tables). It also leans on its prequel, Fundamentals of Software Architecture, and the appendix openly redirects you there for the basics. This is a second book on the topic, not a first.
But if you operate distributed systems for a living, it is the most useful kind of book: one that hands you the questions, not the answers, and makes the questions reusable.
Odilon
Still relevant in 2026?
Strangely, more relevant outside microservices than when it was written. The orchestration-versus-choreography analysis reads today like a manual for multi-agent AI systems: same trade-offs, same error-path explosions, same need for a mediator when workflows get semantically complex. The data mesh hype has cooled since 2021 (organizations discovered the sociotechnical part is the hard part), which the trade-off method itself would have predicted. And the core thesis ages like stone: hype cycles produce silver bullets on schedule; the analysis skill survives all of them.
Who is it for?
Read it if
- You run or design distributed systems and every decision feels like a knife fight between valid options
- Your team is about to split a monolith, especially its database
- You need vocabulary to push back on "let's just make everything async"
- You write ADRs, or wish your team did
Skip it if
- You build monoliths for a living and they serve you well: this pain is optional
- You haven't read an architecture fundamentals book yet: this is volume two
- You want recipes: the book's whole point is that there are none
Going further
Deployment realities are practiced in my deployment course. In the library, Clean Architecture draws the boundaries this book prices, Designing Data-Intensive Applications goes deeper on the data side of the same battles, Team Topologies handles the organizational half of the quantum question, and The Design of Web APIs covers the contracts chapter from the consumer side.
Comments (0)