March 2026–June 2026
Monday, class 10–11·Thursday, class 3–4·一教303
Teaching assistants: Yihan Dai, Dimitris Bouras
This course offers an introduction to software engineering, spanning a broad array of topics and employing a problem-based learning approach. Central to the course is a practical group project, where students apply modern software development principles and tools. The course discusses the software development lifecycle, with an exploration of Agile methodologies and DevOps practices. Students will gain a foundation in software design principles, such as abstraction mechanisms and design patterns, and how they are realized in procedural, object-oriented and functional programming paradigms. A strong emphasis is placed on quality assurance, equipping students with robust techniques for software testing, debugging, and maintaining high code reliability. The course examines program analysis and verification through both static and dynamic analysis methods. Advanced topics, such as AI-driven development tools, expose students to contemporary software engineering research.
Form groups of three and select presentation slots by March 10
Access coursework repository, discuss branching model and merge policy with your teammates.
Optionally, setup GitHub actions.
Experiment with Mermaid diagrams to model important parts of your project.
Restructure your code according to studied design principles.
Identify relevant abstraction mechanisms in your language of choice to support design principles.
Apply Visitor design pattern to your project.
Apply appropriate creational and structural patterns to your code.
Apply appropriate behavioral patterns to your code.
Implement a parser of your choice.
Optionally, apply functional programming patterns in your code.
Write unit tests for your project.
Optionally, apply property-based testing and symbolic execution to test your project.
Optionally, apply fuzzing to your project.
Design robust error handling for your project.
Optionally, apply mutation and metamorphic testing to your project.
Analyze your code for the presence of smells and anti-patterns.
Maintain coding style compliance and write system documentation where necessary.