Most developers I know eventually say the same sentence: "I just can't design." That's almost never true. What's missing isn't taste — it's permission to apply the same systems thinking they already have to a different vocabulary.
Design Tokens Are Variables
A consistent color system, a spacing scale, a limited set of type sizes — at its core, that's the same principle as constants instead of magic numbers in code. If you understand why you don't hardcode values everywhere, you already understand the foundation of good design. This site uses exactly one accent color, three type families with clearly defined roles, and a handful of repeating spacing values — the same tokens rendering this very page:
Components Are Reusable Functions
A button component with three variants is conceptually identical to a function with three parameters. If you can write clean, reusable code, you can design a clean, reusable component system. The only difference is that the "return value" is visual instead of logical.
Constraints Produce Better Results
The same discipline that stops you from overloading a function with ten optional parameters should stop you from using fifteen font sizes in one project. Constraint isn't a creative obstacle — it's the reason consistent systems exist in the first place.
How I Find a Visual Direction
I never start with color. I start with type pairing, then a spacing scale, and only after that, color and motion. That order isn't arbitrary — it follows the same logic as building architecture: structure first, ornamentation second.
* designing-for-developers.md
* Design · 20 May 2026 · 6 min read
*/▋