Weaveworks 2022.03 release featuring Magalix PaC | Learn more
Balance innovation and agility with security and compliance
risks using a 3-step process across all cloud infrastructure.
Step up business agility without compromising
security or compliance
Everything you need to become a Kubernetes expert.
Always for free!
Everything you need to know about Magalix
culture and much more
The term technical debt is an abstract construct used to describe the potential long-term impact on development programs by decisions made at the program’s start.
For example, a fast-paced development that focuses on a minimum time to market by taking shortcuts through the development lifecycle will probably require significant long-term maintenance effort to resolve issues created by the rapid development.
This long-term effort is the technical debt that developers must repay if the end product is to become a polished, fully functional item. Thus, a fast and dirty development will incur a high technical debt.
By comparison, a slow-paced development that identifies and resolves all issues during the development life cycle without deferring the implementation of features will deliver a polished, fully functional item with low technical debt. That is, maintenance efforts to resolve issues will be minor.
Therefore, there is a tradeoff between the pace and thoroughness of the development lifecycle with the incurred technical debt. Furthermore, each program will have its unique aims, objectives, challenges, and dependencies that influence the tradeoff. Therefore, there is no optimum technical debt; it depends on the nature of the program.
The critical point is that technical debt is always an inherent part of doing business. The key is to identify and manage the debt.
The typical factors that influence the technical debt are:
The short-term program factors determine the magnitude of the technical debt. The long-term success of the program depends on the management of this debt.
Decisions made in a development program can lead to the creation of technical debt.
Deliberate and prudent accumulation of technical debt is a necessary tradeoff in rapid development programs to meet timescales by deferring part of the development program to a later phase. This action is planned and controlled, with a definable solution to repay the debt. Sometimes decisions need to be made that create technical debt that the business will never repay. Where the cost of repaying a debt outweighs the benefits, a risk-based business decision may conclude that the debt is acceptable. Not all technical debt is bad.
Figure 1: Sources of Technical Debt
The increasing popularity of migrating infrastructure and services to a cloud environment brought technical debt to prominence. As a result of the benefits of financial savings and technical flexibility, there was a natural attraction to cloud migration for businesses looking to reduce costs and improve processes.
The issue was that the migration process was not always straightforward. Some organizations found that they could not migrate existing services and procedures, that they needed to throw them all away and start from scratch. And the reason was technical debt. Businesses found that short-term decisions taken in the past prevented them from having a quick and simple migration process.
Once the concept of technical debt was out in the open, organizations then found that it existed everywhere, from software applications to consumer products, network infrastructure to end-user devices. Thus, identifying and quantifying technical debt provided the stimulus for businesses to manage it.
Running outdated servers that create processing constrictions or operating systems beyond their end-of-life are classic examples of the accumulation of technical debt.
Cloud migration not only helped many organizations resolve their technical debt issues, but it also identified that they had unknowingly accumulated this debt in the first place.
Deliberate prudent technical debt can be costed based on the time and resources required to implement any deferred functionality. Inadvertent and reckless technical debt is a much more complex problem to solve. Resolving issues caused by substandard infrastructure, poor implementation decisions, or design and development errors can be challenging to quantify. The unquantified issues may be simple to fix, or more often, they can place a substantial financial burden on the business to resolve. Replacing the entire infrastructure or refactoring the whole codebase may prove economically unviable, bringing the program to a premature end.
Typically, the cost of repaying any technical debt comes down to the following factors needed to remove the debt:
Deliberate and prudent technical debt is by definition managed and controlled. The main problem is the intentional and reckless creation of inadvertent debt that inhibits innovation and the adoption of new technologies. From a business point of view, these issues impact growth and competitiveness. A business that cannot adapt to changing market trends will quickly lose market share.
Many factors influence technical debt; the key to keeping this debt to manageable levels is primarily down to following good development practices, such as:
All these good practices come down to the creation of policies and standards that impose good development practices. However, implementing and enforcing policies and standards is a challenge, mainly where resource restrictions and pressure to achieve program milestones are brought to bear.
The traditional enforcement of policies and standards used manual processes built around review and audit procedures. While nominally effective, this approach has two significant drawbacks.
In a rapid development cycle, manual processes add delays. As a result, management applies pressure to speed up the processes. Unfortunately, this pressure introduces more errors. The extra errors contribute to increasing the inadvertent technical debt.
The solution to maintaining high quality in a rapid development cycle with the minimum of technical debt is to look at ways to reduce the overhead of managing policies and standards and automate their enforcement. The answer is codifying these policies and standards.
The principle of policies and standards as code is simply writing the rules that the policies and standards defined in a high-level language that automated processes can interpret. Enforcing these rules can be automated alongside development processes to eliminate bottlenecks and human error.
An additional benefit is that these rules can now be subject to the same best practices as the development artifacts that they apply to, improving their quality. Configuration control, automated testing, and automated deployment can all manage the policies and standards.
By codifying policies and standards, developers can undertake automated checks for inconsistencies and contradictions. This capability is critical when changes to regulatory requirements or market-led legislation require integrating additional standards into the overall ruleset for the development activities. You can learn more about using continuous compliance checks to enforce cloud security and best practices at the build and deployment time here.
A final benefit is that by representing policy and standard-based rules as code, the information and logic about the rules have a direct representation in code that developers can augment with comments. In addition, each rule’s purpose will have an unambiguous definition in a form that developers can comprehend. Studies show that developers are more likely to conform to a rule if they understand why it is applied.
If you’re a Kubernetes user, take a look at our Kubernetes Governance webinar replay - Managing your Policies & Standards.
The development and operation lifecycle has changed significantly with highly automated DevOps processes. Unfortunately, this advancement has led to a culture that promotes creating minimum viable products quickly, followed by product updates to add functionality and resolve issues. As a result, this approach encourages the creation of vast levels of technical debt that will need to be repaid further down the line.
The attraction of this approach is that it achieves the initial development quickly, which visibly meets a business target. However, the long-term debt repayment is less visible, buried in the maintenance activities. Therefore, where meeting the time to market goal is more important than creating a high-quality, fully functional, and error-free product, large technical debt will always be the outcome.
The challenge for developers is to reduce this debt as much as possible by building high quality into the development processes without compromising timelines. Codifying policies and standards are the solution to this problem, automating quality control and reducing errors in deliverables to minimize inadvertent technical debt. This will leave the known, managed, and controlled deliberate technical debt to be resolved as part of future developments.
Magalix empowers organizations to integrate policy-as-code and standards-as-code into DevOps processes and culture. This service allows businesses to apply governance to manage technical debt, enforce quality standards and reduce risks across infrastructure and workflows. Find out how to integrate your governance and compliance scenarios with the Magalix Platform Overview.
To learn more about how we can support your development processes, please get in touch.
Self-service developer platform is all about creating a frictionless development process, boosting developer velocity, and increasing developer autonomy. Learn more about self-service platforms and why it’s important.
Explore how you can get started with GitOps using Weave GitOps products: Weave GitOps Core and Weave GitOps Enterprise. Read more.
More and more businesses are adopting GitOps. Learn about the 5 reasons why GitOps is important for businesses.
Implement the proper governance and operational excellence in your Kubernetes clusters.
Comments and Responses