Skip to main content

External Exercises

Design drills, implementation katas, and reference system-design interviews to build fluency beyond the module's internal practice pages.

How To Use This Page​

  1. Finish the relevant concept page first.
  2. Attempt the drill from memory before consulting the source's answer.
  3. Keep a mistake log with tags such as command-disguised-as-event, published-before-commit, missing-dedup, hot-partition, choreography-too-complex, CQRS-overkill.
  4. Prefer designing in ASCII or mermaid so you can review your old sketches.

Lane 1: Event Modeling (Cluster 1)​

Use this lane when your main gap is what an event is and how to name one.

Design exercises (paper or whiteboard)​

  • Pick three CRUD APIs you know (e.g., GitHub's repo API, Slack's message API, Stripe's charge API). For each, list 10 endpoints and rewrite each as either a command, an event, or a query.
  • Pick one domain you know well. Do a solo "event storming": 20 events in 20 minutes, sticky-note style, then trim and rename.
  • Take any "event payload" from a real system (webhook from Stripe, GitHub, Slack) and apply Concept 01's checklist. Does it pass?

Optional reading-paired drills​

Target outcomes:

  • 30 events named correctly in past tense across 3 domains
  • 5 cases of a "command disguised as event" identified and corrected
  • 1 event storming session completed end-to-end

Lane 2: Messaging Mechanics and Outbox (Cluster 2)​

Hands-on implementation katas​

Use a local Docker setup (Kafka + Postgres) or a hosted sandbox.

  • Kafka 101 from Confluent Developer: Apache Kafka 101 -- work through the producer, consumer, and topic exercises.
  • Outbox in Postgres + Kafka: implement the outbox pattern end-to-end; write 50 orders through the service, crash the relay mid-batch, restart, verify no event is lost or duplicated (consumer-side dedup).
  • Debezium hands-on: follow the Debezium tutorial to point CDC at a Postgres outbox table.

Design drills​

  • Design a queue + DLQ topology for an image-processing service under a load spike. Specify visibility timeout, max receive count, DLQ disposition.
  • Design a topic partitioning strategy for a payments system handling 50k TPS with 3 downstream consumer groups.

Target outcomes:

  • 1 working outbox implementation on your machine
  • 5 broker design drills with justified partitioning and retention
  • 1 DLQ triage runbook written for a fictional on-call engineer

Lane 3: Workflow, Sagas, and Idempotency (Cluster 4)​

Orchestration platforms​

  • Temporal tutorial: learn.temporal.io -- implement the "money transfer" workflow tutorial end to end. It is the best single saga exercise.
  • AWS Step Functions: Getting started -- implement the same money transfer as a state machine.

Saga design drills​

  • Design a saga for: a travel booking (flight + hotel + car), a loan approval with credit check + underwriting + funding, or a software onboarding with trial-to-paid conversion.
  • For each: list steps, compensations, terminal states, non-compensatable steps, correlation IDs, observability.

Idempotency drills​

  • Take a real integration you have built that calls an external API. Redesign the retry path with an idempotency key and describe the behavior under every combination of (first call succeeds/fails) × (retry reaches service/fails).

Target outcomes:

  • 1 complete Temporal or Step Functions implementation
  • 3 saga designs with full compensation stories
  • 2 redesigned non-idempotent consumers with dedup + idempotency keys

Lane 4: Event Sourcing, Projections, CQRS (Cluster 5)​

Implementation-oriented​

  • Marten on Postgres (C# / .NET) or EventStoreDB or Axon (Java): implement a small event-sourced aggregate (a shopping cart, a support ticket). Fold events to compute state; persist; replay.
  • Build a projection: over the same event stream, build two read models -- one denormalized table, one search index. Reset the consumer offset to zero and rebuild both.

Reading-paired drills​

Target outcomes:

  • 1 event-sourced aggregate with snapshot support
  • 2 projections from the same stream, one rebuilt from offset zero
  • 4 CQRS decisions written up with defenses

Lane 5: System Design Interview Drills​

Apply this module under interview pressure.

Classic prompts​

  • "Design a ticketing system" (Ticketmaster, Resy) -- expect to discuss: orders, inventory, reservations, sagas, idempotency, CQRS for the browse side.
  • "Design a chat system" (WhatsApp, Slack) -- messages as events, delivery semantics, fan-out, read models for conversations.
  • "Design a ride-dispatch system" (Uber) -- driver state, trip state, events across surge pricing and dispatch, long-running saga for a trip.
  • "Design a payments platform" (Stripe) -- idempotency is table stakes, event sourcing for the ledger, outbox pattern for webhooks.
  • "Design a real-time analytics pipeline" -- Kafka, stream processing, projections for dashboards.

Where to find more​

Target outcomes:

  • 3 full system design sketches with event-driven components justified
  • 1 whiteboard-timed (60 min) end-to-end design
  • 1 mistake log entry per interview attempt with the specific thing you forgot

Self-Curated Problem Set​

Build a custom set with these minimums:

  • 5 events modeled cleanly (past tense, minimum metadata, two plausible consumers each)
  • 3 messaging-pattern decisions (queue vs topic, notification vs ECST) with written justification
  • 1 full outbox implementation or detailed sketch
  • 1 Kafka topic design with partitioning, keying, retention, and replication decisions
  • 2 full sagas (1 choreographed, 1 orchestrated) including compensations
  • 2 non-idempotent consumers redesigned
  • 3 CQRS yes/no/partial decisions with defense

Completion Checklist​

  • Completed at least one lane in full
  • Retained actual mistakes, their evidence and corrections; if none occurred, label a deliberately faulty example and show how to detect it. No minimum personal-error count.
  • Wrote at least 5 full sentence-form event/command/query justifications
  • Implemented at least one outbox or Temporal workflow locally
  • Drew at least one saga on a whiteboard under a 20-minute timer
  • Defended at least 3 CQRS decisions for real or realistic scenarios