Skip to content

CS3213 Foundations of Software Engineering

Curriculum

To facilitate the widely adaption of CS3213, we prepare detailed curriculum and materials for the course. The curriculum is divided into two parts:
- The foundation knowledge of software engineering in lectures.
- The hands-on experience of the self-sustained project (Development of Intelligent Tutoring System).

The course curriculum focuses on the main activities in SE. Furthermore, we introduce selected relevant SE topics for our project, e.g., automated program repair, static analysis, and fault localization. Each lecture is separated into two parts: (a) the teaching of foundations in the aforementioned areas, and (b) the teaching of project-specific knowledge and corresponding applications.

Requirements Analysis and Modeling

The course starts with a focus on requirements engineering, their elicitation, and modeling. Therefore, we invite stakeholders like lecturers and teaching assistants from the first-year programming courses to an interview session with the third-year students. This interview session is prepared with corresponding assignments about question design and followed up with requirements modeling exercises using UML Use Cases. We also teach other means for requirements modeling, e.g., with finite state machines and sequence diagrams.

Software Architecture and Design

Afterwards, we introduce general principles for software architecture design and modeling. The project-specific part of the lecture introduces the existing architecture and its components, including the available interfaces, which need to be used by the students in their own implementations. We further discuss architecture variants of the existing architecture to discuss pro and contra of the made design decisions.

Our baseline Java implementation already provides the students with elementary classes and functionalities, which they can and need to reuse. To illustrate the fine-grained design, we first introduce relevant design principles and patterns that occur in our implementation. We do not give a comprehensive introduction to design patterns because there is another dedicated software design course in our institution. Instead, we only introduce the most relevant design aspects to enable the students to work on the projects.

Project Planning and Implementation

As part of the assignments, the students have to submit a project plan. Therefore, we also introduce the basics of project planning, work package design, and milestone and resource planning, including necessary models like Gantt-Charts. The coding itself is a major part of the project and is mostly supported by the mentors in project-specific meetings. The lecture introduces general principles like Clean Code and testing and debugging techniques meant to help the students in their concrete implementation efforts.

Testing, Debugging, and Integration

As automated testing and debugging is a major part of an intelligent tutoring system, we also introduce several validation concepts and debugging techniques. In particular, we teach foundations in test-suite estimation, functional testing, whitebox testing, structural testing, dataflow testing, and mutation testing. To this end, we also introduce the basics of static analysis like control-flow graphs (CFGs) and Define-Use Analysis (DUA). Furthermore, we discuss the basics of debugging with the TRAFFIC principle and delta debugging and dive deeper into the basics of static and dynamic slicing and statistical fault localization. Towards the end of the curriculum, we also discuss integration testing strategies and the related challenges.

Project-Specific Topics

In addition to the foundations in general software engineering, we teach the background in automated program repair and provide an overview of existing solutions for ITS components. Depending on the advertised projects, we also discuss more specialized topics like taint analysis and Worst-Case Execution Time (WCET) analysis to ensure the students have the relevant background and material to work on their projects.

Team Management

We ask the students to form groups of 3-4 people to work on the project. We allow them to search for their team members instead of a random assignment by the teaching team. We prepare an ungraded Assignment 0 for the project selection, which provides an overview and additional references for all available projects for the specific year. Each team can bid for three projects, while the teaching team allocates the final project. We encourage each team to join the same lab sessions to maximize the possibility of team interaction. Additionally, each team meets weekly with a graduate-level mentor focusing on the team's planning, design, and implementation progress. The mentors also have access to the team's code repository to provide feedback.

The lectures cover the following essential topics in software engineering:

Week Topics Details
1 Introduction to ITS Introduction to the Intelligent Tutoring System and the project.
2 Requirement Elicitation with Customers Logistics, Projects, Assignment 2.
3 Requirements Modeling + Comments for Software Architecture Requirements Analysis/Elicitation, Assignment 3 and 4.
4 ITS Design & Project Planning Behavior Models, Architectural Drivers, Assignment 5.
5 Unit Testing Module Design, JUnit Testing @ ITS, Assignment 6.
- Midterm -
6 Advanced Testing (Best Practices, Testable Code) Project Plans, Testing with Coverage Information, Assignment 7.
7 Debugging Intermediate Deliverable, Interactive Debugging, Design Patterns.
8 Static Analysis Fault Localization, Static Analysis Tools, Assignment 8.
9 Implementation (Clean Code) Clean Code Examples, Software Architecture Variants for ITS, Assignment 9.
10 Integration Testing & Strategies Discussion Assignment 7, Integration Testing Exercises.
11 Summary Recap of all topics, complete ITS workflow example, aspects of version control.
12 Student Presentations -

Each week in our curriculum is accompanied by a lecture and a lab session. The labs are used to meet in smaller groups of students and discuss their assignments. The assignments track the major milestones in the students' projects, below list gives an overview of the assignments:

ID Topics Details
1 Requirements Analysis & Elicitation Preparations and questions for the interview session with the customer.
2 Requirements Modeling Requirement modeling with UML Use Case and Activity diagrams.
3 Architectural Drivers and Architecture Variants Discussion of architecture variants and the requirements that influence architectural design.
4 Strategy and Project Planning Project-specific planning including a Gantt-Chart and a resource plan.
5 Detailed Design Structural and behavioral design of the students' implementation with UML models.
6 Intermediate Deliverable Towards the middle of the course, we ask the students to submit a minimal project implementation and a report with their project plans and various models.
7 Validation (i.e., Unit Testing) Test case design and test report.
8 Presentation & Final Artifact At the end of the course, all teams need to present their project and submit their code.
9 Final Report After the presentation, the students additionally need to submit a final report, including a retrospective of their project and design decisions.

We provide the lecture materials/recordings/slides and project materials of NUS AY 2021/2022 as an example.