I recently stumbled upon a great post by Steve McConnell, which formulates very nicely the concept of technical debt.
(Some other great posts on this topic include developer-debt and knowing-costs-of-development-choices.)
the taxonomy of technical debt is:
Non Debt
Plus, if you’re reading this then you are probably already aware of the technical debt you are incurring :)
"Numerous tiny shortcuts"
This is the kind I want to talk about, and I realize now that my previous post on Demo Leakage may have been a sub type of.This is the kind of debt that is accumulated by "taking hundreds or thousands of small shortcuts--
It may also include some crazy nested ifs, comparison to hard-coded inline strings, etc.
"..like credit card debt. It's easy to incur unintentionally, it adds up faster than you think, and it's harder to track and manage after it has been incurred"
Why is the kind bothering me?
Because it is this type that makes us software craftsmen cringe, it is this stuff that inspires posts such as this.
We know what the REAL interest rate is, even if we cannot quantify it exactly for the non technical staff.
The other ones will not necessarily be needed to be fixed in this version, and when they do it will probably be easily recognized and understood that it will take a significant effort.
Why is it not worth discussing and trying to decide if any such shortcut is worth it?
- Because management will tend, more often than not, to think that the debt you're proposing is reasonable, because every time it's just +1$ on the credit card.
They do not have the mental picture we do of the other $$ already there, and they definitely do not smell the code smells we sometimes do in order to realize that this one extra $ may topple everything over. - It's almost never worth the time estimating the "interest rate" - almost every such small hack could simply be solved during the time it would take to discuss it.
- I think that the effort that goes into explaining this kind is not worth it. It usually involves intricate details of some implementation, and it's hard even for us to quantify the real damage.
- And most importantly - you will almost never get the approval to pay off the debt. Until, that is, you "have to" add another feature.
Then you're stuck in maintenance hell as well as under time pressure, with management that doesn't understand why this tiny addition requires 3 days of work.
In my experience, you will never get a product manager's approval for a task called "refactoring X".
We should not present it as something that can be weighed against other features. It is simply part of the work that needs to be done in order to call something "Done Done".
Concern for "over-engineering"
Yes - there is the chance of some over-engineering, but you should have developers/team leaders in place who you trust to know and exercise the right balance.
Well, I would choose "wasting" an extra hour of design and a solution that is " a little too generic" any day over wasting twice the time a week later on maintaining a hack.
And over time, 1 out of 10 times of a bit of over engineering balances out with the other 9.
And an anecdote for the end - one of the comments from the following post :
-- Ask an Architect to place the walls such that they don't load the weight properly, or an electrician to wire the outlets in one big circuit, etc.
