A full stack developer builds both the frontend (what users see) and the backend (servers, databases, APIs). This roadmap shows you exactly what to learn, in what order, and realistic timelines — whether you are starting from scratch or levelling up.
At a glance
| Layer | Core technologies | Time to basics |
|---|---|---|
| Foundations | HTML, CSS, JavaScript | 2–3 months |
| Frontend | React (or Vue/Angular), TypeScript | 3–4 months |
| Backend | Node.js or Python, REST APIs | 3–4 months |
| Databases | SQL (PostgreSQL), basics of NoSQL | 2–3 months |
| DevOps basics | Git, Linux CLI, Docker, CI/CD | 2–3 months |
| First full project | All layers combined | 1–2 months |
| Total to job-ready | ~12–18 months |
Phase 1 — The internet and how it works (Week 1–2)
Before writing a line of code, understand what you are building on.
What to learn
| Concept | What it means | Why it matters |
|---|---|---|
| How the web works | Browser → DNS → HTTP → Server → Response | You will debug this chain constantly |
| HTTP/HTTPS | Request/response protocol, status codes, headers | Every API call uses this |
| DNS | Domain names → IP addresses | Explains latency, CDN, SSL certs |
| Browsers | Rendering engines, DevTools, network tab | Primary debug tool for frontend |
| Client vs server | Browser executes JS, server executes Python/Node | Shapes every architecture decision |
Phase 2 — HTML and CSS (Month 1–2)
The language of web pages and their visual presentation.
HTML fundamentals
| Topic | Key concepts |
|---|---|
| Document structure | <!DOCTYPE>, <head>, <body>, semantic tags |
| Semantic HTML | <header>, <nav>, <main>, <article>, <footer> |
| Forms | <input>, <select>, <textarea>, validation attributes |
| Tables | <table>, <thead>, <tbody>, <td> |
| Accessibility | alt text, aria-label, heading hierarchy, role |
CSS fundamentals
| Topic | Key concepts |
|---|---|
| Box model | margin, border, padding, content |
| Flexbox | display: flex, justify-content, align-items, flex-wrap |
| CSS Grid | display: grid, grid-template-columns, fr units, gap |
| Responsive design | @media queries, mobile-first, min-width breakpoints |
| Variables | --primary-color: #3b82f6;, var(--primary-color) |
| Selectors | .class, #id, [attr], :hover, :nth-child(), :focus |
Milestone: Build a static personal portfolio page with a nav, about section, project cards, and contact form. No JavaScript yet.
Phase 3 — JavaScript (Month 2–4)
The programming language of the web — both frontend and backend (Node.js).
Core JavaScript
| Topic | Key concepts |
|---|---|
| Variables | const, let, var, hoisting, temporal dead zone |
| Data types | string, number, boolean, null, undefined, object, array |
| Functions | Declaration, expression, arrow functions, closures |
| DOM manipulation | querySelector, addEventListener, innerHTML, createElement |
| Async JS | Callbacks → Promises → async/await, fetch() |
| Error handling | try/catch/finally, Promise.catch() |
| ES6+ features | Destructuring, spread/rest, template literals, modules |
| Data structures | Arrays, Objects, Map, Set |
// Modern JavaScript — fetch with async/await
async function getUser(id) {
try {
const res = await fetch(`/api/users/${id}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json();
} catch (err) {
console.error('Failed to fetch user:', err);
throw err;
}
}
JavaScript ecosystem basics
| Tool | What it does |
|---|---|
| npm / pnpm | Package manager — install libraries |
| Vite | Fast dev server and bundler |
| ESLint | Catch code errors and style issues |
| Prettier | Auto-format code |
| Git | Version control — track changes |
Milestone: Build a JavaScript todo app — add, complete, delete tasks. Data stored in localStorage. No frameworks yet.
Phase 4 — TypeScript (Month 4–5)
TypeScript adds static types to JavaScript. Most professional teams use it.
// TypeScript catches errors before runtime
interface User {
id: number;
name: string;
email: string;
role: 'admin' | 'user';
}
function greet(user: User): string {
return `Hello, ${user.name} (${user.role})`;
}
greet({ id: 1, name: 'Ana', email: 'ana@mail.com', role: 'admin' }); // OK
greet({ id: 1, name: 'Ana', role: 'superuser' }); // TS error — missing email, wrong role
| Concept | What to learn |
|---|---|
| Basic types | string, number, boolean, any, unknown, never |
| Interfaces and types | interface User {}, type Point = { x: number; y: number } |
| Generics | function identity<T>(val: T): T |
| Union and intersection | string | number, TypeA & TypeB |
| Type narrowing | typeof, instanceof, in operator |
| Utility types | Partial<T>, Required<T>, Pick<T, K>, Omit<T, K> |
When to add TypeScript: Add it immediately when you start a real project. The learning curve is small; the payoff in bug prevention is large.
Phase 5 — Frontend framework: React (Month 5–8)
React is the most widely used frontend library (~70% of JS developer job postings). Learn React first, then consider Vue or Angular.
React fundamentals
| Concept | Key knowledge |
|---|---|
| Components | Functional components, JSX, props |
| State | useState, lifting state up, controlled inputs |
| Effects | useEffect, cleanup, dependency array |
| Context | createContext, useContext — global state without prop drilling |
| Refs | useRef — access DOM nodes, persist values |
| Performance | useMemo, useCallback, React.memo |
React ecosystem
| Tool | Purpose |
|---|---|
| Next.js | Full-stack React framework (SSR, SSG, API routes, App Router) |
| React Router | Client-side routing for SPAs |
| TanStack Query | Server state, data fetching, caching |
| Zustand | Simple global client-side state |
| shadcn/ui | Copy-paste accessible UI components |
| Tailwind CSS | Utility-first CSS framework |
// React component with TypeScript + TanStack Query
import { useQuery } from '@tanstack/react-query';
interface Post { id: number; title: string; body: string; }
function PostList() {
const { data, isLoading, error } = useQuery<Post[]>({
queryKey: ['posts'],
queryFn: () => fetch('/api/posts').then(r => r.json()),
});
if (isLoading) return <p>Loading...</p>;
if (error) return <p>Error loading posts</p>;
return (
<ul>
{data?.map(post => (
<li key={post.id}>{post.title}</li>
))}
</ul>
);
}
Milestone: Build a full frontend app with routing, data fetching from a public API (GitHub/OpenWeather), search/filter, loading states. Deployed on Vercel.
Phase 6 — Backend development (Month 8–11)
The backend serves data, handles business logic, authentication, and talks to databases.
Choose your backend language
| Language | Framework | Best for | Job market |
|---|---|---|---|
| Node.js | Express, Fastify, NestJS | Full-stack JS devs, real-time apps | Very large |
| Python | FastAPI, Django, Flask | Data-heavy apps, ML integration | Very large |
| Go | Gin, Echo, Chi | High-performance APIs, microservices | Growing fast |
| Java | Spring Boot | Enterprise, large teams | Mature, stable |
| PHP | Laravel | WordPress ecosystem, web apps | Large legacy |
| Ruby | Rails | Startups, rapid development | Niche, stable |
Recommended for beginners: Node.js (same language as frontend) or Python (simpler syntax).
What every backend developer must know
| Topic | Key concepts |
|---|---|
| REST API design | Resources, HTTP methods, status codes, JSON |
| Authentication | Sessions vs JWT, bcrypt for passwords, OAuth 2.0 |
| Middleware | Logging, auth guards, error handling, rate limiting |
| Input validation | Never trust user input — validate and sanitize everything |
| CORS | Cross-origin resource sharing — how browsers and servers coordinate |
| Environment variables | .env files, never commit secrets |
| Testing | Unit tests, integration tests, mocking |
// Node.js + Express REST API with JWT auth
import express from 'express';
import jwt from 'jsonwebtoken';
import bcrypt from 'bcrypt';
const app = express();
app.use(express.json());
function requireAuth(req, res, next) {
const token = req.headers.authorization?.split(' ')[1];
if (!token) return res.status(401).json({ error: 'Unauthorized' });
try {
req.user = jwt.verify(token, process.env.JWT_SECRET);
next();
} catch {
res.status(401).json({ error: 'Invalid token' });
}
}
app.get('/api/profile', requireAuth, (req, res) => {
res.json({ userId: req.user.id });
});
Phase 7 — Databases (Month 9–12)
Data is the core of any application. Learn SQL first, then NoSQL.
SQL (PostgreSQL recommended)
| Topic | Key knowledge |
|---|---|
| CRUD | SELECT, INSERT, UPDATE, DELETE |
| JOINs | INNER JOIN, LEFT JOIN, RIGHT JOIN |
| Constraints | PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL |
| Indexes | B-tree index, when to add, EXPLAIN ANALYZE |
| Transactions | BEGIN, COMMIT, ROLLBACK, ACID properties |
| Aggregations | GROUP BY, COUNT, SUM, AVG, HAVING |
| Window functions | ROW_NUMBER(), RANK(), LAG(), running total |
ORM vs raw SQL
| Approach | Tool | Pros | Cons |
|---|---|---|---|
| Raw SQL | node-postgres, psycopg2 | Full control, performance | Verbose, injection risk if careless |
| Query builder | Kysely, Knex | Composable, type-safe | More verbose than ORM |
| ORM | Prisma, SQLAlchemy, Django ORM | Rapid development, migrations | N+1 risk, less control |
NoSQL — when to add it
| Database | Type | Use case |
|---|---|---|
| Redis | Key-value (in-memory) | Caching, sessions, rate limiting, queues |
| MongoDB | Document | Flexible schema, content management |
| Cassandra | Wide-column | High write throughput, time-series |
| Elasticsearch | Search index | Full-text search, log analytics |
Advice: Master PostgreSQL before touching NoSQL. PostgreSQL handles most use cases — it has JSON support, full-text search, and excellent performance.
Phase 8 — DevOps basics (Month 11–14)
A full stack developer must be able to deploy and operate their applications.
Git (non-negotiable from day 1)
git init # Start tracking
git add . # Stage changes
git commit -m "feat: add user auth" # Save snapshot
git push origin main # Push to GitHub
git pull # Get latest changes
git branch feature/login # Create branch
git merge feature/login # Merge branch
Git workflow: Every project uses branches. main is always deployable. Use feature branches, open pull requests, code review before merge.
Linux command line
| Command | What it does |
|---|---|
ls, cd, pwd |
Navigate filesystem |
cat, less, tail -f |
Read files and logs |
grep, awk, sed |
Search and transform text |
ps, top, htop |
Monitor processes |
kill, pkill |
Stop processes |
chmod, chown |
File permissions |
ssh user@host |
Remote access |
scp, rsync |
Copy files remotely |
curl, wget |
HTTP requests from CLI |
systemctl |
Manage services |
Docker
# Dockerfile for a Node.js app
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
# docker-compose.yml — app + database
services:
app:
build: .
ports: ["3000:3000"]
environment:
DATABASE_URL: postgresql://user:pass@db:5432/myapp
depends_on: [db]
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: pass
POSTGRES_DB: myapp
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
CI/CD pipeline basics
| Stage | What happens |
|---|---|
| Lint | Check code style (ESLint, Prettier) |
| Test | Run unit and integration tests |
| Build | Compile TypeScript, bundle frontend |
| Deploy | Push to Vercel / Railway / Fly.io |
# .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 20 }
- run: npm ci
- run: npm test
- run: npm run build
Phase 9 — System design basics (Month 14–16)
As you advance, you need to think beyond a single server.
| Concept | What to understand |
|---|---|
| Load balancing | Distribute traffic across multiple app servers |
| Caching | Redis cache to avoid repeated DB queries |
| CDN | Serve static assets from edge servers near users |
| Database scaling | Read replicas before sharding |
| Message queues | Async tasks — email sending, image processing |
| Monitoring | Metrics (Prometheus), logs (Grafana Loki), alerts |
| Rate limiting | Protect API from abuse |
Full stack technology map
FRONTEND
HTML / CSS / JavaScript / TypeScript
React + Next.js (App Router)
Tailwind CSS
TanStack Query + Zustand
BACKEND
Node.js (Express/Fastify) OR Python (FastAPI/Django)
REST APIs returning JSON
Authentication (JWT / OAuth 2.0)
Input validation (Zod / Pydantic)
DATABASES
PostgreSQL (primary)
Prisma or SQLAlchemy (ORM)
Redis (cache, sessions)
DEVOPS
Git + GitHub
Docker + Docker Compose
CI/CD (GitHub Actions)
Vercel (frontend) + Railway/Render/Fly.io (backend)
Linux CLI basics
SYSTEM DESIGN (senior level)
Load balancing
Caching strategies
Message queues (Kafka / BullMQ)
Horizontal scaling
Realistic timeline
| Month | Focus | Milestone |
|---|---|---|
| 1–2 | HTML, CSS, JS basics | Static portfolio site |
| 3–4 | JavaScript deep dive, TypeScript | Interactive todo app with localStorage |
| 5–7 | React + Next.js | Multi-page app with API data, deployed on Vercel |
| 8–10 | Backend (Node.js or Python), REST APIs | REST API with auth, unit tests |
| 11–12 | PostgreSQL, Prisma/SQLAlchemy | Full CRUD app connected to real DB |
| 13–14 | Docker, CI/CD, Linux | App containerized, auto-deployed on push |
| 15–16 | First full project, portfolio | End-to-end SaaS or CRUD app |
| 17–18 | Job applications, system design | First developer job |
Where to deploy (free tiers)
| Service | What you can host | Free tier |
|---|---|---|
| Vercel | Next.js, static sites | Unlimited hobby projects |
| Railway | Node.js, Python, PostgreSQL, Redis | $5/month credit |
| Render | Web services, cron jobs, PostgreSQL | Sleeps after 15 min inactivity |
| Fly.io | Docker containers | 3 shared VMs free |
| Supabase | PostgreSQL + auth + storage | 2 projects, 500MB DB |
| Cloudflare Pages | Static sites, edge functions | Unlimited |
| Netlify | Static sites, serverless functions | Generous free tier |
Common mistakes when learning full stack
| Mistake | Better approach |
|---|---|
| Learning too many frameworks at once | Master one frontend + one backend first |
| Skipping fundamentals (HTML/JS/SQL) | Fundamentals compound — invest early |
| Tutorial hell (watching without building) | Build a real project after every 2 tutorials |
| Ignoring TypeScript | Add it from the start — saves debugging time |
| Not using Git from day 1 | Commit every day, even small changes |
| Skipping tests | Write at least a few integration tests |
| Building in isolation, no deployment | Deploy every project — even to Vercel free |
| Learning DSA before getting a job | Get employed first, deepen CS theory later |
Full stack vs related roles
| Role | Frontend | Backend | Database | DevOps | Salary range (US) |
|---|---|---|---|---|---|
| Frontend developer | Expert | Minimal | Minimal | Minimal | $70k–$140k |
| Backend developer | Minimal | Expert | Strong | Moderate | $80k–$160k |
| Full stack developer | Strong | Strong | Strong | Moderate | $90k–$170k |
| DevOps / SRE | Minimal | Moderate | Moderate | Expert | $100k–$200k |
| Software architect | Broad | Broad | Broad | Broad | $130k–$220k |
6 FAQ
Q: Should I learn React or Vue first? React — it has more jobs (roughly 5:1 ratio over Vue), a larger ecosystem, and once you understand React, switching to Vue or Svelte takes days not months. The concepts transfer directly.
Q: Do I need a computer science degree to become a full stack developer? No. Most companies care about what you can build, not your degree. A strong portfolio of deployed projects beats a CS degree with no projects. Bootcamps, self-study, and open-source contributions are all legitimate paths.
Q: How long does it really take to get a full stack developer job? 12–18 months with consistent daily practice (3–4 hours/day). Background matters — developers switching from related fields (design, IT support, data analysis) often land jobs in 9–12 months.
Q: Should I learn Next.js from the start instead of plain React? Learn plain React for 1–2 months first so you understand components, state, and effects without magic. Then switch to Next.js — it is the production standard for React and you will use it in most real projects.
Q: What is the difference between a junior and senior full stack developer? Experience is secondary. Seniors write code others can maintain (clear naming, small functions, tests). They debug without panic, design for failure cases, and explain trade-offs. They also know when NOT to build something custom. Aim for senior mindset from month 1.
Q: Is it better to specialise (frontend or backend) or stay full stack? Start full stack — it makes you understand the whole system and is great for startups. Then specialise where you have the most passion or where the market pays most. Many senior full stack developers eventually deepen into one domain while keeping breadth.