Menu

Earn Premium with Referrals

Invite your friends and earn Premium rewards through our referral program.

See how it works and start inviting friends.

Scope Control
HLD

Scope Control

Drawing the line before it draws you — in/out lists, deferral seams, and protecting design depth from breadth traps.

The Invisible Killer

Designs rarely fail from hard problems; they fail from unbounded ones. Every system connects to everything — auth, notifications, analytics, fraud, chat — and each connection is a rabbit hole. Scope control is deciding in advance where exploration stops.

 THE BREADTH TRAP

 prompt: "design ride matching"
   └─► "well, riders need accounts..."          ← auth rabbit hole
         └─► "...with password reset flows"      ← deeper
               └─► "...and OAuth providers"       ← 20 minutes gone
                     └─► matching never drawn

 THE SCOPED PATH
 "auth exists; I'll treat it as an identity service returning a
  trusted user ID — focusing today on matching."

The In/Out Ledger

Write the boundary down. Unwritten scope re-enters by accident:

In scope (v1)Out of scope (v1)
Request → match → trip → payment spineCarpooling, scheduled rides
Rider + driver apps as clientsDriver incentive engine
Card-on-file payment via PSPWallets, split fares, regional methods
Basic ratingsIn-app chat (SMS fallback assumed)

Two properties of a good ledger: every Out has a one-line reason, and the ledger is visible during the whole design so drift gets caught live.

Deferral Seams: Cheap Insurance for Later

Out-of-scope does not mean unanticipated. A seam costs minutes now:

 PaymentSpine v1:            the seam:
 client → TripService        interface PaymentProvider {
 → PaymentProvider             charge(tripId, amount): Receipt
 (single impl: StripeAdapter)  refund(receiptId)
                             }
                             later wallets/regional PSPs plug in
                             behind the same interface — no redesign

The test of a proper deferral: when the deferred feature arrives, it adds a box, not a rewrite.

Time-Boxed Depth Allocation

Scope control extends inside each kept component — decide depth before diving:

 MATCHING SERVICE (in scope, core):
   deep-dive: geo-index + match algorithm     ← the interesting part
   
 PAYMENTS (in scope, but commodity):
   shallow: call PSP, idempotency keys, done  ← don't reinvent Stripe

 HISTORY (should-tier):
   one line: replicas + cache                 ← move on

Depth follows risk and differentiation, not familiarity.

When Scope Creep Arrives Anyway

Mid-design additions (“can we also support…”) get the three-way response:

  1. Park: add to ledger’s Out column with reason.
  2. Trade: allowed only if something of equal weight leaves.
  3. Seam-check: if trivial to note an attachment point, do so and continue.

Interview Framing

Interviewers inject scope tests deliberately: vague prompts, mid-design feature drops. The scoring behavior is verbal fencing — “that’s out of scope v1; here’s the seam it would attach to” — then immediate return to the core flow. Candidates who chase every branch run out of clock with no architecture; the discipline of returning IS the seniority signal.

My Private Notes

Notes are auto-saved locally to this device.