Skip to content

Software Engineering Course

By: Morteza Zakeri†
† Ph.D., Computer Science, ACM Member (mzakeri-nasrabadi[at]acm.org).

Engineering software that remains useful, dependable, and changeable

Software engineering is not only programming. It is the disciplined practice of understanding a problem, making design decisions, collaborating with people, validating behavior, managing change, and continuously improving a software-intensive system.

This course combines core software engineering principles with a practical, repository-centered workflow. Students move from requirements and architecture to implementation, testing, code review, continuous integration, quality assurance, security, and maintenance.

Start with the syllabus Open the semester project

What you will learn

Specify

Turn stakeholder needs into testable requirements, user stories, acceptance criteria, and a prioritized backlog.

Design

Model systems, reason about architecture, apply modularity and design principles, and document important decisions.

Verify

Design automated tests, interpret coverage responsibly, review code, and create CI quality gates.

Collaborate

Use Git, pull requests, issues, code review, branching strategies, and lightweight project management practices.

Assure

Reason about software quality, technical debt, reliability, maintainability, security, and operational risk.

Evolve

Maintain and refactor existing software, manage change, and use AI-assisted development with verification and accountability.

Course philosophy

A software engineering course should make engineering decisions visible. Therefore, the central learning artifact is not only the final executable program: it is the history of justified decisions recorded in requirements, issues, commits, pull requests, architecture notes, tests, CI results, and retrospectives.

Evidence over claims

"The system works" is a claim. A reproducible build, executable tests, review records, issue traceability, and a successful demonstration are evidence.

Practical workflow

flowchart LR
    N[Need / Problem] --> R[Requirements]
    R --> D[Architecture & Design]
    D --> I[Implementation]
    I --> T[Testing & Review]
    T --> C[Continuous Integration]
    C --> O[Release / Operation]
    O --> F[Feedback]
    F --> R

The course treats this as an iterative loop rather than a one-way pipeline. Different development processes organize the loop differently, but the underlying engineering concerns remain.

Quick access

Repository-centered learning

Students are encouraged to treat the project repository as a professional engineering workspace. A healthy repository should make it possible to answer questions such as:

  1. What problem are we solving, and for whom?
  2. Which requirement caused this change?
  3. Why was this design selected over alternatives?
  4. How do we know the implementation behaves correctly?
  5. What quality or security risks remain?
  6. What would a new team member need in order to continue the project?

The site and course materials are intended to evolve over time. Questions, corrections, and improvement proposals are welcome through the course repository.