Roadmap
The duration arithmetic, the dependency structure, the six stages, and thirty-four monthly milestones.
Table of Contents
- Duration Derivation
- Dependency Graph
- Why This Order
- Legal Reorderings
- The Six Stages
- The Active-Week Schedule
- Monthly Milestones (M1–M34)
- Checkpoint Reviews
- References
Duration Derivation
Step 1 — effort per project
Each project's hour figure is the sum of its milestones, estimated at the pace of a senior engineer who knows the language but not the domain, and excluding optional research extensions. The full milestone breakdown is on each project page; the totals:
| # | Project | Size | Hours | Weeks @ 11 h |
|---|---|---|---|---|
| P01 | Transformer from scratch | Medium | 88 | 8 |
| P02 | Approximate nearest-neighbour index | Medium | 77 | 7 |
| P03 | Small vector database | Medium | 88 | 8 |
| P04 | Log-structured storage engine | Medium | 99 | 9 |
| P05 | Distributed key-value store | Large | 143 | 13 |
| P06 | MapReduce-style framework | Medium | 88 | 8 |
| P07 | Stream-processing system | Medium | 88 | 8 |
| P08 | Recommendation system | Medium | 66 | 6 |
| P09 | Recommendation simulator | Medium | 66 | 6 |
| P10 | A/B testing platform | Small | 44 | 4 |
| P11 | Programming language and VM (I + II) | Large | 132 | 12 |
| P12 | OS kernel or kernel subsystems | Large | 121 | 11 |
| P13 | Tensor framework and autodiff (I + II) | Large | 110 | 10 |
| P14 | Hardware-aware ML system | Medium | 77 | 7 |
| P15 | Integrated final system | Large | 143 | 13 |
| Total | 1,430 | 130 |
Step 2 — active weeks to calendar time
\[ \text{calendar months} = \frac{H}{W_{\text{prod}} \times p} \times 12 \]
where \(H = 1430\) hours, \(p\) is your sustained weekly pace, and \(W_{\text{prod}} = 46\) is productive weeks per year. Forty-six, not fifty-two, because six weeks a year vanish into travel, illness, a launch at work, and the fortnight after any real production incident. A plan that assumes fifty-two productive weeks is not optimistic, it is arithmetically wrong.
| p | h/year | years | months |
|---|---|---|---|
| 8 | 368 | 3.89 | 47 |
| 10 | 460 | 3.11 | 37 |
| 11 | 506 | 2.83 | 34 ← plan for this |
| 12 | 552 | 2.59 | 31 |
Step 3 — the honest verdict
34 months. Your stated ceiling of 30 months is reachable two ways, and only two:
- Sustain 12 h/week for the full scope — 1,430 h / 552 h per year → 31 months, with no margin for a bad quarter.
- Stay at 11 h/week and take the six scope cuts listed in the README — 1,265 h / 115 active weeks → exactly 30 months.
Anything shorter is achieved by deleting projects, not by working faster. If you want a shorter honest journey, the right cut is P01, P02, P04, P05, P13 and P15 only — six projects, 660 hours, 60 active weeks, ≈16 months at 11 h/week — which still covers a Transformer, an ANN index, a storage engine, a distributed system, an autodiff framework and an integrated contribution. That is a real 16-month plan. A 16-month plan containing all fifteen projects is not.
Dependency Graph
Solid arrows are hard dependencies: the downstream project consumes the upstream project's code or its measured results. Dashed arrows are soft: the downstream project is much easier if you have done the upstream one, but does not import it.
STAGE 1 STAGE 2 STAGE 3 STAGE 4 STAGE 5 STAGE 6
foundations storage & exec distributed product low-level contribution
P01 Transformer
│ ┊
│ ┊ (motivates)
▼ ┊
P13-I Autodiff ───► P13-II Exec Opt ──────────────────────────────► P14 HW-aware ─┐
│ ▲ │
└───────────────────────────────────────────────────────────────────────┘ │
│
P02 ANN index ────► P03 Vector DB ─────────────────────────────────────────────────┤
│ │ ▲ │
│ │ ┊ (persistence borrowed from) │
│ │ ┊ │
│ P04 LSM engine ──► P05 Distributed KV ──► P06 MapReduce │
│ │ ▲ │ │
│ │ ┊ ▼ │
│ │ ┊ P07 Streaming ───────┤
│ │ ┊ │ │
│ └──────┴──────────────┘ │
│ (fault injector, reused by both) │
│ │
└──────────────► P08 Recommender ──► P09 Simulator ──► P10 A/B platform ─────────┤
▲ │
┊ (embeddings from) │
┊ ▼
P01/P13 P15 Integrated System
P11-I Tree-walk ──► P11-II Bytecode VM ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┘
┊
┊ (GC + dispatch intuition feeds the kernel)
▼
P12 Kernel
Edge table
Every edge, with the specific thing that crosses it. An edge with no concrete payload is not a dependency, it is a vibe, and it should not constrain your ordering.
| From | To | Hard? | What actually crosses the edge |
|---|---|---|---|
| P01 | P13-I | soft | Motivation and a target: your autodiff must reproduce the Transformer's gradients to within 1e-5 of PyTorch's |
| P13-I | P13-II | hard | The graph IR and tensor class that fusion operates on |
| P13-II | P14 | hard | The blocked-matmul kernel and its measured GFLOP/s become the accelerator simulator's CPU baseline |
| P01 | P14 | soft | The decode-step roofline analysis from P01's inference experiments |
| P02 | P03 | hard | The HNSW index — P03 is literally built around it |
| P04 | P03 | soft | If you do P04 first you will rewrite P03's persistence layer; the roadmap accepts this deliberately (see Why This Order) |
| P04 | P05 | hard | The single-node engine that gets partitioned and replicated |
| P05 | P06 | hard | The fault-injection harness; the membership and failure detector |
| P05 | P07 | hard | The same harness plus the replicated log, which becomes the event log |
| P06 | P07 | soft | The task scheduler and worker pool, generalised to long-running operators |
| P02 | P08 | hard | Candidate retrieval — the recommender calls your index, not a library's |
| P01/P13 | P08 | soft | Understanding of what an embedding actually is, and the ability to generate them |
| P08 | P09 | hard | The ranking pipeline the simulator evaluates |
| P09 | P10 | hard | The simulated population that the A/B platform assigns and analyses |
| P11-I | P11-II | hard | The AST and the semantics the bytecode compiler must preserve |
| P11-II | P12 | soft | Concrete intuition for dispatch loops, stack frames, and GC pauses — all of which reappear as scheduler loops, kernel stacks, and page reclamation |
| P03, P05, P07, P08, P09, P10, P13, P14 | P15 | hard | P15 integrates them; see Final System |
Critical path
Because you run one project at a time, the schedule is 130 sequential weeks. But the longest chain of true dependencies is only 51 weeks:
P04 (9) → P05 (13) → P06 (8) → P07 (8) → P15 (13) = 51 weeks
Two other long chains:
P02 (7) → P03 (8) → P08 (6) → P09 (6) → P10 (4) → P15 (13) = 44 weeks
P01 (8) → P13-I (6) → P13-II (4) → P14 (7) → P15 (13) = 38 weeks
That 51-vs-130 gap is your reordering budget. It means the sequence below is one valid topological order out of very many, and if life makes a particular project impossible this quarter, you can almost always slide it without breaking anything. See Legal Reorderings.
Why This Order
Three ordering decisions are non-obvious and worth defending, because you will be tempted to undo all three.
1. The Transformer comes first, before the autodiff framework it logically sits on top of.
The logical order is backwards. You should build tensors, then autodiff, then a model. The roadmap does the reverse, deliberately:
- Motivation survives contact with difficulty better than logic does. Week 1 of a Transformer produces a model that generates text; week 1 of an autodiff framework produces a class that can add two arrays. You are 130 weeks from the end and the first eight weeks decide whether there is a week nine.
- Building autodiff after you have used
loss.backward()a hundred times converts the project from "implement a thing described in a blog post" to "explain a thing you have already relied on". That is the reconstruction skill this whole track is for. - P13's exit criterion is concrete precisely because P01 exists first: your autograd must reproduce your Transformer's gradients to 1e-5 against PyTorch. Without P01 there is nothing to check against.
2. The vector database comes before the LSM engine, even though it needs persistence.
You will build a naive append-only file with a full in-memory index in P03, measure its recovery time at 1M vectors, watch it take minutes, and then build the LSM engine in P04 knowing exactly which problem sparse indexes and Bloom filters solve. Doing P04 first would give you a better P03 and a worse education. This is the single clearest instance of the "naive design first" rule at the level of the roadmap itself, and it costs roughly 6 hours of rework in P03 — a price the plan pays on purpose.
3. The kernel comes at month 27, not month 3.
Kernel work is the most likely project to consume unbounded time and the least likely to produce a portfolio artifact anyone can evaluate. Putting it late means you arrive with two years of scoping discipline, an existing benchmark harness, and a working definition of "done". Putting it early means you spend four months on a bootloader and quit.
Legal Reorderings
Given the dependency table, these swaps are safe. Anything that preserves the edge directions is legal; these are the ones you are most likely to want.
| Situation | Legal move |
|---|---|
| You want distributed systems sooner (job reasons) | Move P04+P05 to Stage 2, pushing P11-II and P13-II to Stage 3. Costs nothing. |
| You are blocked on hardware for P14 | Swap P14 and P12 within Stage 5, or move P14 to just before P15. |
| Recommenders are your day job and you want them early | P02 → P08 is the only hard edge. P08/P09/P10 can run as Stage 2 immediately after P02, before P03. |
| You lose a quarter to work | Drop the stage boundary, not a project: extend Stage 3 and delete the Stage 4 buffer weeks. |
| You want to publish sooner | P02, P04, and P14 are the three most publishable early projects. See Research Directions. |
Two things that are not legal:
- Starting P15 before at least six upstream projects have passed their exit criteria. P15 is an integration and a research question; integrating three half-built systems produces a demo, not a contribution.
- Running two Large projects concurrently. Ever. This is the guardrail that the entire program is structured around.
The Six Stages
Stage 1 — Foundations and Reconstruction · W1–W26 · 286 h · M1–M7
Theme: learn the loop on projects where correctness is cheap to check.
Everything in this stage is single-process, single-machine, and deterministic. That is the point: you are learning to write a naive design, predict its failure, instrument it, and report on it, and you should not be simultaneously learning to debug a network partition.
| Project | Weeks | Deliverable |
|---|---|---|
| P01 Transformer | W1–8 | A character/BPE-level Transformer that trains, generates, and has a measured RoPE-vs-learned-vs-sinusoidal comparison |
| P02 ANN index | W9–15 | HNSW-like index with a recall/QPS curve that beats brute force at a stated n, and a comparison against hnswlib |
| P11-I Tree-walk interpreter | W16–20 | A language with closures and lexical scope, and a measured dispatch-cost breakdown |
| P13-I Autodiff core | W21–26 | Reverse-mode autodiff that reproduces P01's gradients to 1e-5 |
Stage exit: four technical reports; four repositories another engineer can clone and reproduce; the benchmark harness is now yours by muscle memory.
Stage 2 — Storage and Execution · W27–W54 · 308 h · M8–M15
Theme: durability, amplification, and the cost of a byte moved.
| Project | Weeks | Deliverable |
|---|---|---|
| P03 Vector DB | W27–34 | CRUD + filtering + persistence + recovery over P02's index, with a filtered-recall study |
| P04 LSM engine | W35–43 | WAL, memtable, SSTables, Bloom filters, both compaction strategies, and the three-amplification tradeoff measured |
| P11-II Bytecode VM | W44–50 | Compiler, stack VM, GC, and an AST-vs-bytecode speedup with the sources of the speedup attributed |
| P13-II Execution optimisation | W51–54 | Fusion, memory reuse, eager-vs-graph, and a measured arithmetic-intensity improvement |
Stage exit: you can explain read/write/space amplification with your own numbers, and you have twice built a thing whose performance is dominated by data movement rather than instruction count.
Stage 3 — Distributed Systems · W55–W83 · 319 h · M15–M22
Theme: partial failure. The hardest stage; budgeted accordingly.
| Project | Weeks | Deliverable |
|---|---|---|
| P05 Distributed KV | W55–67 | Partitioning, replication, simplified Raft, membership, rebalancing — and the fault injector, built first |
| P06 MapReduce | W68–75 | Coordinator, workers, shuffle, speculative execution, with a straggler study |
| P07 Streaming | W76–83 | Partitions, offsets, windows, watermarks, checkpointing, backpressure, and an event-time-vs-processing-time study |
Stage exit: a linearizability checker that has found at least one real bug in your own code, and a written failure analysis of a split-brain you caused on purpose.
Stage 4 — Product and Experimentation Systems · W84–W99 · 176 h · M23–M26
Theme: systems whose correctness is statistical, not logical. This is where your existing domain knowledge is deepest, so the stage is short and the bar is high — you should be producing near-publishable work here.
| Project | Weeks | Deliverable |
|---|---|---|
| P08 Recommender | W84–89 | Retrieval + ranking + diversity + freshness over your own index, against four baselines |
| P09 Simulator | W90–95 | Persona-driven simulated users with drift, fatigue, and delayed feedback; an experiment harness with seeds and CIs |
| P10 A/B platform | W96–99 | Assignment, exposure logging, guardrails, SRM detection, power analysis, and an offline-vs-online divergence study |
Stage exit: a documented case where an offline metric improved and the simulated online metric did not, with an explanation of the mechanism.
Stage 5 — Low-Level and Hardware-Aware Systems · W100–W117 · 198 h · M27–M31
Theme: the layers your abstractions have been standing on for four stages.
| Project | Weeks | Deliverable |
|---|---|---|
| P12 Kernel | W100–110 | Boot or user-space kernel, scheduler, paging, syscalls, context switching — with syscall and context-switch cost measured |
| P14 Hardware-aware ML | W111–117 | Blocked/vectorised matmul, a systolic-array simulator, quantization, and a roofline study |
Stage exit: you can answer "why is this kernel memory-bound" with a measurement rather than an opinion, at every level from L1 to HBM.
Stage 6 — Original Contribution · W118–W130 · 143 h · M31–M34
| Project | Weeks | Deliverable |
|---|---|---|
| P15 Integrated system | W118–130 | One system, one research question, an ablation suite, a benchmark, a paper, and a public demonstration |
Stage exit: the paper is written, the repository is reproducible from a clean machine by someone who is not you, and the negative results are in the paper rather than in a drawer.
The Active-Week Schedule
Stage 1 W1 ─────────────────────────────── W26
[P01 ·8·][P02 ·7·][P11-I 5][P13-I 6]
Stage 2 W27 ────────────────────────────── W54
[P03 ·8·][P04 ··9··][P11-II 7][P13-II 4]
Stage 3 W55 ────────────────────────────── W83
[P05 ·····13·····][P06 ·8·][P07 ·8·]
Stage 4 W84 ────────────── W99
[P08 6][P09 6][P10 4]
Stage 5 W100 ─────────────────── W117
[P12 ····11····][P14 ·7·]
Stage 6 W118 ───────────── W130
[P15 ·····13·····]
Monthly Milestones (M1–M34)
Calendar months, each covering ~3.8 active weeks at 46 productive weeks/year. The milestone column is the thing that must exist by month end — not a topic covered, an artifact that exists on disk and runs.
| Month | Weeks | Project | Milestone that must exist |
|---|---|---|---|
| M1 | W1–3 | P01 | Tokenizer + embeddings + a single attention head that passes a hand-computed 3-token test; benchmark harness working on your machine |
| M2 | W4–7 | P01 | Full multi-head pre-norm block, training loop, overfits 200 tokens to loss < 0.1; sampling works |
| M3 | W8–11 | P01→P02 | P01 report shipped with the RoPE/sinusoidal/learned ablation. P02 brute force + exact ground truth + recall harness |
| M4 | W12–15 | P02 | Random-graph → NSW → HNSW; efSearch/efConstruction sweep; hnswlib comparison. P02 report shipped |
| M5 | W16–19 | P11-I | Lexer, Pratt parser, AST, tree-walk evaluator with closures and lexical scope |
| M6 | W20–23 | P11-I→P13-I | P11-I report shipped (dispatch cost breakdown). P13-I Tensor class, broadcasting, and the backward graph |
| M7 | W24–26 | P13-I | Reverse-mode autodiff matches PyTorch gradients to 1e-5 on a Transformer block. P13-I report shipped. Stage 1 review. |
| M8 | W27–30 | P03 | Vector + metadata storage, insert/search/delete, tombstones, mmap-backed segments |
| M9 | W31–34 | P03 | Pre- vs post-filtering, recovery, snapshots, compaction; P03 report shipped with the filtered-recall cliff documented |
| M10 | W35–38 | P04 | WAL + memtable + SSTable + sparse index + Bloom; crash-recovery test passes under kill -9 |
| M11 | W39–42 | P04 | Both compaction strategies; the three amplifications measured under uniform/Zipfian/sequential keys |
| M12 | W43–46 | P04→P11-II | P04 report shipped. P11-II bytecode compiler and stack VM executing the Stage-1 test suite |
| M13 | W47–49 | P11-II | Mark-sweep GC with measured pause distribution; constant folding and dead-code elimination |
| M14 | W50–53 | P11-II→P13-II | P11-II report shipped (AST vs bytecode, speedup attributed by source). P13-II fusion + memory reuse |
| M15 | W54–57 | P13-II→P05 | P13-II report shipped. Stage 2 review. P05: the fault injector, built and tested before any distributed feature |
| M16 | W58–61 | P05 | Consistent hashing, partitioning, leader-based replication, replicated log |
| M17 | W62–65 | P05 | Simplified Raft: election, log replication, safety. Survives leader kill under injection |
| M18 | W66–69 | P05→P06 | Membership, failure detection, rebalancing, snapshots. P05 report shipped with a linearizability violation found and fixed. P06 begins |
| M19 | W70–72 | P06 | Input splitting, map, shuffle, sort, reduce; coordinator with task retry |
| M20 | W73–76 | P06→P07 | Speculative execution and the straggler study. P06 report shipped. P07 ingestion, partitions, offsets |
| M21 | W77–80 | P07 | Windows, watermarks, late events, stateful operators |
| M22 | W81–84 | P07→P08 | Checkpointing, recovery time, backpressure. P07 report shipped. Stage 3 review. P08 begins |
| M23 | W85–88 | P08 | Item embeddings, average and EMA user profiles, ANN retrieval, ranking with freshness and dedup |
| M24 | W89–92 | P08→P09 | Four baselines beaten or honestly not beaten. P08 report shipped. P09 personas, drift, click/skip/dwell models |
| M25 | W93–95 | P09 | Twelve scenarios including breaking news, fatigue, and failed embedding generation; seeds and CIs |
| M26 | W96–99 | P09→P10 | P09 report shipped. P10 assignment, bucketing, exposure logs, guardrails, SRM, power. P10 report. Stage 4 review |
| M27 | W100–103 | P12 | Boot (or user-space harness), memory layout, interrupts or their simulation, first syscall |
| M28 | W104–107 | P12 | Processes/threads, context switching, a measured context-switch cost |
| M29 | W108–111 | P12→P14 | Paging, page replacement policies compared, a scheduler-policy study. P12 report shipped. P14 begins |
| M30 | W112–115 | P14 | Naive → blocked → vectorised matmul with a roofline for each; quantization study |
| M31 | W116–118 | P14→P15 | Systolic-array simulator; the specialised-vs-general explanation with numbers. P14 report. Stage 5 review. P15 question locked |
| M32 | W119–122 | P15 | Integration skeleton end to end: ingest → store → embed → index → serve → simulate |
| M33 | W123–126 | P15 | The experiment: ablations, baselines, repeated trials, confidence intervals |
| M34 | W127–130 | P15 | Paper written. Repository reproducible by a stranger. Demonstration recorded. Journey complete. |
Checkpoint Reviews
At each stage boundary — M7, M15, M22, M26, M31 — stop for one full session (3 hours)
and do this, in writing, in notebook/stage-N-review.md:
- Score every project of the stage on the scorecard. Twelve categories, 1–5, with the evidence for each score named. Score down when unsure.
- Recompute the schedule. Actual hours spent vs. planned. If you are more than 15% over, do not "try harder" — cut scope from the next stage using the cut table, and record what you cut.
- Answer the four questions: What did I build that I could not have built at the start of this stage? Which of my predictions were wrong, and was there a pattern in how they were wrong? What did I avoid because it was hard? What is the single weakest of my twelve scorecard categories, and what specific mechanic in the next stage will train it?
- Re-read one report from the previous stage. You will find an unsupported claim. Fix it or retract it.
- Update Research Directions with anything you saw that might be novel. One line each. Do not chase it now.
The review is not optional and it is not a formality. It is the only mechanism in the program that catches slow drift, and slow drift over 34 months is the failure mode that actually ends journeys like this one.
References
- Brooks, F. P. The Mythical Man-Month, anniversary ed. Addison-Wesley, 1995. Chapter 2 on scheduling estimation, and the observation that adding effort to a late project makes it later — which is why the response to slipping here is scope cuts, not hours.
- DeMarco, T., Lister, T. Peopleware: Productive Projects and Teams, 3rd ed. Addison-Wesley, 2013. On sustained-pace work and the cost of interruption; the source of the 46-productive-weeks assumption.
- Hofstadter, D. R. Gödel, Escher, Bach. Basic Books, 1979, p. 152. Hofstadter's Law: "It always takes longer than you expect, even when you take into account Hofstadter's Law." The 34-month figure already includes one application of this; assume it needs a second.
- Boehm, B. W. Software Engineering Economics. Prentice-Hall, 1981. The cone of uncertainty: early estimates are reliably off by 4× in either direction, which is why every stage boundary here recomputes rather than reasserts.
- Lampson, B. W. Hints for Computer System Design. SOSP '83. "Keep it simple", "do one thing well", and the observation that most system complexity is unpaid-for generality — the intellectual basis for the scope-boundary section on every project page.