Experience has shown that the quality attributes of large software systems live principally in the system's software architecture. In such systems the achievement of qualities attributes depends more on the overall software architecture than on code-level practices such as language choice, detailed design, algorithms, data structures, testing, and so forth. It is therefore a critical risk mitigation measure to try to determine, before a system is built, whether it will satisfy its desired qualities. Although methods for analyzing software systems with respect to specific quality attributes already exist, these analyses have typically been performed in isolation. Performance affects modifiability.
Availability affects safety.
Security affects performance. Everything affects cost. While experienced designers know that these tradeoffs exist, there is no codified method for characterizing them and, in particular, characterizing their interactions. There are some techniques that designers have used to try to mitigate the risks of having to choose an architecture to meet a broad palette of quality attributes. The recent activity in cataloguing design patterns and architectural styles is an example of this type of activity.