Home
Backend from First Principles / Module 1 — What is a Backend?

What is a Backend?

Before frameworks, before authentication libraries, before "production-ready" means anything — there is one fundamental loop. Strip everything else away, and that's what every backend in existence is doing.


The Core Mental Model

A backend is the part of a software system that runs on a server — invisible to the end user, but responsible for all the real work. It stores data, enforces business rules, authenticates users, and communicates with other services. The frontend is the face of the system. The backend is its mind.

The clearest analogy I know is a restaurant. The frontend is the dining room — what guests see, touch, and judge. The backend is the kitchen. Guests place orders, the waiter carries them through the swinging door, the kitchen executes them, and the food comes back. The guest never enters the kitchen, but every bite they take depends on it.

The kitchen analogy
An order travels: customer → waiter → kitchen → pantry, then back.
🧑 Customer Frontend 🤵 Waiter API layer 👨‍🍳 Kitchen Backend 🥫 Pantry Database 📋
Ready

The Request Loop

Strip away every framework, every library, every fancy abstraction. What's left is a single loop — the same loop happening on every backend in the world, billions of times per second:

  1. Receive an HTTP request from a client.
  2. Route it to the right handler based on method and path.
  3. Apply middleware — logging, auth, rate limiting.
  4. Validate the incoming data.
  5. Execute service logic — the actual business rules.
  6. Talk to the database (or cache, or other services).
  7. Serialize the result into JSON.
  8. Send the response with the right status code.

Every backend — whether it's a Node.js Express app, a Go service, a Python FastAPI server, or a Rust Actix endpoint — does exactly this. Master the loop, and the language stops mattering.

The 8-stage request pipeline
Click "Send Request" — watch each stage light up as the request flows through.
REQ
Ready

Every backend in existence is fundamentally an event loop that turns HTTP bytes into HTTP bytes. Everything else is decoration.

Why First Principles Matter

Most developers learn backend through frameworks. They copy-paste an Express middleware chain, drop in a JWT library, sprinkle some Redis, and ship. It works — until it doesn't.

When things break at scale — race conditions, graceful shutdown failures, memory leaks, mysterious latency spikes — framework knowledge alone won't save you. You need to know what's actually happening underneath. First-principles understanding is what turns "I can build a CRUD app" into "I can debug production at 3 AM."

Framework-first thinking First-principles thinking
"Express has middleware." Middleware is a chain of responsibility pattern. Every framework implements it.
"JWT is how auth works." Auth is identity verification. JWT is one signed-token implementation.
"Use Mongoose to talk to Mongo." The database is a separate process reachable over a socket. ORMs wrap that.
"Add Redis for caching." Caching is trading freshness for speed. Redis is one option among many.
Key Insight

Frameworks are implementations of patterns. Patterns transcend frameworks. Learn the patterns, and you can read the source code of any framework — or build your own when none fits.

The four payoffs

Three Phases of Mastery

Mastery isn't linear, but it does have a shape. I think about it in three phases — each one builds on the last, and each one feels harder until you finish it.

The progression
A roadmap from concepts to production. Hover or tap each phase.
📚 Phase 1 Concepts Learn the why 🛠️ Phase 2 Implementation Build from scratch 🚀 Phase 3 Production Real systems

Phase 1 — Concepts

Understand why each backend primitive exists. Not how a framework does it — why it exists at all. HTTP, routing, auth, databases — these are answers to specific problems. Learn the problems first.

Phase 2 — Implementation

Pick a language. Build a router from scratch. Write raw SQL without an ORM. Implement a JWT verifier by hand. The frameworks make sense only after you've built the smaller version yourself.

JavaScript
const express = require('express');
const app = express();

app.use(express.json());
app.use(require('cors')());
app.use(require('helmet')());

app.get('/users/:id', async (req, res) => {
  const user = await User.findById(req.params.id);
  res.json(user);
});

app.listen(3000);
// "Why is it slow?" "Why does it crash?" — no idea.
JavaScript
// Same endpoint, but now I understand each layer:

// 1. The HTTP server is just a TCP socket parsing bytes.
const server = http.createServer((req, res) => {
  // 2. Routing = matching (method, path) to a handler.
  const handler = router.match(req.method, req.url);
  if (!handler) return notFound(res);

  // 3. Middleware = a chain of functions before the handler.
  runMiddleware(req, res, () => {
    // 4. The handler reads, calls service, writes response.
    handler(req, res);
  });
});

server.listen(3000);
// Slow? I know where to look. Crash? I have a model of why.

Phase 3 — Production

