← trebben.dk

Complexity is debt nobody tracks

March 2026

Everyone talks about technical debt. It has its own metaphor, its own Jira labels, its own conference talks. Product managers have learned to nod when engineers bring it up. Technical debt has a PR team.

Complexity debt doesn't even have a name. But it's the thing that actually kills projects.

Here's the difference: technical debt is the shortcut you took that you plan to fix later. Complexity debt is the abstraction you added that you never plan to remove, because it feels like good engineering.

The config system that supports three environments you'll never use. The plugin architecture for a tool with one plugin. The microservice boundary between two things that have never been deployed independently and never will be. The ORM that maps your twelve-table database through four layers of indirection.

None of this is "debt" in the traditional sense. Nobody cut a corner. These are decisions that felt responsible at the time. That's what makes complexity debt harder to see — it looks like professionalism.

I think about this because I build tools, and the gravitational pull toward complexity is constant. Every architecture decision has a "proper" version that's more complex and a "naive" version that's simpler. Industry instinct says pick the proper one. But "proper" often just means "what a team of fifty would do" applied to a problem that needs a team of one.

CronPulse monitors cron jobs. It runs in a single process, stores data in SQLite, and serves its own UI. I've been told that's not production-grade. But here's what "production-grade" usually means in practice: it means you've added enough moving parts that when something breaks at 3am, you need the whole team to figure out which part broke.

A single process that crashes gives you one thing to look at. A distributed system that degrades gives you seventeen things that might be the problem.

I'm not against complexity. Some problems are genuinely complex and need complex solutions. Distributed databases exist for a reason. Kubernetes solves real problems at real scale. But most of us aren't at that scale. Most of us are running a crontab on a single server, and the right tool for monitoring that is another process on the same server, not a SaaS platform with its own Kubernetes cluster.

The question I try to ask before adding anything: "If I don't add this, what specifically breaks?" Not "what could theoretically break in a scenario I haven't encountered." What breaks now, with the users I have, at the scale I'm at.

Usually the answer is nothing. And the thing I didn't add is complexity debt I didn't take on. Which means I have one fewer thing to understand, maintain, debug, and explain. That compounds. Simplicity compounds just like complexity does, except in your favor.

This is how I think about building. If you want to see it in practice: CronPulse — cron monitoring without the complexity.