What it argues
John Ousterhout's central claim in this book is that the greatest limitation in software development is our ability to manage complexity, and that almost every problem in large systems can be traced back to complexity that was unnecessary and could have been prevented. Ousterhout is a computer science professor at Stanford with decades of experience building systems software — he created the Tcl scripting language and the Raft consensus algorithm — and the book reads like an attempt to make explicit the design intuitions he has developed over that career.
The book's organizing concept is the distinction between deep and shallow modules. A deep module has a simple interface that hides a large amount of functionality — a file system call that lets you read a file in one line, regardless of the physical complexity beneath. A shallow module has nearly as complex an interface as its implementation, which means it doesn't do much to reduce the cognitive load of using it. Ousterhout argues that most complexity in systems comes from shallow modules, from leaking implementation details through interfaces, and from incremental design decisions that each seemed reasonable but together made the system harder to understand.
What it gets right
- 1.
Complexity is the root cause of most software failures. Managing it is the central task of software design, not a side concern.
- 2.
Deep modules have simple interfaces that hide a large implementation. Shallow modules expose nearly as much complexity as they contain, providing little abstraction value.
- 3.
Information hiding is the most powerful technique for reducing complexity. If a module knows less about other modules, changes are less likely to cascade.
What it covers
Who wrote it
John Ousterhout is a professor of computer science at Stanford University and the creator of the Tcl scripting language and the Raft distributed consensus algorithm. He spent years in industry at Sun Microsystems and co-founded Electric Cloud before returning to academia. His research spans distributed systems, operating systems, and software engineering. A Philosophy of Software Design grew directly from a software design course he developed at Stanford. He is one of the relatively few academic computer scientists who writes directly for a practitioner audience.