Evolutionary design and refactoring


Architect, Programmer, Team lead


2 days


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?

Traditional design techniques date back to the 1970s, and although OO techniques in the early 1990s brought with them an added appreciation of the value of encapsulation and modularization, we still see the design of a software system as a one-time activity.

It has proven very hard to make one-off design work, even with careful anticipation of future requirements, definition of high quality abstractions, design patterns and use of advanced off-the-shelf frameworks.

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.

This is evolutionary design.


This course is applicable to people in technical software development roles. The course illustrates the theory and practice of evolutionary design (including refactoring), along with a refresher on the object-oriented design techniques that apply to evolutionary design.


The course blends tutorial, class discussion, question and answer sessions, demonstrations/simulations and practical exercises.


Evolutionary design

  • What it is
  • How it works

Principles of good design

  • Clarity of intent, readability, consistency
  • Minimization of complexity, cost of change
  • Conceptual and behavioural integrity

How to spot bad design

  • Redundancy, duplication and complexity
  • Poor readability, structure and abstraction
  • Domain – design – code inconsistencies
  • Poor dependency management and layer separation


  • Spotting bad design in unfamiliar software

Techniques for simpler designs

  • OO design patterns for reducing code and design complexity
  • Handling design debt
  • What is design debt?
  • An analogy with bank loans
  • How to avoid making things worse
  • What to do to make things better


  • What is refactoring?
  • Refactoring versus rewriting
  • How to do it
  • When to do it – learning to recognize and respond to “design smells”
  • Refactoring demonstration

Discussion and exercise

  • Refactoring code

Refactoring and evolutionary design

  • Design change
  • Planning redesign through refactoring
  • Carrying out large design activities


Not quite what you want? Contact us if you’d like to shorten or lengthen this course, aim it at a different audience, cover particular topics or combine it with our other courses, briefings or services.

Further information and booking

Please contact us for further information or to book this course.