Software Design and Evolution

Module aims

Modern software systems are not static artefacts; they are long-lived, continuously evolving products, increasingly developed and maintained in environments that include automated and AI-assisted tools. Modern software engineering is therefore concerned not only with designing and building systems, but with managing their evolution over time. Practice has shifted from infrequent releases to continuous integration and deployment of incremental updates, requiring systems to support rapid, reliable change. This module addresses the challenge of continuous software evolution while controlling the cost of change over time.
 

Learning outcomes

Upon successful completion of this module you will be able to:

  • Identify and describe various design patterns, the problems they address, and any trade-offs involved
  • Make informed engineering decisions to minimise the cost of change
  • Implement common design structures for various common software application types
  • Construct automated tests for code through test-driven development
  • Perform refactoring operations on a codebase using appropriate tools
  • Consider and critique the qualities of the design of a given codebase

Module syllabus

The module focuses on software engineering design principles, organised around the theme of software evolution and changeability:
1. Designing for Change
 - Modularity, coupling, and cohesion
 - Architectural patterns and styles
 - Managing complexity in evolving systems
2. Enabling Safe Change
 - Automated testing (including TDD and test doubles)
 - Refactoring techniques
 - Working effectively with legacy code
3. Enabling Continuous Change
 - Continuous Integration and Deployment (CI/CD)
 - Build, test, and deployment pipelines
 - Feedback loops and iterative development practices
4. Software Evolution
 - Maintaining and evolving large codebases
 - Managing long-term system complexity
 - Empirical analysis using version control history
5. Automated Software Engineering
 - AI-assisted development workflows
 - Interaction between system design and automated tools
 - The role of feedback, structure, and explicit knowledge in supporting automation

Teaching methods

Each week of the course will address a different topic, with weekly lectures and computer-based lab sessions. There will be weekly practical tutorial exercises (small, focused, computer-based exercises).

An online service will be used as a discussion forum for the module.

Assessments

Some of the tutorial exercises will be assessed and in total count for 20% of the marks as the coursework component for the module. There will be a final computer-based exam, testing practical skills and knowledge on an individual basis. This exam counts for the remaining 80% of the marks for the module.   

For each assessed exercise there will be feedback from an automated online testing system (where appropriate) and/or additional written feedback from either the module leader or GTAs.

Reading list

Module leaders

Dr Robert Chatley