Technical Debt
In this article I want to talk about a term that I think is just brilliant: technical debt! The term technical debt makes an analogy: it considers the use of quick, but poor, technical solutions to store up a form of debt. As with more conventional forms of debt, the immediate problem is solved, but trouble can be stored up for the future. The reason I like the term so much is because, by its use of analogy, it makes it much easier to communicate a concept that is, otherwise, rather tricky to explain.
All too frequently in software development, technical/design problems are solved sub-optimally in the interests of speed. Actually that is putting it too nicely. Such problems are often solved using quick and dirty hacks. This is usually done in the belief that it will get a solution in place quickly. Often the belief is actually correct, and this approach does indeed get a solution in place quickly. However, there is a price to be paid. The price manifests itself in the form of code being difficult to work with in the future, and therefore the risk to future deliveries is much increased.
Here lies the importance of the debt analogy: there is nothing wrong in principle with technical debt, but like any other kind of debt it must be managed, and it must be managed effectively. If debt is to be entered into then it is imperative that the debtor is in control of the debt - the debt must not be allowed to control the debtor!
The need to make a delivery in time, typically so as not to miss a market window, may make it necessary to accept a "quick hack" solution. However, such a solution can not be allowed to remain in place; if it is, then soon it will become difficult - and even practically impossible - to meet deadlines. For this reason, some planning is necessary; time must be made factored into the development schedule for solutions carrying such a technical debt to be reworked with more enduring solutions. Failure to do this leads to developers being unable to work with the code base, and ultimately the code base needing to be rewritten from scratch.
Typically, such rework is not carried out because (non-technical) management decide to spend the development time on new features - after all, the code works so why spend time rewriting any of it? Software developers then become frustrated because they perceive this as incompetence on the part of their management. This attitude is wrong on the part of developers! Technical debt is in the technical domain, and therefore it is not something non-technical management should be expected to understand - at least, not without it being explained to them in such a way that they, as non-technical people, can understand it. The responsibility here lies with the senior software developers, who have a responsibility do learn to communicate this issue to their management.