Roadmap

The duration arithmetic, the dependency structure, the six stages, and thirty-four monthly milestones.


Table of Contents


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:

#ProjectSizeHoursWeeks @ 11 h
P01Transformer from scratchMedium888
P02Approximate nearest-neighbour indexMedium777
P03Small vector databaseMedium888
P04Log-structured storage engineMedium999
P05Distributed key-value storeLarge14313
P06MapReduce-style frameworkMedium888
P07Stream-processing systemMedium888
P08Recommendation systemMedium666
P09Recommendation simulatorMedium666
P10A/B testing platformSmall444
P11Programming language and VM (I + II)Large13212
P12OS kernel or kernel subsystemsLarge12111
P13Tensor framework and autodiff (I + II)Large11010
P14Hardware-aware ML systemMedium777
P15Integrated final systemLarge14313
Total1,430130

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.

ph/yearyearsmonths
83683.8947
104603.1137
115062.8334 ← plan for this
125522.5931

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.

FromToHard?What actually crosses the edge
P01P13-IsoftMotivation and a target: your autodiff must reproduce the Transformer's gradients to within 1e-5 of PyTorch's
P13-IP13-IIhardThe graph IR and tensor class that fusion operates on
P13-IIP14hardThe blocked-matmul kernel and its measured GFLOP/s become the accelerator simulator's CPU baseline
P01P14softThe decode-step roofline analysis from P01's inference experiments
P02P03hardThe HNSW index — P03 is literally built around it
P04P03softIf you do P04 first you will rewrite P03's persistence layer; the roadmap accepts this deliberately (see Why This Order)
P04P05hardThe single-node engine that gets partitioned and replicated
P05P06hardThe fault-injection harness; the membership and failure detector
P05P07hardThe same harness plus the replicated log, which becomes the event log
P06P07softThe task scheduler and worker pool, generalised to long-running operators
P02P08hardCandidate retrieval — the recommender calls your index, not a library's
P01/P13P08softUnderstanding of what an embedding actually is, and the ability to generate them
P08P09hardThe ranking pipeline the simulator evaluates
P09P10hardThe simulated population that the A/B platform assigns and analyses
P11-IP11-IIhardThe AST and the semantics the bytecode compiler must preserve
P11-IIP12softConcrete 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, P14P15hardP15 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.


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.

SituationLegal 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 P14Swap P14 and P12 within Stage 5, or move P14 to just before P15.
Recommenders are your day job and you want them earlyP02 → P08 is the only hard edge. P08/P09/P10 can run as Stage 2 immediately after P02, before P03.
You lose a quarter to workDrop the stage boundary, not a project: extend Stage 3 and delete the Stage 4 buffer weeks.
You want to publish soonerP02, 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.

ProjectWeeksDeliverable
P01 TransformerW1–8A character/BPE-level Transformer that trains, generates, and has a measured RoPE-vs-learned-vs-sinusoidal comparison
P02 ANN indexW9–15HNSW-like index with a recall/QPS curve that beats brute force at a stated n, and a comparison against hnswlib
P11-I Tree-walk interpreterW16–20A language with closures and lexical scope, and a measured dispatch-cost breakdown
P13-I Autodiff coreW21–26Reverse-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.

ProjectWeeksDeliverable
P03 Vector DBW27–34CRUD + filtering + persistence + recovery over P02's index, with a filtered-recall study
P04 LSM engineW35–43WAL, memtable, SSTables, Bloom filters, both compaction strategies, and the three-amplification tradeoff measured
P11-II Bytecode VMW44–50Compiler, stack VM, GC, and an AST-vs-bytecode speedup with the sources of the speedup attributed
P13-II Execution optimisationW51–54Fusion, 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.

ProjectWeeksDeliverable
P05 Distributed KVW55–67Partitioning, replication, simplified Raft, membership, rebalancing — and the fault injector, built first
P06 MapReduceW68–75Coordinator, workers, shuffle, speculative execution, with a straggler study
P07 StreamingW76–83Partitions, 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.

ProjectWeeksDeliverable
P08 RecommenderW84–89Retrieval + ranking + diversity + freshness over your own index, against four baselines
P09 SimulatorW90–95Persona-driven simulated users with drift, fatigue, and delayed feedback; an experiment harness with seeds and CIs
P10 A/B platformW96–99Assignment, 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.

