Logo

My process

I slow down just enough to make sure we’re building the right thing, for the right reasons, with clear tradeoffs.

I follow a design-driven development approach — framing problems, constraints, and systems before writing code.

In a world where AI accelerates execution, the real leverage comes from deciding the right thing to build. My process focuses upstream: clarifying problems, surfacing tradeoffs, and designing systems that can evolve — not just ship.

Problem framing

What I do

I start by defining the actual problem — not features, screens, or tasks.

Every project begins with a clear problem statement that answers:

  • Who is experiencing the problem
  • What is breaking today
  • Why it matters now
  • What happens if it stays unsolved

Constraints & tradeoffs

What I do

I surface constraints early instead of discovering them mid-build.

  • Technical limitations and system boundaries
  • Business goals and operational realities
  • Accessibility, security, and compliance requirements
  • Team capacity, timelines, and risk

System-level design

What I do

Before UI polish, I design the underlying system.

  • Data flows and state ownership
  • Lifecycle and validation models
  • Design tokens and interaction rules
  • Extension points and failure paths

Execution with intent (Design + Engineering together)

What I do

Design and engineering move in parallel.

  • Components map directly to system rules
  • Accessibility and performance are built in from the start
  • Decisions are documented as they’re made

Learn & iterate

I treat launches as checkpoints, not finish lines. Shipping reveals which assumptions were right, which were wrong, and where the system needs to adapt.

After launch, I focus on:

  • Observing real usage instead of relying on intent
  • Stress-testing systems under real constraints
  • Refining architecture, interactions, and workflows based on evidence
  • Improving extensibility so change doesn’t mean rewrites