Live data from Hacker News

Towards an understanding of technical debt

laughingmeme.org

1–10 of 26 posts

Re: Towards an understanding of technical debt

#2
"Hence the paradox: how is it that a team of brilliant senior engineers need 6 months to clean up after that one early programmer’s weekend kludge job?"

I don't think things happen quite like that - what I have seen happen is that a "weekend kludge job" becomes the foundation for a lot of subsequent work and the "kludge job" sets the so after a year you can have a vital production system that has been extended and "improved" in a completely ad-hoc fashion and it's that that takes a lot of effort to reverse engineer and structure properly.

In my experience it is really difficult to raise the quality level on a project once it gets going - thing generally only get worse as external things start to impact (timescales, scope creep etc.). The only way things seem to keep high quality is to consciously start high and fight to keep standards high - which can be pretty difficult.

Re: Towards an understanding of technical debt

#4
I feel like this post misses the point of the whole "technical debt" analogy. They way the author talks, it seams like their org. uses it as a catch-all term for complaining about the code base. But that's never been the point of the term.

"Technical debt" is the justification for process and development decisions that require more time up-front but will save time in the long run (especially as a term to communicate this to non-technical management). It only comes into play when you're talking relatively about two or more different choices.

Just as an example: when deciding to move ahead with less testing or to move more slowly and write unit tests for every function, you should consider the first to come with more technical debt. That doesn't mean it's the wrong decision, it just means that it should be a factor in your thought process.

Re: Towards an understanding of technical debt

#5
I see technical debt differently. Technical debt is something you take on in exchange for moving faster. Maybe you skipped writing unit tests. Maybe you didn't respond to all the style feedback, or even do a code review. But at the time you make the choice, you should know that you're borrowing time from your future self in order to move faster now.

Like real life monetary debt, technical debt has 2 aspects: the principle and the interest. Sometimes the interest ends up being variable rate and backbreaking for your project - you should have written those tests up front and saved yourself a lot of time. Sometimes the whole project dies before you pay back the debt - you go bankrupt but it's no big deal, your creditors are friendly. In either case, the principle usually isn't smaller when you go to address it. You're just delaying payment in favor of speed.

What the original artical addresses are several aspects that I might call "technical assets" that have depreciated significantly. That kludge, if it wasn't done intentionally, isn't debt - it's now an asset. If you didn't have a plan to pay it off in the future, you've already bought it and now you need to replace it. And the replacement is very expensive. That is a technical investment you're deciding to make. You aren't just paying off debt at that point, it's a whole new capital expense.

Re: Towards an understanding of technical debt

#6
I'm currently on a month-long crusade against what initially was a single small poor code choice (a denormalized model in Rails) from 4 years ago.

As it stands, over 5% of the codebase has been deleted so far without reducing functionality. One could argue that a significant part of the application were just hacks to get around the original hack, and hacks to get around those etc.

Not sure how to break that down into the categories provided, but given that the problems add up to proportions unimaginable to anybody but IRS, debt as an analogy works well enough for me.

Re: Towards an understanding of technical debt

#7
post #4

I feel like this post misses the point of the whole "technical debt" analogy. They way the author talks, it seams like their org. uses it as a catch-all term for complaining about the code base. But that's never been the point of the term. "Technical debt" is the justification for process and development decisions that require more time up-front but will save time in the long run (especially as a term to communicate…

I think it's more complex than that.

If you look at a practice like Unit testing, you tend to find some organizations are having success with it and others not. Some of them see it as a "waste of time" and others see it as a "timesaver". How the practices are implemented are as important as the practices you decide to use. If the unit tests for your project take 3 minutes to run you may have a problem. If you are writing a large number of hard to maintain mock objects you may have a problem. If the program is not divided into units that are easy to test that is a different problem.

Another good example is the use of Vagrant. It is very possible to have Vagrant spinning like a top, but in a lot of places you hear software management grumbling that a team of 3 people wasted 2 weeks screwing around with it.

I see it so common for developer discussions to center around "cargo cult" positions (i.e. "singletons are evil") and not around a real dialog about the work to be done and how to do it.

Re: Towards an understanding of technical debt

#8
There's a lot of ways to parse technical debt. The simplest one I've found, while it has its shortcomings, is this from a Deloitte article:

They state, in general, it costs $3.61 technical debt / line of code.

"Technical debt is a way to understand the cost of code quality and the impacts of architectural issues. For IT to help drive business innovation, managing technical debt is a necessity. Legacy systems can constrain growth because they may not scale; because they may not be extensible into new scenarios like mobile or analytics; or because underlying performance and reliability issues may put the business at risk." (Tech Trends 2014, Deloitte University Press).

It's an easy to use metric to weigh the cost of supporting programs, and relatively simple for managers to understand. It has the added benefit of encouraging reducing the size of the code-base when possible.

Re: Towards an understanding of technical debt

#9
(This is not disagreement with the original post, but further musings.)

One of the other problems with the technical debt idea is, debt relative to what? Since I think most people do not consciously instantiate an answer to that question, I think most of us non-purposefully choose by default a comparison to an idealized perfect code base that is somehow perfectly correctly factored, yet also as fast as completely optimized code, completely documented without being overdocumented, simultaneously optimized for all possible future changes, and despite not existing at the moment, also perfectly understood by the original team such that they can do anything they like to it, and such understanding will survive any such refactoring, all accomplished in exactly the same amount of time that it took to write the terribad code that we actually have.

OK, but that was never on the table, though. What I described isn't even possible to manifest, and even if you back it down to what is at least sort of possible, you don't have the resources to manifest it before you simply run out due to lack of customers. You're not really taking on "debt" if you fail to manifest that, any more than you are taking on "debt" if you fail to make every possible dollar you could if you perfectly correctly harnessed your skills and made the perfect deals.

I think what a lot of people call "debt" is simply the natural state of code. Debt is something somewhat more exceptional than that. There is a core idea of value there, because there definitely is an operation where we deliberately make a short-term choice at the cost of long-term pain, but it requires more thought than I think has traditionally been given to it. The baseline needs to be more carefully defined.

As I said at the top, I'm just musing here; I don't have a ready-to-go definition of "baseline quality" here.

Re: Towards an understanding of technical debt

#10
post #9

(This is not disagreement with the original post, but further musings.) One of the other problems with the technical debt idea is, debt relative to what ? Since I think most people do not consciously instantiate an answer to that question, I think most of us non-purposefully choose by default a comparison to an idealized perfect code base that is somehow perfectly correctly factored, yet also as fast as completely op…

>OK, but that was never on the table, though. What I described isn't even possible to manifest, and even if you back it down to what is at least sort of possible, you don't have the resources to manifest it before you simply run out due to lack of customers. You're not really taking on "debt" if you fail to manifest that, any more than you are taking on "debt" if you fail to make every possible dollar you could if you perfectly correctly harnessed your skills and made the perfect deals.

I don't think that's such a problem, though. The "perfect" codebase should be the baseline to which you compare your current debt.

Just like in real life, you take on some debt to have a basic standard of living. You might have a mortgage or maybe a car loan or some minor credit card debt, and you're normally always working on paying a little bit of that off. In a perfect world you'd want no debt at all, just like in a perfect codebase. But, a small amount is natural. It's only when it gets unruly and unmanageable that it becomes a problem.

---

Aside, the first and last lines of your comment reminded of this post: https://news.ycombinator.com/item?id=10859383

Post reply on HN