Both slogans read the same — your code runs on demand, no server to manage. But one runs a full Node.js box in a single far-away data center, and the other runs a stripped-down V8 isolate a few milliseconds from your user. The difference between them is where they run and what they're allowed to do, and that difference decides which one belongs on your request path.
HTTP/3 didn't invent new headers or smarter routing — it kept HTTP exactly the same and swapped the pipe underneath. Instead of TCP plus TLS, it runs on QUIC over UDP, and that one change fixes head-of-line blocking, cuts the handshake to a single round trip, and lets a connection survive you walking from Wi-Fi to cellular.
SQL injection was killed by a structural fix: parameterized queries drew a hard line between code and data. Prompt injection is the same shape of bug with no such line — for an LLM, instructions and data arrive in one channel, and nothing reliably marks 'this part is data, never obey it.' Here's why agents make it lethal, and how to design as if injection will succeed.
Virtual threads make Java look like Go for concurrency — until you hit a synchronized block, a ThreadLocal hot path, or a pool you forgot to remove. A working engineer's guide to what actually changes and what to leave alone.
Most teams use Redis for one thing and miss the four others. Rate limiting, distributed locks, idempotency, ephemeral session storage, and a serviceable job queue — each in a few commands, each replacing something heavier.
Why streaming an 8-second answer makes it feel fast even though it isn't, how to pick between long-poll, SSE, and WebSockets, and how to build a NestJS SSE endpoint that proxies a streaming LLM call — including the proxy-buffering, cancellation, and mid-stream-error gotchas that bite everyone the first time.