ProjectWeeksDeliverable
P12 KernelW100–110Boot or user-space kernel, scheduler, paging, syscalls, context switching — with syscall and context-switch cost measured
P14 Hardware-aware MLW111–117Blocked/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

ProjectWeeksDeliverable
P15 Integrated systemW118–130One 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.

MonthWeeksProjectMilestone that must exist
M1W1–3P01Tokenizer + embeddings + a single attention head that passes a hand-computed 3-token test; benchmark harness working on your machine
M2W4–7P01Full multi-head pre-norm block, training loop, overfits 200 tokens to loss < 0.1; sampling works
M3W8–11P01→P02P01 report shipped with the RoPE/sinusoidal/learned ablation. P02 brute force + exact ground truth + recall harness
M4W12–15P02Random-graph → NSW → HNSW; efSearch/efConstruction sweep; hnswlib comparison. P02 report shipped
M5W16–19P11-ILexer, Pratt parser, AST, tree-walk evaluator with closures and lexical scope
M6W20–23P11-I→P13-IP11-I report shipped (dispatch cost breakdown). P13-I Tensor class, broadcasting, and the backward graph
M7W24–26P13-IReverse-mode autodiff matches PyTorch gradients to 1e-5 on a Transformer block. P13-I report shipped. Stage 1 review.
M8W27–30P03Vector + metadata storage, insert/search/delete, tombstones, mmap-backed segments
M9W31–34P03Pre- vs post-filtering, recovery, snapshots, compaction; P03 report shipped with the filtered-recall cliff documented
M10W35–38P04WAL + memtable + SSTable + sparse index + Bloom; crash-recovery test passes under kill -9
M11W39–42P04Both compaction strategies; the three amplifications measured under uniform/Zipfian/sequential keys
M12W43–46P04→P11-IIP04 report shipped. P11-II bytecode compiler and stack VM executing the Stage-1 test suite
M13W47–49P11-IIMark-sweep GC with measured pause distribution; constant folding and dead-code elimination
M14W50–53P11-II→P13-IIP11-II report shipped (AST vs bytecode, speedup attributed by source). P13-II fusion + memory reuse
M15W54–57P13-II→P05P13-II report shipped. Stage 2 review. P05: the fault injector, built and tested before any distributed feature
M16W58–61P05Consistent hashing, partitioning, leader-based replication, replicated log
M17W62–65P05Simplified Raft: election, log replication, safety. Survives leader kill under injection
M18W66–69P05→P06Membership, failure detection, rebalancing, snapshots. P05 report shipped with a linearizability violation found and fixed. P06 begins
M19W70–72P06Input splitting, map, shuffle, sort, reduce; coordinator with task retry
M20W73–76P06→P07Speculative execution and the straggler study. P06 report shipped. P07 ingestion, partitions, offsets
M21W77–80P07Windows, watermarks, late events, stateful operators
M22W81–84P07→P08Checkpointing, recovery time, backpressure. P07 report shipped. Stage 3 review. P08 begins
M23W85–88P08Item embeddings, average and EMA user profiles, ANN retrieval, ranking with freshness and dedup
M24W89–92P08→P09Four baselines beaten or honestly not beaten. P08 report shipped. P09 personas, drift, click/skip/dwell models
M25W93–95P09Twelve scenarios including breaking news, fatigue, and failed embedding generation; seeds and CIs
M26W96–99P09→P10P09 report shipped. P10 assignment, bucketing, exposure logs, guardrails, SRM, power. P10 report. Stage 4 review
M27W100–103P12Boot (or user-space harness), memory layout, interrupts or their simulation, first syscall
M28W104–107P12Processes/threads, context switching, a measured context-switch cost
M29W108–111P12→P14Paging, page replacement policies compared, a scheduler-policy study. P12 report shipped. P14 begins
M30W112–115P14Naive → blocked → vectorised matmul with a roofline for each; quantization study
M31W116–118P14→P15Systolic-array simulator; the specialised-vs-general explanation with numbers. P14 report. Stage 5 review. P15 question locked
M32W119–122P15Integration skeleton end to end: ingest → store → embed → index → serve → simulate
M33W123–126P15The experiment: ablations, baselines, repeated trials, confidence intervals
M34W127–130P15Paper 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:

  1. Score every project of the stage on the scorecard. Twelve categories, 1–5, with the evidence for each score named. Score down when unsure.
  2. 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.
  3. 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?
  4. Re-read one report from the previous stage. You will find an unsupported claim. Fix it or retract it.
  5. 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.