Hints for System Design

April 29, 2012

In 1983, Butler Lampson published a landmark paper about Hints of Computer System Design. As a practitioner and a student of distributed systems design, I find it immensely insightful and I habitually go back and re-read this paper every few months. In this post I'll try and summarize some of the learnings from this paper that I've gained over the years.

Prerequisite

Before jumping into system design, think hard about what is it that you are trying to accomplish? Have a clear idea about what your goals are?

Hints / Principles

Butler organizes his suggestions along two axis.

  1. Why - Why it helps in making a good system?
  2. Where - Where in the system design it helps?

Why/Where

Functionality

Does it work?

Speed

Is it fast enough?

Fault-tolerance

Does it keep working?

Completeness

Separate normal and worst case

Shed load
End-to-end
Safety first


End-to-end

Interface

Do one thing well:
Don’t generalize
Get it right
Don’t hide power
Use procedure arguments
Leave it to the client
Keep basic interfaces stable
Keep a place to stand

Make it fast
Split resources
Static analysis
Dynamic translation

End-to-end
Log updates
Make actions atomic

Implementation

Plan to throw one away
Keep secrets
Use a good idea again
Divide and conquer

Cache answers
Use hints
Use brute force
Compute in background
Batch processing

Make actions atomic
Use hints

Key Takeaways

** In 2020, Butler published a new version of this paper. Its available here