Skip to content

Course Overview


  • When is a program good enough to ship? Have you built what the customer wanted?
  • Why (and how) does Netflix deliberately and randomly take down its own servers?
  • What can we learn from the Boeing 737 disaster?
  • How did Twitter eradicate the Fail Whale? And what does it have to do with Ruby?
  • How do you get a patch accepted into an open-source project?
  • You can write code. Can you build software?


Successful software projects require more than just technical expertise. Figuring out what the client wants, collaborating in a team, managing complexity, mitigating risks, staying on time and budget, and determining under various constraints when a product is good enough to be shipped are at least equally important topics that often have a significant human component. 17-313 explores these issues while broadly covering the fundamentals of modern software engineering.

Assuming reasonably solid programming skills (including unit testing and code-level design), we will explore the following topics:

  • Process consideration for software development
    (How do avoid problems early? When and how much to design? When and how much to test? When and how to involve the customers? Agile methods...)
  • Requirements elicitation, documentation, and evaluation
    (How to figure out what the customer really wants? Who else has an interest? How can we measure success objectively? How can we reliably document expectations? ...)
  • Design for quality attributes
    (How can we design a system to be able to scale to millions of users? How can we design security into a system? ...)
  • Strategies for quality assurance, including measurement, inspection, and static and dynamic analysis
    (What quality assurance strategy is best for a given system? What can we automate and when should we keep humans in the loop? How much testing and what kind of testing should we do? What qualities are important to assure beyond functional correctness? Can we evaluate usability, scalability, reliability, performance? How can we statically guarantee the absence of certain security issues? ...)
  • Empirical methods in software engineering
    (How can we measure quality attributes such as performance, security, and reliability? How can we measure how users interact with the system? How can we know whether the difference matters? ...)
  • Time and team management
    (How to estimate the duration and costs of a project? How to monitor progress and risks to recognize issues early? How to coordinate developers in a team? How to form and develop teams? How to select and motivate team members? How to deal with team dynamics such as social loafing? ...)
  • Economics of software development
    (Business models, outsourcing, open source, ...)

This course has a strong technical focus, and includes assignments with and without programming. Many assignments will also have written components. Students will get experience with team management and modern software-engineering tools. The course puts students on a fast track toward project management positions.

Assignments (mostly done in groups) include:

  • An introduction assignment where individual students will learn to engage with an existing code base.
  • A requirements assignment in which each team will interview stakeholders to elicit and document requirements for a software system.
  • An architecture assignment in which teams will train and deploy an ML model using microservices.
  • A project in which each team contributes to an open source project of their choice. This involves identifying an issue in the existing project, understanding the development process of that project and how to contribute, and actually making a contribution such as fixing a bug or adding a feature. Extra credit will be awarded if the contribution is merged into the project.

Previous Course Iterations

Fall 2020 | Fall 2021 | Fall 2022 | Spring 2023 | Fall 2023