← Writing

How I think about building software

2025-12-13

Most real-world software problems don’t start with clear requirements. They start with ambiguity: partial context, competing priorities, and uncertainty about what “good” actually means.

Over time, I’ve learned that my job as an engineer isn’t to eliminate ambiguity—it’s to turn ambiguity into something the team can act on.

The loop I come back to looks like this:

  • Ambiguity → clarify goals, risks, and what failure would look like
  • Constraints → time, reliability, performance, security, people, tools
  • Tradeoffs → choose what to optimize for—and name what you’re not

Good engineering decisions don’t come from chasing ideal systems. They come from making the right decision given the constraints, then documenting and owning the tradeoffs.

I’m skeptical of “best practices” in isolation. Practices only matter inside context. What I care about are decisions that produce durable outcomes: systems that are understandable, operable, and easy to evolve when requirements change.

When software stays clear under change, teams move faster—and trust compounds over time.