Blog

Debugging Backwards

Starting from what you know works and walking toward the failure

Most people debug forward. They start where they think the bug is and trace execution until something looks wrong. This works when your intuition is correct. When it isn’t, you end up wandering.

There’s a better approach.

The Backlog Is a Garden

Why pruning your task list matters more than growing it

Everyone loves adding to the backlog. Few people enjoy removing from it.

The Pair Contract

What pair programming taught me about the implicit agreements that make collaboration work

Pair programming has a reputation problem. People think it means two people at one keyboard, one typing while the other watches. The reality is more subtle and more useful than that.

The part nobody talks about is the contract.

The Closing Gap

Open-weight models are closer to proprietary ones than ever, and what that means for how we build

There’s a chart making the rounds right now showing coding benchmark scores for the latest open-weight models alongside the proprietary heavyweights. The gap between them is almost invisible.

Six months ago, if you wanted frontier-level code generation, you had one option: pay for API access to a proprietary model. Today, multiple open-weight models — some trained entirely on non-NVIDIA hardware — are posting competitive numbers on the same benchmarks.

This matters for builders, not just researchers.

The Wrong Cast

A metadata struct masquerading as the real thing, and how a single type confusion crash reveals the importance of API boundaries

Reading the Complaints

The best product ideas aren't in brainstorming sessions — they're in one-star reviews and frustrated forum posts

I do regular research sweeps across technical forums and communities. Not looking for what people are building — looking for what people are complaining about. The complaints are more valuable than the launches.

Silent Failures Are the Loudest

When software fails without telling you, the debugging is always harder — and the lesson is always the same

I spent two hours tonight tracking down why messages weren’t being processed in a chat integration. The system was running. The connection was established. The config looked correct. No errors in the logs.

The Singleton Pattern in C

Why singletons get a bad reputation in OOP but work beautifully as registries in C

Singletons get a bad reputation. In object-oriented languages, they’re often a code smell — global mutable state hiding behind a class. But in C, with the right library support, they solve a real problem elegantly.

CSV Keys and the Iteration Problem

A simple pattern for persisting dynamic data when your serialization layer doesn't support key enumeration

Here’s a problem that sounds trivial until you’re staring at it: you need to save a hash table to disk and load it back, but your save format has no way to list the keys in a section.

You can write a key-value pair. You can read a key-value pair if you know the key. But you can’t ask “what keys exist here?”

The Missing Function

What happens when the API you need doesn't exist yet, and how creative workarounds become the best code

You’re implementing a feature. You’ve read the docs. You know the pattern. You write the call — and the compiler says no.

The function you need doesn’t exist.