Understanding Technical Debt : Gajendra Singh Rathore

Understanding and managing technical debt: Software Engineering

Gajendra Singh Rathore
Nerd For Tech

--

Let’s delve deeply into the concept of technical debt in the context of general software engineering, exploring how it builds up over time and throughout product release cycles.

In this article we’ll read about:

  • What is technical debt?
  • How is it accumulated over time?
  • What are types of technical debt and their indicators?
  • Why it’s important to manage it?

Introduction

Introduction to the concept of technical debt

In the realm of software engineering, technical debt is a critical concept that developers and project managers must understand and manage it effectively.

It refers to implied cost of additional rework that’s needed to be done caused by choosing an easy, limited or quick solution now instead of using a better approach that would take more resources and longer time.

While it’s totally understandable and normal that we want to rollout features and product releases fast and meet deadlines and not considering technical debt can help expedite the process. But down the line it often leads to more significant issues impacting the overall project sustainability, impacting code quality and maintainability.

Types of technical debt

Based on a research paper published in December 2014, which was published by the Software Engineering Institute as Towards an Ontology of Terms on Technical Debt”, There are 13 distinct types of technical debt, Lets learn a bit about each one of them below:

Architecture Debt

  • Definition: Architecture debt refers to problems encountered in architecture of the project. It could be violation of modularity, not following SOLID principle etc. This can affect architectural requirements like performance and robustness of the system. This debt will overtime require extensive development activities to resolve.
  • Indicators: Issues in software architecture, structural analysis, structural dependencies and Modularity.

Build Debt

  • Definition: Build debt refers to build-related issues that make the task harder and more time-consuming unnecessarily.
  • Indicators: Dependency

Code Debt

  • Definition: Code debt refers to the problems found in source code that affect its readability and maintainability. This is often identified by examining the source code and relates to bad coding practices. This can be avoided to a great extent by proper PR reviews.
  • Indicators: Code Metrics, No proper coding standards, Duplicated CODE, Slow algorithms

Defect Debt

  • Definition: Software may have some known or unknown issues that are either not discovered yet or not fixed. This debt accumulates when defects are deferred due to competing priorities or limited resources but strict deadlines.
  • Indicators: Unfixed bugs, Pending backlog issues.

Design Debt

  • Definition: This debt is identified by analysing the source code for violations of good object-oriented design principles like large classes, not proper separation of concerns, tight coupling.
  • Indicators: Dispersed Coupling, duplicated code, huge God/Parent class.

Documentation Debt

  • Definition: This refers to issue in project documentation, including missing/incomplete documentation that can help developers to either onboard or understand systems on high or low level.
  • Indicators: Lack of documentation, incomplete or not maintained documentation.

Infrastructure Debt

  • Definition: This refers to infrastructure related issues whithin the software organization that can delay or hinder the development process when time comes. This could be delaying an upgrade or infrastructure fix.

People Debt

  • Definition: Relates to issues within the software organisation and it refers to insufficient training or hiring, concentrating expertise in too few people.
  • Indicators: Insufficient hiring, Concentrated expertise in few people, Little to no Knowledge transfer.

Process Debt

  • Definition: Refers to inefficiencies in processes that may no longer be appropriate for the project’s needs.

Requirement Debt

  • Definition: Involves trade-offs regarding requirements implementation, such as partially implemented requirements or those not fully satisfying non-functional requirements.
  • Indicators: Requirement backlog list

Service Debt

  • Definition: Issues arising from the need to substitute web services, which need to be managed and transformed from liability to value-added.
  • Indicators: Selection/Replacement of web service.

Test AutomationDebt

  • Definition: Refers to work involved in automating tests for previously developed functionality, impacting continuous integration and faster development cycles.
  • Indicators: No automated tests.

Test Debt

  • Definition: Issues in testing activities that affect testing quality. This includes planned tests that were not run or known deficiencies in the test suite, such as low coverage.
  • Indicators: No tests, Incomplete Tests, Low coverage.

Importance of managing technical debt in software engineering

There could be many reasons behind why it’s important to manage technical debt in software engineering.

Maintainability:

If unmanaged, technical debt can make the codebase difficult to understand and maintain in longer run. This results in higher costs and effort required for future development and bug fixes.

Quality Assurance:

High technical debt often correlates to higher number of bugs and lower overall software quality. Managing technical debt ensures that the code remains clean and reliable, reducing the risk of defects.

Performance:

Technical debt can also lead to performance bottlenecks if the underlying code is inefficient or outdated. Often to fix a minor performance fix a major code refactor could be necessary which is ignored due to urgency of release. Regularly addressing technical debt can help maintain optimal performance and reliability.

Development Speed:

A clean codebase allows developers to add new features and make changes more quickly. High technical debt can slowdown the development process as developers must navigate and work around poor code quality.

Cost Efficiency:

Addressing technical debt early can be more cost-effective than dealing with it later. The longer technical debt persists, the more expensive it can become to address issues as they then require significant refactoring or rewriting.

Scalability:

Software that accumulates technical debt over time may struggle to scale as user demands grow. Managing technical debt ensures that the code can handle increased loads and accommodate new changes and experiments without major overhauls.

Team Morale:

High technical debt can lead to frustration and burnout among developers [Personal experience ;) ]. Managing technical debt helps maintain a positive working environment by making development smoother and less error-prone.

Stakeholder Confidence:

Stakeholders, including customers and investors and business side of things need confidence that the software is reliable and will continue to improve. Effective management of technical debt high-quality software and long term sustainability.

Compliance and Security:

Neglected technical debt can lead to non-compliance with industry standards or introduce security vulnerabilities. Regularly addressing it ensures that the software remains compliant and secure.

Innovation:

Last but not the least- Innovation, Managing technical debt frees up resources and time that can be redirected towards innovation and implementing new features. This allows the team to focus on strategic goals rather than being bogged down by legacy issues.

That’s all. You can breathe now. We learned about Technical debt, Different types of technical debt and how it accumulates over time and most important, why it’s important to manage it over time.

❤️ Finally ❤️

I hope reading a bit about Technical Debt helped you in some way and you’ve learnt something from it. If you’ve any questions or suggestions, let me know in the comments and Please share it with people who might need to learn about the it.
Support by Clapping👏, Commenting 💭 and Sharing ❤️

Thanks, Keep coding. Cheers 🍻!

--

--