Monday, June 5, 2017

Frederick Brooks on Software Design

Software design and architecture always has been my foremost interest and fun part in computer science. Frederick Brooks' book "The Design of Design" summarizes a lot of useful facts and topics all system designers will learn about sooner or later. This post contains some few excerpts from his excellent book.
The Design Question

Design is to plan in mind for later execution.

For most human makers of things, the incompletenesses and inconsistencies of our ideas become clear only during implementation. Thus it is that writing, experimentation, "working out" are essential disciplines for the theoretician.

Frederick Brooks in his classic book "The Mythical Man-Month" about conceptual integrity:
"I will contend that conceptual integrity is the most important consideration in system design. It is better to have a system omit certain anomalous features and improvements, but to reflect one set of design ideas, than to have one that contains many good but independent and uncoordinated ideas.""Conceptual integrity in turn dictates that the design must proceed from one mind, or from a very small number of agreeing resonant minds."
Conceptual integrity does not emerge from democracy. The result of a democratic approach is a compromise that does not meet the needs of any single person or the customer.
"The separation of architectural effort from implementation is a very powerful way of getting conceptual integrity on very large projects."Design Models

The theory of design is the general theory of search through large combinatorial spaces of possibilities.

Sometimes the problem is to discover what the problem is.

Goal iteration must be considered an inherent part of the design process.

The most potent reason to study design history is to learn what doesn't work, any why.

Ask yourself: Am I doing the right thing? or am I just doing the thing right?

Study failure examples even more carefully than you study successes.

Any attempt to formulate all possible requirements at the start of a project will fail and would cause considerable delays.

Collaboration in Design

Most great works have been made by one mind. The exceptions have been made by two minds.

Great designs often arise in physical isolation, small teams, intense concentration, and leadership by one mind.

Great designers most have a clear vision of and for the system and must really care about its conceptual integrity.

Clean interfaces make a big difference in the error rate of the design.

Clean interfaces give multiple designers each the joy of ownership, of the privilege of signing a piece of work. They also facilitate sequential ownership, as small components flow together into larger subsystems.

The telephone provides an even bigger collaboration breakthrough than email.

Constraints are Friends

A general-purpose product is harder to design well than a special-purpose product.

Constrains shrink the search space of possibilities.

The hardest part of designing is deciding exactly what to design.

Any design process begins with the designer elaborating and particularizing the objectives and constraints. The first task is to narrow the design space.

Esthetics and Style in Design

Style is the dress of thought, and a well-dresses thought, like a well-dressed man, appears to great advantage.

Definition of style: Those features of literary composition that belong to form or expression rather than to the substance of the thought or matter expressed.

Computer design clearly must place a high value on parsimony, the use of few elements (building blocks).

Consistency is reinforcing and self-teaching, because it confirms and encourages our expectations.

Uniform style aids comprehensibility of a design.

Great Design and Great Designers

Good design is top-down.

Great designers, even the most iconoclastic, rarely start from scratch - they build on the rich inheritance from their predecessors. This is why you must know about design (computer science) history.

Great designs come from great designers, not from great design processes.

Very good programmers are ten times as productive as poor ones.

Give the system architect full authority over the design.

Every man who rises above the common level has received two educations: the first from his teachers; the second, more personal and important, from himself.

Design productivity requires flow, an uninterrupted mental state of high creativity and concentration.

The Mythical Man-Month

Lean, sparse, fast programs are almost always the result of strategic breakthrough, rather than tactical cleverness.
Often such breakthrough will be a new algorithm.
More often, the breakthrough will come from redoing the representation of the data or tables. Representation is the essence of programming.

You can never plan the future by the past.

Be careful how you fix what you don't understand.

One addition from my side

Great designers grow with their challenges. They need a constant flow of exciting challenges for mastery.