← Back to roadmap
Phase 4Week 52~90 min read
0%·0/7

Launch & Retrospective

Ship it, share it, and plan the next year.

Mastery · Markets, Strategies & Getting Hired

Why this week

Fifty-one weeks ago you were deciding whether a channel's Sender should be Clone. Since then you've built an exchange: order book, matching, journal, replication, market data, wire protocols, a gateway, risk, telemetry, a performance sprint, strategies, a backtester, replay, chaos testing and a deployable demo with a native terminal. This week you finish the way professionals finish: ship it at one commit, tell people what it is with evidence, and review the year honestly so the next one starts from what you learned rather than what you remember.

Shipping is a skill of its own. The last 5% (tagging, regenerating the report at the release commit, checking the demo runs that exact build, writing the announcement, answering the first critical comment well) is what makes the other 95% visible. The retrospective is the other half: data on how your estimates held up, which phases hurt, and what changed in how you design systems.

ℹ️
Note

"Done" for this curriculum isn't "every benchmark green". It's a public, verifiable artifact, a written account of what you learned, and a plan. Some of your week targets will still be red. Say so in the README, explain what limits them, and launch anyway.

Day 1 — The launch checklist

Day 01

One commit, everything consistent

The README, report, demo and tag must all agree

A launch is a claim: this commit is the thing, and here is the evidence. The evidence has to come from that commit. A README showing last month's benchmark numbers, or a demo running a build from before the last refactor, is exactly the kind of inconsistency a careful reader notices, and it undermines everything else.

