~/blog/tag/craft
Craft
On code quality, deliberate building and the craft of software development.
What I write about here
Software craft is what you cannot outsource. Most posts under this tag are about that, written in the era where the temptation to outsource is the highest it has ever been.
Here is the trade I keep seeing teams make. They reach for an agent because it ships features faster. The features ship. The bugs ship with them.
The code review gets thinner because the diff looks plausible. Six months later, nobody on the team can explain why the auth flow does what it does, and the last person who could has left.
The craft I am defending here is the part that does not show up in commit velocity. It is taste, and the instinct that something is off before you can articulate why. It is the willingness to read code carefully, including code you did not write. And it is the discipline to refuse a fix you do not understand.
None of that gets easier when an agent is involved. If anything, it gets more important. A pull request you would have caught on instinct because it looked weird is the one an agent will produce in a tone of perfect confidence. The reader has to do more work, not less.
That is the through-line of these posts. The model is a tool. The judgment is yours, and you do not get to put it down.
The full argument, with all the posts in one connected arc, is in the Software craft in the AI era guide.
best entry points
- The prompt is not the spec
The framing essay. A prompt carries intent, a spec carries constraints. Most craft failures are versions of this confusion.
- How to get better at reading code: a practice routine
The craft as a muscle. A practice routine for reading code, because everyone diagnoses the atrophy and nobody trains the cure.
- You can't spot the bug if you didn't write the code
The argument in its sharpest form. You only catch the bugs in code you understand. The craft is in the reading, not the writing.
Empty catch blocks in AI code: the comment that silences your linter
AI-generated code swallows errors in catch blocks that hold nothing but a comment, and ESLint's recommended config waves them through because of that comment. What I found in my own repositories, why a model writes it, and the rule that sees through the comment.
read →Who wrote this commit? Git attribution when an agent does the work
I went looking for the coding agent in 1,644 commits across ten of my public repositories. It left no trace at all. The thing that had quietly rewritten the authorship record was the merge button.
Slopsquatting: checking that the package exists is not a defence
The standard advice against AI-hallucinated packages is to verify the package exists before installing. I checked four names from the latest research against PyPI. All four resolve. The registry answers the wrong question, in both directions.
Software estimation with AI: the typing was never the estimate
Software estimation with AI keeps missing. One METR survey asked 349 technical workers how much faster they had become and how much more value they produced, and got 3x and 1.4 to 2x. The gap between those two answers is the estimate you are actually making.
Quality ratchets for AI code: baselines that only tighten
A lint baseline lets you enforce a standard you cannot fix today. Existing violations are grandfathered, new ones fail the build, and the file can only shrink. How PHPStan, ESLint, detekt and Sonar do it, and the four ways a ratchet quietly stops working.
On-call for AI-generated code: what to set up before the pager goes off
The best-known case of AI code taking down production is one the company denies. Nobody outside can settle it, because the records that would settle it were never kept. On-call for code a model wrote is a records problem.
Observability for AI-generated code: what review cannot see
94% of technology leaders rate AI-generated code as higher quality than human code at review. 82% had a production failure caused by it within six months. Two instruments, same code, opposite verdicts.
Did the model get worse? Comparing coding models without a benchmark
You swapped models, something feels worse, and you have nothing to point at. Why re-running the prompt and asking a judge model both fail, and the small boring harness that answers the question.
Hiring junior developers in 2026: the collapse is a hiring decision
Junior developer hiring stopped, and the number everyone quotes to explain it is not in the paper it gets credited to. What the research found makes the collapse a decision, and one large employer is now betting the other way.
The AI code review bottleneck: everyone quotes the wrong number
Median PR review time is up 441.5%. That figure gets credited to DORA, which never measured it, and it is the least useful of the three review numbers in the report it did come from.