Butler W. Lampson: “Hints and Principles for Computer System Design”
I have many hints that can be helpful in designing computer systems, as well as a few principles. Two ways to organize them are:
• Goals (what you want)—simple, timely, efficient, adaptable, dependable, yummy.
• Methods (how to get it)—approximate, increment, iterate, indirect, divide and conquer.
Of course the goals are in conflict, and engineering is the art of making tradeoffs.
It also helps to choose the right coordinate system, just as center of mass coordinates make many dynamics problems easier. For example, you can view the system state as a name→value map, or as an initial state and a sequence of operations that transform the state. You can view a function as code or as a table or as a sequence of partial functions.
In the complex process of designing systems, both principles and hints can only be justified by examples of what has worked and what has not.