|Perl Monk, Perl Meditation|
(OT) Evolutionary Design??by Anonymous Monk
|on Oct 30, 2003 at 17:17 UTC||Need Help??|
"In the broadest sense, evolution is merely change, and so is all-pervasive; galaxies, languages, and political systems all evolve. Biological evolution ... is change in the properties of populations of organisms that transcend the lifetime of a single individual. The ontogeny of an individual is not considered evolution; individual organisms do not evolve. The changes in populations that are considered evolutionary are those that are inheritable via the genetic material from one generation to the next. Biological evolution may be slight or substantial; it embraces everything from slight changes in the proportion of different alleles within a population (such as those determining blood types) to the successive alterations that led from the earliest protoorganism to snails, bees, giraffes, and dandelions."Evolutionary design is a term that is bandied about quite liberally in software development circles these days. Very often, but not always, reference is made to biology. The implication is that we are borrowing terms, concepts, and principles from evolutionary biology and somehow applying them to the software development process. If biological evolution can produce the rich, varied, and complex designs we see around us everyday in the natural world, it must be powerful and good. And the idea of harnessing some of this power in our design and development process sounds like a good idea. Right?
But the fact is that all these new "evolutionary" paradigms of development have nothing whatsoever to do with biological evolution. If we use the term evolution in its broadest and most trivial, all pervasive sense then sure, software evolves. But biological evolutionary theory is not just about descibing the patterns present in the history of life, it is also about the process that drives and creates those patterns.
The fundamental process in biological evolution is that of natural selection. It is very important to realize that biological evolution is not something that applies to an organism. Organisms do not evolve. A catepillar does not evolve into a butterfly --- this is a process of development (ontogeny) and the catepillar is already designed to develop (or metaporhose) into a butterfly. The complexity of the butterfly already exists within the simpler catepillar.
Populations of organisms evolve across generations provided that they have heritable variation in fitness. Two crucial elements are key here: populations and variation. These elements lie at the heart of biological evolution. Without them, there is no evolution (there may be change, but not evolution).
Yes, biological evolution is incremental and iterative, but that does not mean that any other incremental and iterative process is like biological evolution in any sense of the process of evolution.
Why am I bringing this up? Partially just as a rant, but don't stop reading just yet, it is more than that. I am not saying that current, so-called evolutionary methodologies don't work, or are bad in any way. But if these methods do work and do have benefits, we gain nothing by mislabelling them as evolutionary (except marketing hype).
To begin with, what would a more realistically evolutionary methodology look like? Well obviously we would want to have a hand in guiding the process to arrive at a particular goal. There is something in human-nature interaction which looks like this: artificial selection (selective breeding programs) in the agricultural industry.
In an evolutionary sense, a cow only needs to produce the minimal amount of milk required to rear its young to a certain age. Excess milk production is not something that is likely to evolve naturally as it doesn't contribute to the successful generation of new cows. In fact, in a natural setting, cows that overproduce milk will most likely be selected against over time.
But, farmers want cows to produce more milk and so step in with artificial selection. Cows will vary in their milk production, and farmers can use that as a selective criteria to determine which cows will produce offspring. Perhaps only the top 10% will be bred for the next generation. Over the course of several generations, we have herds with higher milk production. This is a man-made process that does mimic evolution in important ways.
Are our evolutionary strategies of software design anything like this? The answer is a resounding No. We do not work with populations of designs, or populations of prototypes, select the best (according to some criteria) and create a second generation of designs or prototypes based on these.
We may start out with an extremely small population of design ideas at the very outset, in the brainstorming sessions. But we rapidly settle on one or perhaps two early models. From here, we start building the simplest organism we can and slowly add bits and pieces, possibly changing earlier design decisions in the process, as we develop this organism to meet the requirements. We make small changes to one organism, stop often, retest, refactor, and redesign as we go (incremental, iterative). We do not create new populations of varying prototypes at each stage and select the best for further generations.
Once we look at how evolution really works, and then at how we really work, there is simply no basis for comparison. We do not work with populations of prototypes (organisms). There is no variation of fitness.
To put it simply, while all this talk of evolutionary design sounds impressive, I argue that not only is our process decidedly not like biological evolution, we wouldn't want it to be! Biological evolution takes time, and lots of it. Even artificial selective breeding programs generally take a lot of time for relatively small gains. The agricultural industry (which obviously works with biological creatures) is pouring vast amounts of money into research in genetic manipulation so it can produce new products without having to go through an evolutionary process.
Let's consider another aspect, where principles of evolution might be useful in describing software: The actual environment where software lives. We have populations of operating systems, text editors, graphics programs and the like. There is variation within and among these populations and this software interacts with its environment (hardware, other software, users). And, just like natural selection in the biological world, the selective processes in the software world do not guarantee anything about the quality of the designs found. In nature it is not the best designs that flourish, it is the designs that reproduce better than the competitors. Microsoft Word is not necessarily a superior word processor to WordPerfect or WriteNow, or a myriad of others, in any design or engineering sense. It may not even be any better at any of its designed word processing goals than its competitors. But it is probably the most successful reproducer. Evolutionary success does not imply superior design. Superior designs (by one measure or another) fail in the marketplace all the time.
So, why would we want our software development process to mimic evolution? Evolution is a slow process that does not lead to superior design, merely superior reproduction. The design process is not evolutionary, nor should we want it to be.
Remember, none of this says anything at all about whether incremental and iterative design and testing is good or bad (good I think). This has just been about disentangling what we do from the conceptual mess underlying what we think and say we do.
I'm sure some will disagree, I hope some disagree strongly. That will be a good thing. I am not interested in being right or wrong, I am interested in understanding what it is we do. It is my suggestion that the process, principles, and mechanisms of evolutionary biology are poorly applied to what it is we do as designers and programmers.
20031030 Edit by castaway: Changed title from 'Evolutionary Design??'
20031030 Edit by castaway: Changed title from 'Evolutionary Design??'