How I Work

shape
shape
shape
shape
shape
shape
shape
shape

You're not hiring a process. You're hiring the judgment that runs it. Here's how an engagement actually goes.

1

We figure out the real problem

The stated problem and the real problem are often different. "We need microservices" is usually "our deploys are scary and our team stepped on each other twice last month." I spend the first conversations pulling the real constraint into the open — because the whole engagement is only as good as the problem it's aimed at.

2

We right-size the solution — on purpose

Then I tell you the smallest thing that solves it. Sometimes that's a distributed, event-driven platform. Often it's one well-layered API and a boring database. I'll make the case for whichever it is, and I'll name what I'm choosing not to build and why. Everything I decline to build is declined on purpose.

3

We work in layers, and we review as we go

I don't hand over a two-thousand-line diff and hope you can review it. Work ships in small, ordered layers — contracts, then data, then the rules that are the product, then the wiring. Each layer is small enough to actually review. Errors stay local. Naming gets fixed cheaply, at the start, instead of expensively, at the end.

4

We fix the plan, not the code

The cheapest place to catch a mistake is a paragraph, before any code exists. So we argue with the plan first — in prose. It feels slow for about a day. Then it's dramatically faster, because nobody's spelunking through a giant generated diff looking for the line that's lying to them.

5

You get an artifact, not just an outcome

When AI-assisted work is involved, the prompts are committed alongside the code — a versioned record of why the system looks the way it does. Six months from now, when someone asks why a query pointedly ignores a filter, the answer is in a file with a commit history, not in my head. When I roll off, the reasoning stays.

Real Talk

Weekly cadence, your approval at every step, no surprises — that part's table stakes, and yes, I do it. The part that's worth paying for is the four decisions above.

Case Studies

The same judgment, applied to real work

Two engagements, two very different shapes — a production reliability rescue and a right-sized proof of concept. Pick one.

Case Study · Cloud & Azure Architecture

The Signups That Never Arrived

Reliability hardening for a 21-function, event-driven Azure platform — without the rewrite nobody needed. Here's the same judgment above, applied to a real engagement.

The Challenge

A choreographed, event-driven backend — 21 Azure Functions reacting to Service Bus messages — had grown one handler at a time. Three different ways of acknowledging a message meant the profile-creation path could silently drop a new registration.

The Work

A reverse-engineered architecture baseline, one standardized message-settlement pattern rolled across every function, an at-least-once redesign of the create path, poison-message dead-lettering by default, and consistency observability for the CQRS read models.

The Outcome

Dropped registrations closed at the source, uniform settlement across all 21 functions, a bounded and observable read-model divergence window, and a versioned architecture baseline the team actually owns — with no new Azure spend.

A registration that was never there

A new member signed up. The platform said "got it" to the message broker — and then the call that was supposed to actually create the profile failed. Because the message had already been marked complete, nobody retried it. Nobody dead-lettered it. Nobody knew. The signup didn't throw an error. It didn't fire an alert. It simply never happened.

That's the kind of bug that never shows up in a demo. It compiles. It passes tests. It works every single time you watch it. It only fails when you aren't looking — which, for a registration path, is most of the time.

When you acknowledge a message is not a coding detail. It's an architectural decision about delivery guarantees, and it has to be made once, on purpose, for the whole system — not twenty-one times, by accident, one function at a time.

The landscape, reverse-engineered from source
Web Apps7 sites
Azure Service Bustopics
Azure Functions21 handlers
SQL Server · audit & configCosmos DB · profiles & 5 read modelsRedis · cacheBlob · templatesEmail / SMS · Profile API

One write to the canonical profile document projects into five denormalized read models — username lookup, geo/filter search, birthday lists, newest members, tag search — each partitioned for its own query. A textbook CQRS fan-out.

What discovery surfaced
Critical

Registration-loss risk

The create path acknowledges the message before the downstream call succeeds. A failure after that point drops a signup, silently, with no retry and no alert.

Critical

Inconsistent settlement

Three completion strategies across 21 functions means delivery guarantees you can't reason about, because they're different everywhere you look.

Important

Read-model divergence

The five projections run independently. A partial failure leaves search and member lists temporarily disagreeing with the source of truth — with no visibility into when, or for how long.

Important

No standard poison handling

One function dead-letters correctly. The rest either abandon-loop or drop. A poison message is therefore either an infinite retry or a silent loss — never an alert.

The decision — harden it, don't rewrite it

This is the point where a certain kind of consultant sells you a rewrite: event sourcing, an orchestration layer, a service mesh to "manage" the functions. The architecture was already right. What the system needed wasn't a new architecture — it needed the one it already had, applied consistently. The most valuable slide in the whole engagement was the one that said don't rewrite this.

What the client got
  • A registration path that can't silently drop a signup — the failure mode that started the conversation, closed at the source.
  • Uniform message settlement across all 21 functions, with poison messages dead-lettered instead of looping forever or vanishing.
  • Read-model divergence that's bounded and observable, not a mystery that surfaces through a confused user.
  • A versioned architecture baseline — C4 diagrams, an entity map, and sequence flows — that the team owns and extends. And no new Azure spend.

At the end of the day, the client got an architectural plan, remediation, and hardened, production-ready code.

Want the whole story? Review the entire case study and the discovery delivery the client actually received.