Build real systems end-to-end. Not toy CRUD apps — systems with logging, metrics, graceful shutdown, distributed tracing, and security. The kind where you'd be embarrassed if a stranger read the code.

What turns a toy into a system
Step 1 of 5
  1. 1
    It survives load

    A toy handles one user. A system handles thousands. Connection pooling, async I/O, and pagination stop being optional.

  2. 2
    It tells you when it's broken

    Structured logs, metrics, alerts, distributed traces. If the system breaks at 3 AM and nobody knows, it might as well not exist.

  3. 3
    It shuts down cleanly

    SIGTERM arrives, in-flight requests finish, connections close. No abandoned jobs, no half-written data, no angry users.

  4. 4
    It assumes hostility

    Validation, rate limiting, parameterized queries, secret rotation. Everything is hardened against malicious inputs by default.

  5. 5
    It deploys without drama

    CI runs tests. Migrations apply automatically. Rollouts are gradual. Rollbacks are one click. Friday deploys stop being scary.

A Backend in 12 Lines

To prove how simple the core loop really is, here's a working HTTP server in vanilla Node.js — no framework, no dependencies. Read it slowly. Every line maps to one of the eight stages of the request loop.

JavaScript
// A complete backend. No framework. ~12 lines.
const http = require('http');

const server = http.createServer((req, res) => {
  if (req.method === 'GET' && req.url === '/hello') {
    res.writeHead(200, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify({ message: 'Hello, world' }));
  } else {
    res.writeHead(404);
    res.end('Not found');
  }
});

server.listen(3000, () => console.log('Listening on :3000'));

That's it. Everything else — Express, validation, ORMs, JWT, Redis, Kafka — is layered on top of this. Frameworks make the boring parts disappear, but they don't change what's underneath.

Try it yourself

Save the code above as server.js, run node server.js, then open another terminal and run curl http://localhost:3000/hello. You just built a backend. Welcome to the club.

And the database side, in raw SQL

SQL
-- The other half of every backend: the database.
CREATE TABLE users (
  id          UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  email       VARCHAR(255) UNIQUE NOT NULL,
  created_at  TIMESTAMPTZ DEFAULT NOW()
);

INSERT INTO users (email) VALUES ('alice@example.com');

SELECT id, email FROM users WHERE email = 'alice@example.com';

Talking to the backend

Bash
# Start the server
node server.js &

# Send a request
curl -i http://localhost:3000/hello

# Expected response:
# HTTP/1.1 200 OK
# Content-Type: application/json
# {"message":"Hello, world"}
!
Don't ship this

The 12-line server above is a teaching artifact, not a production server. It has no auth, no rate limiting, no validation, no graceful shutdown, no logging — that's all the stuff we'll build over the next 23 modules.

Test Yourself

Question 01
If a backend is "just" a function from request to response, why do production systems get so complicated?

Because the function has to handle all of reality at once: thousands of concurrent users, hostile inputs, flaky networks, slow databases, deploys that can't drop traffic, errors that need to be surfaced without leaking internals, and a team of humans changing the code daily.

The core function stays simple. The complexity comes from making that function survive contact with reality — which is exactly what the rest of this series is about.

Question 02
What's the difference between a backend and a database?

The database stores data. The backend decides what to store, when to store it, and who's allowed to read it. A database has no idea what a "user" is, what "permission" means, or whether a withdrawal should succeed. The backend imposes all of that meaning on top of raw rows and columns.

A backend without a database is forgetful. A database without a backend is dangerous.

Question 03
Why do experienced engineers say "all backends are the same" when frameworks look so different?

Because once you've built three or four real systems, you realize the surface syntax (app.get(...) vs @app.route(...) vs r.HandleFunc(...)) is decoration. Underneath: TCP socket → HTTP parsing → router → middleware → handler → service → database → serializer → response. Same structure, different syntax.

That's why a senior backend engineer can pick up a new language in two weeks. They're not learning the framework — they're just looking up where their existing mental model maps onto it.

×
A common trap

Many tutorials teach you Express, then claim you've "learned backend." You haven't. You've learned one framework's API. The next time you need to debug a memory leak or write a custom protocol, that knowledge alone won't be enough. Always learn the why, not just the how.


What's Next

You now have the mental model. Every system in this series will fit inside it. Next up: we open the lid on the first stage of the loop — receiving the request — and look at HTTP itself, the protocol that carries every byte between every backend and every client on the planet.


Source & Credit

The Backend from First Principles series is based on what I learnt from Sriniously's YouTube playlist — a thoughtful, framework-agnostic walk through backend engineering. If this material helped you, please go check the original out: youtube.com/@Sriniously. The notes here are my own restatement for revisiting later.

⁂ Back to all modules