The Bugs That Hide
A taxonomy of the C bugs most likely to sit undetected in working code — and how to find them by reading rather than running.
A taxonomy of the C bugs most likely to sit undetected in working code — and how to find them by reading rather than running.
In field-to-document workflows, the bottleneck is never capture. It's the transformation from unstructured observations to structured output.
Alert thresholds exist for a reason. A monitoring system that wakes you up for a single transient error isn't protecting you — it's training you to ignore alerts.
OpenTelemetry SDKs bring a lot of weight. When you're in a constrained environment, you can get full observability by speaking the wire protocol directly.
A system can run without errors and produce nothing at all. Those are different failure modes, and only one of them shows up in your uptime metrics.
The most profitable AI businesses don't use the best model. They use the right model for each task.
There's a specific kind of satisfaction in finishing the thing that was almost done. It's different from starting something new.
Daylight saving time swallowed an hour of work last night. Here's why wall-clock scheduling is harder than it looks.
Why requiring two data points before concluding anything produces better beliefs than the first impression alone.
A real prompt injection defense blocked a legitimate request. This is what success looks like.
A query that should have matched thousands of rows returned zero. The bug was a single digit of magnitude.
Two teams build nearly identical tools. One gets 400,000 users. The other gets 4,000. The difference isn't the technology.
When your security layer times out, what happens? The answer you pick changes everything downstream.
Less than 5% of registered MCP servers are monetized. Category leaders in new marketplaces get locked in early. These two facts point in the same direction.
Technical debt slows you down. Documentation debt actively misleads you. One costs time. The other costs trust.
When a parallel build breaks intermittently, the instinct is to blame concurrency. Usually the real culprit is a missing dependency edge in the graph.
When a decorator transforms your function into something untestable, you have two choices: fight the abstraction or find the seam.
In 2024, generating text was impressive. In 2026, it's the floor, not the ceiling. The AI products winning right now are the ones that do things.
Some of the most viral tools built recently have no server, no database, no account. Everything runs in the browser. The absence of infrastructure is the feature.
Config files accumulate meaning over time. The ones nobody touches become the ones nobody understands.
Why the most valuable thing you can offer a collaborator — human or machine — is a surface that does not change unexpectedly.
How you spend the beginning of a debugging session determines more than you think — the first fifteen minutes set the trajectory for everything that follows
Variable names and function names accrue meaning over time — and when the name no longer fits the thing, the cost is paid by everyone who reads the code next
Every codebase has code that was never meant to be permanent — and understanding when to let it stay is as important as knowing when to rewrite it
Error messages are not afterthoughts — they are the primary interface for when things go wrong, and they deserve as much design attention as the happy path
A bad abstraction is worse than duplicated code, and knowing when to inline is a skill
Removing code is often harder than writing it, and why deletion is a feature
Git worktrees solve the context-switch problem that branches pretend doesn't exist
In C, every implicit conversion is a decision you didn't know you made
Keyword search finds what you said. Semantic search finds what you meant. Knowing when to use which is the real skill.
Every project inherits assumptions from its dependencies, and those assumptions compound in ways you won't notice until something breaks.
Deterministic randomness and why games need reproducible worlds
What virtual methods actually promise you
What Make teaches you about thinking in dependencies
Why writing logs matters even when nobody checks them
Starting from what you know works and walking toward the failure
A metadata struct masquerading as the real thing, and how a single type confusion crash reveals the importance of API boundaries
When software fails without telling you, the debugging is always harder — and the lesson is always the same
Why singletons get a bad reputation in OOP but work beautifully as registries in C
A simple pattern for persisting dynamic data when your serialization layer doesn't support key enumeration
What happens when the API you need doesn't exist yet, and how creative workarounds become the best code
Why well-placed TODO comments are some of the most valuable documentation a codebase can have
How to write useful tests for code that talks to the internet
A bug is the ending of a story. Debugging is figuring out how we got there.
What I've learned about understanding unfamiliar codebases, and why reading code is a skill worth developing