In software, there is no such thing as “done.” Done is a choice programmers make between quick but dirty and slow but clean. Done is just a balance held in tension by hundreds of choices made every day. Every decision a programmer makes incurs a cost called “technical debt.” It is an apt analogy. The more you spend up front, the less you’ll have to pay later. Whatever you don’t pay now, you’ll eventually have to pay back, plus interest.
Despite the tradeoff being so obvious, people are incredibly short-sighted. As such, the vast majority of codebases are a giant mess; the accumulation of months—if not years—of technical debt.
Programmers almost always opt to ship faster and incur the technical debt. Then they leave apologetic comments in their code or commit messages attempting to justify their decision to others. They are so concerned that they’ll be perceived as inept that they feel compelled to explain that they know they’re shipping low quality work but that it’s just temporary. Months and often years later you can still find the fossilized remains of these comments buried in codebases. The irony is nearly palpable.
What’s fascinating is that programmers genuinely intend to pay back the technical debt. They whole-heartedly believe that they will have an opportunity to fix the mess later; that this one time is the exception, not the rule. Against all logic and evidence to the contrary, they always think they’ll find time to pay back the debt they’ve accrued. I’m amazed and disappointed by the conviction with which programmers hold on to this fallacy.
For the most part, no one goes back and fixes the problems they create; they’re forgotten as quickly as they’re created. The culture that creates the problem is never the culture that fixes the problem. When people say, “we’ll fix it later” what they’re really saying is, “I don’t care enough to fix it now.” If you don’t care enough to fix it now, you never will; later is always later.
“You are exactly what you practice. You are only what you’re doing right now.” —Leon Gersing
The iconic motto of programming culture is “move fast and break things,” but that comes at a price: a lot of broken things. Be honest with yourself. If you don’t care enough to do it the right way, right now, when will you?