-
Complexity is incremental: you have to sweat the small stuff (see p. 11).
-
Working code isn't enough (see p. 14).
-
Make continual small investments to improve system design (see p. 15).
-
Modules should be deep (see p. 22)
-
Interfaces should be designed to make the most common usage as simple as possible
(see p. 27).
-
It's more important for a module to have a simple interface than a simple implementation (see pp. 55, 71).
-
General-purpose modules are deeper (see p. 39).
-
Separate general-purpose and special-purpose code (see p. 62).
-
Different layers should have different abstractions (see p. 45).
-
Pull complexity downward (see p. 55).
-
Define errors (and special cases) out of existence (see p. 79).
-
Design it twice (see p. 91).
-
Comments should describe things that are not obvious from the code (see p. 101).
-
Software should be designed for ease of reading, not ease of writing (see p. 149).
-
The inerements of software development should be abstractions, not features (see p. 154).