Skip to main content

Technical Debt and AI's Chest of Gold

The reason for the detour is gone, but you'll be taking those extra steps forever!

The reason for the detour is gone, 
but you'll be taking those extra steps forever!


 Our new CTO does not believe in Technical Debt.

If you are not familiar with the concept, Technical Debt is a metaphor first proposed by Wade Cunningham in the early 1990s. In an Experience Report for OOPSLA 1992 (the annual conference for Object-Oriented Programming, Systems, Languages & Applications), he wrote:

Shipping first time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite. ... The danger occurs when the debt is not repaid. Every minute spent on not-quite-right code counts as interest on that debt. Entire engineering organizations can be brought to a stand-still under the debt load of an unconsolidated implementation, object-oriented or otherwise.

As a manager of teams responsible for maintaining apps built upon legacy code, I see the impacts of that technical debt on a regular basis. Some business logic got buried in the wrong place in the code, for reasons of expediency or carelessness, and now reusing that code takes a monumental effort.

 

Technical Debt
Technical Debt

So why does our CTO not believe in the concept? Why does he not subscribe to this common metaphor in our industry? The short answer is: perspective.

He views the state of the code base from the perspective of the company, the evolution of the suite of products over time, rather than from the perspective of the technical players, the devs and engineers who see it as an accumulating weight slowing them down.

Technical Debt, from this perspective, is about changes to business requirements over time. Why were shortcuts taken? To ship faster, thereby getting an app or feature set to production by a deadline for business reasons. Why are we struggling to make changes now? Because the business requirements have changed; had they remained static, any "interest payments" in the metaphor would have been manageable, or at least acceptable to the company.

The irony is that our CTO was unconcerned about the accumulated Technical Debt until Artificial Intelligence came along.

When our applications evolved through the sweat and toil of humans, the interest payments in the tech debt metaphor were acceptable to pay, and were explained to my team and to senior leadership as the necessary price of delivering on the new business requirements.

AI radically changed the calculations behind these Technical Debt payments. Now, a massive refactoring that would have taken the team days can be done in hours; estimates of weeks can now be reduced to mere days.

It is as if AI walked into the room carrying a chest full of gold coins. Now those tech debt payments were affordable, using that AI gold.

Yet now, even with the AI-powered development and the reduced impact of Technical Debt, our CTO has approved projects to clean up the code base. We have initiatives either scheduled or already under way to refactor some corners of the codebase or to rip out others that have minimal traffic or too few customers.

Why the interest in repaying that Technical Debt now? It is because of the rising cost, not of the Tech Debt in our metaphor, but the rising cost of tokens and AI usage. The massive codebase needs AI tools that can handle a large context; those tools then need to work through millions of lines of code across several distributed systems and micro-services.

That all costs real money. Not in terms of hours needed for a human to deliver new features despite the sub-optimal code; rather in dollars needed for the AI tool to work its magic.

AI might bring its own metaphorical chest full of gold coins to pay those metaphorical interest costs; but it comes with real, non-metaphorical hits to the bottom line.

Of course, the old-fashioned human struggle with sub-optimal code had its own real-world costs, in the added time to deliver a feature and in the opportunity-costs of what could not be delivered while all that time was spent paying the tech-debt costs. That was the point of Mr. Cunningham's metaphor.

It might have taken eye-popping monthly cost numbers for our AI tools to prompt our CTO to bless a code cleanup effort, but the end result will be a cleaner, leaner, healthier codebase for our future. And that will make everyone happy - the engineers will find more enjoyment in their labours; the company will benefit from increased velocity in our development; the finance team will be happy with the dropping costs for our AI usage; and the CTO will enjoy the glow of successfully raising our overall team productivity.


Popular posts from this blog

Trigger Windows Scheduled Task from Remote Computer via Jenkins

One thing I love about working in Information Technology is the opportunity - the NEED - to constantly learn new things. If a week goes by in which I have not looked up something on StackOverflow or other message boards, I start lobbying my team for more challenges. This week, I learned the power of running " SCHTASKS.exe " from a command-line script for a remote server in a Microsoft Windows environment. If you don't know Schtasks, you can read up on it here: https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357(v=vs.85).aspx In a nutshell, it is the command-line interface for the Windows Task Scheduler, and allows you (or a system administrator) to create, change, run, query, terminate, and delete scheduled tasks on a work-station, either the local one or a remote one. Not all of the features are available in older versions. In my scenario below, this was relevant as the local computer will be a Windows 8 machine, and the remote server is, shall we ...

Abort a Git Merge or Cherry-Pick

Recently a colleague of mine used the Git Cherry-pick feature to bring one of their commits from one branch of our repository to another. They hit a somewhat complex merge conflict and, in trying to resolve all of the conflicts in the file, they got confused about what needed to be done. They came to see me with the question: can they cancel their cherry-pick and partial merge, and start over? The answer is Yes: it is possible to abort a merge or a cherry-pick Git operation. Most of the time it is not needed; with a little work and human intelligence, the merge conflicts can be resolved without too much trouble. But sometimes, in cases like my colleague faced, a more complex merge winds up confusing the developer, and they want to go back and start over. If you use git from the command-line, it’s as simple as: git cherry-pick --abort or git reset --merge On my team, about a quarter of us use Git from the command line, but most - like my colleague in this story -...

How to do Git Rebase in Eclipse

This is an abbreviated version of a fuller post about Git Rebase in Eclipse. See the longer one here : One side-effect of merging Git branches is that it leaves a Merge commit. This can create a history view something like: The clutter of parallel lines shows the life spans of those local branches, and extra commits (nine in the above screen-shot, marked by the green arrows icon). Check out this extreme-case history:  http://agentdero.cachefly.net/unethicalblogger.com/images/branch_madness.jpeg Merge Commits show all the gory details of how the code base evolved. For some teams, that’s what they want or need, all the time. Others may find it unnecessarily long and cluttered. They prefer the history to tell the bigger story, and not dwell on tiny details like every trivial Merge-commit. Git Rebase offers us 2 benefits over Git Merge: First, Rebase allows us to clean up a set of local commits before pushing them to the shared, central repository. For ...

Updating Oracle javapath symlinks on Windows

A Java-based application on my Windows 10 machine recently started prompting me to upgrade my version of Java. Since I wanted to control it myself, I declined the app's offer to upgrade for me, and downloaded and installed the latest Java 8 from Oracle. In my case, Java 1.8.0_171, 64-bit version. The upgrade went fine. But when I launched the app, it again said I needed to upgrade. Why was it still looking at the old location? I made the change using Settings, to change the JAVA_HOME environment variable to point to the location of the new upgrade. But no change, the app still insisted that I needed to upgrade. A little research into the app's execution path showed that it was using c:\ProgramData\Oracle\Java\javapath to find Java. When I looked in that folder, I found symbolic links to my old Java installation. Normally, this hidden bit of information gets updated automatically in the upgrade or installation process. I have read of cases where, when downg...

Git Reset in Eclipse

Using Git and the Eclipse IDE, you have a series of commits in your branch history, but need to back up to an earlier version. The Git Reset feature is a powerful tool with just a whiff of danger, and is accessible with just a couple clicks in Eclipse. In Eclipse, switch to the History view. In my example it shows a series of 3 changes, 3 separate committed versions of the Person file. After commit 6d5ef3e, the HEAD (shown), Index, and Working Directory all have the same version, Person 3.0.