I’m trying to improve the design activities conducted by my software team. In the course of making these improvements I began to look for ways to better characterize design. This is important to help align the team around the objective of improving our designs–how do we know good design when we see it?
My initial attempt to characterize design involved reading Christopher Alexander’s Notes on Synthesis and Form. In this book, design has to consider fit (or the context in which it is employed). This implies that design solves a problem whose contraints and use help define it.
Robert C. Martin provides a definiton for bad design in The Dependency Inversion Principle. In defining this principle Robert says:
A piece of software that fulfills its requirements and yet exhibits any of the following traits has a bad design.
- It is hard to change because every change affects too many other parts of the system. (Rigidity)
- When you make a change, unexpected parts of the system break. (Fragility)
- It is hard to reuse in another application because it cannot be disentangled from the current application. (Immobility)
What causes bad design?
-
Rigidity: A system exhibits rigidity if there is heavy interdependence between system components.
-
Fragility: A system exhibits fraglity if it has the tendency to break in many places when a single change is made. Often the new problems are in areas that have no conceptual relationship with the area that was changed.
-
Immobility: A design is immobile when desirable parts of the design are highly dependent upon other details that are not desired. The separation of undesired parts is usually expensive.
I’d argue that in this definition, the functional requirements are met but the non-functional requirements are not. Furthermore, the causes of bad design are all high coupling between system components.
So far, the best characterization I’ve got is good design must solve a problem and the solution to that problem is context (or fit dependent). Bad designs are highly coupled.
This implies that the definition of good design might lie in the direction of defining how to create loosely coupled elements that meet both functional and non-functional requirements.