Project Portfolio
The fifteen builds: size, effort, dependencies, scope tiers, and the one sentence that says why each exists.
Table of Contents
- Master Table
- Effort and Size Classification
- The Three Scope Tiers
- What Each Project Teaches That No Other Project Teaches
- Language Assignment
- The Deliverable Every Project Produces
- Reading This Track's Project Pages
- References
Master Table
| # | Project | Size | Hours | Weeks | Stage | Language | Hard deps | Central question |
|---|---|---|---|---|---|---|---|---|
| P01 | Transformer from scratch | Medium | 88 | W1–8 | 1 | Python | — | What does attention actually compute, and what does it cost? |
| P02 | ANN index | Medium | 77 | W9–15 | 1 | Python→Rust ext | — | What exactly do you give up when you stop being exact? |
| P11-I | Tree-walk interpreter | Small | 55 | W16–20 | 1 | Rust | — | Where does the time go in a language that "does nothing"? |
| P13-I | Autodiff core | Medium | 66 | W21–26 | 1 | Python | P01 (soft) | Why is reverse mode the right default and when is it not? |
| P03 | Vector database | Medium | 88 | W27–34 | 2 | Python/Rust | P02 | What breaks when an index must survive a power cut? |
| P04 | LSM storage engine | Medium | 99 | W35–43 | 2 | Rust | — | Which of the three amplifications are you choosing to pay? |
| P11-II | Bytecode VM + GC | Medium | 77 | W44–50 | 2 | Rust | P11-I | Where does the AST→bytecode speedup actually come from? |
| P13-II | Tensor execution opt | Small | 44 | W51–54 | 2 | Python/C | P13-I | Is your framework compute-bound or dispatch-bound? |
| P05 | Distributed KV store | Large | 143 | W55–67 | 3 | Go | P04 | What does your system do when it cannot tell "slow" from "dead"? |
| P06 | MapReduce framework | Medium | 88 | W68–75 | 3 | Go | P05 | Why does a restricted programming model beat a general one? |
| P07 | Stream processor | Medium | 88 | W76–83 | 3 | Go | P05 | What is a "correct" answer when the input never ends? |
| P08 | Recommender | Medium | 66 | W84–89 | 4 | Python | P02 | Which of your gains is real and which is popularity bias? |
| P09 | Recsys simulator | Medium | 66 | W90–95 | 4 | Python | P08 | Can a simulated user population rank real algorithms correctly? |
| P10 | A/B testing platform | Small | 44 | W96–99 | 4 | Python | P09 | When does an offline win fail to become an online win? |
| P12 | OS kernel | Large | 121 | W100–110 | 5 | Rust/C | P11-II (soft) | What does a syscall, a page fault, and a context switch cost? |
| P14 | Hardware-aware ML | Medium | 77 | W111–117 | 5 | C/CUDA | P13-II | Why can specialised silicon beat a CPU by 100× at one job? |
| P15 | Integrated system | Large | 143 | W118–130 | 6 | mixed | 8 projects | Your research question — see Final System |
| Total | 1,430 | 130 |
Effort and Size Classification
The size rule
| Class | Weeks | Hours @ 11 h/wk | Count in this journey |
|---|---|---|---|
| Small | 3–5 | 33–55 | 3 (P11-I, P13-II, P10) |
| Medium | 6–10 | 66–110 | 9 |
| Large | 10–16 | 110–176 | 3 (P05, P12, P15) — plus P11 and P13 which are Large in total but split |
No project may grow beyond its class ceiling. A Medium project at week 11 is not a diligent Medium project, it is an undeclared Large one, and it is stealing weeks from a project later in the plan that you have not yet met and therefore cannot defend. The enforcement is mechanical: at the class ceiling you stop, ship whatever passes the exit criteria, and write the rest into the extension section of the report. See the two-week stall rule.
How the hour estimates were built
Each figure is the sum of its project's milestones, each estimated independently, then sanity-checked three ways:
- Against the allocation. A project of H hours should show ~0.15H reading, ~0.45H implementation, ~0.20H experiments, ~0.10H writing, ~0.10H debugging. If a project's milestone list implies 0.8H of implementation, the estimate is wrong or the scope is.
- Against known reference implementations. P01 is calibrated against nanoGPT (~300 lines of model code); P04 against the LevelDB paper's component list; P05 against the MIT 6.5840 lab sequence, which takes competent graduate students most of a semester at higher intensity than 11 h/week.
- Against the 4× rule. Boehm's cone of uncertainty says early estimates are routinely off by 4× in either direction. These are not off by 4× because they are milestone-level rather than project-level, but assume ±30% on any individual project and expect the errors to partially cancel across fifteen.
Where these estimates are most likely wrong, stated in advance so you can check:
- P05 (143 h) is the most likely to overrun. Distributed debugging has no floor. The fault injector is scheduled first specifically to bound it.
- P12 (121 h) is the second. If you choose the bootable option and hit a toolchain problem, you can lose two weeks to something that teaches you nothing. Budget a hard "switch to the user-space option" decision at week 3 of the project.
- P08–P10 (176 h combined) are the most likely to underrun, because they are closest to your existing expertise. If you finish early, do not add scope — advance the schedule and bank the weeks against P12.
The Three Scope Tiers
Every project defines three versions. This is the single most important structural device in the plan, because it converts "when am I done?" from a judgement call into a lookup.
Minimum viable implementation (MVI). The smallest artifact that still exhibits the mechanism being studied. Must be genuinely educational on its own: an LSM engine without compaction is an MVI (it still teaches WAL, memtable, SSTable, recovery); an LSM engine that keeps everything in RAM is not, because the mechanism under study is precisely what happens when it does not.
Standard implementation. MVI plus the features that make the project's core experiments possible. This is the target. Exit criteria are written against this tier.
Optional research extension. The interesting thing you will want to do. It is locked until the standard tier passes its exit criteria, and it may be skipped entirely without affecting any later project. Nothing downstream ever depends on an extension — that is what makes it optional in a way that survives contact with a busy quarter.
Worked example — Project 4
| Tier | Contents | Hours |
|---|---|---|
| MVI | WAL + memtable + SSTable write + point read + crash recovery. No compaction, no Bloom filters, no range queries. Teaches durability, the memtable flush, and the read path across immutable files. | 40 |
| Standard | + sparse index, Bloom filters, tombstones, range queries via merged iterators, size-tiered and leveled compaction, checksums. Enables every experiment on the project page. | 99 |
| Extension | Learned index blocks replacing the sparse index; or a compaction scheduler that adapts to measured read/write ratio. Publishable if it works. | +40–60 |
If week 9 arrives and leveled compaction is half-finished, you ship size-tiered only, you write "leveled compaction not implemented; the read-amplification comparison is therefore against published figures rather than my own" in the report, and you move on. That is a completed project with a stated limitation. It is worth far more than a twelfth week.
What Each Project Teaches That No Other Project Teaches
If you ever need to cut, cut by asking which unique lesson you are willing to lose.
| Project | The lesson available nowhere else in this journey |
|---|---|
| P01 | That an architecture is a set of arbitrary-looking choices, each of which is defensible only by measurement |
| P02 | That "approximate" is a quantified contract, and that a better algorithm can lose to a worse one on constant factors |
| P03 | That an index and a database differ by everything that happens after a crash |
| P04 | That you cannot optimise read, write, and space amplification simultaneously — the RUM conjecture, felt rather than read |
| P05 | That the hard part of distributed systems is not consensus, it is that failure is indistinguishable from slowness |
| P06 | That restricting what a programmer may express is what makes automatic fault tolerance possible |
| P07 | That correctness over an unbounded input requires you to define correctness first — watermarks are an admission, not a feature |
| P08 | That an accuracy metric can improve while the product gets worse |
| P09 | That a simulator's value is in its relative rankings, and validating that claim is harder than building the simulator |
| P10 | That statistics is an engineering constraint: your MDE decides whether a feature is even measurable |
| P11 | That every abstraction you use daily is a dispatch loop, a stack frame, and a decision about who frees memory |
| P12 | That the numbers you have been treating as free — a syscall, a page fault, a context switch — have prices you can measure |
| P13 | That autodiff is bookkeeping over a graph, and that framework overhead can exceed the arithmetic it dispatches |
| P14 | That performance is data movement, and that specialised hardware wins by changing the movement, not the arithmetic |
| P15 | That integrating working parts is a different and harder skill than building them |
Language Assignment
Rationale and the full argument in Languages. The summary:
| Language | Projects | The mechanism it exposes |
|---|---|---|
| Python | P01, P13, P08, P09, P10, parts of P02/P03 | Nothing — and that is the point. Python makes the algorithm visible by making everything else uniform, and its slowness makes constant factors impossible to ignore (see the worked notebook entry) |
| Rust | P04, P11, P12, P02's hot loop | Ownership makes lifetime and aliasing explicit, which is precisely what a storage engine, a GC, and a kernel are about. No GC pauses to confound your latency measurements |
| Go | P05, P06, P07 | Goroutines and channels make concurrency cheap enough that you build the real topology instead of a simplified one; the runtime's scheduler and race detector are genuinely good distributed-systems tools |
| C / CUDA | P14, optionally P12 | Explicit memory hierarchy, explicit vectorisation, explicit kernel launch. Nothing between you and the machine |
Four languages across 34 months, each assigned once and not revisited on a whim. You already know Python and Go. Rust is the one real learning cost, and it is paid across P11-I (Small, W16–20) where the project is easy enough that the language is the only hard part — that scheduling is deliberate.
The Deliverable Every Project Produces
Not negotiable, and identical across all fifteen:
- A repository that a stranger can clone and run. One command to build, one to test, one to reproduce the headline benchmark. If it needs a paragraph of setup prose, it is not reproducible.
- A technical report (
REPORT.md), 1,500–4,000 words, followingtemplates/report.md, containing a section titled "What I Expected And Did Not Get". That section is scored and may not be empty. - A research-notebook entry per experiment, following
templates/notebook.md. - A benchmark artifact: the raw sample data (not just summaries), the script that produced it, and the environment block.
- A scorecard self-assessment, twelve categories, with evidence named per score.
The first three take about 10 hours of the project's budget combined. That is the 10% writing allocation, and it is the part that converts a build into a portfolio.
Reading This Track's Project Pages
Every project page has the same eighteen sections, in the same order, so you can jump straight to the one you need:
Why This Project Matters Concepts To Study Expected Difficulties
Prerequisites Primary-Source Readings Scope Boundaries
Duration and Size Experiments Deliverables
Central Technical Questions Benchmarks and Metrics Exit Criteria
Architecture Correctness Tests Extension Ideas
Implementation Milestones Failure Tests Connections
Plus, at the top of each, the fourteen-step loop instantiated for that project — what "naive design" and "predicted failure point" concretely mean for this build. Read that section, then close the page and write your own naive design before reading the architecture section. The architecture section is deliberately placed after the loop for that reason.
References
- Boehm, B. W. Software Engineering Economics. Prentice-Hall, 1981. The cone of uncertainty underlying the ±30% claim.
- Brooks, F. P. No Silver Bullet — Essence and Accident in Software Engineering. IEEE Computer 20(4), 1987. The essential/accidental distinction is what the scope tiers are trying to separate: MVI is essence, everything else is negotiable.
- Athanassoulis, M. et al. Designing Access Methods: The RUM Conjecture. EDBT 2016. The read/update/memory trilemma referenced in P04's unique lesson.
- Ousterhout, J. A Philosophy of Software Design, 2nd ed. Yaknyam Press, 2018. Deep modules and the argument that interface simplicity is worth implementation complexity — the standard against which each project's API is judged.
- Karpathy, A. nanoGPT. github.com/karpathy/nanoGPT, 2022. The calibration reference for P01's size estimate. Read the code after you write yours, not before.
- MIT 6.5840 (formerly 6.824) Distributed Systems lab sequence. The calibration reference for P05.