L3VLUP
Atlas

FrameworkContrarian viewSoftware engineering

Complexity is what you must hold in your head to make a safe change

John Ousterhout · A Philosophy of Software Design

The idea

Ousterhout defines complexity in software as whatever makes a system hard to understand and modify, and argues that most of it comes from dependencies and obscurity rather than from size. His prescription disagrees with a lot of received advice: deep modules, which hide a lot of functionality behind a small interface, beat many small shallow ones, because each interface is something a reader has to hold in mind. The disagreement is useful in itself. An engineer who can say why small functions are not always better has understood the goal, which is reducing what a change requires you to know.

Judge a design by how much a reader must understand to change it safely, and prefer deep modules behind small interfaces.

When it works

Code review, design discussions, and software engineering interviews that ask what good code is.

When it may fail

Deep modules can hide too much, and the right depth depends on how often the inside changes. The book is a position in an argument, which is exactly why it is worth reading.

How to use it

In a review, ask for each interface what a caller must know to use it correctly. An interface that leaks its implementation is shallow however short it is, and merging two shallow modules into one deep one is often the right fix.

Where it came from

Book A Philosophy of Software Design · John Ousterhout

What the source says. A short argument about deep modules and shallow interfaces that disagrees, usefully, with a lot of received advice about small functions.

Find it on the shelf Written from L3VLUP’s own notes on the work · reviewed 2026-10-16

Connected ideas

Concepts

Put it to work on L3VLUP

More like this