The design and implementation of a software system is the result of many interwoven sequences of decisions. Often, these decisions are made under less than ideal conditions of uncertainty and/or incomplete information. Furthermore, many of these decisions do not have clear “right/wrong” answers — they are value judgments dependent upon the current knowledge of the system and its intended domain...