CS PAPERS DEEP READ · PAPER 70

Hints for Computer System Design

Butler Lampson · Xerox PARC · SOSP 1983

中文 →

What did this paper do?

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.

First, a curiosity

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.

What was new

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.

How it works

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.

What it led to

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.

Remember one thing

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