Backend
Seven languages and runtimes, described by the one thing that actually differs between them: the execution model — how each one handles concurrency, memory and failure. Not syntax, not ecosystem size, not benchmarks, because the execution model is what decides which problems a language makes easy and which it makes expensive. Five are general-purpose server runtimes. Rust frees memory without a garbage collector, at a point the compiler checks. Solidity runs on a public machine where every call is open to anyone and the code cannot change. Read two of these side by side and most "which language should we use" arguments answer themselves.
What is inside
Every page in this group, with what each one covers.
- PHPA process per request that starts clean and ends clean — the model that makes PHP simple to reason about and hard to keep state in.Per requestShared nothing
- JavaThe JVM as the actual product: every JDK release then and now, memory in a container, the Spring proxy, and virtual threads.JVMThreads
- Node.jsWhich thread pays for each job: the event loop, the pool of four, yearly releases from Node 27, and a 502 behind a load balancer.Event loopNon-blocking
- PythonWaiting or computing: the GIL and the build without it, asyncio’s traps, versions to 3.15, and why workers share less memory.GILasyncio
- Go (Golang)Where every goroutine waits and what releases it: leaks, GOMAXPROCS in a container, GOMEMLIMIT, and what Go 1.27 changed.GoroutinesGOMAXPROCS
- RustOwnership checked at compile time: the twelve errors everyone meets, what unsafe really means, async, and Rust 1.99.OwnershipBorrow checker
- SoliditySmart contracts on the EVM: twelve server habits that fail on-chain, reentrancy, proxies, flash loans and five losses.EVMSmart contracts
Where to start
- Choosing a runtimeRead the two you are choosing between and compare the concurrency models. Everything else is negotiable; that is not.
- Your service is slow under loadYour runtime’s page. Almost every load problem is the workload fighting the execution model rather than a lack of hardware.
- Coming from another languageRead your old runtime and the new one together — the difference between the two models is the thing to internalise.
- Asked to build on a blockchainSolidity, and its last section first: a contract earns its costs only when users must not have to trust the operator.
Elsewhere in the section
- DevelopmentSoftware development is the work of deciding where the boundaries in a system go, what runs on each side of them, and what moving one of those boundaries will cost once the code is live. This section covers 30 topics — architecture, the browser, seven backend languages, four mobile platforms, language models and the databases underneath all of it. Every page turns on the constraint that actually separates the options, rather than on the API surface.
- ArchitectureWhere to put the boundaries, and what each boundary costs. Four topics: the two shapes a system can take, the migration between them that most teams attempt at the wrong moment, and the contract that makes any boundary usable by somebody else. The recurring theme is that a boundary is not free — it buys independence and charges you in latency, debugging and operational surface.
- DatabasesWhere the state lives, and what each store guarantees about it. Three topics: how a relational engine actually answers a query, what a non-relational store trades away to scale, and how to design a schema that will still be true in three years. Modelling comes last on purpose — it is the one that determines whether the other two are easy or painful.
Found this useful?
Share it with someone who is working on the same problem.