*Please note: This is the syllabus from the 2021/22 academic year and subject to change.*
This course is an intermediate approach to applied software design and development methods for use in creating efficient, reusable, and modular software. This course is offered annually but content and focus change from year to year. Methods we investigate include: distributed systems, architectures including microservices, event-driven architecture, Hybrid Transactional/Analytical Processing; software frameworks and container-based software development; and advanced techniques including multi-threading and data design. A heavy focus is on design and creativity and what constitutes creative design.
This course provides hands-on experience in the architecture and design of systems and a review of best practices for the communication of that design. Issues in the landscape of software design, including complexity, constraints, progressive discovery, and limitations in communication will be explored. In this course, students will be organized into teams and each team will be provided with a set of (partial) requirements and will be responsible for the analysis, design, design documentation, and implementation in source code of a project that constitutes a complex software system. Each team of students will work through requirements analysis, expression of design using a modeling language, and implementation, and techniques and tools will be provided in order to facilitate the delivery.
The progression of design will be peer-reviewed by the student teams. We will work within an "Agile" design and implementation framework and adopt agile approaches to lean design. One of our efforts will be to dispel the myth that design is not performed within an agile environment.
During the course and lectures, we will cover the following topics:
Why is design important, even in an agile environment?
Attributes of good design: coupling, cohesion, law of Demeter, generic solutions vs. specific solutions
What is the role of modeling in software development?
Documenting and communicating software design using the Unified Modeling Language notation
Lean thinking and lean modeling
Design guidelines for quality, interoperability, modifiability, performance, security, testability, and maintainability
The role of patterns in designing software and design refactoring
Decomposing systems into recognizable patterns