Take what you learned and build it.

A course is for reading in order and taking in; a project is for building one thing all the way through. Rather than handing you the requirements and walking off, each one carries the steps, a worked answer and the places people get stuck.

24 in total

Beginner 📊

Find what pulled sales down, and put it in a one-page report

Starting from a single orders CSV, you narrow down where sales are falling, working from the whole to the breakdown to one candidate. Using nothing but pandas aggregation, you finish with a one-page report holding a conclusion, its evidence, what the data cannot tell you, and one next step.

PythonpandasCSVReporting
Beginner ⚡

Make a slow aggregation fast, by measuring first

Your instinct about what is slow is usually wrong. You print the times before touching anything, and check afterwards that the answer has not changed. You also find one rewrite that turns out to do nothing.

PythonMeasurementComplexitycProfile
Advanced 🧵

Stop a data race at compile time

Why can Rust not even express code that another language would happily run with numbers that do not add up? You read what Send is saying, get it compiling, and measure three ways of writing it.

RustConcurrencySend/SyncArc/Mutex
Advanced 📉

Cut memory, after measuring it

You print the peak with tracemalloc and cut it in two directions: making one item smaller (__slots__) and holding fewer at once (generators). The second one is what pays.

Pythontracemalloc__slots__Generators
Advanced 🔒

Make a class that cannot hold a broken state

Are your rules only enforced inside __init__? Then nothing stops anyone afterwards. You check on every assignment with a descriptor, and work out derived values rather than holding them.

PythonDescriptors__set_name__Invariants
Advanced 🧭

Design an error type the caller can branch on

With Box<dyn Error> all you learn is that it failed. You write the possible failures out as an enum, so that adding one makes the compiler stop every caller. Up to where thiserror ends and anyhow begins.

RustError designthiserroranyhow
Advanced 🔑

Fix the keys you can no longer get back out of a HashMap

You look up a key you know you put in, and get null back. There are four causes, and all of them compile. You measure how entries become unreachable, sort out what a record fixes and what it doesn't, and finish by making the keys immutable.

Javaequals/hashCodeHashMaprecord
Advanced 🐹

Count your runaway goroutines, then stop them

A goroutine you start with go doesn't end until someone stops it. You count 100 of them lingering after a timeout gives up, find the line where they're stuck, stop them with channels and context, and pin down "no leaks" with a test.

Gogoroutinecontextpprof
Intermediate ♻️

Recover a wrecked history from the reflog

reset --hard, a deleted branch, a rebase you didn't mean, a dropped stash. You cause all four accidents on purpose and recover from every one, then check with your own hands where the line lies for what truly can't come back.

GitreflogORIG_HEADgit fsck