Web Development Learning Roadmap
Master modern web development from internet fundamentals to full-stack deployment — a comprehensive roadmap covering 150+ topics
Duration: 44 weeks | 11 steps | 117 topics
Career Opportunities
- Frontend Developer
- Full Stack Developer
- UI/UX Developer
- JavaScript Engineer
- React Developer
- Next.js Developer
- Web Performance Engineer
- DevOps Engineer
Step 1: Internet Fundamentals
Understand how the web works before building on it — protocols, DNS, browsers, and hosting
Time: 2 weeks | Level: beginner
- How the Internet Works (required) — Understand the physical and logical infrastructure — ISPs, routers, packets, and the client-server model
- The internet is a network of networks connected via routers and ISPs
- Data travels in packets using the TCP/IP protocol stack
- Clients (browsers) request resources from servers
- HTTP & HTTPS (required) — The protocol that powers the web — request/response cycle, methods, status codes, and TLS encryption
- HTTP uses methods (GET, POST, PUT, DELETE) to interact with resources
- Status codes (200, 301, 404, 500) communicate outcomes
- HTTPS adds TLS encryption for security
- Domain Names & DNS (required) — How human-readable domains are translated to IP addresses via the Domain Name System
- DNS resolves domain names (google.com) to IP addresses
- DNS records include A, CNAME, MX, and TXT types
- Domain registrars manage domain ownership
- How Browsers Work (required) — The rendering pipeline — parsing HTML, building the DOM, CSSOM, layout, paint, and compositing
- Browsers parse HTML into a DOM tree and CSS into a CSSOM
- The render tree combines DOM + CSSOM for layout and paint
- JavaScript can block rendering — script placement matters
- Web Hosting Basics (required) — Types of hosting — shared, VPS, cloud, and static hosting platforms like Vercel and Netlify
- Static sites can be hosted free on Vercel, Netlify, or GitHub Pages
- Dynamic apps need server hosting (VPS, cloud platforms)
- Understand the difference between shared, VPS, and cloud hosting
- TCP/IP & Network Layers (recommended) — The protocol suite that powers internet communication — transport, network, and application layers
- TCP ensures reliable, ordered data delivery
- IP handles addressing and routing of packets
- UDP provides faster but unreliable transport (used in video/gaming)
- CDNs (Content Delivery Networks) (recommended) — How CDNs cache and distribute content across global edge servers to reduce latency
- CDNs serve static assets from servers geographically close to users
- Reduces latency and server load significantly
- Popular CDNs: Cloudflare, AWS CloudFront, Fastly
- What are APIs? (optional) — Understanding Application Programming Interfaces — REST, endpoints, and how frontends talk to backends
- APIs define how software components communicate
- REST APIs use HTTP methods on URL endpoints
- APIs return data in JSON or XML format
Step 2: HTML
The backbone of every webpage — semantic structure, forms, multimedia, and accessibility
Time: 3 weeks | Level: beginner
- Semantic HTML5 Elements (required) — Use header, nav, main, section, article, aside, footer for meaningful document structure
- Use semantic tags to convey meaning, not just <div> for everything
- Semantic HTML improves SEO, accessibility, and maintainability
- Use <main> once per page, <section> for thematic groups, <article> for self-contained content
- Forms & Input Types (required) — Form elements, input types (text, email, date, range), validation attributes, and form submission
- Use appropriate input types for built-in validation and mobile keyboards
- Use required, pattern, minlength, maxlength for validation
- Always associate labels with inputs using the for attribute
- Tables, Lists & Structure (required) — Ordered/unordered lists, description lists, and accessible data tables with proper headers
- Use <table> for tabular data only, never for layout
- Use <thead>, <tbody>, <th> with scope for accessible tables
- Choose <ul>, <ol>, or <dl> based on content semantics
- Links & Navigation (required) — Anchor tags, relative vs absolute URLs, navigation patterns, and link accessibility
- Use descriptive link text — never 'click here'
- Understand relative, absolute, and fragment URLs
- Use target='_blank' with rel='noopener noreferrer' for security
- Images, Video & Audio (required) — Embedding media with <img>, <video>, <audio>, responsive images with srcset, and lazy loading
- Always provide alt text for images for accessibility
- Use srcset and sizes for responsive images
- Use loading='lazy' for images below the fold
- SEO & Meta Tags (required) — Title tags, meta descriptions, Open Graph tags, structured data, and search engine optimization basics
- Every page needs a unique <title> and <meta description>
- Open Graph tags control social media sharing previews
- Use heading hierarchy (h1 → h6) correctly for SEO
- Accessibility (a11y) (required) — ARIA roles, screen reader compatibility, focus management, keyboard navigation, and WCAG guidelines
- Use native HTML elements before reaching for ARIA
- Ensure all interactive elements are keyboard-navigable
- Maintain 4.5:1 color contrast ratio (WCAG AA)
- Test with screen readers (VoiceOver, NVDA)
- HTML Best Practices (recommended) — Document structure, doctype, charset, viewport meta, and writing clean, maintainable HTML
- Always declare <!DOCTYPE html> and charset UTF-8
- Include the viewport meta tag for responsive design
- Keep HTML semantic and minimal — avoid div soup
- HTML5 APIs (optional) — Canvas, Drag & Drop, Geolocation, Web Storage, and other native browser APIs exposed via HTML
- Canvas API enables 2D drawing and pixel manipulation
- Drag & Drop API provides native drag interactions
- Geolocation API accesses user location (with permission)
Step 3: CSS
Style and layout the web — from box model to Grid, responsive design, animations, and modern CSS architecture
Time: 4 weeks | Level: beginner
- Selectors & Specificity (required) — Element, class, ID, attribute, pseudo-class, pseudo-element selectors and specificity calculation
- Specificity is calculated as (ID, Class, Element) — higher wins
- Combinators: descendant, child (>), adjacent (+), general (~)
- Avoid !important — fix specificity issues instead
- Box Model (required) — Content, padding, border, margin, box-sizing, and understanding how elements take up space
- Use box-sizing: border-box universally
- Margin collapses vertically between adjacent elements
- Padding adds space inside the border, margin adds space outside
- Display & Positioning (required) — Block, inline, inline-block, none, static, relative, absolute, fixed, and sticky positioning
- position: relative creates a positioning context for children
- position: absolute removes element from flow, positions relative to nearest positioned ancestor
- position: sticky toggles between relative and fixed based on scroll
- Flexbox Layout (required) — One-dimensional layout — flex containers, items, alignment, wrapping, ordering, and gap
- justify-content controls main-axis, align-items controls cross-axis
- flex: 1 makes items grow equally to fill space
- Use gap instead of margins for consistent spacing
- CSS Grid Layout (required) — Two-dimensional layout — grid templates, areas, auto-placement, minmax(), repeat(), and responsive grids
- Use grid-template-areas for readable, named layouts
- auto-fill + minmax() creates responsive grids without media queries
- Grid is for 2D layouts, Flexbox for 1D — use both
- Responsive Design (required) — Mobile-first approach, media queries, viewport units, fluid typography, and breakpoint strategy
- Start mobile-first with min-width media queries
- Use relative units (rem, em, %, vw) instead of px
- Set the viewport meta tag for proper mobile rendering
- Colors & Backgrounds (required) — Color formats (hex, rgb, hsl, oklch), gradients, background images, blend modes, and filters
- HSL is the most intuitive color format for adjustments
- Use CSS gradients (linear, radial, conic) for design effects
- oklch and color-mix() are the future of CSS color
- Typography & Web Fonts (required) — Font properties, web fonts, @font-face, variable fonts, and fluid typography with clamp()
- Use system font stacks for performance, web fonts for brand
- clamp() creates fluid font sizes without media queries
- Variable fonts reduce file size with adjustable weight/width
- CSS Custom Properties (required) — CSS variables (--var), theming, dark mode, and dynamic styling with custom properties
- Define variables on :root for global use
- Variables cascade and can be overridden per element
- Perfect for theming and dark/light mode switching
- Animations & Transitions (recommended) — CSS transitions, @keyframes animations, transform, timing functions, and performance considerations
- Only animate transform and opacity for 60fps performance
- Use transition for state changes, @keyframes for complex sequences
- will-change hints the browser to optimize specific properties
- CSS Architecture (BEM) (recommended) — BEM naming convention, organizing stylesheets, avoiding specificity wars, and scalable CSS strategies
- BEM uses Block__Element--Modifier naming for flat specificity
- Keep selectors shallow — avoid nesting beyond 2-3 levels
- Organize CSS by component, not by property type
- Sass / CSS Preprocessors (recommended) — Sass variables, nesting, mixins, partials, and when preprocessors are still useful
- Sass adds nesting, mixins, and partials to CSS workflows
- Modern CSS (variables, nesting) replaces many Sass features
- SCSS syntax is most popular — looks like regular CSS
- Tailwind CSS (recommended) — Utility-first CSS framework — classes, customization, responsive variants, and component extraction
- Utility classes compose directly in HTML — no context switching
- Customize via tailwind.config for brand colors, fonts, spacing
- Extract repeated patterns into components, not @apply
- Container Queries (optional) — Style components based on their container size instead of viewport — the future of responsive components
- Use container-type: inline-size on a parent to enable queries
- @container queries style children based on parent width
- Enables truly reusable responsive components
Step 4: JavaScript
The programming language of the web — from variables and functions to async programming and the DOM
Time: 6 weeks | Level: intermediate
- Variables & Data Types (required) — let, const, var — strings, numbers, booleans, null, undefined, symbols, and type coercion
- Use const by default, let when reassignment is needed, never var
- Understand primitive vs reference types
- Know type coercion rules (== vs ===)
- Functions & Scope (required) — Function declarations, expressions, arrow functions, parameters, closures, and lexical scope
- Arrow functions don't have their own 'this' binding
- Closures capture variables from their outer scope
- Use default parameters and rest/spread syntax
- Control Flow & Loops (required) — if/else, switch, ternary, for, while, for...of, for...in, and iteration patterns
- Use for...of for arrays, for...in for object keys
- Optional chaining (?.) and nullish coalescing (??) reduce verbosity
- Prefer array methods (.map, .filter) over manual loops
- Arrays & Array Methods (required) — map, filter, reduce, find, some, every, flat, spread, destructuring — functional array operations
- map() transforms, filter() selects, reduce() accumulates
- Use destructuring for clean variable extraction
- Spread [...arr] creates shallow copies
- Objects & Prototypes (required) — Object literals, methods, this, prototype chain, classes, inheritance, and object destructuring
- Objects are collections of key-value pairs
- The prototype chain powers JavaScript inheritance
- Classes are syntactic sugar over prototypes
- DOM Manipulation (required) — Selecting elements, modifying content and styles, creating/removing nodes, and traversing the DOM tree
- querySelector and querySelectorAll select elements with CSS selectors
- Use textContent over innerHTML for security (XSS prevention)
- createElement + appendChild for dynamic content creation
- Events & Event Handling (required) — addEventListener, event bubbling/capturing, delegation, preventDefault, and custom events
- Use addEventListener instead of inline event handlers
- Event delegation handles events on dynamic/many child elements efficiently
- Events bubble up — stopPropagation() and preventDefault() control flow
- ES6+ Modern Features (required) — Template literals, destructuring, spread/rest, modules, optional chaining, nullish coalescing, and more
- Template literals enable string interpolation and multi-line strings
- Destructuring extracts values from arrays/objects concisely
- Optional chaining (?.) safely accesses nested properties
- Async JavaScript (required) — Callbacks, Promises, async/await, Promise.all, error handling, and the event loop
- Promises represent eventual completion or failure of async operations
- async/await is syntactic sugar that makes async code look synchronous
- Use Promise.all() for parallel async operations
- Error Handling & Debugging (required) — try/catch/finally, custom errors, debugging with DevTools, breakpoints, and console methods
- Always catch errors in async code (try/catch or .catch())
- Use the DevTools debugger — breakpoints beat console.log
- Create custom Error classes for domain-specific errors
- Fetch API & HTTP Requests (recommended) — Making HTTP requests with fetch(), handling responses, headers, CORS, and working with JSON
- fetch() returns a Promise — always check response.ok
- Use response.json() to parse JSON bodies
- Understand CORS and why browsers block cross-origin requests
- Web Storage & Browser APIs (recommended) — localStorage, sessionStorage, IndexedDB, and other browser storage mechanisms
- localStorage persists across sessions, sessionStorage clears on tab close
- Store only strings — use JSON.stringify/parse for objects
- IndexedDB for larger, structured data storage
- Modules & Import/Export (recommended) — ES modules, named/default exports, dynamic imports, and module bundling concepts
- Use named exports for multiple values, default for main export
- Dynamic import() enables code splitting and lazy loading
- Modules have their own scope — no global pollution
- Regular Expressions (optional) — Pattern matching, character classes, quantifiers, groups, and practical regex for validation
- Use regex for validation (email, phone) and search/replace
- Test patterns interactively at regex101.com
- Named groups (?<name>) improve readability
- Functional Programming (optional) — Pure functions, immutability, composition, higher-order functions, and declarative patterns
- Pure functions have no side effects and return consistent outputs
- Immutability prevents bugs from shared mutable state
- Compose small functions instead of writing monolithic ones
Step 5: Version Control & Tooling
Git, GitHub, package managers, linters, and build tools — the professional developer toolkit
Time: 2 weeks | Level: intermediate
- Git Basics (required) — init, add, commit, status, log, diff — the core workflow of tracking changes locally
- Stage changes with git add, snapshot them with git commit
- Write clear, descriptive commit messages
- Use git log and git diff to review history and changes
- Branching & Merging (required) — Create branches for features, merge strategies, resolving conflicts, and rebasing
- Branches isolate feature work from the main codebase
- Merge brings branches together — resolve conflicts carefully
- Rebase creates a cleaner linear history but rewrites commits
- GitHub & Pull Requests (required) — Remote repositories, push/pull, forking, pull requests, code review, and GitHub features
- Push local branches to GitHub and open Pull Requests for review
- PRs enable code review, discussion, and CI checks before merging
- Use Issues to track bugs and features
- npm & Package Management (required) — Installing packages, package.json, scripts, semantic versioning, and npm vs yarn vs pnpm
- package.json defines project dependencies and scripts
- Understand semantic versioning (^major.minor.patch)
- Use npm scripts for build, test, and dev workflows
- ESLint & Prettier (required) — Automated code linting and formatting — catch bugs and enforce consistent style
- ESLint catches bugs and enforces code quality rules
- Prettier auto-formats code — no more style debates
- Configure both to work together without conflicts
- Vite (Build Tool) (required) — Modern build tool with instant dev server, HMR, and optimized production builds using Rollup
- Vite uses native ES modules for instant dev server startup
- Hot Module Replacement (HMR) updates code without full reload
- Vite has replaced Webpack as the standard for new projects
- Git Workflows (recommended) — GitFlow, trunk-based development, feature branches, and team collaboration patterns
- Trunk-based development keeps branches short-lived
- Feature branches isolate work until ready for review
- Choose a workflow that matches your team size and release cadence
- GitHub Actions (CI/CD) (optional) — Automated workflows for testing, building, and deploying code on every push or PR
- Workflows run on events (push, PR) defined in YAML files
- Automate tests, linting, and deployment on every commit
- Use marketplace actions for common tasks
Step 6: TypeScript
Add static types to JavaScript — catch bugs at compile time, improve DX, and write more maintainable code
Time: 3 weeks | Level: intermediate
- Types & Interfaces (required) — Defining shapes with type aliases and interfaces — when to use each and how they differ
- Use interfaces for object shapes (extendable), types for unions/intersections
- Both define contracts that TypeScript enforces at compile time
- Prefer interfaces for public APIs — they produce better error messages
- Type Inference & Annotations (required) — How TypeScript infers types automatically and when you need to add explicit annotations
- TypeScript infers types from initial values — don't annotate the obvious
- Annotate function parameters and return types for clarity
- Use 'as const' for literal type narrowing
- Generics (required) — Write reusable, type-safe functions and components that work with any type
- Generics parameterize types — like function arguments but for types
- Use constraints (extends) to limit what types are accepted
- Generic components in React accept flexible prop types
- Union & Intersection Types (required) — Combine types with | (union) and & (intersection) for flexible, precise type definitions
- Union types (A | B) accept either type — narrow with type guards
- Intersection types (A & B) combine all properties from both types
- Discriminated unions use a shared literal field for safe narrowing
- Utility Types (required) — Partial, Required, Pick, Omit, Record, Exclude, ReturnType and other built-in type helpers
- Partial<T> makes all properties optional — great for update functions
- Pick<T, K> and Omit<T, K> extract or exclude specific properties
- Record<K, V> creates an object type with known key and value types
- Type Guards & Narrowing (required) — typeof, instanceof, in operator, custom type predicates, and exhaustive checking with never
- Type guards narrow union types within conditional blocks
- Custom type predicates (is keyword) create reusable guards
- Exhaustive checks with never ensure all cases are handled
- Enums & Literal Types (recommended) — String/numeric enums, const enums, literal types, and when to use each approach
- Prefer string literal unions ('a' | 'b') over enums for simplicity
- const enums are inlined at compile time — zero runtime cost
- Use enums when you need reverse mapping or computed values
- tsconfig & Project Setup (recommended) — Configuring strict mode, module resolution, paths, and common compiler options
- Enable strict mode for maximum type safety
- Configure path aliases (@/) for clean imports
- Understand module vs moduleResolution options
- Advanced Patterns (optional) — Conditional types, mapped types, template literal types, and infer keyword for type-level programming
- Conditional types (T extends U ? X : Y) enable type-level logic
- Mapped types transform existing types property by property
- Template literal types construct string types dynamically
Step 7: React
The most popular UI library — components, hooks, state management, routing, and modern React patterns
Time: 8 weeks | Level: advanced
- JSX & Components (required) — JSX syntax, function components, component composition, and thinking in components
- Components are functions that return JSX (UI description)
- JSX is syntactic sugar for React.createElement calls
- Components must return a single root element (use fragments <>)
- Props & State (required) — Passing data with props, managing local state with useState, and understanding re-rendering
- Props flow down (parent → child), state is local to a component
- setState triggers a re-render with the new state value
- Never mutate state directly — always create new references
- Core Hooks (required) — useState, useEffect, useRef, useMemo, useCallback — the essential hooks API
- useEffect handles side effects (data fetching, subscriptions, DOM)
- useRef persists values across renders without causing re-renders
- Hooks must be called at the top level — never inside conditions or loops
- Rendering & Lifecycle (required) — How React renders, commit phase, reconciliation, keys, and understanding when components re-render
- React re-renders when state changes or parent re-renders
- Keys help React identify which list items changed
- The virtual DOM diffs minimize actual DOM updates
- React Router (required) — Client-side routing — routes, nested layouts, dynamic parameters, navigation, and loaders
- Define routes declaratively with Route components or objects
- useParams() extracts dynamic URL segments
- Nested routes enable shared layouts across pages
- Forms & Controlled Components (required) — Controlled vs uncontrolled inputs, form handling, validation, and form libraries (React Hook Form)
- Controlled inputs have their value driven by React state
- React Hook Form reduces re-renders with uncontrolled refs internally
- Use Zod or Yup with form libraries for schema validation
- Context API (required) — Share state across the component tree without prop drilling — createContext, Provider, useContext
- Context avoids prop drilling for global data (theme, auth, locale)
- Context changes re-render ALL consumers — don't overuse it
- Split contexts by domain to minimize unnecessary re-renders
- Custom Hooks (required) — Extract and share stateful logic across components with reusable custom hooks
- Custom hooks encapsulate reusable stateful logic (useLocalStorage, useFetch)
- Name custom hooks with 'use' prefix — enables linting rules
- Hooks compose — build complex hooks from simpler ones
- State Management (recommended) — When Context isn't enough — Redux Toolkit, Zustand, Jotai, and choosing the right solution
- Zustand is the lightest option — simple API, minimal boilerplate
- Redux Toolkit is the standard for large, complex state
- Most apps don't need global state — start with local state + context
- Data Fetching (TanStack Query) (recommended) — Server state management — caching, refetching, pagination, and optimistic updates
- TanStack Query handles caching, deduplication, and background refetching
- Separates server state from client state cleanly
- Provides loading, error, and success states automatically
- Performance Optimization (recommended) — React.memo, useMemo, useCallback, code splitting, lazy loading, and profiling with DevTools
- React.memo prevents re-renders when props haven't changed
- useMemo caches expensive computations, useCallback caches functions
- Use React DevTools Profiler to identify rendering bottlenecks
- Component Patterns (recommended) — Compound components, render props, higher-order components, and composition patterns
- Composition (children prop) is preferred over inheritance
- Compound components share implicit state (like <Select> + <Option>)
- Render props and HOCs are legacy — prefer hooks for logic reuse
- Styling in React (recommended) — CSS Modules, Tailwind CSS, styled-components, CSS-in-JS, and choosing a styling approach
- Tailwind CSS is the most popular choice for React projects
- CSS Modules provide scoped styles without runtime cost
- styled-components/emotion offer dynamic styles but add bundle size
- Suspense & Error Boundaries (optional) — Declarative loading states with Suspense, catching errors with Error Boundaries, and lazy()
- Suspense shows a fallback UI while async content loads
- lazy() code-splits components — loaded only when rendered
- Error Boundaries catch rendering errors and show fallback UI
- React Server Components (optional) — The new paradigm — server-rendered components with zero client JS, data fetching on the server
- Server Components render on the server — zero client JS
- Use 'use client' directive for interactive components
- Data fetching happens directly in Server Components — no useEffect
Step 8: Next.js & Full-Stack React
The React framework for production — SSR, SSG, API routes, and full-stack TypeScript applications
Time: 4 weeks | Level: advanced
- App Router & File-Based Routing (required) — File-system routing, layouts, loading states, error handling, and route groups
- Folders define routes, page.tsx renders the UI
- layout.tsx wraps pages and persists across navigations
- loading.tsx and error.tsx provide automatic loading/error UI
- Server-Side Rendering (SSR) (required) — Dynamic rendering on each request — when to use it, data fetching, and streaming
- SSR generates HTML on every request — always fresh data
- Use for personalized or frequently changing content
- Streaming SSR sends HTML progressively with Suspense
- Static Site Generation (SSG) (required) — Pre-render pages at build time for maximum performance — generateStaticParams and static exports
- Static pages are generated once at build time — fastest possible
- Use generateStaticParams for dynamic routes with known paths
- ISR (Incremental Static Regeneration) rebuilds pages on a schedule
- API Routes & Server Actions (required) — Build backend endpoints with route handlers and mutate data with server actions
- route.ts files in app/api/ create REST API endpoints
- Server Actions allow forms to call server functions directly
- No need for a separate backend for many use cases
- Data Fetching Patterns (required) — Fetching data in Server Components, caching strategies, revalidation, and parallel data loading
- Fetch data directly in Server Components — no useState/useEffect
- Next.js extends fetch() with caching and revalidation options
- Use parallel fetching to avoid request waterfalls
- Dynamic Routing (required) — Dynamic segments [slug], catch-all routes [...slug], optional catch-all, and route parameters
- [slug] captures a single dynamic segment
- [...slug] catches all nested segments
- generateStaticParams pre-renders dynamic routes at build time
- Middleware (recommended) — Run code before requests — authentication checks, redirects, rewrites, and geolocation
- Middleware runs at the edge — before the request reaches your routes
- Use for auth checks, redirects, A/B testing, and rate limiting
- Defined in middleware.ts at the project root
- Image & Font Optimization (recommended) — next/image for responsive images, next/font for zero-layout-shift fonts, and performance wins
- next/image auto-optimizes, resizes, and lazy-loads images
- next/font loads fonts with zero layout shift
- Both significantly improve Core Web Vitals
- Authentication (NextAuth) (recommended) — Auth.js (NextAuth) for OAuth, email, and credential-based authentication in Next.js
- Auth.js supports OAuth providers (Google, GitHub), email, and credentials
- Session management works with both JWT and database strategies
- Protect routes with middleware or server-side session checks
- Deployment (Vercel) (recommended) — Deploy to Vercel with zero config, environment variables, preview deployments, and custom domains
- Vercel deploys Next.js with zero configuration
- Every push creates a preview deployment for review
- Set environment variables in the Vercel dashboard
Step 9: Backend Development
Server-side programming with Node.js — APIs, databases, authentication, and full-stack architecture
Time: 6 weeks | Level: advanced
- Node.js Fundamentals (required) — The JavaScript runtime — modules, event loop, file system, streams, and the Node.js ecosystem
- Node.js runs JavaScript outside the browser using V8
- The event loop enables non-blocking I/O — single-threaded but concurrent
- CommonJS (require) vs ES Modules (import) — prefer ESM
- Express.js (required) — The most popular Node.js framework — routing, middleware, error handling, and API development
- Middleware functions process requests in a pipeline
- Use Router for modular route organization
- Centralized error handling with error middleware
- REST API Design (required) — RESTful conventions — resource naming, HTTP methods, status codes, pagination, and versioning
- Use nouns for endpoints (/users, /posts), HTTP methods for actions
- Return appropriate status codes (201 Created, 404 Not Found)
- Implement pagination, filtering, and sorting for list endpoints
- Databases (SQL vs NoSQL) (required) — Understanding relational vs document databases, when to use each, and core database concepts
- SQL (PostgreSQL, MySQL) — structured data with relationships
- NoSQL (MongoDB) — flexible schemas, document-based
- Choose based on data structure, relationships, and query patterns
- MongoDB & Mongoose (required) — Document database — CRUD operations, schemas, indexes, aggregation, and Mongoose ODM
- MongoDB stores data as flexible JSON-like documents
- Mongoose adds schema validation and helper methods on top of MongoDB
- Use indexes for query performance on frequently searched fields
- PostgreSQL & SQL (required) — Relational database — SQL queries, joins, indexes, migrations, and Prisma/Drizzle ORMs
- SQL uses SELECT, INSERT, UPDATE, DELETE with typed schemas
- JOINs combine data across related tables
- Prisma provides type-safe database access with auto-generated types
- Authentication & JWT (required) — User authentication with JSON Web Tokens, password hashing (bcrypt), and session management
- JWTs encode user claims and are verified with a secret key
- Always hash passwords with bcrypt — never store plaintext
- Use refresh tokens for long-lived sessions, short-lived access tokens
- API Security & Validation (required) — Input validation (Zod), rate limiting, CORS, helmet, and protecting against common attacks
- Validate ALL input with Zod or Joi — never trust client data
- Use rate limiting to prevent abuse and DDoS
- Set CORS headers and use helmet for HTTP security headers
- GraphQL Basics (recommended) — Query language for APIs — schemas, resolvers, queries, mutations, and when to use over REST
- Clients request exactly the data they need — no over/under-fetching
- Schema defines types, queries, and mutations
- Best for complex data graphs with many relationships
- WebSockets & Real-Time (recommended) — Bi-directional real-time communication — Socket.io, use cases, and scaling considerations
- WebSockets maintain persistent connections for real-time data
- Use for chat, notifications, live dashboards, and collaborative editing
- Socket.io adds reconnection, rooms, and broadcasting
- Caching (Redis) (recommended) — In-memory caching for performance — Redis data structures, TTL, and caching strategies
- Cache database queries and API responses for faster reads
- Set TTL (time-to-live) to auto-expire stale cache entries
- Redis supports strings, lists, sets, and sorted sets
- Docker Basics (recommended) — Containerize your applications — Dockerfiles, images, containers, docker-compose, and dev environments
- Docker packages your app with its dependencies in a container
- Dockerfile defines how to build your image step by step
- docker-compose orchestrates multi-container apps (app + db + redis)
Step 10: Testing & Performance
Ship with confidence — unit testing, integration testing, E2E testing, and web performance optimization
Time: 3 weeks | Level: advanced
- Unit Testing (Vitest/Jest) (required) — Test individual functions and components in isolation — assertions, mocks, and test organization
- Test pure functions and component behavior, not implementation
- Use describe/it blocks for organized test structure
- Vitest is faster than Jest and compatible with Vite projects
- Integration Testing (required) — Test how components and modules work together — API integration, database queries, and middleware
- Test user interactions and component integration, not internal state
- React Testing Library renders components and queries the DOM
- Test the behavior users see, not the implementation details
- E2E Testing (Playwright) (required) — Test complete user flows in a real browser — page navigation, form submission, and cross-browser testing
- Playwright tests run in real browsers (Chrome, Firefox, Safari)
- Test critical user paths: signup, login, checkout, etc.
- Use locators based on text/role/test-id — avoid CSS selectors
- Core Web Vitals (required) — LCP, INP, CLS — the metrics Google uses for search ranking and what they measure
- LCP (Largest Contentful Paint) — main content load time < 2.5s
- INP (Interaction to Next Paint) — responsiveness < 200ms
- CLS (Cumulative Layout Shift) — visual stability < 0.1
- Lighthouse & DevTools (required) — Audit performance, accessibility, and SEO with Lighthouse and the Chrome Performance tab
- Lighthouse audits give actionable recommendations for improvement
- Performance tab shows a flame chart of rendering and scripting
- Network tab reveals slow requests, large bundles, and missing caching
- Code Splitting & Lazy Loading (recommended) — Split bundles for faster initial loads — dynamic imports, React.lazy, and route-based splitting
- Dynamic import() loads modules only when needed
- Route-based splitting loads each page's JS independently
- Analyze bundle size with tools like webpack-bundle-analyzer
- Accessibility Testing (recommended) — Automated and manual accessibility testing with axe, Lighthouse, and screen reader validation
- Automated tools catch ~30% of issues — manual testing catches the rest
- Tab through your app to verify keyboard navigation works
- Test with screen readers (VoiceOver on Mac, NVDA on Windows)
- Error Tracking & Monitoring (optional) — Track errors in production with Sentry, monitor performance with analytics, and set up alerts
- Sentry captures runtime errors with stack traces and context
- Set up alerts for error spikes and performance regressions
- Source maps enable readable stack traces in production
Step 11: DevOps & Deployment
Ship and scale your applications — CI/CD, containers, cloud platforms, and production operations
Time: 3 weeks | Level: advanced
- CI/CD Pipelines (required) — Continuous Integration and Deployment — automated testing, building, and deploying on every commit
- CI runs tests on every push — catch bugs before merging
- CD auto-deploys to staging/production after tests pass
- GitHub Actions, GitLab CI, and CircleCI are popular CI/CD platforms
- Docker in Production (required) — Multi-stage builds, optimizing images, docker-compose for production, and container registries
- Multi-stage builds reduce final image size dramatically
- Use .dockerignore to exclude node_modules and build artifacts
- Push images to registries (Docker Hub, GitHub Container Registry)
- Cloud Platforms (required) — AWS, GCP, Azure — compute, storage, databases, and choosing the right services for your app
- Use managed services (RDS, S3, Lambda) over self-managed when possible
- Vercel/Railway for full-stack apps, AWS/GCP for complex infrastructure
- Understand the shared responsibility model for security
- Nginx & Reverse Proxy (required) — Web server configuration — serving static files, reverse proxying, SSL termination, and load balancing
- Nginx reverse proxies requests from port 80/443 to your app
- Configure SSL/TLS certificates for HTTPS
- Set up gzip compression and caching headers
- Domains & SSL Certificates (required) — Register domains, configure DNS records, set up SSL with Let's Encrypt, and custom domain deployment
- Point A/CNAME records from your registrar to your hosting
- Use Let's Encrypt for free, auto-renewing SSL certificates
- Certbot automates certificate issuance and renewal
- Environment Variables & Secrets (required) — Managing configuration, .env files, secret managers, and keeping credentials secure
- Never commit secrets to git — use .env files (in .gitignore)
- Use platform secret managers (Vercel, AWS SSM) for production
- Prefix NEXT_PUBLIC_ only for values safe to expose to the browser
- Monitoring & Logging (recommended) — Application logging, structured logs, monitoring dashboards, and alerting for production issues
- Structured logging (JSON) enables searching and filtering
- Monitor key metrics: response time, error rate, CPU/memory
- Set up alerts for anomalies — don't wait for users to report issues
- Kubernetes Basics (optional) — Container orchestration — pods, deployments, services, scaling, and when you actually need K8s
- Kubernetes orchestrates containers across multiple machines
- Most teams don't need K8s — start with simpler deployment options
- Use managed K8s (EKS, GKE) if you do need it
- Serverless Functions (optional) — Run code without managing servers — AWS Lambda, Vercel Functions, and event-driven architecture
- Serverless scales automatically — pay only for execution time
- Cold starts can add latency — keep functions small
- Great for APIs, webhooks, and background processing
