Impact of Technical Debt in Software Development and Distributed Systems
In my previous article on technical leadership, I discussed how it can help prevent the accumulation of technical debt.
Now, let us talk about technical debt. Not exactly the most exciting part of IT, right? However, in modern IT landscapes, especially within distributed systems and rapidly growing organizations, technical debt tends to accumulate over time. Even superheroes like tech leaders cannot always prevent this. If you work in tech, you have probably encountered it, even if you did not realize it at the time. The shortcut taken to meet a deadline, the temporary fix applied to avoid a larger refactor might seem like lifesavers in the moment. But as the system grows and evolves, they come back to haunt you. 👻
Understanding Technical Debt in IT
In simple terms, technical debt refers to the cost of shortcuts or suboptimal decisions made in software development that require "paying back" later. These shortcuts might be made to save time, reduce costs, or quickly meet business goals. While technical debt can help deliver fast results in the short term, it creates extra work and complications for future development and maintenance.
Ward Cunningham, who coined the term, described technical debt as similar to financial debt. When you take on debt, you can make progress faster, but over time, you have to "pay interest" in the form of increased maintenance and slower development. [1]
So, imagine your codebase as a house. Every time you take a shortcut, like skipping a test or starting to implement with a suboptimal design, you are essentially building that house on shaky ground. Sure, the house goes up quicker, but over time, you will have to keep repairing and reinforcing it. That is the technical debt I want to discuss.
Note: For readability, the terms "software development" and "software engineering" are used interchangeably throughout this text.
What Does Technical Debt Mean for Distributed Systems?
In distributed systems, technical debt is not just an isolated problem of a bounded context or a service run by a development team. It is like a virus that spreads across your entire architecture. Microservices, APIs, databases, and cloud platforms are all interconnected. A quick fix in one service can lead to performance bottlenecks elsewhere, scalability issues, or even security vulnerabilities. Fixing technical debt in a distributed environment is complex because of the coordination needed between teams and services. Changing one part of the system can impact others, making refactoring risky and time-consuming.
And now comes the really unpleasant part 😞
That one decision to choose a "quick and dirty," "workaround," or "shortcut" solution for an urgent initiative can snowball into an entire legacy system that no one really wants to touch. Now you have to deal with a grown monolith, and every new feature or upgrade becomes dependent on it. Finally, leading to a process that is risky, slow, and painful.
Potential Impact of Technical Debt
💡 Why should organizations care about technical debt? 💡
Higher Operational Costs
Teams spend more time debugging, fixing, and adding patches rather than focusing on innovation or new features. Developers are constantly firefighting instead of building new things. Fixing bugs, patching workarounds leads to higher operational costs and reduced development efficiency.
Affecting Pace of Development
Technical debt slows down the pace of development. Instead of launching exciting new features, teams spend their time fixing what is already broken. Teams are often forced to work around existing issues, which reduces their ability to quickly adapt to new business needs or market changes.
Limited Agility
Want to introduce a new feature? When technical debt is accumulating, the system becomes fragile, making it harder to implement changes without breaking existing functionality. Agility? Not so much.
Recommended by LinkedIn
Frustration
Colleagues which are involved in the software development process can become frustrated when they spend most of their time dealing with technical debt rather than working on new features.
📚 If you want to read more about the potential impact of technical debt, please refer to the references: [3, 4, 5, 7, 8]. 📚
How IT Solutions Architects Help Manage Technical Debt?
Before discussing how IT Solutions Architects can help manage technical debt, I would like to highlight a key study: In their paper "Measure it? Manage it? Ignore it? Software Practitioners and Technical Debt" [2], Ernst et al. conducted a survey of 536 participants across three large organizations. The results of this survey revealed that the respondents identified architectural decisions as the primary contributor to technical debt so called architectural debt.
Therefore, an IT Solutions Architect should act in a way to minimize and manage technical debt by focusing on long-term, scalable and maintainable solutions. Depending on the priorization based on a solid trade-off analysis each requirement is more or less important. But Architects should be the ones keeping the ship on course, making sure you do not borrow more than you can pay back in an efficient way. So, where does an IT Solutions Architect fit into this picture?
Time and Change - Managing the Inevitable
And now some more bad news: Tech debt cannot be avoided in software engineering.
As discussed in the chapter "Time and Change" from the "Software Engineering at Google" book [9], change is an inevitable part of software engineering. Every decision we make, whether to prioritize new features or maintain existing code, contributes to the already existing technical debt. When changes are made without fully understanding their implications, it can lead to accumulating debt that may impact future development efforts.
Conclusion - Tech Debt in Software Development
Technical debt can have a big impact on IT costs. Studies shows, the longer we ignore it, the more expensive it potentially becomes over time.
Xiao et al stated in [2]: "We evaluated our approach on 7 large-scale Apache open source projects and the results showed that a significant portion (51% to 85%) of overall maintenance effort was consumed by paying interest on architectural debts. This suggests that projects could save a significant amount of maintenance costs if they can discover these debts early, and pay them down by refactoring."
So, technical debt is an unavoidable aspect of software development. However, it does not need to overwhelm your systems or teams. It is crucial for organizations to implement a strategy for managing technical debt to prevent significant challenges from arising, particularly in complex distributed systems.
For IT Solutions Architects, managing technical debt is not just about cleaning up messes. It is also about preventing, identifying, and documenting it as best as possible in the first place. And by doing so, they help that your organization remain agile, innovative, and ready for the future.
References
A critical point for defining technical debt is actually having a defined and communicated architecture e.g. like one based on TOGAF or DDD in the first place. Someones technical debt is the perfect solution for somebody else.
had to think of your article when this popped up on my twitter feed :D