By Ipek Ozkaya
Senior Member of the Technical Staff
Research, Technology, and System Solutions
Managing technical debt, which refers to the rework and degraded quality resulting from overly hasty delivery of software capabilities to users, is an increasingly critical aspect of producing cost-effective, timely, and high-quality software products. A delicate balance is needed between the desire to release new software capabilities rapidly to satisfy users and the desire to practice sound software engineering that reduces rework. A previous post described the practice of strategically managing technical debt related to software architecture, which involves deliberately postponing implementation of some architectural design choices to accelerate delivery of the system today and then rearchitecting at a later time. This blog post extends our prior post by discussing how an architecture-focused analysis approach helps manage technical debt by enabling software engineers to decide the best time to rearchitect—in other words, to pay down the technical debt.
By Ipek Ozkaya
Senior Member of the Technical Staff, Research, Technology, and System Solutions
As industry and government customers demand increasingly rapid
innovation and the ability to adapt products and systems to emerging
needs, the time frames for releasing new software capabilities continue
to shorten. Likewise, Agile software development processes, with their
emphasis on releasing new software capabilities rapidly, are increasing
in popularity beyond their initial small team and project context.
Practices intended to speed up the delivery of value to users, however,
often result in high rework costs that ultimately offset the benefits of
faster delivery, especially when good engineering practices are forgotten along the way. This rework and degrading quality often is referred to as technical debt.
This post describes our research on improving the overall value
delivered to users by strategically managing technical debt, which
involves decisions made to defer necessary work during the planning or
execution of a software project.