Skip to content
MartinsAI.
All writing
Career & Craft

Why I Write the Blueprint Before I Write the Code

On three unrelated projects this year, the highest-leverage work happened before the first line of implementation. That's not a coincidence — it's the point.

4 min read

Three projects I've worked on this year have almost nothing in common on the surface — a multi-tenant ERP and POS platform, an AI-assisted academic writing tool, and a headless CMS — and yet all three followed the same first move: a comprehensive written blueprint, completed and reviewed before implementation started in earnest. For BluuPay v3, that meant sequencing nine modules and sixteen industry verticals into a 151-task design-first registry. For TanCMS, it meant a full architectural blueprint as the explicit precursor to breaking the build into implementation tasks. For CowriterAI, it meant documenting the agent workflow, the multi-channel delivery model, and the versioning strategy before the authentication system — the part users would touch first — was even built.

That's not a coincidence, and it's not a personal quirk I've talked myself into liking. It's the least glamorous, highest-leverage step available on any non-trivial system, and I think most of the value of "senior" engineering is just being disciplined about not skipping it.

A blueprint is where wrong assumptions are cheapest to find

Every non-trivial system has a handful of decisions that are expensive to reverse once code exists and cheap to reverse on paper: the entity boundaries in a multi-tenant schema, whether an integration is synchronous or event-driven, which parts of a workflow need to be resumable versus which can safely fail and restart from scratch. Writing these decisions down as a blueprint — with enough specificity that another engineer could implement against it — forces the assumptions underneath them into the open, where they're a sentence to challenge instead of a migration to undo.

The BluuPay task registry is the clearest example: sequencing sixteen industry verticals against nine modules surfaces the cross-cutting questions immediately — does the POS module's offline-sync requirement apply identically across verticals, or does a restaurant's real-time table/order state need different sync guarantees than a retail SKU count? Those questions are a paragraph in a blueprint. Discovered mid-implementation, they're a schema migration and a week of rework.

It's also where scope gets honest

A blueprint is where "this will take two weeks" gets tested against what "this" actually contains, before a deadline has been communicated to anyone. Writing CowriterAI's full agent and multi-channel delivery blueprint before touching the authentication system meant the auth work itself — phone normalization, OTP flow, the sign-up wizard — was scoped with a clear picture of what it needed to support downstream (a phone-verified identity usable identically from a web dashboard and three chat platforms), rather than being built in isolation and reworked once the multi-channel requirement surfaced.

This is the part of blueprint-first work that's easy to undervalue from the outside, because a good blueprint makes the eventual implementation look easier than it was. Nobody sees the version of the project where the authentication system got built first, in isolation, and had to be partially redone once the Telegram and WhatsApp requirements were fully specified.

The discipline is finishing the blueprint, not starting one

Everyone starts a design doc. Fewer people finish one to the point where it's actually specific enough to implement against, because the last 20% of a blueprint — the part covering edge cases, failure modes, and the boring cross-cutting concerns like auditability or offline behavior — is exactly the part that feels like it could be figured out later. It can be. It's just more expensive later, and "more expensive later" is the whole argument for doing it now.

The task-registry approach I used for BluuPay — 151 explicit, sequenced tasks rather than a prose document — is partly about this: a task registry makes "is this blueprint actually done" a checkable question (are all sixteen verticals represented across all nine modules, or does the registry only cover the eight I thought about first) instead of a feeling.

This isn't about avoiding iteration

None of this is an argument for waterfall, or for pretending a blueprint eliminates the need to revise decisions once real usage tests them. Every one of these three projects will have blueprint assumptions that don't survive contact with actual users and actual data — that's expected, and it's a different failure mode than the one blueprint-first work is guarding against. The point isn't to get every decision right on paper. It's to make sure the decisions that are expensive to get wrong are made deliberately, in a format cheap to argue with, before they're made implicitly by whatever the first line of code happens to assume.

ProcessArchitectureConsulting