To improve the state of architecture designs, we need:
- quality objectives for a software architecture
- metrics and review processes for evaluating architectures
- graphical notation systems for documenting and communicating architectures
- processes for designing architectures.
Some quality objectives of good software architectures include:
- complete functional coverage of application domain(s)
- consistent treatment of functions within the architecture
- flexibility to adapt to different products in an application domain
- clean separation of responsibilities between components to ensure that side effects are minimized and documented, protocols are functionally focused, and the coupling between modules is loose and cohesion is strong
- loose constraints that do not assume or preclude lower domain decisions such as: concurrency, data structures and algorithms, i.e., allows such decisions to be made, evaluated and changed without changing the architecture
- measurable and predictable performance, effort and generality.
There are several approaches to achieving these objectives. One is a top-down process where architectural principles are derived from the objectives. Another is a bottom-up approach which captures, classifies and catalogs architectural styles, cliches and notations and then synthesizes common abstract principles with reproduce the cataloged artifacts. Both approaches are important.