The checklist, as dependencies:

  • CI green on the release commit: tests, clippy, docs, the week tests (cargo xtask test).
  • Benchmark report regenerated at that commit on the reference machine (week 51's generator), and the README's numbers come from it.
  • Demo deployed from that commit's image (week 47), and its build id visible somewhere a reader can check.
  • Licence chosen. MIT/Apache-2.0 dual licensing is the Rust ecosystem's convention.
  • Changelog and version tag: a v1.0.0 (or v0.1.0) tag, with a changelog entry that says what's in it.
  • Repository hygiene: no secrets in history, issue templates, a short CONTRIBUTING file, and the stranger test (week 51) passed.
  • Announcement last, linking to all of the above.
Docs
Choose an open source license

Compare MIT, Apache-2.0 and GPL in two minutes. The Rust project and most of its ecosystem dual-license MIT OR Apache-2.0: Apache-2.0 adds an explicit patent grant, and MIT keeps compatibility with GPLv2 projects.

Docs
Starting an Open Source Project (Open Source Guides)

README, CONTRIBUTING, code of conduct, and setting expectations about how much maintenance you're offering. A personal project is allowed to say 'issues welcome, response time best-effort'.

Docs
Keep a Changelog and Semantic Versioning

Write a 1.0 entry that a user, not a git log, would want to read. Pair it with semver.org's rules if you publish any crate on crates.io.

The drill is the launch gate as code: order the checklist by its dependencies, then refuse to launch with unfinished items or evidence produced at an older commit.

Drill

Launch checklist

Target: 6/6 · nothing ships on stale evidenceNot yet run
#[derive(Debug, Clone)]
pub struct Item {
    pub id: &'static str,
    pub deps: Vec<&'static str>,        // items that must be done first
    pub done: bool,
    pub evidence: Option<&'static str>, // commit the evidence was produced at, if the item has evidence
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Problem {
    UnknownDep { item: &'static str, dep: &'static str },
    Cycle,
    NotDone(&'static str),
    StaleEvidence(&'static str),
}

/// Every item after all of its deps. Whenever several items are ready at
/// once, take the smallest id (string order) first.
/// Errors: the first UnknownDep found scanning items in list order and each
/// item's deps in order; otherwise Cycle if not every item can be ordered.
pub fn launch_order(items: &[Item]) -> Result<Vec<&'static str>, Problem> {
    let _ = items;
    todo!()
}

/// The launch gate. If launch_order fails, return just that error.
/// Otherwise, walking items in launch order: NotDone(id) for an item that
/// isn't done; StaleEvidence(id) for a done item whose evidence is
/// Some(commit) with commit != head. An empty Vec means: ship it.
pub fn gate(items: &[Item], head: &str) -> Vec<Problem> {
    let _ = (items, head);
    todo!()
}
Rust
Recall#stale-evidence

Your benchmarks were run at commit a1b2c3d; since then you merged a 'docs only' change and tagged f00dfee. Must you regenerate the report before launching?

Day 2 — The announcement

Day 02

Tell people, with evidence

A post that a skeptical expert will finish

Write one launch post, on your own site, that the rest of your sharing links to. Its structure:

  1. What it is, in two sentences, and a picture: the terminal watching the live demo.
  2. Why it's interesting: the one or two hard problems (determinism with microsecond latency, failover without double fills) and how you solved them.
  3. Numbers with method: the headline table from the generated report, the machine, and what limits each number.
  4. What you learned: the single most surprising thing (coordinated omission? false sharing? how hard tail loss is to detect?).
  5. Links: repo, demo, report, architecture overview.

Expect the first critical comment to target your weakest number or your strongest claim. Thank them, answer with data, and fix what they found in public. That exchange often impresses hiring readers more than the project itself.

Design note#launch-post

Outline the launch post: the two-sentence summary, the one picture, the hard problem you'll explain, the headline table and its caveats, and the one lesson. Then write the title three different ways and pick the least hyperbolic one.

0 chars

Day 3 — Retrospective: data first

Day 03

Evidence before opinions

Estimates, hit rates and streaks from your own logs

A retrospective that starts with feelings ends with the loudest memory. Start with data: your weekly planned and actual hours, which benchmark targets you hit in each phase, the drills and recall checks you marked for review, and the week reports from the lab. Three questions to answer from the numbers before you write a word of interpretation:

  • How biased were your estimates? The median ratio of actual to planned hours tells you your personal planning-fallacy factor. Most people land well above 100%. The worst weeks tell you which kind of work you underestimate (debugging concurrency? performance work with no clear stopping point?).
  • Where did the targets slip? Benchmark hit rate per phase shows whether the foundation, production, performance or mastery phase was hardest for you, which is usually not the one you'd guess.
  • When did you have momentum? The longest run of consecutive on-plan weeks, and what was true during it.
Bookby Esther Derby and Diana Larsen
Agile Retrospectives: Making Good Teams Great

The five-stage structure (set the stage, gather data, generate insights, decide what to do, close) works for a team of one. This week's Day 3 is 'gather data' and Day 4 is 'generate insights'. Don't skip ahead.

Drill

Structured retrospective

Target: 6/6 exact answersNot yet run
#[derive(Debug, Clone, Copy)]
pub struct WeekLog {
    pub week: u32, // 1..=52
    pub planned_h: u32,
    pub actual_h: u32,
    pub benches_met: u32,
    pub benches_total: u32,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Retro {
    /// Σ (actual_h − planned_h).
    pub overrun_h: i64,
    /// Median of actual_h × 100 / planned_h (integer division) over weeks
    /// with planned_h > 0; for an even count take the LOWER middle value.
    /// 0 if there are no such weeks.
    pub median_ratio_pct: u32,
    /// Up to 3 weeks with the highest ratio (same definition), highest
    /// first; ties → lower week number first.
    pub worst_weeks: Vec<u32>,
    /// Per phase (weeks 1–12, 13–24, 25–40, 41–52):
    /// Σ benches_met × 100 / Σ benches_total (integer division), None if Σ total = 0.
    pub phase_hit_pct: [Option<u32>; 4],
    /// Longest run of consecutive week NUMBERS (a missing week breaks the
    /// run) where actual_h × 100 <= planned_h × 110. Logs may be unsorted.
    pub longest_on_plan_streak: u32,
}

pub fn retro(logs: &[WeekLog]) -> Retro {
    let _ = logs;
    todo!()
}
Rust
Recall#planning-fallacy

Your retro says the median week took 135% of plan and the three worst weeks were all performance work. What do you change in how you plan the next year, concretely?

Day 4 — Retrospective: insights

Day 04

What changed in how you think

Liked, learned, lacked, longed for — and one design, redone

Now interpret, using the 4Ls: what you liked, what you learned, what you lacked (skills, tools, time, feedback) and what you longed for. Keep it blameless, even though the only person involved is you. The point is to find the conditions that produced the outcomes, not to grade yourself. "I skipped the profiler in week 26 because I was behind schedule" is useful. "I was lazy" isn't.

The most valuable single exercise is to redo an early design with what you know now. Take week 1's channel, week 6's order book or week 13's gateway and write how you'd design it today. The differences (where you'd put the thread boundaries, what you'd measure first, which invariant you'd encode in types) are the clearest record of what the year changed.

Docsby Google
Postmortem Culture: Learning from Failure (Site Reliability Engineering, ch. 15)

Blameless postmortems: focus on contributing causes and systems, not people. Apply the same rules to your year. Write about decisions and their context, not about character.

Design note#four-ls

Write your 4Ls: three items each for liked, learned, lacked and longed for. For every 'lacked', name the condition that caused it and one change that would have prevented it.

0 chars
Design note#redesign

Redesign one early component (week 1 channel, week 6 book, or week 13 gateway) as you would today. List every difference from your original and the week in which you learned the reason for it.

0 chars
Recall#blameless-solo

Why bother keeping a solo retrospective 'blameless'? Nobody else is being blamed.

Day 5 — Contributing upstream

Day 05

Give back to the crates you stood on

Small, well-evidenced, and useful to the maintainers

You used dozens of crates this year, and you now know some of their internals better than most of their users. Contributions are the strongest public signal of judgement and collaboration, and they make you better at reading other people's code. Start small and specific:

  • A bug or papercut you hit, with a minimal reproduction. Your replay and chaos tooling makes reproductions your strength.
  • Docs: an example of the exact use you needed, or a missing statement of cost or ordering guarantees.
  • Benchmarks or tests that cover a case the project lacks.
  • Performance work, carefully: open an issue with measurements first, agree on the approach, then send a focused PR with before/after numbers and methodology. Maintainers merge evidence, not enthusiasm.

Read the project's CONTRIBUTING guide, look at recently merged PRs to calibrate size and style, and keep your first PR small enough to review in ten minutes.

Docs
How to Contribute to Open Source (Open Source Guides)

Finding a project, reading its norms, opening a good issue and a good first pull request. The 'before you contribute' checklist is worth following literally.

Before the day ends, list five crates you depended on this year, write one concrete contribution for each (a bug, a doc gap, a benchmark, a test) with the evidence you already have, and open the issue for the best one.

Day 6 — The next year

Day 06

Choose depth

One area, measurable goals, and a first step this week

You now have breadth across a whole trading system. The next year should buy depth in one area, chosen by what you liked and what the roles you want reward:

  • Hardware and the network edge: kernel bypass in production (ef_vi, DPDK), hardware timestamping, PTP, and FPGA feed handlers and order entry, where the lowest-latency firms compete.
  • Correctness: formal specification of your replication and failover protocol in TLA+ (Leslie Lamport's Specifying Systems is the reference), model checking, and deterministic simulation at scale.
  • Distributed systems: consensus (Raft, Paxos) for the control plane (configuration, reference data), multi-site disaster recovery, and the latency cost of each.
  • Quantitative work: microstructure research, execution algorithms, and simulation fidelity, turning weeks 41–45 into a research practice.
  • Performance engineering as a discipline: compilers and codegen, profiling tooling, and contributing performance work to the Rust ecosystem itself.

Write the plan the way this curriculum was written: a sequence of weeks, each with a reading, a build task and a measurable target, plus a quarterly review using this week's retro drill on the new logs.

Design note#next-year-plan

Write your next-year plan: the depth area and why, four quarterly milestones with measurable targets, the first four weeks in detail, and the one thing you'll stop doing to make time for it.

0 chars

Capstone

Deliverable

Shipped, reviewed, and pointed forward

The exchange is public at one tagged commit, announced with evidence, reviewed with data, and followed by a concrete plan.

  • Public release: repo, tag, report and demo at one commit#launchmark when done

    The repository is public with a licence, a tagged release and a changelog entry. The benchmark report was regenerated at the tagged commit, the demo runs that commit's build, and your launch gate (the Day 1 drill applied to your real checklist) returns no problems.

  • Launch post published, with numbers and method#announcemark when done

    One post on your own site with the summary, the terminal screenshot, one hard problem explained, the generated headline table with its machine and caveats, the main lesson, and links to the repo, demo and report. Shared wherever your audience is. Reply to the first critical comment with data.

  • Written retrospective: data first, then insights#retro-docmark when done

    A written retrospective: your Day 3 numbers (estimate ratio, worst weeks, hit rate per phase, streak), the 4Ls, the redesign of one early component, and three decisions you'd make differently, each with the condition that led to the original one.

  • First upstream contribution opened#contributionmark when done

    At least one issue or pull request opened on a crate you depended on, with a reproduction or measurements attached. Link it in your retrospective.

  • Next-year plan with one depth area and measurable goals#next-yearmark when done

    The Day 6 plan: one depth area, quarterly targets, the first four weeks in detail, and the date of your first quarterly retro.

Feeds into

This is the last week of HFT-52. What it feeds into is whatever you chose on Day 6. Keep the habits that got you here: write the invariant before the code, measure before you optimise, publish the method with the number, and review the year with data.