System design
Abstractions, design patterns, and the skills that separate seniors from juniors — named, not vibed.
A while ago I tried to write down what separates a top 1% software engineer from a junior, in skills you could actually name. This note is the living version of that list.
The skills, named
- Domain-driven design — the code's vocabulary matches the business's vocabulary, so a conversation with a stakeholder is also a code review.
- Recognizing code smells — not memorizing the catalog, but feeling the friction early, when renaming is still cheap.
- Design patterns — knowing them well enough to know when not to use them. A pattern applied before the pain it solves is just ceremony.
- System design — drawing the boxes is easy; the skill is knowing what each layer demands from the layer below it, and what it promises to the layer above.
- End-to-end ownership — from writing code to watching it run in production. The gap between "works on my machine" and "works" is where seniority lives.
What each layer demands
The question I ask of every architecture diagram: what does L1 request from L2, and what does L2 promise back? If the diagram can't answer that, it's a drawing, not a design.
L1: UI → demands: fresh state, fast → promises: user intent
L2: Application → demands: consistent domain → promises: orchestration
L3: Domain → demands: durable storage → promises: invariants hold
L4: Storage → demands: hardware that works → promises: durabilityEvery interface is a contract. Most bugs are one layer assuming a promise the other layer never made.