↕ Scroll to explore

A book report on

The Art of Unix Programming

Eric S. Raymond, 2003 · 560 pages · v2

Thirty years of unwritten software engineering wisdom, codified. This report doesn't just describe the ideas — it makes you build with them.

↓ scroll to begin

"Do one thing and do it well."

Doug McIlroy, inventor of the Unix pipe. The most cited rule in all of software. But what does it feel like? Compare:

🔪 The Swiss Army Knife

SuperTextPro 9000

edit compile debug email browse chat ftp calendar
  • Can't use the editor without loading everything else
  • Bug in email client crashes the whole app
  • Want a better debugger? Too bad, it's built in
  • Other programs can't use any of its parts
🧰 The Unix Toolbox

Small sharp tools

vim gcc gdb mutt lynx irc scp cal
  • Each tool loads in milliseconds
  • Bug in mutt? vim doesn't care
  • Don't like gdb? Use lldb. Swap freely
  • Pipe them together for things nobody planned

"Write programs that do one thing and do it well. Write programs to work together." The toolbox always wins long-term.

Build a pipeline. Experience composition.

Click tools to snap them together. Each does one thing. Together they do things nobody planned:

echo "..."
click tools above to build a pipeline →
add tools to see output...

Each tool is ~10 lines of code. The pipeline is emergent power. No tool knows what the others do. That's the Rule of Composition.

Separate policy from mechanism.

One engine. Three interfaces. Click each to control the same music player with a completely different policy:

Engine (mechanism)
♫ No track loaded
Stopped · 0:00
CLI
$ play --track 1
Minimal
Fancy

Three completely different interfaces. Zero changes to the engine. That's separation. Policy changes freely; mechanism endures.

Fail noisily. Fail early.

Both programs process 5 data files. File #3 has a corrupt record. Click "Run" on each and watch what happens downstream:

❌ Silent Failure
✅ Loud Failure (Unix Way)

Fold knowledge into data.

Rob Pike: "Data dominates. If you've chosen the right data structures, the algorithms will be self-evident." Both versions handle HTTP codes. Click "Add 418 I'm a Teapot" and watch what each requires:

Logic-Heavy
function statusText(code) { if (code === 200) return "OK"; else if (code === 301) return "Moved"; else if (code === 404) return "Not Found"; else if (code === 500) return "Server Error"; else return "Unknown"; }
Data-Driven
const codes = { 200: "OK", 301: "Moved", 404: "Not Found", 500: "Server Error", }; return codes[code] ?? "Unknown";

17 rules. 30 years of wisdom.

Click any rule:

Silence is golden.

Both programs copy 5 files. Click "Run" on each:

❌ Loud Program
✅ Unix Program

Transparency: let there be light.

fetchmail's -v flag: one option that shows everything. 8/10 bugs diagnosed within seconds.

Click to toggle -v
fetchmail hurkle.thyrsus.com
2 messages for esr (1 new)

"Don't let debugging tools be afterthoughts. They are your windows into the code; don't just knock crude holes in the walls, finish and glaze them."

Worse Is Better

Richard Gabriel's famous essay. Two philosophies of design:

MIT / "The Right Thing"
Interface must be simple. Implementation can be complex. Correctness is non-negotiable.
New Jersey / "Worse Is Better"
Implementation must be simple. Interface can be rough. Ship it, get users, improve fast.

📖 The scenario:

It's 1989. You're building a hypertext system. A document links to another document on a different server. That server goes down. What do you do?

★★★★★

"Software design and implementation should be a joyous art, a kind of high-level play. If this attitude seems preposterous or vaguely embarrassing to you, stop and think; ask yourself what you've forgotten."

Twenty years old. Still radical. Not because it's complicated — because almost nobody follows it. Do one thing well. Make it composable. Keep it transparent. Ship it simple.

Reviewed by John Isidore · February 2026 · v2

← v1