All Code Is Tech Debt (Just With Varying Interest Rates)
A healthy software engineering organization in 2020 has a good understanding of what tech debt is, and why the debt metaphor is good. Engineers with any significant experience understand how implementation decisions create or reduce debt, and product managers (especially those that went to business school) understand that paying down debt must be done regularly for the long term health of the product. Debt is a useful tool for growth, but ultimately must be paid down, or at least managed.
This unavoidable truth about actively developed software is ingrained because of countless conversations that boiled down to “this feature is not as easy as it seems, the system has too much tech debt”. Inevitably, engineers complain to product managers about the system produced by their predecessors, and after enough of these conversations, product managers learn that they will get more product in the long run by listening to these complaints and allowing the engineers time to improve the system without creating new features. And of course, “we’ll build it better this time so we don’t run into these problems in the future”.
The secret though, is that engineers generally won’t admit that their code is debt too, right from the start. Not because it’s bad (it might be!), but because it’s code. All code is debt! No matter how well constructed the system, if bugs are to be fixed and features are to be added, the code must be understood at some point in the future. While engineers strive for simplicity in their systems, understandability can never come for free - it can only come with the lowest rate of interest possible.
Simply writing code is creating debt. Every new feature comes with a long term cost beyond the initial cost of development. This is rarely discussed by product managers when considering cost, but it’s especially important for a long-term-focused business that isn’t rapidly growing (i.e. most of them, despite what it may seem like from reading hacker news). And this cost of understandability does not only fall on the engineers, it falls on the entire organization all the way out to the users.
So why write code at all if it’s all just debt? While code is debt, what the code does is an asset - and when you have more assets than you do debt, you have equity. Minimizing debt and maximizing equity is what makes a great software engineer.