Evolutionary design and refactoring
Audience
Architect, Programmer, Team leadDuration
2 daysOverview
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.
Prerequisites
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.
Format
The course blends tutorial, class discussion, question and answer sessions, demonstrations/simulations and practical exercises.
Outline
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
Exercise
- 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
Refactoring
- 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
Options
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.

