It’s fair to say that every software development team will at some point incur technical debt, whether they like it or not. Technical Debt you say? Not many people know what it is, so today I will do my best to help you understand what exactly tech debt is, and why it so important. So important that it’s at the forefront of our 2020 vision at gap intelligence. Paying off technical debt is the big focus for our Dev Team, among other initiatives.
Let’s start with a little bit of history first. Technical debt was a phrase coined by a programmer named Ward Cunningham, who is well known for developing the first ever wiki back in 1994. The term is a metaphor that software developers use, that refers to the “short-term compromises” to a software’s code or design quality, which in turn makes it difficult for someone else to continue to develop and maintain in the future. Ward compared technical debt to financial debt, in that you will incur interest if you don’t pay down the principal. So we can continue to pay the interest or we can pay down the principal by refactoring that quick and dirty approach you took and investing the time now to improve the code. Although it costs to pay down the principal, we gain in the long run by reducing payments in the future.
The metaphor also explains why it might be sensible to take the quick and dirty approach. Sometimes a business needs to capitalize on a market opportunity and must choose to incur some debt now. Deadlines can also cause technical debt to incur. In cases like these, short cuts in the code are almost inevitable. The problem is that organizations will let their debt get out of control and spend most of their future development efforts paying off interest payments.
Some of these choices are out of our hands and unknown at times, so it can be tricky to recognize, especially for things we don’t know about the future. Where this financial analogy fails us a bit is that, unlike financial debt, tech debt isn’t easy to measure either in terms of the cost of repayment or the cost of interest. That’s because some of the costs of tech debt are unknown upfront. Applying this to the financial analogy, it would be like signing up for a range of debt with an undefined interest rate for an undefined amount of time. This does NOT sound like a good idea!
The Technical Debt Quadrant
There are different types of technical debt and different reasons why it is incurred. First it comes down to being aware that you’re incurring debt, and then to the reasons why you might choose to inherit said debt. Martin Fowler, a well known software developer, refers to this as the Technical Debt Quadrant and describes the kinds of debt as Deliberate and Inadvertent, and the choice of taking on debt can be described as Prudent or Reckless.
The ever popular tech debt quadrant:
- Reckless – Deliberate: The team does not have time for design and provides a quick and dirty solution with little foresight into quality.
- Prudent – Deliberate: The team must ship the product now with the known shortcomings and take a proactive lead on the consequences.
- Reckless – Inadvertent: The team is unaware of the basic design principles and hence does not even realize the mess that they are introducing.
- Prudent – Inadvertent: This is true for teams with excellent designers. They deliver a solution which is delivering business value but after completing the solution; they understand what the best design approach could have been.
Technical Debt is Everywhere
Up until now, we’ve discussed technical debt within the context of code. However, technical debt can be found throughout the entire technology stack— especially in SAAS (software as a service) organizations. Outdated operating systems, delaying security patch deployments, old libraries, and compilers can all contribute to a system’s overall technical debt. Infrastructure-based technical debt can make it more difficult for admins to do their work.
Here are some other deliberate & inadvertent examples of tech debt:
Deliberate:
- Not writing enough tests in order to ship faster
- Creating a shortcut in the code and pushing off re-factoring to a later date
- “Let’s just get this done so we can meet our important deadline”
- Choosing to delay upgrading libraries & frameworks your system utilizes
- The API works but could be faster so let’s release it now and optimize it later
Inadvertent:
- Inheriting 3rd party code
- Choosing a design strategy that proves later to have flaws
- Having to patch an operating system because there is a vulnerability in the OS
- Having to upgrade a version of a language you use because the version you are using will no longer be supported
By now, hopefully you can get a sense for why it’s so important to keep your debt in check. There are a lot of measures you can take to help minimize the technical debt you incur. For example: writing automated tests, team code reviews, documentation, automated syntax checks, updating supporting frameworks on a continuous cadence, etc.
No matter how talented and smart your software developers are, all these small deferrals can add up and will eventually catch up to you. We recently made the mistake of waiting a little too long to upgrade our Ruby on Rails framework. I’m happy to report that we have successfully upgraded to Rails 5, but it was not easy. We touched over 800 files in the act. Bottom line is, there are many ways to get yourself into debt. Your only way out is to buckle down, put in some work, and pay off that debt.
And remember…not all debt is bad, but too much will crush you. So make the investments in maintenance and refactoring today and support your dev teams when they say they need to pay off some debt. During the quarantine our team is working towards becoming debt free as gap intelligence does our part to flatten the curve.
Be on the lookout for part 2 of this blog, written by my teammate Timur, where we talk about the plan we have implemented, so that we can pay off our technical debt.
And finally….I leave you with this quote:
“It’s OK to borrow against the future, as long as you pay it off” – Ward Cunningham
For more than 17 years, gap intelligence has served manufacturers and sellers by providing world-class services monitoring, reporting, and analyzing the 4Ps: prices, promotions, placements, and products. Email us at info@gapintelligence.com or call us at 619-574-1100 to learn more.