You already have the hardest skill: you can ship. The gap to "good at design" isn't talent — it's a vocabulary, a set of heuristics you can apply in code, and reps on real interfaces. Click the checkboxes as you go; your progress is tracked live.
These are the four primitives everything else is built on. Learn them as constraints — like knowing how the event loop works, but for perception.
Every screen must answer "where do I look first, second, third?" Hierarchy comes from size, weight, colour, contrast, and space — not from making everything bold.
Whitespace is not empty — it's grouping. Use a consistent scale (4/8/12/16/24/32/48) instead of arbitrary pixel values. Related things sit close; unrelated things get air.
Type does 80% of the work on most product UIs. Cap yourself at 2 families and a small modular scale (1.25 or 1.333). Watch measure: 45–75 characters per line.
Colour is a system, not a preference: a neutral ramp, one brand hue, and semantic tokens (success/warn/danger). Contrast minimum is WCAG AA 4.5:1 for body text.
This is where a JS dev has an unfair advantage: you can reason in states.
Design and build all of them, not just the one in the mockup.
Users forgive slowness that is acknowledged. The classic thresholds to design against:
A form is a state machine. So is onboarding, checkout, a drag-and-drop. Name the states explicitly instead of juggling five booleans.
Bridge design and code with a single source of truth. Tokens let designers and devs speak the same language.
Both fields do the same thing. Only one respects the human. Type an invalid email into each and watch what happens.
Tab through the buttons below. The "before" version had its outline removed — see how easy it is to get lost?
Click the buttons to compare :focus-visible handling.
Design maturity = you stop styling screens and start composing primitives. This is also where your engineering brain pays off.
Catalog what actually exists before inventing a new thing. Most "new" UI is a variant of something you already have.
a11y is not a phase — it's correctness. And it's mostly mechanical in JS frameworks.
You don't need to become a Figma wizard, but you should be dangerous in it — to inspect, prototype, and communicate.
Motion explains change: where something came from, what it's related to, whether it worked. Keep it fast (150–250ms) and respect prefers-reduced-motion.
Adopting the process is what turns "makes things pretty" into "solves the right problem".
Talk to 5 users before designing. Watch them use the current thing. Write down the jobs-to-be-done in their words.
Sketch 5–10 rough options fast (paper, Excalidraw). Quantity first. Bad ideas unlock good ones.
Converge against criteria: user value, effort, risk. Document the trade-off, not just the outcome.
Cheapest thing that tests the riskiest assumption. HTML/CSS prototype > hi-fi mock when uncertain.
5 users, tasks, no leading questions. Watch where they hesitate. You're testing the design, not them.
Instrument the flow. Task success rate, time-on-task, error rate, drop-off. Close the loop with data.
Deliberate practice beats reading. One hour a day, each week with a concrete output you can show.
Copy 10 great UIs by rebuilding them in HTML/CSS from screenshot. No shortcuts, no Tailwind first pass.
Output: a "copies" folder of 10 pixel-attemptsBuild a personal design system: tokens, then Button/Input/Card across all 7 states.
Output: token file + 3 polished componentsBuild a real form flow and a data table with empty/loading/error states. Keyboard-first.
Output: one accessible, stateful flowRead Refactoring UI + Don't Make Me Think. Run 5 user tests on your own project.
Output: a test report with 5 findings you acted onRefactor an existing project of yours to use tokens + primitives. Delete 70% of ad-hoc CSS.
Output: before/after diffPick one flow, add analytics, iterate once based on data. Write up what you learned.
Output: a case-study write-upCurated, not exhaustive. Start with the two books in bold.
Adam Wathan & Steve Schoger. The single most actionable book for devs who want to design. Written for engineers.
Steve Krug. Usability fundamentals in an afternoon. The classic baseline.
Don Norman. Affordances, signifiers, mapping. The vocabulary behind everything.
Jon Yablonski. Fitts, Hick, Jakob, Miller — heuristics with real examples.
If you learn by watching someone iterate, this is it.
Frontend Mentor, UI Challenges, Mobbin for pattern research, Dribbble for taste (not for structure).