Shell — The last interface that does not guess what you meant
# Needs nothing. Everything else is typed into this: the filesystem, the process, the quote you forgot.
The roadmap
Seventeen gyms is a menu, not a path. This is the path. A Makefile is the oldest dependency graph in software: a target, what it needs first, and the recipe. Every gym below is listed after the ones it needs, with the reason on the edge.
Complete beginner? Run make all and start at the top. Know what you want? Pick a goal and the list shrinks to what that goal actually needs. Mark what you already have as up to date; make skips those.
The whole path, every target in dependency order. Start here if you do not know what you would fail.
17 targets for ‘all’
the graph · left needs nothing, right needs everything · click a target to jump to its rule
# What you type into. Every other gym is driven from a prompt; the shell, the object model under your commits, and the patterns in your greps are the substrate.
# Needs nothing. Everything else is typed into this: the filesystem, the process, the quote you forgot.
# A diff is the unit of review, and a diff is a difference between two commits. Learn what a commit points to before you read what changed between them.
# The first thing you will read that looks like line noise. Predict what a pattern matches before you trust a grep, a validator, or a generated route.
# Optional and orthogonal. Speed, not understanding. Do it whenever; it only asks that you already live in a terminal.
# The thesis of the site. The model writes the code; you read it. Everything after this is a specialised way of reading.
# The thesis. Read a diff the model wrote, find the one defect, prove it with an input. Never skip this.
# A green suite is a claim about the code. You have to be able to read the code before you can judge the claim; then watch an engine break the code under your tests.
# The first place the cost is not in the source. A query is a program a planner runs; a migration is a lock you did not see.
# A query is a program that a planner runs. Read the plan the way you read the diff: the cost is in the pages, not the SELECT.
# A migration is a lock you did not see. You need tables, indexes and transactions in hand before you watch a lock queue form behind an ALTER.
# Requests cross a network and land on a kernel. What a handshake costs, what a file descriptor is, and why two threads disagree.
# Every request crosses DNS, TCP, TLS and HTTP before your handler sees it. Reading a capture is reading a trace; the latency budget is arithmetic.
# The shell is what you type; the kernel is what happens. A pipe at the prompt is two file descriptors here.
# A concurrent bug is an assertion that holds under one interleaving and fails under another. You need to be able to write the assertion first.
# How code gets to the machine: a filesystem diff, a plan you should read before applying, and a loop that fights you.
# An image is a filesystem diff; a container is namespaces plus cgroups. Both are kernel objects, so the kernel comes first.
# A plan is a diff between declared state and recorded state. Read it before you apply it, the way you read a diff before you merge it.
# A rollout is old and new code running side by side against one database, in containers a scheduler placed, behind probes that speak HTTP. Three gyms, all at once.
# The capstones. Build a system and break it, prove the exploit, and get paged. Everything above is what you need to read the trace.
# Build an architecture, generate traffic, break it. Every box is a database or a network hop; you need both before the diagram means anything.
# Read a generated handler, prove the exploit with a request, ship the fix. Review gave you the reading, net gave you the request, sql gave you the injection.
# The capstone. Get paged, read traces, logs and metrics, prove the diagnosis. Every trace is a request through a system on a machine.
Already know where you are? Pick whichever you'd fail today.