Skip to content

Stage 2 — Project 1: SaaS Landing + Blog + Newsletter

Triết lý cốt lõi: Product thinking + System constraint.
Mỗi War Story có 2 options thực sự, trade-off đau. A11y không phải checklist, là user constraint.

Phase: BRIDGE (20:80 | 40:60 | 50:50)
Teaching Model: 40% Teaching / 60% Questioning
Deliverable: 1 SaaS Landing + Blog + Newsletter live, WCAG 2.1 AA, INP < 200ms, Lighthouse > 90, CI/CD, Sentry, auth, PWA + 2 Decision Records

Mục tiêu

Áp dụng nền tảng vào product, bắt đầu chịu trách nhiệm decision. Không chỉ "làm feature", mà hiểu tại sao làm feature đó theo cách này.

  • Product thinking: Mỗi quyết định kỹ thuật có user impact và business impact.
  • System constraint: A11y, performance, security không phải "bonus", là requirement.
  • War Story: Mỗi module có tình huống thực tế với 2 options đều khả thi, trade-off đau.
  • Staff Lens: Bắt đầu review code ở mức "bảo vệ kiến trúc", không chỉ tìm bug.

Tại sao Stage 2 tồn tại

  • Bối cảnh thực tế: Junior code xong feature nhưng không nghĩ đến screen reader, không test race condition, không đo INP. Staff phải "sửa sau".
  • Hậu quả nếu bỏ qua: Bạn sẽ viết code "chạy được" nhưng không production-ready. Không hiểu tại sao INP cao, tại sao form bị race condition, tại sao deploy lỗi không rollback được.
  • Output của Stage 2: 1 product live, measurable (Lighthouse, INP, coverage), với CI/CD, monitoring, và khả năng viết DR cho trade-off thực tế.

Danh sách module

React Core & Performance

ModuleNội dungMức độPhaseStatus
2.1.1 React Core: Fiber & ReconciliationFiber architecture, Reconciliation, Render vs Commit, React 19FoundationBRIDGE
2.1.2 React Performance: MemoizationuseMemo, useCallback, React.memo, Profiler, React CompilerApplicationBRIDGE

Next.js App Router

ModuleNội dungMức độPhaseStatus
2.2.1 Next.js App Router & RSCFile-based routing, Server vs Client Component, Hydration mismatchFoundationBRIDGE
2.2.2 Next.js Caching Strategy4 loại cache, revalidatePath vs revalidateTag, ISRApplicationBRIDGE

CSS & UI

ModuleNội dungMức độPhaseStatus
2.3.1 CSS Modern & Tailwind ConfigTailwind config, Container Queries, :has(), size-adjust, CLSFoundationBRIDGE
2.3.2 shadcn/ui & Component PatternsRadix Primitives, Compound Components, cn() utilityApplicationBRIDGE

Accessibility

ModuleNội dungMức độPhaseStatus
2.4.1 Accessibility FundamentalsWCAG 2.1/2.2 AA, Semantic HTML, <button> vs <a>, Form labelsFoundationBRIDGE
2.4.2 Accessibility Advanced — Keyboard & Screen ReaderRoving tabindex, Focus trap, Screen reader, prefers-reduced-motionApplicationBRIDGE

Animation

ModuleNội dungMức độPhaseStatus
2.5.1 CSS Transitions & FLIPCSS Transitions, FLIP technique, will-change, prefers-reduced-motionFoundationBRIDGE
2.5.2 Framer Motion & View TransitionsAnimatePresence, layoutId, View Transitions APIApplicationBRIDGE

Mobile Web

ModuleNội dungMức độPhaseStatus
2.6.1 Mobile Web FundamentalsViewport, Safe area, Touch Events, Responsive ImagesFoundationBRIDGE
2.6.2 Mobile Web Advanced — Keyboard & GestureVirtual Keyboard, Passive listeners, content-visibility, INPApplicationBRIDGE

SEO & i18n

ModuleNội dungMức độPhaseStatus
2.7 SEO Technical + i18nMeta tags, JSON-LD, Sitemap, next-intl, locale routingApplicationBRIDGE

