The boring stack still wins

Douglas Pereira

I like new tools. I also like shipping on a Tuesday. Dan McKinley's Choose Boring Technology still names the constraint: you get about three "innovation tokens." Spend them on the problem that is actually yours, not on the database everyone is tweeting.

Postgres as the default

Relational data, JSON when you must, LISTEN/NOTIFY before you buy a queue, full-text before you buy a search cluster. The Postgres docs are the product. SQLite is the same argument at the edge and in tests (when to use SQLite).

A novel store will not save a fuzzy data model. A familiar one will not doom a sharp one. Hyrum's Law applies to ORMs too: your implicit schema becomes load-bearing whether you versioned it or not.

TypeScript as a seatbelt, not a religion

I want exhaustiveness on unions, not a 400-line type to prove string is string. strict on. Avoid any at boundaries (HTTP, env, JSON.parse). That is where bugs live, not in your map.

type Result<T, E = Error> =
  | { ok: true; value: T }
  | { ok: false; error: E }

A Result type in one module is cheaper than an effects system across the app.

The platform you already pay for

Next.js, Vercel or whatever hosts the thing, the browser. I do not want a second runtime on-call in spirit. Boring means: grep works, Stack Overflow exists, the pager is for our code.

References