This course is about software design. It focusses on building software systems, and addressing common problems with recognised design solutions. We will look at principles of software design, where to apply them, and how they may inform our design choices. We will also look at techniques for ensuring that systems you build behave correctly.
Software - this course is about the development of software systems. To a large extent it is about programming, but rather than considering, for example, the implementation details of particular algorithms, we look at combining components into larger systems.
Design - software development is a creative activity. There may be many different ways to solve the same problem. Different designs may be thought to be more effective, or more elegant, than others, but to be useful they must all perform their basic function satisfactorily.
Engineering - from an engineering standpoint, we are concerned with the assessment and balancing of forces that may affect our design decisions in solving a particular problem. There are likely many possible designs that solve a particular problem, how can we choose between them?
Communication of Design: students will learn mechanisms for communicating and discussing their design ideas, both through graphical notation and diagrams, and through a common vocabulary of well known design patterns and architectural styles.
Design Principles: we aim to instil a set of principles and guidelines to be followed during the design of a system, with the aim of increasing flexibility, maintainability and re-use in that system.
Design Patterns: we aim to familiarise students with a collection of common solutions to common design problems. We introduce the notion of a Design Pattern and identify a set of key patterns and their applications.
Architectural Styles: we examine some common architectural styles for classes of application such as: interactive GUI applications, web applications, and data processing pipelines.
Concurrency and Distribution: we look at various models for performing work concurrently. We examine distributed systems of co-operating components and how we can implement communication between them.
Throughout the course we aim to examine design choices based on practical applications and examples.
There is no set textbook for the course, but we would recommend interested students to read: