Designing Data-Intensive Applications
The book I recommend most often, and the one I’ve reread most.
It doesn’t teach you a technology — it teaches you the trade-offs underneath all of them, so that when a new database shows up you already know which four questions to ask it. Replication strategy, partitioning scheme, consistency model, failure behaviour.
What changed how I work
Chapter 5 (Replication). Understanding replication lag as a correctness problem rather than a performance one. Read-your-own-writes isn’t a nice-to-have; it’s the difference between a working feature and a bug report.
Chapter 7 (Transactions). The isolation level section is the clearest
explanation of write skew I’ve read. I’ve since found two real bugs in our code
that were exactly this — a check-then-act under READ COMMITTED.
Chapter 9 (Consistency and Consensus). Slow going, worth it. It’s where “just use a distributed lock” stops sounding like a solution.
Caveats
The stream-processing chapters have aged the fastest — the ecosystem moved. The fundamentals haven’t moved at all.
Read it slowly. A chapter a week, with the references, is better than a rushed pass.