Skip to content

AI Without Losing Judgment

Naseebullah AhmadiSenior Software Engineer, London

AI made me ship faster, and for a while it also made me approve code I couldn't defend. Speed isn't progress if nobody owns the decisions.

2 min read
#engineering

At first I used AI as overpowered autocomplete. Output went up, my reviews got lighter, and some of what I merged looked fine while quietly crossing boundaries it shouldn't have. The fix wasn't using less AI. It was being clear about who decides what.

Who owns what

AI canYou still own
Draft an implementationThe architecture it has to fit
Suggest testsWhat "correct" and "good enough" mean
Offer three ways to do itPicking one, and the trade-off you accepted
Explain the code it wroteBeing able to explain it without the AI

The test I use: if I can't explain why a change exists, I don't merge it.

The loop

  1. Constrain to Compare: ask for options
  2. Compare to Slice: pick one
  3. Slice to Verify: review it all
  4. Verify to Constrain: tighten
Small slices keep every round reviewable. Verification is what feeds the next constraint.
  1. 1Constrain. Write the behaviour, the non-goals, and the performance and security limits before asking for anything.
  2. 2Compare. Ask for options with trade-offs, not one-shot code.
  3. 3Slice. Generate pieces small enough that you read every line.
  4. 4Verify. Same bar every time: tests, types, review. What fails becomes a constraint for the next round.

What slips through when you skip it

The same four things, almost every time: abstractions nobody needed yet, logic leaking across domain boundaries, edge cases left unhandled, and tests that check the implementation instead of the behaviour. They all look reasonable in a diff, which is exactly why the loop exists.

The advantage was never typing faster. It's keeping your judgment while you move quickly.