Examining a recipe closely, we can see it is divided into two distinct types of information: the ingredients and sequential steps. The list of ingredients comprises everything that should go into a dish. The steps document the actions a cook must take to prepare the dish. Both types of information are equally important to achieving the desired outcome. The same is true of a software design process.
One might describe a software design process this way:
Ingredients:
- users—people who will use the product
- stakeholders—people who have something at stake in building the product—like purchasers, supervisors, installers, developers, or marketers
Steps:
- Obtain requirements from users.
- Obtain requirements and constraints from stakeholders.
- Measure requirements against constraints.
- Mix requirements thoroughly.
- Knead requirements into designs.
- Let the designs rise with the development team.
- Validate the initial designs with stakeholders and users.
- Add lately discovered requirements.
- Knead the designs again.
- Let the designs rise with the development team.
- Repeat steps 7–10 until the requirements gel.
- Bake the designs with the development team until golden brown.
Every software design process includes users and stakeholders. Steps may vary somewhat from process to process, but generally, an iterative software design process follows the same pattern I’ve just outlined. So, why deviate from the recipe? In both cooking and software design, reasons to deviate from a recipe include lack of ingredients, lack of resources, time constraints, conscious choice, and lack of experience. Let’s discuss each of these in more detail.
- lack of ingredients—If an ingredient for a recipe is not available, a cook can either substitute something else or omit the ingredient altogether. In software design, a similar situation could occur if users are not readily available for some reason. While it is possible to omit user input from the design process, there would then be little way of knowing whether the product will satisfy users’ needs. Instead of omitting users, it may be possible to substitute surrogate users. Surrogates are people who have direct working knowledge of the tasks real users perform and the goals they want to achieve. You might use support personnel, trainers, or product installers as surrogate users. While using surrogates is a less desirable option than using real users, at least surrogates can provide more information than you would obtain if you omitted the ingredient completely.
- lack of resources—If you’re missing a needed resource, you can use an alternative technique to complete a step. For example, in cooking, if you don’t have an electric mixer for mixing ingredients, you might be able to use a whisk instead. In software design, if there are no available personnel who are experienced in using a prescribed technique—for example, job shadowing—it is possible to substitute another technique to complete a step—for example, structured interviews.
- time constraints—Typically, in both cooking and software design, time constraints exist. Dealing with time constraints in the kitchen requires forethought and careful scheduling. This is also true in software design. (I once heard someone refer to the preparation of a catered banquet as a ballet with plates.) As we all know, crises often occur at the least opportune times. In software design, people may not be available when you need them, requirements and priorities can change, or schedules can slip.