“Never go to sea with two chronometers; take one or three.”
“How does a project get to be a year late? . . . One day at a time.”
On human nature
As the child delights in his mud pie, so the adult enjoys building things, especially things of his own design.
On writing / thinking
First, writing the decisions down is essential. Only when one writes do the gaps appear and the inconsistencies protrude.
The act of writing turns out to require hundreds of mini-decisions, and it is the existence of these that distinguishes clear, exact policies from fuzzy ones.
On system design
The hardest single part of building a software system is deciding precisely what to build.
(…) conceptual integrity is the most important consideration in system design.
For efficiency and conceptual integrity, one prefers a few good minds doing design and construction.
(…) the entire system also must have conceptual integrity, and that requires a system architect to design it all, from the top down.
If a system is to have conceptual integrity, someone must control the concepts.
Architecture must be carefully distinguished from implementation. As Blaauw has said, “Where architecture tells what happens, implementation tells how it is made to happen.”
[The Second-System Effect] The general tendency is to over- design the second system, using all the ideas and frills that were cautiously sidetracked on the first one.
The sooner one puts the pieces together, the sooner the system bugs will emerge.
(…) software systems are perhaps the most intricate of man’s handiworks.
Being a programmer
Adjusting to the requirement of perfection is the hardest part of learning to program.
The hard thing about building software is deciding what to say, not saying it.
The programmer at wit’s end for lack of space can often do best by disentangling himself from his code, rearing back, and contemplating his data. Representation is the essence of programming.
Thinkers are rare; doers are rarer; and thinker-doers are rarest.
Programmers are most effective if shielded from, not exposed to, the innards of modules not their own.
The architect must always be prepared to show an implementation for any feature he describes, but he must not attempt to dictate the implementation.
On project management
The programming project converges more slowly the nearer one gets to the end, whereas one expects it to converge faster as one approaches the end.
The first step in controlling a big project on a tight schedule is to have a schedule, made up of milestones and dates for them.
No Silver Bullet—Essence and Accident in Software Engineering
- Exploit the mass market to avoid constructing what can be bought.
- Use rapid prototyping as part of a planned iteration in establishing software requirements.
- Grow software organically, add more and more function to systems as they are run, used, and tested.
- Identify and develop the great conceptual designers of the rising generation.
Brooks Jr., F. P. (1995). The Mythical Man-Month, Anniversary Edition: Essays On Software Engineering (2nd Edition) [Kindle Android version].