Skip to main content

Why diagnosing someone else's software is a distinct skill, the method the course teaches it through, who it's for, and what it deliberately leaves out.

Course Overview

Course premise

Most software teaching assumes you’re building something, or reading code you wrote yourself a week ago. Neither assumption holds once you’re on a team: the system in front of you was built by people who’ve moved on, its documentation is partial or stale, and something in it is failing for reasons nobody in the room currently understands. Reconstructing what a system was meant to do, forming a hypothesis you could be wrong about, and proving a diagnosis with evidence rather than intuition is not a byproduct of knowing how to program — it’s a separate discipline, and this course treats it as one.

The investigation method

Every exercise and every assessment in this course runs the same fixed cycle. It doesn’t change week to week; what changes is how much of it is scaffolded for you, and how uncooperative the system and its evidence are.

  1. Observe. State what is actually happening — output, behaviour, logs — precisely enough that someone else could check it, without folding in a guess about why.
  2. Hypothesise. Propose a specific, falsifiable cause, and commit in advance to what evidence would prove it wrong.
  3. Gather Evidence. Collect whatever a hypothesis actually calls for — source structure, runtime traces, version history, operational artefacts — rather than whatever happens to be easiest to look at.
  4. Reduce Uncertainty. Use that evidence to eliminate hypotheses that don’t survive it, including ones you’d have preferred to be true.
  5. Intervene. Make the smallest change that addresses the diagnosed cause, having first checked what else it could plausibly disturb.
  6. Verify. Confirm the intervention resolved the cause you diagnosed — not merely that the original symptom stopped appearing.

Learning outcomes

By the end of the course, you will be able to:

  1. Reconstruct a working model of an unfamiliar system’s intended behaviour from its code, structure, and available documentation, explicitly marking what remains unknown.
  2. Formulate falsifiable hypotheses about the cause of an observed failure, and design the smallest observation or experiment that could rule a hypothesis out.
  3. Collect and interpret evidence — logs, traces, state snapshots, targeted instrumentation — appropriate to a given system and failure, and distinguish signal from coincidence in it.
  4. Narrow a fault to a specific, defensible location in a system, and justify why alternative explanations were excluded rather than merely unconsidered.
  5. Propose and apply a minimal, targeted intervention, and verify that it resolves the original failure without relying on the symptom’s disappearance as the sole evidence.

Intended students

Upper-level undergraduates or entry postgraduates who already write software competently but keep finding themselves — in internships, group projects, open-source contributions, inherited work — responsible for a system they did not write and don’t yet understand. This course treats that specific gap, reading and diagnosing someone else’s system, as a skill in its own right rather than something general programming ability eventually confers.

Prerequisites

No specific framework, language, IDE, database, or cloud platform is assumed. The bar is judgment and code literacy, not tool familiarity.

What this course is not

For the week-by-week structure this method builds through, see the Schedule.