Mo Sharif
Back to writing

System Design Books: Choose One for the Real Problem

In this article

There are two different reasons to pick up a system design book. You may need to explain a whole system in an interview, or you may need to make one part of a real system behave correctly. Buying the same “best” book for both can waste a lot of time.

System design

is the work of choosing components and boundaries for a specific set of requirements, then explaining the performance, reliability and cost trade-offs those choices introduce.

This is how I would choose between the books on my shelf. The order follows the problem, not a universal ranking.

Read the book that addresses your current uncertainty. Interview structure, data semantics, service boundaries and production failure are separate subjects. Pick one and work through it against a real example before turning the reading list into a shopping list.

Your immediate questionStart withUseful output
How do I open a system design interview?System Design Interview, Volume 1A clear problem statement and high-level design
Why does this data system behave this way?Designing Data-Intensive ApplicationsAn explanation of consistency and failure behavior
Which requirement should dominate this design?Fundamentals of Software ArchitectureA written trade-off with measurable criteria
How should we split a tightly coupled system?Software Architecture: The Hard PartsAn analysis of boundaries, state and coordination
What happens when a dependency degrades?Release It!A failure path with timeouts and recovery

A book can be excellent and still be the wrong first book this week. The important question is what decision you can make after reading it.

The System Design Interview books teach a repeatable way to discuss a system and explore its bottlenecks. Volume 1 is a useful starting point for the format. Volume 2 offers a different set of deeper examples; it is not simply the next difficulty level in a mandatory sequence.

Alex Xu's comparison describes Volume 1 as more fundamentals-focused and Volume 2 as more focused on bottlenecks and trade-offs. Reading the first is helpful, not required.

I would practise the opening loop: clarify the requirement, sketch the main path, estimate only what affects a decision and choose a meaningful deep dive. The interview rubric is about the evidence inside that explanation, not whether the diagram matches a book.

Use Volume 2 when one of its problems matches what you need to study. You do not have to read every preceding chapter to investigate payment workflows or a metrics system.

Designing Data-Intensive Applications is the right choice when the hard question sits inside state, concurrency or recovery. It rewards slow reading because the value is understanding why apparently reasonable guarantees fail across boundaries, not collecting a list of database features.

The second edition's publisher page credits Martin Kleppmann and Chris Riccomini and lists the updated contents. Check those contents before buying another edition; foundational material in the first does not become useless when a second appears.

For reference architecture studies, this is the book that helps turn “there is a replica” into questions about what the reader can observe during lag or failure.

Do not treat difficulty as a verdict on your ability. A chapter is easier to understand when a concrete bug or design decision gives it a purpose.

Fundamentals of Software Architecture adds a vocabulary for requirements that are often reduced to “make it scalable.” It helps separate the characteristics a design needs and the compromises between them. That makes a design review more concrete than arguing over an architecture style.

Mark Richards and Neal Ford's book listing includes the second edition. I would start with architecture characteristics, then use the survey of styles to compare alternatives.

The practical exercise is to rewrite one vague statement in a design document. Replace “highly available” with the target, the failure being tolerated and how the team will test it. Replace “scalable” with the workload and the limit being addressed.

The book supplies language. You still need the product requirement and evidence. A well-named characteristic is not a measurement.

Read Software Architecture: The Hard Parts when service boundaries and distributed state are live decisions. The book focuses on compromises that appear while changing a system, not just the final diagram. It is useful before a split, while choosing whether the split is justified.

The publisher's description and contents cover service granularity, contracts, workflows and distributed transactions. Those are the concerns that can make a simple-looking extraction expensive.

Sam Newman's Building Microservices is a useful companion for the broader delivery and operating consequences. Eric Evans' Domain-Driven Design resources help with the language and model boundaries underneath the split.

I would defer these decisions when a modular application still meets the need. A new service adds ownership and operational work as well as code. Include that work in the architecture cost discussion.

Read Release It! before an incident because failure containment is easier to design before retries and dependencies spread through the codebase. Production experience makes its examples vivid, but timeouts, overload and partial failure do not become relevant only after launch.

Michael Nygard's second edition is a practical reference for stability patterns. My exercise would be to take one outbound call and explain what happens when the dependency becomes slow, unavailable or intermittently wrong.

That thinking is behind Codelit's diagram chaos mode. A diagram can help rehearse a failure, but it only knows the dependencies you declared. It is not a substitute for testing recovery in a safe deployed environment.

Turn a chapter into judgement by making a decision with it and checking the consequences. Recall is useful, but it can hide gaps in understanding. Reconstructing a design, changing a requirement and testing a failure makes those gaps easier to identify.

Try this sequence:

  1. Choose one request or data path from the chapter.
  2. Close the source and redraw it.
  3. Explain what each component prevents or enables.
  4. Remove one component and state the consequence.
  5. Change a requirement and identify which decisions no longer hold.

This is the practice loop behind learning system design on a canvas. The drawing is a way to expose reasoning, not the end product.

The companion books

Choose a companion when its subject becomes a real decision: deeper interview examples, architecture characteristics, service boundaries or domain modelling.

  • System Design Interview – An Insider's Guide: Volume 2Alex Xu

    Volume 1 teaches the format. Volume 2 is where the problems start to resemble things you will genuinely be asked to build. The payment system and metrics aggregation chapters are the standouts.

  • Fundamentals of Software Architecture (2nd Edition)Mark Richards & Neal Ford

    The chapter on architecture characteristics — treating 'scalability' and 'elasticity' as distinct, measurable things you trade against each other — changed how I write design docs. It gave me vocabulary for arguments I had been losing.

  • Software Architecture: The Hard PartsNeal Ford, Mark Richards, Pramod Sadalage & Zhamak Dehghani

    Every other architecture book shows you the finished microservice diagram. This one sits in the ugly middle where you have to split a shared database and nobody is happy. That is where real work happens.

  • Building Microservices (2nd Edition)Sam Newman

    The second edition is notably more sceptical than the first, which is why I trust it. Newman spends real pages on when *not* to do this. Read it before you split anything.

  • Domain-Driven DesignEric Evans

    Bounded contexts are the single most useful idea for anyone drawing service boundaries, and this is where they come from. Read the strategic design section — part four — before you read the rest.

Pick the book that answers your next difficult question. Leave with a design you can explain and a failure you can test. That is more valuable than finishing the entire shelf.

Questions people actually ask

What should I read first for a system design interview?
I would start with Alex Xu's System Design Interview, Volume 1, if the interview format is unfamiliar. Use it to practice framing and explaining a design. Then test the method on a problem you have not memorized, because recognizing the worked answer is not the same skill.
Should I read Designing Data-Intensive Applications first?
Start there when data-system behavior is your immediate question: replication, transactions, partitioning or recovery. If you mainly need practice discussing a whole system under interview constraints, an interview-focused book may be a more useful first step.
Should I replace the first edition of Designing Data-Intensive Applications?
Compare the second edition's contents with the questions you need answered. The newer edition is by Martin Kleppmann and Chris Riccomini, but the first remains useful for foundational concepts. Owning a newer edition is less valuable than carefully applying the one you already have.
Is Release It! useful before a product launches?
Yes. Timeouts, retries and dependency isolation are worth designing before the first incident. Some operational examples become clearer with production experience, but you do not need to wait for an outage before studying failure modes and testing how your system responds.
How should I practice after reading a system design chapter?
Close the chapter and reconstruct one request path. State the requirements, explain each component, then change a constraint or introduce a failure. Compare your reasoning with the source afterward. The questions you cannot answer become the next reading or testing task.