Daniel Howells

Design-Driven Development with Ideate

2025-09-01

The problem with jumping straight into code is that you commit to implementation details before you understand the shape of the problem. I noticed this pattern repeatedly: the best features I shipped were the ones where I spent the most time in a notebook or whiteboard before touching an editor. The worst were the ones where I started coding in the first five minutes.

Ideate enforces a specific flow: discovery, architecture, characters, outline. Discovery is the constraint-gathering phase where you articulate what you're actually solving and what you're explicitly not solving. Architecture maps the technical boundaries. Characters are the interesting part -- they're expert personas who review your design from different angles before you write a line of code. One reviewer might focus on type safety and API ergonomics, another on edge cases and failure modes. The outline is the final artifact: a structured implementation plan that's been stress-tested by multiple perspectives.

The characters concept came from noticing that I catch different classes of bugs depending on my mindset. When I'm thinking about types, I catch interface mismatches. When I'm thinking about UX, I catch missing states. Ideate externalises those mindsets into reviewers you can tune to your own preferences. Mine care about complete UI states (empty, loading, error, sparse, dense), type narrowing over assertions, and code that reveals its structure without comments. When the design gets reviewed, it's like having a strict version of yourself catch things at the cheapest possible moment -- before any code exists. Changing a plan costs nothing. Refactoring code costs hours.

The workflow maps cleanly to software in general: problem, constraints, design, build. Most teams skip straight from problem to build, then wonder why they're refactoring three weeks later. The discovery phase alone -- just writing down "what are we not building" -- eliminates half the scope creep I used to deal with. I used Ideate to design Ideate itself, which felt appropriately recursive. Four design iterations before I wrote the first line of implementation code. Each iteration caught assumptions that would have become bugs. The meta lesson is simple: the tool that slows you down before coding speeds up everything after it.