Design should be backward-looking


Harrison Ainsworth

Good engineering design rests essentially on good knowledge – not prediction

To design for future modifiability is taken for granted in software development. But this superficially simple intent hides an implicitly misleading contradiction. Examining the elements – the meaning of design, and the character of software – shows why.

On one hand, engineering design is essentially about working with known information: known by theoretical understanding, and known by as-needed experimentation. This is what makes it so effective. On the other hand, one of the core virtues of software is its underlying adabtability: bits are always open to change. This is what makes it resilient to the future – that is, to the unknown. These two sides conflict.

You cannot design for the unknown. You cannot systematise and abstract over an unspecified, unbounded region. To try to design for future modifiability is a contradiction: it means design is dominated by the unknown, by lack of information – it can never work well, design becomes a problem that is insoluble.

Design should look backward not forward. It should put together available components to meet intended requirements – doing the best job with information known now. Then later, when new conditions and needs arise, the design can be re-done to fit them – the new conditions become known information, and design can work with them properly.

Any predictive, anticipatory, design must be based on good theoretical understanding. There must be sound reason to expect particular conditions, and a clear enough picture to make good judgements. Otherwise, such prediction is not known information, neither by understanding nor experiment, and so would weaken design.

Design for what you know.