Evolutionary design

A hallmark of successful software projects is that they build systems that users want extended and enhanced. This creates a problem: how do we design the system so it can be extended and enhanced, probably in ways we cannot anticipate?

Software design cannot be a one-time activity.

Since the late 1990s, the emphasis has been moving towards a way of working which acknowledges that we can never fully anticipate what feature-set changes a design must be able to accommodate. Instead, we treat design as an on-going activity that lasts as long as the product. Changes to the design and code are implemented using refactoring techniques.

We believe the biggest benefits of an evolutionary design approach are:

  • Simpler designs, leading to faster delivery, higher quality, greater reliability
  • Quality design in the presence of uncertain, unclear or changing requirements
  • Design for testability and quality: reducing the number of places where bugs can hide
  • Revival of “legacy” systems
  • Extracting more value from existing software assets by reusing and repurposing them
  • Milestone deliverables rather than all-or-nothing
  • A way to handle problems without slowing or halting delivery

The techniques of evolutionary design aren’t hard to learn, but they do require a shift in mind-set. We can show you how.

Starting points