Form Engineering

ModuleNội dungMức độPhaseStatus
2.8.1 Form Engineering with react-hook-formRHF + Zod + Server Action, Cross-field validation, aria-invalidFoundationBRIDGE
2.8.2 Form Advanced — Auto-save & Race ConditionAuto-save draft, Race condition, Optimistic update, Progressive enhancementApplicationBRIDGE

Security

ModuleNội dungMức độPhaseStatus
2.9.1 Browser Security — SOP & iframeSame Origin Policy, iframe sandbox, CSP, COOP/COEPFoundationBRIDGE
2.9.2 Frontend Security — XSS & CSRFXSS types, DOMPurify, SameSite cookie, Trusted TypesApplicationBRIDGE

Auth

ModuleNội dungMức độPhaseStatus
2.11.1 Auth Fundamentals — Session & JWTSession vs JWT, Cookie attributes, Token storage, LogoutFoundationBRIDGE
2.11.2 Auth Advanced — PKCE & Refresh TokenRefresh Token Rotation, PKCE, Silent Refresh, Multi-tab syncApplicationBRIDGE

Testing

ModuleNội dungMức độPhaseStatus
2.12.1 Testing FundamentalsVitest + Testing Library, userEvent, Query priority, MockFoundationBRIDGE
2.12.2 Testing Advanced — Async & IntegrationwaitFor, MSW, Playwright E2E, Race condition testApplicationBRIDGE

Performance & Observability

ModuleNội dungMức độPhaseStatus
2.13.1 Core Web Vitals & Performance BudgetLCP, INP, CLS, size-limit, Lighthouse budgetFoundationBRIDGE
2.13.2 LoAF API & Real-world MeasurementLoAF API, web-vitals, Lighthouse CI, RUM vs lab dataApplicationBRIDGE

CI/CD & Deploy

ModuleNội dungMức độPhaseStatus
2.14.1 CI/CD FundamentalsGitHub Actions, Caching, Artifact, Environment secretsFoundationBRIDGE
2.14.2 Preview Deploy & ChangesetsPreview URL, Semantic Versioning, Changesets, Bundle size checkApplicationBRIDGE
2.15.1 Deploy & Custom DomainVercel deploy, Custom domain, Cloudflare, Environment parityFoundationBRIDGE
2.15.2 Observability Nền tảngSentry, Source map, Health check, Error classificationApplicationBRIDGE

Operations & Architecture

ModuleNội dungMức độPhaseStatus
2.16.1 Incident Response & On-call RunbookStaff lead incident. Incident response flow, Runbook, On-callApplicationBRIDGE
2.16.2 Feature Flags as Architecture GuardrailsDùng FF để bảo vệ kiến trúc, không chỉ release. Dark Launch, Kill SwitchApplicationBRIDGE

Stage 2 Staff Checkpoint

Tự đánh giá trước khi sang Stage 3. Nếu trả lời "Không" ở bất kỳ câu nào, quay lại module tương ứng.

#Câu hỏiModule
1Tôi có giải thích được Fiber architecture cho Junior không? (không dumbing down)2.1.1
2Tôi có viết được 1 Decision Record cho trade-off thực tế không? (ví dụ: A11y fix phá animation)2.4.1, 2.5.1
3Tôi có tính được cost impact của INP > 200ms không? (business metric)2.13.1
4Tôi có lead được 1 mock incident với runbook không?2.16.1
5Tôi có review code ở mức "bảo vệ kiến trúc" không? (không chỉ tìm bug)2.16.2
6Tôi có thiết kế được feature flag strategy cho 1 feature không?2.16.2

Nguyên tắc vàng

  • A11y = constraint, không phải checklist: Nếu component không dùng được bằng keyboard, chưa merge.
  • Performance = measurable: Không nói "nhanh hơn", mà nói "INP giảm từ 280ms xuống 150ms". Không có metric = không biết có improve không.
  • Mỗi War Story có 2 options đều khả thi: Không có đáp án "đúng" duy nhất. Có trade-off, có cost, có user impact.