Full Stack Developer Interviews: Complete Request-to-Response Knowledge 2026
True full stack competency means understanding how each layer connects. Master the end-to-end request flow and architectural patterns that define modern web applications.
Domain Overview
Full stack development is the art of building complete web applications—from the pixels users see to the databases that store their data. It's not about being mediocre at everything; it's about understanding how all the pieces connect and being able to work effectively across the entire technology stack.
In 2026, full stack developers are expected to understand modern frontend frameworks like React or Vue, backend technologies like Node.js or Python, databases both SQL and NoSQL, cloud deployment, API design, and increasingly, AI integration. The role has evolved from "jack of all trades" to "systems thinker who can ship complete features."
What separates good full stack developers from great ones isn't raw coding ability—it's the mental model of how systems work together. When something breaks in production, a great full stack developer can trace the problem from the browser's network tab through load balancers, backend services, and database queries to find the root cause.
Key Skills Interviewers Look For
- Frontend Mastery: React/Vue/Angular, state management, performance optimization
- Backend Proficiency: Node.js, Python, or Java; RESTful and GraphQL APIs
- Database Knowledge: SQL design, NoSQL patterns, query optimization
- DevOps Basics: Docker, CI/CD, cloud deployment (AWS/GCP/Azure)
- System Design: Scalability, caching, microservices vs monoliths
- Security Awareness: OWASP top 10, authentication, authorization
- Testing: Unit, integration, and E2E testing strategies
- Problem Solving: Debugging across the stack, performance profiling
Fundamental Questions (Q1-Q15)
1. What happens when you type a URL in your browser and press Enter?
This classic question tests your understanding of the entire web stack
Expert Answer:
This is actually a beautiful journey through multiple systems:
- DNS Resolution: Browser checks cache, then asks DNS servers to convert the domain to an IP address
- TCP Connection: Browser establishes a TCP connection with the server (three-way handshake)
- TLS Handshake: If HTTPS, they negotiate encryption (certificate exchange, key agreement)
- HTTP Request: Browser sends GET request with headers (cookies, user-agent, etc.)
- Server Processing: Request hits load balancer → web server → application code → database
- Response: Server sends back HTML with status code and headers
- Rendering: Browser parses HTML, builds DOM, fetches CSS/JS, paints pixels
Pro tip: Interviewers love when you mention potential failure points at each step—DNS failures, certificate issues, server timeouts, etc.
2. Explain the difference between REST and GraphQL. When would you choose each?
Expert Answer:
REST (Representational State Transfer):
- Resource-based URLs (/users/123/posts)
- Fixed data structures per endpoint
- HTTP verbs define actions (GET, POST, PUT, DELETE)
- Great for caching, simple to understand
GraphQL:
- Single endpoint, query language for data
- Client specifies exactly what data it needs
- Eliminates over-fetching and under-fetching
- Strong typing with schema
When to choose:
- REST: Simple CRUD apps, public APIs, heavy caching needs, team new to APIs
- GraphQL: Complex data relationships, mobile apps (bandwidth sensitive), rapid frontend iteration
3. What is the Virtual DOM and why do frameworks like React use it?
Expert Answer:
The Virtual DOM is an in-memory representation of the real DOM. Here's why it matters:
The Problem: Direct DOM manipulation is slow. Every change triggers layout recalculation, painting, and compositing.
The Solution:
- React keeps a lightweight copy of the DOM in JavaScript
- When state changes, React creates a new Virtual DOM tree
- It "diffs" the new tree against the old one (reconciliation)
- Only the actual differences are applied to the real DOM (batched updates)
{`// Without Virtual DOM: 1000 direct DOM updates
// With Virtual DOM: diff → batch → maybe 10 actual DOM updates`}
Important nuance: The Virtual DOM isn't always faster than hand-optimized DOM manipulation. Its value is in making UI updates predictable and easier to reason about while being "fast enough" for most applications.
4. Explain the difference between SQL and NoSQL databases. Give examples of when to use each.
Expert Answer:
SQL (Relational):
- Structured tables with schemas
- ACID transactions
- Complex joins and queries
- Examples: PostgreSQL, MySQL
NoSQL:
- Flexible schemas (document, key-value, graph)
- Horizontal scaling
- Eventually consistent (typically)
- Examples: MongoDB, Redis, Cassandra
Use SQL when: Data has clear relationships, you need transactions (banking, inventory), complex queries are common
Use NoSQL when: Schema evolves rapidly, massive scale needed, data is hierarchical/document-like (user profiles, content management)
Real answer: Most production systems use both. User auth in PostgreSQL, session data in Redis, logs in Elasticsearch.
5. What is CORS and why does it exist?
Expert Answer:
CORS (Cross-Origin Resource Sharing) is a security mechanism that restricts web pages from making requests to a different domain than the one serving the page.
Why it exists: Without CORS, a malicious site could make authenticated requests to your bank's API using your cookies—that's called a CSRF attack.
How it works:
- Browser sends preflight OPTIONS request for non-simple requests
- Server responds with allowed origins, methods, headers
- If allowed, browser sends actual request
{`// Server response headers
Access-Control-Allow-Origin: https://myapp.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true`}
Common mistake: Setting Access-Control-Allow-Origin: * with credentials. Browsers block this for security.
6. Explain the JavaScript event loop. How does Node.js handle asynchronous operations?
Expert Answer:
JavaScript is single-threaded but handles async operations through the event loop:
- Call Stack: Executes synchronous code, one function at a time
- Web APIs/Node APIs: Handle async operations (setTimeout, fetch, file I/O)
- Callback Queue: Holds callbacks ready to execute
- Microtask Queue: Higher priority queue for Promises
- Event Loop: When stack is empty, moves tasks from queues to stack
{`console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
// Output: 1, 4, 3, 2
// Microtasks (Promise) run before macrotasks (setTimeout)`}
Node.js specifics: Uses libuv library with thread pool for file I/O, while network I/O uses OS-level async primitives (epoll, kqueue).
7. What is the difference between authentication and authorization?
Expert Answer:
Authentication (AuthN): "Who are you?" - Verifying identity
- Username/password login
- OAuth (Login with Google)
- Biometrics, MFA
- Results in: session token, JWT
Authorization (AuthZ): "What can you do?" - Verifying permissions
- Role-based access control (RBAC)
- Attribute-based access control (ABAC)
- Checking if user can edit this resource
Real-world example: You authenticate to enter a building (show ID), but authorization determines which floors you can access (your keycard permissions).
8. Explain CSS specificity. How do you resolve style conflicts?
Expert Answer:
CSS specificity determines which styles apply when multiple rules target the same element:
{`/* Specificity calculated as (inline, IDs, classes, elements) */
p { } /* 0,0,0,1 */
.intro { } /* 0,0,1,0 */
#header { } /* 0,1,0,0 */
style="color:red" /* 1,0,0,0 */
p.intro { } /* 0,0,1,1 */
#header .nav li { } /* 0,1,1,1 */`}
Resolution strategies:
- Use consistent methodology (BEM, CSS Modules)
- Avoid !important (creates maintenance nightmares)
- Keep specificity low and flat
- Modern: Use CSS-in-JS or Tailwind to scope styles
9. What are HTTP status codes? Name the important ones.
Expert Answer:
Categories:
- 2xx Success: 200 OK, 201 Created, 204 No Content
- 3xx Redirection: 301 Moved Permanently, 302 Found, 304 Not Modified
- 4xx Client Error: 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 422 Unprocessable Entity, 429 Too Many Requests
- 5xx Server Error: 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable, 504 Gateway Timeout
Common confusion:
- 401 vs 403: 401 = not logged in, 403 = logged in but not allowed
- 302 vs 301: 302 = temporary redirect, 301 = permanent (affects SEO)
10. What is the difference between cookies, localStorage, and sessionStorage?
Expert Answer:
| Feature | Cookies | localStorage | sessionStorage |
|---|---|---|---|
| Size | ~4KB | ~5-10MB | ~5-10MB |
| Sent with requests | Yes (automatic) | No | No |
| Expiration | Configurable | Never | Tab close |
| Access | Server + Client | Client only | Client only |
Use cases:
- Cookies: Authentication tokens, tracking, server-needed data
- localStorage: User preferences, cached data, offline support
- sessionStorage: Form data, temporary state, single-session data
11-15. More Fundamental Questions:
- 11. What is middleware in Express.js? How does the middleware chain work?
- 12. Explain the box model in CSS. What's the difference between content-box and border-box?
- 13. What is the difference between let, const, and var in JavaScript?
- 14. How does database indexing work? When should you add an index?
- 15. What is the purpose of package.json and package-lock.json?
Intermediate Questions (Q16-Q35)
16. Explain React hooks. What problems do useEffect and useCallback solve?
Expert Answer:
Hooks let you use state and lifecycle features in functional components:
useEffect: Handles side effects (data fetching, subscriptions, DOM manipulation)
{`useEffect(() => {
// Effect runs after render
const subscription = api.subscribe(data);
return () => {
// Cleanup runs before next effect or unmount
subscription.unsubscribe();
};
}, [dependency]); // Only re-run if dependency changes`}
useCallback: Memoizes functions to prevent unnecessary re-renders
{`// Without useCallback: new function on every render
// Child components re-render even if nothing changed
const handleClick = useCallback(() => {
doSomething(id);
}, [id]); // Function only recreated if id changes`}
Common mistake: Over-using useCallback. Only use it when passing callbacks to optimized child components that rely on reference equality.
17. How would you implement JWT authentication? What are its pros and cons?
Expert Answer:
JWT (JSON Web Token) flow:
- User logs in with credentials
- Server validates, creates JWT (header.payload.signature)
- Client stores JWT (httpOnly cookie preferred)
- Client sends JWT with each request
- Server validates signature, extracts user info
Pros:
- Stateless (scalable)
- Self-contained (user info in token)
- Works across domains
Cons:
- Can't be invalidated easily
- Larger than session IDs
- XSS vulnerable if in localStorage
Best practice: Short-lived access tokens (15 min) + refresh tokens in httpOnly cookies
18. Explain database normalization. When would you denormalize?
Expert Answer:
Normalization organizes data to reduce redundancy:
- 1NF: Atomic values, no repeating groups
- 2NF: No partial dependencies (all non-key columns depend on full primary key)
- 3NF: No transitive dependencies (non-key columns don't depend on other non-key columns)
When to denormalize:
- Read-heavy workloads where joins are expensive
- Reporting/analytics databases (data warehouses)
- Caching frequently-accessed aggregations
- When you've proven normalization is the bottleneck (not before!)
Real talk: Start normalized. Denormalize specific queries only when you have performance data proving it's needed.
19. How does React's reconciliation algorithm work?
Expert Answer:
React's reconciliation (diffing) algorithm compares Virtual DOM trees efficiently:
Key assumptions that make it O(n):
- Elements of different types produce different trees (rebuild entirely)
- Keys hint which children are stable across renders
Process:
- Same element type → update attributes, recurse on children
- Different element type → unmount old tree, mount new tree
- Lists → use keys to match children (avoid index as key!)
Why keys matter: Without stable keys, React can't tell if items were reordered vs replaced. Using index as key causes bugs when list order changes.
20. Explain the N+1 query problem. How do you solve it?
Expert Answer:
The problem: Loading a list of items (1 query), then loading related data for each item (N queries)
{`// N+1 Problem: 1 query for posts + N queries for authors
const posts = await Post.findAll(); // 1 query
for (const post of posts) {
post.author = await User.findById(post.authorId); // N queries
}
// Solution: Eager loading with JOIN
const posts = await Post.findAll({
include: [{ model: User, as: 'author' }]
}); // 1 query with JOIN (or 2 queries with batching)`}
Solutions:
- Eager loading: Include related data in initial query (JOINs)
- Batch loading: Collect IDs, fetch all at once (DataLoader pattern)
- GraphQL DataLoader: Automatic batching and caching per request
21. What is server-side rendering (SSR)? Compare it with client-side rendering and static generation.
Expert Answer:
CSR (Client-Side):
- JS downloads, runs, fetches data
- Fast subsequent navigations
- Poor initial load, bad SEO
- Use: Dashboards, apps behind login
SSR (Server-Side):
- Server renders HTML per request
- Fast first paint, good SEO
- Server load, TTFB depends on data
- Use: Dynamic content, personalization
SSG (Static Generation):
- HTML generated at build time
- Fastest, CDN cacheable
- Stale until rebuild
- Use: Blogs, docs, marketing
Modern approach (Next.js): Mix strategies per page. Static for marketing, SSR for dynamic, ISR (Incremental Static Regeneration) for best of both.
22. How would you implement rate limiting in an API?
Expert Answer:
Common algorithms:
- Token Bucket: Tokens refill at fixed rate, requests consume tokens
- Sliding Window: Count requests in rolling time window
- Fixed Window: Reset count at interval boundaries (can burst at edges)
{`// Redis-based sliding window
async function rateLimit(userId, limit, windowSec) {
const key = \`ratelimit:\${userId}\`;
const now = Date.now();
await redis.zremrangebyscore(key, 0, now - windowSec * 1000);
const count = await redis.zcard(key);
if (count >= limit) {
return { allowed: false, retryAfter: windowSec };
}
await redis.zadd(key, now, now);
await redis.expire(key, windowSec);
return { allowed: true, remaining: limit - count - 1 };
}`}
Best practices: Return 429 status, include Retry-After header, rate limit by user/IP/API key, use distributed store (Redis) for multi-server
23-35. More Intermediate Questions:
- 23. Explain WebSockets vs HTTP polling vs Server-Sent Events
- 24. How does browser caching work? Explain Cache-Control headers
- 25. What is a memory leak in JavaScript? How do you detect and prevent them?
- 26. Explain ACID properties in databases with examples
- 27. How would you implement pagination? Compare offset vs cursor pagination
- 28. What is tree shaking? How does it improve bundle size?
- 29. Explain the difference between optimistic and pessimistic locking
- 30. How does React Context work? When should you use it vs Redux?
- 31. What is XSS (Cross-Site Scripting)? How do you prevent it?
- 32. Explain the difference between SQL injection and how to prevent it
- 33. How would you implement file uploads? Handle large files?
- 34. What is connection pooling? Why is it important?
- 35. Explain the observer pattern. Where is it used in frontend frameworks?
Advanced & Real-World Questions (Q36-Q50)
36. Design a URL shortener like bit.ly. Walk through the system design.
Expert Answer:
Requirements clarification:
- 100M URLs/month, 10:1 read/write ratio
- Short codes 7 characters (62^7 = 3.5 trillion possibilities)
- Custom aliases optional, analytics tracking
High-level design:
{`Client → Load Balancer → API Servers → Cache (Redis) → Database
POST /shorten: Generate short code, store mapping
GET /:code: Look up URL, 301 redirect
Short code generation:
1. Base62 encode auto-increment ID (simple, predictable)
2. Hash URL + random salt (collision handling needed)
3. Pre-generate codes (best for high throughput)`}
Database schema:
{`urls: short_code (PK), long_url, created_at, expires_at, user_id
analytics: id, short_code, timestamp, ip, user_agent, referer`}
Scaling considerations:
- Cache popular URLs in Redis (80/20 rule)
- Database sharding by short_code hash
- Async analytics writes (Kafka → analytics DB)
- CDN for redirect handling at edge
37. Your API is suddenly slow. Walk through your debugging process.
Expert Answer:
Systematic approach:
- Scope the problem: All endpoints or specific ones? All users? When did it start? (Check deployment logs)
- Check infrastructure: CPU/memory usage, disk I/O, network latency (CloudWatch, Datadog)
- Database investigation:
- Slow query log - any new expensive queries?
- Connection pool exhaustion?
- Lock contention (SHOW PROCESSLIST)?
- Application profiling:
- Add timing logs around suspected code
- Check for N+1 queries
- Look for blocking I/O
- External dependencies: Third-party API latency? DNS issues?
Pro tip: Add distributed tracing (Jaeger, Zipkin) before you need it. Impossible to debug microservices without it.
38. How would you implement real-time collaborative editing like Google Docs?
Expert Answer:
Core challenge: Multiple users editing simultaneously without conflicts
Solutions:
- OT (Operational Transformation): Transform concurrent operations to preserve intent (Google Docs approach)
- CRDT (Conflict-free Replicated Data Types): Data structures that merge automatically (Yjs, Automerge)
Architecture:
{`Clients ←→ WebSocket Server ←→ Document Service
↓
Redis Pub/Sub (multi-server sync)
↓
PostgreSQL (persistence)
Each edit = operation (insert/delete at position)
Server applies OT/CRDT, broadcasts to all clients
Periodic snapshots for new joiners`}
Key considerations:
- Cursor position sync (show where others are typing)
- Undo/redo per user
- Offline support with sync on reconnect
- Version history and snapshots
39. Explain microservices vs monolith. When would you choose each?
Expert Answer:
Monolith:
- Single deployable unit
- Simple development, testing, deployment
- Shared database, in-process calls
- Scales by replication
Microservices:
- Independent services, own databases
- Team autonomy, technology diversity
- Complex: networking, distributed transactions
- Scales independently per service
Choose monolith when:
- Small team (<10 engineers)
- New product, unclear domain boundaries
- Simple deployment requirements
Choose microservices when:
- Large org with multiple teams
- Clear domain boundaries exist
- Different scaling/availability needs per component
- Team already has microservices expertise
Real talk: Start with a modular monolith. Extract to microservices when you have clear reasons, not because it's trendy.
40. How would you handle database migrations in a zero-downtime deployment?
Expert Answer:
The challenge: Old code and new code run simultaneously during deployment. Schema changes must work with both.
Expand-Contract pattern:
- Expand: Add new column/table (nullable or with default)
- Migrate: Backfill data, update code to write to both old and new
- Contract: Remove old column/code after all servers updated
{`# Example: Rename column 'name' to 'full_name'
# Step 1: Add new column
ALTER TABLE users ADD COLUMN full_name VARCHAR(255);
# Step 2: Deploy code that writes to BOTH columns
# Step 3: Backfill existing data
UPDATE users SET full_name = name WHERE full_name IS NULL;
# Step 4: Deploy code that only reads from new column
# Step 5: Drop old column (after old servers gone)
ALTER TABLE users DROP COLUMN name;`}
Rules:
- Never rename columns directly
- Never drop columns in same deploy as code change
- Use feature flags for risky migrations
41-50. More Advanced Questions:
- 41. Design a notification system that handles email, push, SMS at scale
- 42. How would you implement a job queue system? Handle failures and retries?
- 43. Explain the CAP theorem. How do you choose between CP and AP systems?
- 44. How would you design an API rate limiter that works across multiple servers?
- 45. Walk through implementing OAuth 2.0 authorization code flow
- 46. How do you handle distributed transactions across microservices?
- 47. Design a caching strategy for an e-commerce product catalog
- 48. How would you implement a search feature? When would you use Elasticsearch vs database full-text search?
- 49. Explain how you'd set up CI/CD pipelines for a full stack application
- 50. How do you approach performance optimization in a React application at scale?
Practice Makes Perfect
Many candidates now use tools like Craqly to simulate real full stack interviews and refine their answers under real-time pressure.
- ✓ Practice system design explanations with AI feedback
- ✓ Get instant suggestions for technical questions
- ✓ Simulate whiteboarding sessions
Common Mistakes Candidates Make
❌ What to Avoid:
- • Claiming to know both frontend and backend but having shallow knowledge in both
- • Jumping to solutions without clarifying requirements
- • Over-engineering solutions (microservices for a todo app)
- • Not considering security, error handling, edge cases
- • Using buzzwords without understanding them
- • Dismissing technologies you haven't used as "bad"
✓ What Works:
- • Be honest about your depth in frontend vs backend
- • Ask clarifying questions before diving in
- • Start simple, add complexity when needed
- • Always mention security implications
- • Explain trade-offs, not just solutions
- • Show curiosity about unfamiliar technologies
Pro Tips from Interviewers
Draw diagrams
For system design questions, sketch the architecture. A whiteboard diagram shows how you think about systems holistically.
Talk about production experience
"I've debugged this in production" is worth more than "I read about this." Share war stories.
Understand the "why" behind technologies
Don't just know React hooks—understand why they replaced class components and what problems they solve.
Have opinions (with justification)
Senior candidates have preferences. "I prefer TypeScript because..." shows experience and thoughtfulness.
Comments
Leave a comment
No comments yet. Be the first to share your thoughts!
Related Articles
SRE Interview Help: Top Questions on Reliability Engineering
Real SRE interview questions covering SLOs, error budgets, incident management, capacity planning, and toil reduction — with answer guidance from engineers who have lived through production outages.
Read moreFull Stack Developer Interview Help: Frontend, Backend, and Everything Between
The full stack interview covers everything from React hooks to database indexing. Here are the questions that actually come up, with practical answer guidance for each.
Read moreQA Engineer Interview Help: Testing and Automation Questions
The most common QA engineer interview questions on manual testing, automation frameworks, API testing, and CI/CD — with practical answer guidance for each.
Read more