Knowledge lets you deduce the right thing to do; expertise makes the right thing a reflex, hardly requiring conscious thought at all.
Modularity
: Write simple parts connected by clean interfaces.Clarity
: Clarity is better than cleverness.Composition
: Design programs to be connected to other programs.Separation
: Separate policy from mechanism; separate interfaces from engines.Simplicity
: Design for simplicity; add complexity only where you must.Parsimony
: Write a big program only when it is clear by demonstration that nothing else will do.Transparency
: Design for visibility to make inspection and debug- ging easier.Robustness
: Robustness is the child of transparency and simplicity.Representation
: Fold knowledge into data so program logic can be stupid and robust.Least Surprise
: In interface design, always do the least surprising thing.Silence
: When a program has nothing surprising to say, it should say nothing.Repair
: When you must fail, fail noisily and as soon as possible.Economy
: Programmer time is expensive; conserve it in preference to machine time.Generation
: Avoid hand-hacking; write programs to write programs when you can.Optimization
: Prototype before polishing. Get it working before you optimize it.Diversity
: Distrust all claims for “one true way”.Extensibility
: Design for the future, because it will be here sooner than you think.