The design of many software applications begins as a vital image in the minds of its designers. At this stage it is clean, elegant, and compelling. It has a simple beauty that makes the designers and implementers itch to see it working. But then something begins to happen. The software starts to rot, over time, the program worsens in quality, the rotting effect increases, with a little bug here, a little hack there, and the program becomes a festering mass of code that the developers find increasingly hard to maintain.