1.01^n

The books that changed how I think about systems

There is a difference between books that add information and books that change how you think. The first kind expands what you know. The second kind changes how you reason about what you already know.

The second kind is rarer and more valuable. Here are the ones that belong in that category for me.

Designing Data-Intensive Applications -- Martin Kleppmann

This book did something unusual: it made distributed systems legible.

Most writing about distributed systems is either too theoretical (academic papers) or too specific (documentation for a particular system). Kleppmann found the level in between: concrete enough to be useful, general enough to apply across different technologies.

The most important thing it teaches is not any particular technique but a way of framing problems: what is the consistency model? What are the failure modes? What guarantees does this actually provide?

After reading it, I stopped accepting vague statements about reliability and started asking specific questions. What happens when a network partition occurs? Is this operation atomic? What does "eventually consistent" mean in practice here? These questions have simple answers, but many systems are designed by people who never asked them.

The Mythical Man-Month -- Fred Brooks

This is not a technical book. It is a book about how software projects actually behave when they involve more than one person.

Brooks was describing the IBM OS/360 project, which by any measure was a failure -- overdue, over budget, and produced software that was not what was needed. His analysis of why is still accurate for most large software projects today.

The two ideas that have stayed with me:

Conceptual integrity is more important than feature completeness. A system with fewer features but a coherent design is easier to understand, maintain, and extend than a system with more features and no unifying model.

The second system is always the worst. After building something successfully, engineers tend to put everything they held back the first time into the second version. This produces bloated, incoherent software. The constraint was doing work.

A Philosophy of Software Design -- John Ousterhout

Ousterhout's argument is that most software problems reduce to complexity, and most complexity comes from unnecessary information being exposed across module boundaries.

His concept of "deep modules" -- small interfaces with large implementations -- is a useful lens for evaluating design. Shallow modules (large interfaces, small implementations) are the opposite of what you want: they expose complexity without providing much in return.

This is not a difficult concept. It is a simple concept that is consistently ignored. Reading the book gives you a vocabulary for noticing when your design is going the wrong direction, which turns out to be most of the time.

Systems Performance -- Brendan Gregg

This book is technically specific (it is about Linux performance analysis), but its importance extends beyond the specific tools.

What it teaches is an empirical approach to reasoning about systems. You do not guess. You measure. You form hypotheses about what the bottleneck might be, and then you verify or falsify them using instrumentation. This sequence -- observe, hypothesize, test -- applies to any complex system.

More than the specific tools, it instilled a discomfort with guessing. Before reading it, I would accept "it's probably the database" as a reasonable explanation for slowness. After reading it, the correct response is obvious: instrument and find out.


A pattern across these: none of them are primarily about tactics. They are about developing a model -- a way of seeing systems that reveals structure that was previously invisible. That is what makes them compound rather than decay.

The test of a good technical book: does it change what you notice? These did.