One of the simplest and most constructive definitions of architecture comes from Grady Booch: "All architecture is design but not all design is architecture. Architecture represents the significant design decisions that shape a system, where significant is measured by cost of change." What follows from this is that an effective architecture is one that generally reduces the significance of design decisions. An ineffective architecture will amplify significance.
When a design decision can reasonably go one of two ways, an architect needs to take a step back. Instead of trying to decide between options A and B, the question becomes "How do I design so that the choice between A and B is less significant?" The most interesting thing is not actually the choice between A and B, but the fact that there is a choice between A and B (and that the appropriate choice is not necessarily obvious or stable).
An architect may need to go in circles before becoming dizzy and recognizing the dichotomy. Standing at whiteboard (energetically) debating options with a colleague? Umming and ahhing in front of some code, deadlocked over whether to try one implementation or another? When a new requirement or a clarification of a requirement has cast doubt on the wisdom of a current implementation, that's uncertainty. Respond by figuring out what separation or encapsulation would isolate that decision from the code that ultimately depends on it. Without this sensibility the alternative response is often rambling code that, like a nervous interviewee, babbles away trying to compensate for uncertainty with a multitude of speculative and general options. Or, where a response is made with arbitrary but unjustified confidence, a wrong turn is taken at speed and without looking back.
There is often pressure to make a decision for decision's sake. This is where options thinking can help. Where there is uncertainty over different paths a system's development might take, make the decision not to make a decision. Defer the actual decision until a decision can be made more responsibly, based on actual knowledge, but not so late that it is not possible to take advantage of the knowledge.
Architecture and process are interwoven, which is a key reason that architects should favor development lifecycles and architectural approaches that are empirical and elicit feedback, using uncertainty constructively to divide up both the system and the schedule.
This article appears in 97 Things Every Software Architect Should Know. It is licensed under a Creative Commons Attribution 3.
User Comments
"If you choose not to decide you still have made a choice" - Rush<br>
Doing the simplest thing that works may be a way of deferring the decision, but this always comes back to haunt you. I agree that the design should not focus so much on the options of the decision, but rather breed an agile design which makes changing the decision easier. Great post!
When faced with a choice between two alternatives, I find the best approach is to define a third alternative. Instead of comparing A vs. B, I find myself comparing A and B vs C, B and C vs A, and C and A vs B. This leads to a better evaluation of strengths and weaknesses of each alternative, even one that I might view as a throw away alternative. The end result is usually a composite approach. For any problem with a non-obvious solution, always strive for at least three alternatives before making a choice.<br>