The View From Mount Improbable
Penguin has published a nifty little book called "The View From Mount Improbable" in it Richard Dawkins explains how the eye evolved through a series of incremental steps. This is an important argument to make, as creationists often use the eye as an example of an organ that is so complicated and so perfect that it could not have evolved but must have been created in one master stroke. (Central concepts from Dawkins argument have analogs that are critical in planning software architectures, we will get to that in a little bit, first the biology.)
Darwin himself admits the difficulty:
"To suppose that the eye, with all its inimitable contrivances for adjusting the focus to different distances, for admitting different amounts of light, and for the correction of spherical and chromatic aberration, could have been formed by natural selection, seems, I freely confess, absurd to the highest degree."
What Darwin, Dawkins, and the other evolutionists have done is show how the human eye was formed through a series of incremental steps, where each step required only a limited change, and each step resulted in a functioning organ. In fact many of these intermediate forms still exist today in other creatures, the "non-directional light sensitive skins of starfish" are a good example of an early form. While it is impossible to imagine that you could go from no eye to a fully formed human eye in a single mutation, it is possible to imagine a single mutation triggering each of these individual intermediate steps. And since each intermediate step is a functioning organ that has at least slightly improved upon its predecessor it is easy to see how natural selection would spread that new version through the population.
In software development we also have arguments about what is the most plausible way to create something that is complex and perfect. Two typical options can be thought of as the "creationist" approach and the "evolutionist" approach:
- Creationist: Assign a very smart design team. Have them create an elegant design that fulfills your full concept for the product. Immediately start to implement this final form of the product.
- Evolutionist: Lay out a plan for series of intermediate versions of the product. Carefully design the first step (keeping in mind that the codebase will be evolved and reused, so put emphasis on compartmentalization, factoring, and good interfaces), don't take the time to fully design the later steps. Make each intermediate step something that is deployed with users, or at least with beta users. Be prepared to adjust the plan based on feedback you get at each intermediate step.
The "creationists" argue:
- It takes too long to make all these intermediate versions.
- What is the point of writing a bunch of code that will only get reworked or replaced as you evolve the product.
- Intermediate versions lead to legacy problems (interfaces you have to support, migration plans you have to implement, etc.) that you will regret.
- The competition is not going to waste time with these intermediate versions. They will leapfrog us.
- Why limit yourself to designs that can be reached through incremental steps, what if the "best possible design" can not be reached through incremental steps.
The "evolutionists" argue:
- Not understanding the real requirements is the biggest issue. Users themselves typically don't know what they ultimately want. Only getting something in use can resolve this issue.
- It is only after you have written it once that you really understand how to write it right.
- Naval gazing in your conference room does not lead to true understanding. Putting software into use, careful analysis of the reaction, and rapidly evolving the offering is what leads to true enlightenment
- Having working intermediate versions gives you more flexibility when it comes to the point of making the features vs. schedule trade-offs.
- Working intermediate versions improves your ability to get continued funding. This is true whether your funding comes from a VC firm or a senior management budget committee.
- The goal is not finding the "best possible design", the goal is finding a great design that meets your audacious goals with minimum risk.
Which approach is best depends on your specific circumstances: scope of the project, relevance of team's previous experience, clarity of requirements, etc. However, most of the time I am an "evolutionist".
Smart people tend to over-estimate their ability to go directly (via their own mental horsepower) to the correct final answer. Usually getting the optimum offering requires interaction and evolution.
Let's return to biology for a moment. The eye is not perfect. Remember those exercises you did in Junior High science class, they proved that we all have a blind spot, none of us can see in the infrared and some of us are color blind. A perfect design would not have these traits. However, as Darwin pointed out the eye is a great design. So great that many believed omnipotence was required to create it. I believe it ended up great, because each modification was tested in real use before it was incorporated in the final result. This lesson is worth keeping in mind when you go to create your next great design.
Previous posts touched on some related topics: why great is often better than perfect; why we so often miss the real requirements; why interfaces are more important than code; and why a "truly complete" design is not what you want.
copyright 2007 Kerry Champion
