Technical Debt is the collection of design or implementation constructs that are expedient in the short term but set up a technical context that can make future changes more costly or impossible. In other words, Technical Debt is the deferment of good software design for the sake of expediency. It presents an actual or contingent liability that impacts internal system qualities, primarily maintainability and evolvability. It can slow the delivery of future releases or sprint increments, make defects harder to find and fix, and erode good testing practices.
A good software design does two things:
- Communicates the intent of all software behaviors to the team’s developers, now, and in the future.
- Facilitates future enhancements, both expected and unexpected.
Consequences of Technical Debt
As the level of technical debt rises, so does the severity of the consequences like
- Unpredictable Tipping Point: At the tipping point, even small changes to the product become major occasions of uncertainty.
- Increased Time to Delivery: Taking on technical debt means taking a loan today against the time required to do future work. When velocity slows, it takes longer to deliver new features and product fixes to customers. So, in the presence of high technical debt, the time between deliverables actually increases rather than decreases.
- Huge Number of Defects: Products with significant technical debt become more complex, making it harder to do things correctly. The compounding defects can cause critical product failures to happen with alarming frequency. These failures become a major disruption to the normal flow of value-added development work. In addition, the overhead of having to manage lots of defects eats into the time available to produce value-added features.
- Rising Development and Support Costs: As technical debt increases, development and support costs start rising.
- Product Atrophy: As we stop adding new features or fixing defects that could rejuvenate our aging product, the product becomes less and less appealing to current and potential customers. As a result, the product starts to atrophy and simply ceases to be a viable option for most customers.
- Decreased Predictability: For a product with high levels of technical debt, making any sort of prediction is nearly impossible. For example, estimates become bad estimates even for the most experienced team members. There is simply too much uncertainty surrounding how long something might take when dealing with a debt-ridden product. Consequently, our ability to make commitments and have a reasonable expectation of meeting them is seriously impaired. The business stops trusting anything development has to say, and customers stop trusting anything the business has to say!
- Underperformance: Sadly, as it increases, people come to expect increasingly lower development performance and therefore reduce their expectations of what is possible.
- Universal Frustration: The unfortunate human consequence of high technical debt is that everyone in the value chain becomes frustrated.
- Decreased Customer Satisfaction: Customer satisfaction will decrease as customer frustration increases. So the extent of the damage caused by it is not just isolated to developers or even to the development organization as a whole. Even worse, the consequences of it can substantially affect our customers and their perception of us.
Four core processes to minimize Technical Debt
We need to be able to enhance the functionality of our software without damaging any of the prior investments in functionality. Four core practices to reduce it
- Refactoring – Refactoring is the reshaping of the code’s structure without changing any of the behavior of the system so that we can then more easily add the new functionality. It’s not reworked, and it’s not rewriting. A good design is a changeable design, by definition. This has to be possible in order to develop software incrementally and support healthy, diligent, continuous refactoring. Refactoring creates an understandable (readable, clear, straightforward) and changeable design.
- Test Driven Development (TDD) or Behavior Driven Development (BDD) – Refactoring needs a comprehensive and very fast automated test suite which is a key feature of TDD and BDD. These practices are often called “test-first” practices because we write a single test or scenario, and we work to get that test passing before we move on to writing another test. These build our safety net, protecting the investment in existing behaviors, while we add new behaviors and refactor confidently and swiftly. Test-first practices use test scenarios to communicate WHAT the software does, whereas the code itself tells us HOW it does that.
- Pair Programming – Another reason for it is the lack of real communication & continuous collaboration with peers. This allows continuous collaboration and dialog about enhancement requests, design, and quality. Collaborative practices like pairing and mobbing are all about instant communication and confirmation, thus considerably shortening typical feedback loops that exist on a team. E.g., the code is reviewed continuously, without creating rework or (worse!) embarrassment.
- Continuous Integration – Multiple pairs on a team will have the occasional merge conflict, but if they integrate numerous times per day, conflicts are small, rare, and easily resolved. Continuous Integration means we integrate continuously. Secures our important enhancements and refactoring, and provides them to others on the team. Continuous Integration distributes the most recent changes to the rest of the team and avoids ugly merge conflicts that often occur right before testing or delivery.
Vision for Managing Technical Debt
Challenge | Initial Step | Vision |
Process and Tools | Start aggressive initiatives to bring visibility to existing technical debt. Strategies include explicitly tagging technical debt issues, allocating resources for technical debt in the backlog and release planning, and reserving time to reflect on it during retrospectives. | Processes and tools manage it holistically throughout the lifecycle, enabling communication between stakeholders by evaluating intrinsic quality attributes. Few tools like Bliss, CAST Application Intelligence Platform, SonarQube, & Teamscale. |
Software economics | Track consequences of tradeoffs in terms of business and economic impact. | Technical debt management is used as a strategic software development approach. |
Software architecture | Use software architecture concretely during development, testing, and operations activities by managing quality attribute requirements and issues related to technical debt. | Focus on the source code and consequences on runtime behavior give way to managing technical debt at the level of architecture decisions and associated tradeoffs and risks. |
Empirical basis and data science | Instrument small changes in development activities to enable data collection, without overhead for teams, to provide input for establishing an empirical basis for technical debt management. Such information today includes iteration tempo, defect rate, bugs open for a long time, time spent on rework, files that are changed frequently, and so on. | Software development data is used for technical-debt analysis, with improved intelligent tools targeting developer productivity and efficiency. Validated models provide an empirical basis for decision-making. |
Education | Include it across the curriculum–such as how to avoid technical debt and how to use quality management tools and architecture reviews to uncover technical debt–spanning multiple courses or as a senior hands-on project. | It is an integral part of the curriculum, not as a separate course but as a learning thread permeating the course work. |
Reference: Click Here