Lesson 1 of 8 · 55 min
What production FE ownership means
Reframe from ticket-shipper to surface owner: eight production dimensions, ownership receipt, failure at 100k users, interview format map, staff archetypes, and the senior scoring rubric for the whole track.
Ticket-shipper → surface owner
Ownership vs authorship
- 01Code I own — I merge, I watch RUM, I get paged (or own the flag).
- 02Code I share — design-system primitives, shared hooks; I review and depreciate carefully.
- 03Code I observe — adjacent surfaces whose regressions hit my users; senior signal is moving into this circle before you are asked.
Key idea
The production stack — eight dimensions
- 01Rendering model — CSR / SSR / SSG / ISR / RSC / streaming / PPR: what ships HTML, what hydrates, where the client boundary is.
- 02State design — server cache · URL · local component · global UI. One source of truth per concern.
- 03Data contracts — fetch, cache keys, invalidation, optimistic updates, error/empty/loading UX.
- 04Performance — LCP / INP / CLS budgets at the 75th percentile of real users, not just lab Lighthouse.
- 05Accessibility — keyboard, focus, semantics, WCAG 2.2 AA as architecture, not a late checklist.
- 06Design system — tokens, composition primitives, deprecation, Storybook + visual/a11y gates.
- 07Observability — RUM (web-vitals), client errors, feature flags, FE error budget.
- 08Release — canary, rollback, on-call runbook, who owns the incident at 2am.
Key idea
Definition of done — rewrite the PR checklist
1SURFACE DONE CHECKLIST (say this out loud)23[ ] Happy path + empty + loading + error + offline sketched4[ ] State bucket map: which data is server/URL/local/global5[ ] Perf: LCP element named; INP hot path known; CLS sources listed6[ ] A11y: keyboard path, focus order, SR labels, target size ≥24px7[ ] Observability: error boundary + RUM mark + flag kill-switch8[ ] Release: flag default, canary plan, rollback owner9[ ] Docs: Storybook or design-system note if pattern is reusable1011### Ownership receipt (PR template)12Risk surface: user-visible? bundle delta? new dep? hydration/a11y risk?13Observability: metric page_view vs LCP p75; alert error_rate >1% 5m14Rollback: revert commit / set FLAG_X=false15Tech debt created: TODO(issue#): ...Common mistake
“Frontend ownership is just CSS and React components.”
Production failure modes (what seniors prevent)
- 01Silent a11y regression in modal — no focus return contract. Fix: trap + ESC + restore in DS Dialog; Chromatic a11y story.
- 02Bundle bloat after refactor — no size limit per route. Fix: next-bundle-analyzer in CI; fail PR at +5kb on critical routes.
- 03Hydration drift after deploy — Date/random in render tree. Fix: deterministic first paint; client-only island for live clocks.
- 04Works-on-my-machine flag mismatch — .env.local vs prod env. Fix: single env loader + staging parity on previews.
- 05Tribal CSS — no tokens. Fix: design tokens + stylelint; ban raw hex in features.
Failure at 100k users — think in modes
- 01Network — retries double traffic; missing AbortController piles in-flight requests; optimistic UI desyncs.
- 02Performance — main-thread work that was fine in lab fails INP on mid-tier phones; images without size attributes destroy CLS.
- 03State — multi-tab cart drift; stale React Query keys; duplicate websocket connections per remount.
- 04A11y — custom widgets without keyboard trap users; live regions announce spam on every token stream.
- 05Ops — no RUM → you debug from screenshots; no flag → bad deploy stays up for hours.
Spec ambiguity ladder
Demo shape: customer feedback widget
1// Ownership walkthrough while building FeedbackWidget2// 1. Components: button group + optional comment + toast3// 2. A11y: role=group, labelled buttons, focus after submit4// 3. State: local UI only; submit via mutation (server cache not needed)5// 4. Errors: ErrorBoundary around widget; toast on 5xx; don't crash page6// 5. Perf: dynamic-import the comment form (rarely opened)7// 6. RUM: mark 'feedback_submit' duration; count success/fail8// 7. Release: feature flag feedback_v2; kill-switch if spam spikes910function FeedbackWidget({ pageId }: { pageId: string }) {11 const [status, setStatus] = useState<'idle'|'sending'|'done'|'err'>('idle')12 // submit with AbortController + timeout; never leave buttons unlabelled13}Key idea
Interview format map (this track)
- 01Live UI coding (45–60m) — decompose, state, edge cases, polish. Drill in L3 + L8 machine-coding patterns.
- 02JS/TS + React/Next battery (30–45m) — mental model, hooks, RSC, App Router. Deep dive in L2.
- 03FE system design (45–60m) — chat, feed, autocomplete, dashboard, collab, PDP. L6–L7 full skeletons.
- 04Machine coding / take-home — working component with a11y + tests. Capstone in L8.
- 05Perf / a11y folded questions — increasingly standalone. L4–L5.
Five interview failure modes (red / green)
1RED → jump into code before requirements / NFRs2GREEN → 2–3 min scope: goals, users, constraints, NFRs, out-of-scope34RED → design API/DB first, UI last5GREEN → product surface → rendering/state → then API shape that serves UI67RED → ignore perf, a11y, security, resilience8GREEN → name NFRs early; revisit at the end with a budget910RED → Redux + microfrontends for a 5-screen CRUD11GREEN → simplest architecture that meets constraints; justify extras1213RED → wait for interviewer to drive every step14GREEN → own the agenda: clarify → design → dive deep → tradeoffs → risksCommon mistake
“If I code fast enough, architecture will sort itself out.”
Senior scoring rubric (carry this track-wide)
- 01Architecture & state (20%) — right rendering model; four state buckets; clear contracts.
- 02Performance & CWV (15%) — diagnose LCP/INP/CLS; fix with numbers, not vibes.
- 03TypeScript rigor (10%) — domain types, discriminated unions, narrow at boundaries.
- 04Accessibility (15%) — WCAG 2.2 criteria by name; keyboard + SR semantics.
- 05Testing strategy (10%) — pyramid; know what not to test.
- 06Data fetching (10%) — cache keys, invalidation, optimistic + cancel.
- 07Observability & ownership (10%) — RUM, flags, rollback, on-call.
- 08Communication & product sense (10%) — clarify, drive, tradeoff out loud.
Behavioural ownership — one beat
Senior signals checklist (cohort rubric)
- 01I can describe my surface’s failure modes before someone asks.
- 02My PR description contains risk, telemetry, rollback, follow-ups.
- 03I open the next PR that fixes one of those follow-ups within a sprint.
- 04I write the RFC before the spike PR when ambiguity is neutral/negative.
- 05I have at least one owner-only metric (a dashboard panel) that I watch.
- 06I reframe a feature request into a job-to-be-done before scoping.
- 07I name a SLO before naming a UI control when stakes are high.
- 08I push back on PM with a budgeted alternative, not a naked “no”.
How this track is sequenced
How To Take Ownership — Will LarsonWill Larson / conference talkdocsStaff Engineer — Staff Archetypes (Will Larson)staffeng.comdocsweb-vitals — Core Web Vitals overviewweb.devdocsWCAG 2.2 RecommendationW3CdocsReact — Thinking in Reactreact.devdocsArchitecture Decision Records (templates)GitHubCheckpoint
An interviewer asks: “How do you know a UI feature is done?” Which answer scores senior?
Checkpoint
You are designing a feedback widget for a high-traffic docs site. What is the strongest ownership move for release safety?
Checkpoint
In a FE system design round you jump into API schemas before discussing rendering or state. What failure mode is that?
Checkpoint
At ~100k sessions, which class of issue most often surprises teams that only tested on desktop Chrome?
Checkpoint
Which statement best captures the senior FE job vs mid-level?
Can you narrate the eight production dimensions and a definition of done without notes?
Takeaways
- Senior FE = own a surface: rendering, state, data, perf, a11y, design system, observability, release.
- Definition of done includes budgets, a11y path, error UX, RUM, and rollback — not just green tests.
- Scale surfaces network races, INP on real devices, multi-tab state, and ops gaps lab hides.
- Five red flags: code-first, backend-first, ignore NFRs, over-engineer, don't drive.
- Self-score with the eight-dimension rubric after every mock this track.
Next: React + Next.js interview battery — the mental model and 40+ questions that actually show up.
Sources
Free to read · better with Enzo
Learn it with Enzo
Save your progress, answer the checkpoints, and let Enzo quiz you on what you just read.