Practice posts
Everything in the journal filed under practice.
2026
Making technical debt visible enough to pay
Debt nobody can see never gets budget. Give each item a cost, an interest rate and a place on the same list as features, then pay it inside feature work.
Where your team writes down its decisions
Decisions live in chat threads and in people's heads until they vanish. A one paragraph record next to the code keeps the reasons where the work is.
Five questions for the first meeting with a client
Ask what success is in numbers, what must keep running, who owns the accounts, what was tried before, and who decides. Then write the answers down.
Debugging: measure first, guess later
The order that finds bugs is reproduce, narrow, measure, then theorise. Here is how to bisect changes and inputs, and why the first theory costs the most.
Long jobs get finished in small reversible steps
How to cut a large piece of work into steps that can each ship and each be undone, with feature flags, expand and contract migrations and a real rollback.
Lab numbers, field data and a real phone
A synthetic audit, real user data and a phone in your hand answer three different questions. Here is when each one lies and how to measure a change.
Three fields that make logs worth reading
Most logs cannot answer the one question an incident asks. A correlation id, the subject being worked on and an outcome with a reason fix that.
Two accessibility mistakes almost every site makes
Heading levels chosen to match the layout, and an aria-label that hides the visible text. Both break keyboard and voice users, and both are cheap to fix.
2025
Invisible dot underscore files travelling from macOS to your server
Extended attributes become AppleDouble files inside archives made on a Mac, land in your web root and get served. How to spot, stop and clean them up.
Blue green deploys: check the build exit code before you restart
A deploy script that restarts after a failed build serves a half written directory. Exit codes, an atomic switch, a smoke test and a rollback that works.
Never write to /tmp with a generic name on a shared server
On a shared machine a generic temp filename may already exist and belong to someone else. The write fails, the read succeeds, you ship the wrong file.
The invisible suffix that split every message in two
Two features each appended five characters after the length check ran. Every message crossed a segment boundary and the cost doubled in silence.
The Turkish uppercase trap: i, I and the dotted İ in code
In Turkish, i uppercases to İ and I lowercases to ı. Case folding, CSS text-transform and database collations all get this wrong by default.
2024
Justified Turkish text without a hyphenation dictionary
Chrome ships no Turkish hyphenation dictionary, so justified Turkish opens rivers of white space. Insert soft hyphens at build time instead.