Farasu on TelegramJoin
Back to books
Cover of Designing Data-Intensive Applications by Martin Kleppmann

Designing Data-Intensive Applications

by Martin Kleppmann · Published 2017

The most technical book on this list, and one of the most valuable. Outstanding for understanding distributed systems, databases, replication, consistency and system architecture. Not a book to read — a book to study.

What works

  • Exceptional technical depth.
  • Explains why systems work, not just how to use them.
  • Excellent treatment of distributed systems.
  • Valuable across many technology stacks.

What doesn't

  • Very demanding.
  • Not suitable for beginners.
  • Some technologies evolve faster than the book.
  • Requires hands-on engineering experience to fully appreciate.

Summary

Martin Kleppmann opens this book with a blunt claim: most software engineers know how to use a database, message queue, or cache, but far fewer know how these tools actually work underneath, or why they made different design decisions. This book isn't a "how to use it" guide — it's a deep explanation of "why it was designed this way," from relational databases to modern distributed systems.

The book is organised around three central concerns Kleppmann treats as the backbone of any data-intensive system: reliability (the system works correctly even in the face of faults), scalability (the system behaves sensibly as load grows), and maintainability (future engineers can understand and change the system). Every later chapter examines one real design decision in data systems — from the data model to partitioning — through the lens of these same three criteria.

What separates this book from ordinary technical documentation is its honesty about trade-offs: Kleppmann never claims one solution is "the best"; he shows that every design choice sacrifices something for something else, and a good engineer is someone who chooses those trade-offs deliberately.

Key ideas

1. The three pillars: reliability, scalability, maintainability

Kleppmann introduces these three criteria not as abstract goals but as a lens for evaluating every technical decision. A system can be very fast but unreliable; it can be reliable but collapse under growing load; or it can have both but be so complex that no engineer dares change it. The book argues the best architecture isn't the one that excels in one dimension, but the one that finds the right balance across all three, matched to the business's actual needs.

2. Impedance mismatch: when the data model doesn't match the code

Kleppmann explains a phenomenon every engineer who has worked with an ORM has felt: object-oriented code naturally thinks in nested objects, but relational tables are flat and represent relationships through foreign keys. This "impedance mismatch" creates a hidden cost for every translation layer placed between these two worlds. He shows why document-oriented models (like JSON) solve this particular problem but bring others — like difficulty with many-to-many relationships — in its place; no single data model wins for every problem.

3. Storage engines: B-trees versus LSM-trees

The book offers one of the clearest available comparisons between the two main families of storage engine: B-trees (used by most traditional relational databases) update data in place and are optimised for random reads; LSM-trees (the foundation of systems like Cassandra) accumulate writes in memory first and then write them sequentially to disk in batches, which is much faster for heavy write loads but makes reads more complex. This comparison shows why choosing a database should be based on the application's real read-write pattern, not simply popularity.

Every data-intensive application must assume the network is unreliable, clocks are unsynchronised, and any node may fail at any moment.

4. Replication lag and the real consequences of eventual consistency

Kleppmann gives a very concrete example: a user posts a comment and immediately refreshes the page, but doesn't see their comment — because the read request landed on a replica that hasn't yet received the new write. This "eventual consistency" sounds acceptable in theory, but breaks the user experience in practice. He introduces specific solutions like "read-your-writes" consistency — a guarantee that a user always sees their own write, even if other users don't see it yet.

5. The CAP theorem: why it needs careful handling

The CAP theorem — which says a distributed system cannot simultaneously fully guarantee consistency, availability, and partition tolerance — has become one of the field's most-cited yet most misunderstood ideas. Kleppmann warns it's often used as a slogan and incorrectly; instead of leaning on one oversimplified theorem, an engineer should know specific consistency models (linearizability, causal consistency, eventual consistency) and choose deliberately based on the application's real requirements.

Who it's for

  • A backend or infrastructure engineer working with databases and distributed systems — exactly the book's primary audience.
  • Anyone wanting to move from "using a tool" to "understanding the mechanism" — the book targets precisely this transition.
  • A systems architect who has to choose between different data technologies — the three-pillar framework is a good tool for these decisions.
  • A complete beginner to programming — this book wasn't written for beginners and requires prior knowledge.
This book is demanding and shouldn't be read like a general-audience book. Large parts of it need careful study, not casual reading — and without hands-on engineering experience, many examples remain abstract.
Some of the specific technologies mentioned in the book evolve faster than the book itself — new database versions, new streaming tools, new approaches to distributed coordination. You need to separate the underlying principles (consistency trade-offs, partitioning patterns) from the moment-specific technical details that may become dated.

FAQ

Is this necessary for everyday work with an ordinary database?

Not for surface-level use, but if you ever become responsible for system architecture decisions — choosing a database, designing partitioning, managing consistency — this knowledge is the difference between an informed decision and an arbitrary one.

Why does the book emphasise trade-offs so much?

Because Kleppmann believes the biggest mistake inexperienced engineers make is searching for the "best" technology instead of understanding what each technology sacrifices. The right decision is always context-dependent, not a universal answer.

Do I need to read it start to finish?

Its structure allows targeted reading — if you face a specific problem (partitioning, say), you can go straight to that chapter. But Part One, which builds the three core pillars, provides the necessary context for understanding the rest of the book.

Because few books explain distributed systems without depending on one specific technology. Its principles remain valid independent of which database happens to be popular tomorrow.

Is it useful for technical interview preparation?

Yes, particularly for system design interviews. But the book's real value goes beyond interviews; it gives a framework that's also useful in real, everyday engineering decisions.

Was this useful?

Counts appear once there are 5 votes.

More in this genre