Skip to content

Prerequisites

This is not an introductory programming course.

Expected knowledge

Students should already be comfortable with:

  • object-oriented programming and polymorphism;
  • interfaces/abstract classes and dependency management;
  • unit testing;
  • Git and basic collaborative development;
  • reading UML class/sequence diagrams;
  • basic software architecture terminology;
  • data structures and algorithms.

The following are useful but can be learned during the project:

  • Python for analysis scripts;
  • parsing/AST libraries;
  • graph algorithms and graph representations;
  • software metrics;
  • basic statistics and experimental design;
  • introductory machine learning;
  • containers for reproducible experiments.

Diagnostic exercise

Before the course, you should be able to explain why the following design can become difficult to change:

class CheckoutService {
    MySqlConnection db;
    StripeClient stripe;
    SmtpClient email;

    void checkout(Order order) {
        // validate, price, persist, charge, notify, log, retry ...
    }
}

A graduate-level answer should go beyond “violates SRP.” It should identify change reasons, dependency direction, test seams, transaction boundaries, failure modes, and plausible refactoring options.