How to Grow a Project Without Accumulating Technical Debt
Table of Contents
Ideas have been pouring out of me these past few days. I want to build a proper support system in the bot — so users can report problems, ask for help, and have a dialogue with the administrator right inside the app. I want to add a “User Guide” section to the site — real documentation, written in plain human language, not techno-geek speak only developers and AI can understand. And also — add a QR code to the device card. Seems like a small thing: after the recent work on trial functionality, I have a rough idea of how it’s done. I think it’s simple and won’t take long.
Stop.
I think I just said the phrase that, apparently, is where all technical debt begins.
The Phrase Where It All Begins #
“It’s simple and won’t take long” — this phrase has two modes of operation, and both are equally treacherous.
The first: “We’ll do it later.” The task is clear right now: the context is in your head, the implementation is obvious, your hand reaches for the keyboard. But there’s something more urgent. The task goes into the “later” list. A week passes, then another. The context dissolves — and when you finally come back to it, you find you have to remember everything from scratch: why it was needed, how it should work, what it connects to. Something that took fifteen minutes at the moment it came up now takes an hour and a half and needs a dedicated slot in the schedule. A small current task quietly turns into a Task with a capital T.
The second: “Let’s do it right now!” A new idea takes hold — and your hand reaches for the keyboard, but at the expense of what has long been sitting in the queue. This is where Murphy’s Law in its extended edition kicks in: multiply your estimated time by two to account for unforeseen circumstances. Then multiply by two again — to account for just how unforeseen those unforeseen circumstances will turn out to be. The trial functionality alone took me an entire programming session. The result was good — the project moved forward. But something else shifted backward in the process.
Every new feature opens up horizons. But some directions end up marking time — displaced by the stream of newer and newer ideas.
Tasks That Are Always Postponed #
I’ve had a backlog of tasks piling up for a while now, ones that keep getting put off. Not all of them are technical. Remember the project mascot I mentioned in the very first post? More than three weeks have passed — and nothing has moved. I’m trying to cover a wide front of tasks across very different directions — alone. Two-thirds of my time goes to running this blog and the channel, instead of solving technical problems. I’m worried about user experience — instead of expanding the infrastructure and configuring the network stack on the backend.
I know you can’t do everything at once. But I’m trying.
The Invisible Work #
Sometimes I run entire sessions dedicated to polishing small things: wrong article order in the blog, broken navigation, strange artifacts, a word transposed in a sentence. These are such minor things that you can’t write about them in the blog or on the channel — not even in the section about the project’s day-to-day routine. It isn’t even routine. It’s quiet, almost invisible work. It produces no new results, goes unnoticed from the outside — but the project becomes a little bit better because of it. I’m sure I could spend an entire month on this and still have more left to do.
How do you find the balance between moving forward and this invisible polishing? How do you grow a project without accumulating technical debt?
Unfortunately, I don’t have an answer to that question.