This is one of a series of essays that reflect my current thinking about the design process. I begin by comparing two different design philosophies—design as a process of making decisions and design as generate and test—and describing how these two philosophies are complementary.
Design as a process of making decisions
When generating a design in any field—software architecture or art—one makes decisions. In software architecture, the decisions may be about which tactic to apply in a particular context, and in art the decisions may be about background and perspective; but in every case, one could view the finished product as a sequence of decisions. Decision 1 is followed by decision 2 and so forth. Recreating the design from its description as a sequence of decisions is a matter of repeating the consequences of each decision. The earliest description of this philosophy that I am aware of dates from the 1940s.
One consequence of this view of the design process is that later decisions are constrained by earlier decisions. A sidewalk artist may focus on the eyes as the first item to be drawn. The drawing of the eyes will determine the scale of the picture, the orientation of the picture, how much of the body will be shown, as well as many other things. The decision to begin with the eyes and the decisions made in drawing the eyes will constrain much of the rest of the drawing.
Software architecture design is similar. Suppose the architect makes a decision to use the MVC pattern. Then subsequent allocation decisions will be constrained as to whether they affect a Model, a View, or a Controller, and the decisions may need to be rethought so that the responsibility being allocated fits into one of those categories.
A focus on design as a process of making decisions leads to the following questions:
- What decision do I make next? At any point in the design process, there is a list of possible decisions that could be made. Choosing the next decision to be made is an important element of this philosophy of design.
- What are my options? When making a decision, you choose among a variety of options. Knowing the options available is necessary in order to make a good decision.
- How do I make this decision? Some decisions are made on the basis of intuition, others on the basis of analysis; still others may be a random choice. How to make this particular decision is another element of this philosophy.
- Is the decision worth recording? Decisions that are not recorded are frequently lost and difficult to communicate. Yet an architectural design may reflect thousands of distinct decisions. Recording each one in a form others can interpret has a cost. So a particular decision must be judged as to whether it is cost effective to record it.
Design as generate and test
Another philosophy of design is that it is the process of generate and test. A particular design is a hypothesis that this design satisfies the requirements. Testing is the process of determining whether the hypothesis does, in fact, satisfy the requirements. Assuming it does not, another hypothesis must be generated. I was unable to determine an early citation for this philosophy but it likely dates from the Greeks.
For this process to be effective, the generation of the next hypothesis must build on the results of the test. That is, the things wrong with the current hypothesis are fixed in the next hypothesis and the things that are right are kept. If there is no coupling between the testing and the generation of the next hypothesis, then this process becomes guess and test, and that is not effective.
Considering design as a process of generate and test leads to the following set of questions:
- Where does the initial hypothesis come from? Choosing the first hypothesis is important in determining how quickly the process converges. The better the first hypothesis, the fewer problems are discovered during the testing phase, and the faster a satisfactory design will be achieved.
- What are the test cases and how are the tests accomplished? Choosing the set of test cases is important to determine whether the design is satisfactory. If the test cases do not test important factors, then weaknesses in the design with respect to those factors will not be found.
- What kind of weaknesses do the test cases expose? The types of weaknesses exposed will determine how the next hypothesis is generated.
- How is the next hypothesis generated? Generating the next hypothesis is a matter of repairing the weaknesses exposed. There must exist techniques to repair the types of weaknesses exposed in the testing phase.
- When am I finished? What is the ending criteria for the cycle of generate and test? If there are not ending criteria, there is no guarantee that the cycle will ever end and allow development to proceed.
Merging the two philosophies
These two philosophies are compatible. Generate and test provides a framework for specifying which decisions need to be made.
The first decision that must be made during the generate and test process is “where does the initial hypothesis come from?” During the testing phase, there are multiple decisions to be made:
- What are the test cases?
- How are the tests performed?
- When am I done?
During the generation of the next hypothesis, the decision that must be made is “how do I use the results of the test phase to generate the next hypothesis?”
During subsequent essays I will give my thoughts on these questions.
– Len Bass, SEI