ka
Khairul Azharsenior software engineer
All writing
PersonalAug 16, 2026 · 4 min

Debugging as a Personality

The delivery was wrong and I had root-caused it before my friend finished typing his complaint. Binary search on everything, distrust of “it worked yesterday”, receipts reviewed line by line. What years of debugging do to a brain, the calm it buys, and the tax it charges.

KA
Khai
Senior Software Engineer
Debugging as a Personality

Last month a food delivery arrived wrong. While my friend was still composing an angry message, I had already worked out that the mistake had to be in the restaurant’s tablet interface and not the rider’s app, because the drink was wrong but the address was right, and those flow through different systems.

Nobody asked for this analysis. Nobody ever asks. Debugging stopped being a job skill years ago and became a personality, and I am told it shows.


The symptoms

  • Binary search on everything. The TV remote is dead: batteries first, because that cuts the problem space in half. The wifi is slow: one device or all devices? Once you think in bisection you cannot stop, and honestly, you should not.

  • Distrust of “it worked yesterday”. Something always changed. Something ALWAYS changed. The universe does not spontaneously break working systems; it waits for someone to update something quietly and forget.

  • Receipts get reviewed line by line. Not stinginess. A bill is a small report generated by a system, systems have bugs, and restaurant billing software has never once given me a reason to extend it trust.


Two real hunts, so you can see the brain at work

The scroll events that refused to exist. While testing scroll tracking on this website, I hit a measurement that should have been impossible. The page position moved, I could read the scroll offset changing, but zero scroll events fired. Not on the window, not on the document, not on any element. I attached five listeners at once and scrolled: position 700 pixels, event count zero on all five.

The debugging brain does not accept “impossible”, it starts removing suspects. My tracking math? Bypassed it, listened raw: still zero. Wrong code version served? Checked the actual bundle bytes: current. The browser lying about position? It was not. What remained was the environment itself, and one status check ended the mystery: the tab was in a hidden background window, and browsers suppress scroll event dispatch and animation frames entirely in hidden tabs. The page scrolled; the notifications about it were never sent. My code was innocent. The room it ran in was the bug.

The quota bar frozen at 62 percent. In my menu bar app that tracks AI provider quotas, one provider’s number stopped moving. No error, no crash, a perfectly healthy-looking bar that had quietly been showing the same value for days. Frozen data looks exactly like stable data, which is what makes this defect class so nasty.

One question cracked it, and it has since become my standard opening move for any stalled system: what is the timestamp on the last persisted data? Not the logs, not the UI, the stored blob itself. The timestamp was days old, which instantly split the world in two: the provider stopped answering, or my app stopped asking. From there it was a short walk to the answer. Every “it just stopped working” since then gets the same first question, and it has never wasted my time.


Why it happens

Debugging rewires how you see causality. Most people experience problems as events: the thing broke. A debugger experiences problems as stories with a missing chapter: the thing was fine, then a specific change happened, then it broke, and the chapter in the middle exists whether or not anyone has read it yet.

Once you believe the middle chapter always exists, you stop accepting mystery as an answer, anywhere. Not aggressively. You just quietly know that the parking app did not “just crash”, and given twenty minutes and log access you could probably say why.


The good and the tax

The good part: calm. When real problems hit, the debugging brain does not panic, it starts isolating variables. People around you notice and bring you their crises, technical or otherwise, because you respond to chaos with questions instead of adrenaline.

The tax: switching it off. Not every wrong drink needs a root cause analysis. Some mysteries deserve to stay mysteries, some conversations want sympathy instead of a diagnostic tree, and I have learned, slowly, to ask “do you want me to fix this or just listen” before deploying the questionnaire.

People say I debug like other people breathe. It was not entirely meant as a compliment. I have chosen to log it as one anyway.

Next essay

I Built Browser Fingerprinting Into My Portfolio. Here’s How Far It Gets You

My analytics thought my laptop and phone were strangers. sha256(ip + UA) breaks in both directions, so I rebuilt visitor identity with three layers: a first-party UUID, a FingerprintJS v5 fingerprint with fuzzy drift-matching, and the old IP hash demoted to last resort.

ka

I design and ship resilient mobile platforms and the backends that keep them honest.

© 2026 · Privacy · v4.2.0 · commit 8a3f12c