CS PAPERS DEEP READ · PAPER 70
Butler Lampson · Xerox PARC · SOSP 1983
In 1983 Butler Lampson — one of the people behind the first personal computer (the Alto), Ethernet, and the first what-you-see-is-what-you-get text editor — compressed twenty years of system building into about thirty short, sloganized lines.
The paper isn't about how to write code. It's about how to decide when there is no right answer: should this feature exist, should anyone else be able to see it, what happens when it breaks. Most of the things engineers say to each other today — "don't over-engineer it," "make it right before you make it fast," "shed load when you're drowning" — trace back to this one page.
He didn't call them rules, and he didn't call them laws. He called them hints. And in this very paper, "hint" is also a precise technical term: a guess that may be wrong, but whose correctness can be checked very cheaply.
So the title is its own instruction manual: every line here might be wrong for your project, so go check it yourself. A classic that would go on to be cited thousands of times opens by disclaiming its own authority — which is exactly why it hasn't aged.
Papers of that era either proved things about algorithms or described a system someone built. Nobody wrote about judgment — judgment lived in the heads of old hands and got transmitted by apprenticeship and by wrecking projects. Lampson wrote it down, with examples on both sides, including failures he was part of.
He first collapses every design argument onto two axes: what you're worried about (is it right, is it fast enough, what happens when it breaks) and where you're deciding (how much to do at all, what the interface exposes, how the insides work). Three by three, nine boxes, and the hints all find a home. Three of them, for flavor:
1. Do one thing and do it well; don't rush to generalize. Making something "general" is a bet on future requirements, and everyone pays for a lost bet: a bloated interface that also runs slower. A handy paring knife turned into a Swiss army knife peels apples worse. Want to reuse a good idea? Use it again, separately, in each place — don't build one universal part.
2. Don't hide power. Encapsulation exists so you needn't look at what you don't want to see — not to lock away the capability you actually need. An automatic transmission shifting for you is great; one that won't let you touch the brake means you'll go build your own car. An interface that hides too much always gets bypassed in the end.
3. Send the normal case and the worst case down separate paths. They want opposite things: the everyday path must be fast, while the disaster path only has to make some progress. Force them into one path and you get neither. It's why hospitals separate the clinic from the emergency room — mixed together, the sore throat and the cardiac arrest drag each other down.
This page became required reading in generations of systems courses, common knowledge in interviews, and shorthand in design reviews — it isn't cited so much as memorized and used. One honest cost: these are experience, not laws, and they contradict each other, while the paper gives you no way to arbitrate. Usually only someone who has already been burned knows which one applies right now.
A man who helped build the first personal computer wrote down the judgment behind "get it right, make it fast, keep it working" as about thirty memorable lines — and honestly called them hints: they may be wrong, please check. Most of the design common sense engineers repeat today starts on this page.
Want the 3×3 table, the precise mechanism of a hint, and which lines the decades have rewritten? → Switch to the deep read
Lampson distilled the lessons that kept recurring across a set of real systems he helped design — successes and failures alike — into about thirty sloganized "hints," organized by a 3×3 table (three questions: functionality / speed / fault-tolerance, against three places: how much to do / the interface / the implementation). It proves no theorem, yet it became the most widely circulated checklist of judgment in system design — and he deliberately called them hints rather than rules: they may be wrong, verify for yourself.
Butler Lampson wrote this at Xerox PARC, where he had a hand in the Alto personal computer, Ethernet, the Bravo WYSIWYG editor, the Dover laser printer, the Grapevine distributed mail and naming service, and the Mesa/Cedar programming environment. He received the Turing Award in 1992. The paper was presented at the 9th SOSP in 1983 and reprinted the following year in the first issue of IEEE Software, which is part of why it travelled so far.
It follows Brooks's tradition of written engineering experience, Parnas on information hiding, and Saltzer's end-to-end argument (both deep-read on this site). What follows it isn't another paper so much as a whole body of engineering common sense passed along by word of mouth.
System design had (and has) an awkward property: there is no computable right answer. You can prove an algorithm's complexity and a protocol's correctness, but real systems rarely fail on algorithms — they fail on judgment: where to cut the interface, what to hide and what to expose, when performance starts to matter, which layer catches errors. Worse is how this knowledge travels: it lives only in the heads of people who have built a few large systems, passed on by apprenticeship and by failed projects. It can't go in a textbook and it can't go in a paper, because it can't be proved — so every generation of engineers repeats the previous one's mistakes.
Lampson's aim was to break that loop. But he understood what kind of knowledge this is, so the form is deliberately modest: not laws, hints — each with a slogan to make it memorable, each backed by real systems on both sides, and each openly admitted to conflict with the others, leaving the judgment to you. That self-limitation is exactly why the paper survived forty years.
The paper's most underrated contribution is its organizing scheme. Lampson noticed that nearly every design argument lands on two axes: what you're worried about (functionality: is it right? speed: is it fast enough? fault-tolerance: what happens when it breaks?) and where you're deciding (completeness: how much should this do at all? interface: what does it expose? implementation: how do the insides work?). Three by three, nine boxes, and thirty-odd hints each find their place.
Lampson frames interface design as a trade-off: a good interface should be simple, complete (nothing essential missing), and admit a small, fast implementation — and satisfying all three at once is essentially impossible, so design is deciding what to give up. Out of that grow a cluster of hints:
The most-quoted line here is "Make it fast, rather than general or powerful." Small fast primitives can be composed by clients into whatever they actually need; a large slow feature cannot be decomposed into something fast. Performance is the one property clients can't add from outside — so give less, but give it fast.
The rest is an acceleration toolkit: cache the answers to expensive computations; batch when you can; move work off the critical path into the background; analyze statically instead of at run time; and the wonderfully unacademic "when in doubt, use brute force" — hardware keeps getting cheaper, and a dumb correct algorithm often beats a clever fragile heuristic, besides being easier to debug. "Split resources in a fixed way if in doubt, rather than sharing them" belongs here too: you give up utilization and buy back predictable performance and debuggable failures.
This is the cleverest line in the paper, and the title's pun. A hint is a guess that may be stale or wrong, but whose correctness can be checked cheaply on the spot; if every hint is wrong the system is still correct, merely slower. That's precisely how it differs from a cache: a cache assumes its contents are valid (hence all the coherence machinery), while a hint assumes nothing — it leaves "being correct" to the authoritative source and only takes the "usually saves a round trip" winnings.
The paper's canonical examples are local tables of network addresses and names: the table may be stale, but each use is validated by the response itself. A hit saves a broadcast or a lookup; a miss falls back to the slow path and refreshes the entry on the way. The pattern is everywhere now — branch prediction, optimistic concurrency control, DNS and routing caches are all "verifiable guesses."
Cutting across the whole table is "handle normal and worst case separately." Their requirements genuinely differ — the normal case must be fast, the worst case need only make progress. Cram both into one code path and you typically end up slow in the common case and shaky in the rare one.
Finally, the maxims that run through everything: "keep it simple"; "get it right — neither abstraction nor simplicity is a substitute for getting it right" (elegant layering cannot rescue semantics that are wrong to begin with); and, quoting Brooks, "plan to throw one away" — the main output of a first system is knowledge, not product.
It has to be said plainly: this paper has no experiments, no data, no baselines. Its "results" are cases. Lampson argues hint by hint from real systems — Alto, Bravo, Ethernet, Grapevine, Pilot, Star, Mesa and others — with examples where a hint paid off and examples where violating it hurt, and a good share of the negative examples come from systems he worked on himself. The persuasiveness comes not from statistics but from "the witness was there, and is willing to write down his own failures" — which is also exactly where the methodological weakness lies.
Its mode of influence is unusual: it isn't cited into later research so much as memorized and used. "Don't over-engineer it," "leave the decision to the caller," "a hint is allowed to go stale," "shed load," "get it right before you make it fast" — a large share of what's written into company design guidelines and interview questions today starts on this page.
It also became a standard teaching text, and it gave engineers a shared vocabulary: say "that one hides power" in a review and the other person instantly knows what you're worried about. In 2020 Lampson wrote a successor, Hints and Principles for Computer System Design, reorganized into goals / techniques / process with the mnemonics STEADY, AID and ART (AID = approximate, incremental, divide and conquer) — evidence that the list is still evolving.
1. In one line: Lampson distilled system-building judgment into about thirty sloganized "hints," organized by a 3×3 table, and said outright that they may be wrong and must be verified.
2. The pain: system design has no computable right answer; failures come from judgment rather than algorithms, and that knowledge lived only in veterans' heads, transmitted by failed projects.
3. The scheme: three questions (functionality / speed / fault-tolerance) by three places (how much to do / interface / implementation) file nearly every design argument into nine boxes.
4. Interfaces: simple, complete, and cheap to implement can't all be had — hence "do one thing well, don't generalize," "don't hide power," "leave the decision to the client," "keep basic interfaces stable."
5. Speed: "fast beats general" — small fast primitives compose, large slow features don't decompose; plus caching, batching, background work, static analysis, and "when in doubt, use brute force."
6. Hints: guesses that may be wrong but are cheap to verify, leaving the system correct (only slower) when they all fail — branch prediction, optimistic concurrency and name caches are all this, and so is the title.
7. Fault tolerance: end-to-end (only application-level recovery is logically necessary), log updates, atomic or restartable actions, safety first, shed load, and separate paths for normal and worst case.
8. Results and influence: no experiments; the argument rests on real systems including the author's own failures — and it spread by being memorized, becoming course material and shared engineering vocabulary.
9. Limits: anecdotal evidence and survivorship bias; hints that conflict with no arbitration rule; lines like "split resources rather than share" rewritten by cloud economics; nothing on consensus or security; unfalsifiable overall.