Software Engineering Design

Module aims

In this module you will have the opportunity to:

  • consider the effects of various design choices on the flexibility, maintainability and cost of software systems
  • practise different refactoring techniques to improve code quality
  • practise automated testing techniques
  • select appropriate design patterns and architectural styles to suit a given problem
  • reflect on the impact of different design choices on the long term health of a software system
  • consider how these technical practices fit in the context of iterative and incremental software delivery

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

This module covers the following topics:

  • Test-driven development
  • Refactoring
  • Mock objects
  • Encapsulation and the Law of Demeter
  • Design patterns for re-use and extensibility
  • Code quality metrics
  • Design patterns for data processing and concurrency
  • Design patterns for object creation and dependency management
  • Interactive (GUI) applications
  • Patterns for system integration
  • Patterns for distribution
  • Web applications, REST and web services

Teaching methods

This module focuses on learning through doing. Each week a new topic is introduced in a lecture, followed by
a hands-on computer-based lab session in which you can put software design principles into practice.
Design ideas and principles are made concrete by working with real software.You will implement different design
options, and experience the pros and cons of each approach. You will complete the weekly exercises working in pairs, which will allow you to develop your ideas in discussion with colleagues, and learn from one another.
Support is given by the lecturer, Graduate Teaching Assistants (GTAs), and through automated tests that you can
run at will, to get fast, automated feedback on fundamental elements of the exercises. Lab sessions are supervised allowing you to get further advice and feedback from experts.

Over the course of the module you will build up a set of techniques, and will use them to work with systems of increasing size and complexity.

The course features a computer-based exam, a more natural environment for assessing software development
skills than working on paper. To familiarise you with the computer-based exam environment, a mock exam will be included as a final coursework exercise, before the module concludes.

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


There will be weekly assessed exercises (small, focused, practical, computer-based exercises) undertaken in pairs. In total these exercises count for 15% of the marks for the module. Weekly exercises give the opportunity for weekly feedback to help you to improve your software engineering skills. There will be a final computer-based exam, testing practical skills and knowledge on an individual basis. This exam counts for the remaining 85% of the marks for the module.   

For each weekly exercise there will be feedback from an automated online testing system and additional written feedback from either the lecturer or GTAs. This feedback will be returned electronically, before the next week’s exercise is undertaken. General feedback on each exercise will also be given in class each week, discussing common approaches and mistakes.    

Reading list

Module leaders

Dr Robert Chatley