Developers are often quick to use designs and patterns they are already familiar with, to try the first idea that occurs to them, and to persist with things that seem to be working.
However, the resulting product can often be made stronger through judicious consideration of alternatives early in the development process.
When generating alternatives, it’s good to get input from a broad range of people with varying backgrounds and perspectives. These alternatives can then be vetted through discussion, research and, often, some degree of quick prototyping.
Morgan and Liker have described one such approach as “set-based concurrent engineering,” and have pointed out that better and ultimately more workable designs are often developed by starting with broader sets of possible solutions, and then gradually converging on a final design.
Note that this approach requires a higher tolerance for a longer period of uncertainty early in the project, as alternative ideas are generated, evaluated and compared, but then results in less risk of having to rework the design late in the project, in order to accommodate issues that were not given sufficient consideration early on.
Since this approach results in spending more design time up front, but then less time re-designing later in the project, it is sometimes referred to as “front-loading the development process.”
Of course, any consideration of alternatives will require open and spirited discussion of the pros and cons of each. Such discussions can get messy, but these sorts of discussions are absolutely essential in order to achieve the best possible results.
A critical aspect of all engineering disciplines is the elaboration of multiple approaches, trade-off analyses among them, and the eventual adoption of one. After requirements are agreed upon, you must examine a variety of architectures and algorithms.
Next: Have Wonderful Arguments