Live data from Hacker News

The Way We Look at Technical Debt Is Wrong

bigeng.io

91–100 of 114 posts

Re: The Way We Look at Technical Debt Is Wrong

#91
I see a lot of wisdom in this article and I find myself nodding, but I'm dubious whether it's effectively communicated from the article per se or its just my experience dovetailing with the author's. The problem is that "technical debt" is an analogy, and like all analogies, it breaks down. It's never a choice between writing perfect code or hacking together the fastest ugliest thing that could possibly work, rather all long-term software development is a continuous series of tradeoffs heavily dependent on an unknowable future.

Consider the center-point of this article:

> I view technical debt as any code that decreases agility as the project matures.

Well, any given piece of code can have positive or negative value based on what change you need to make in the future. You can have a perfectly factored, elegant piece of code which becomes useless if the job to be done changes, at which point you are better with no code than the previously ideal code. On the other hand, you can have a module which is ugly as sin, unreadable, and horrible in every way, but it does a job that never needs changing, and it's isolated enough that no one ever even has to look at it or consider it.

So the very judgement of the scope and severity of technical debt depends non-trivially on the future. Individually design decisions can be critiqued, and the likelihood of certain types of changes can be weighed out, and certainly the best engineering and product teams are very very good at this, but the fact is that the whole endeavor is terribly fraught and difficult to concretize.

All that said, I think the author is absolutely right that engineers often have a proclivity to polish some bit of code or architecture when their time would be better spent elsewhere, but it's just a tiny microcosm of the problem facing all startups: you need to build a money-making machine, and you have infinitely many dials to turn, with only a handful of (hopefully) smart people on a very limited runway. How do you make decisions day-to-day about where your greatest marginal utility lies? I don't think there are any rules of thumb that are globally applicable. If you are lost, a blog article is not going to help you. The only hope is to gather feedback as widely and quickly as possible and be brutally honest with yourself.

Re: The Way We Look at Technical Debt Is Wrong

#92
post #72

Earlier quoted context omitted.

That's the everyday struggle; as developers we can produce so much wealth just by typing at a keyboard. Yet we let ourselves be controlled by people who don't know what's what and can't even prove their ideas have any return on investment. As you say, don't make magic happen . It doesn't matter how cool it would be if, or how you think you'll show them your ideas are better; when you say "it cannot be done" don't go…

If I understand your story correctly, that other dev accomplished the task in some characteristically short amount of time, plus an hour for fixing a bug. While you didn't specify what your "X" was, it sounds like the manager (and the company) got a better outcome by going around you and it was far from being "asked to do the impossible".

I believe his point was that there's often a difference between finishing the task and actually fixing the issue.

Re: The Way We Look at Technical Debt Is Wrong

#93
post #13
post #3

"Financial debt, however, accrues interest and hurts more regardless of what it is incurred for." I'd disagree, I think all technical debt accrues interest (similar to financial debt), but the interest rate is different. As the example about a usps api demonstrated, that has a near 0% interest rate. Of course if you were ever to need to update it (maybe usps updated its api) you'd get hit. A bad domain model has a hi…

A problem with comparing the metaphorical debt of technical debt to the financial one is that interest rates can be negative. In addition, the term "debt" also applies to moral aspects, and not just financial ones. A builder may come back and improve something not because it's good for the employer or has financial benefits, but because of a belief that quality is good for the soul of the builder. That is also an asp…

>If a company (like Microsoft with Excel) is slow but eventually gets there, then they are successful.

Excel was successful because Lotus decided 123 had so much technical debt it would be a good idea to "upgrade" the old assembler code to C. This took at least a year longer than planned, and introduced a lot of bugs and incompatibilities.

Meanwhile Windows had arrived, and the planned Windows rewrite of 123 never happened as scheduled.

So it wasn't so much that technical debt killed 123. But poor management of technical debt certainly did.

Effectively the C rewrite was a complete waste of time, and Lotus should have aimed for a Windows release as soon as they could.

It's nice to be able to say this with hindsight, but it was doubtless much less obvious at the time, when Windows was barely considered a mediocre visual DOS shell, and certainly not a serious OS.

Bottom line - you have to be smart, prescient, and a little lucky to manage technical debt. It's not just about getting the code right - it's making decisions with educated guesses about where you may be a year or two from now.

And that's hard.

Re: The Way We Look at Technical Debt Is Wrong

#94

IMO This is all you need to know about "technical debt" 1/ Poor code =/= technical debt. Far too often, poor code masquerades as "technical debt" 2/ Good engineers do the right thing which is always a judgment call based on circumstance & culture. 3/ Take guidance from your best engineers, and find a way for the business to adapt. Much easier to change the sales deck or pricing today, much harder to overcome bad tech…

> Build things that are simple

With, of course, the realization that simple is hard and that it is almost always orthogonal to easy.

Re: The Way We Look at Technical Debt Is Wrong

#95
post #88

Earlier quoted context omitted.

I've seen entire products - established, successful products - sunk by a single decision to let the engineers build a gold-plated replacement for some component that had a messy architecture and eye-watering code on the inside but otherwise wasn't broken and didn't need fixing. This is a spot where I'm definitely in line with the Scrum position: If it's really causing problems, then the developers should have no prob…

Just because you don't think anything is wrong in terms of external acceptance criteria, does not mean that there is not something wrong with the code that is of real consequence. Contrarian anecdotes aside, the reason everyone knows the phrase "technical debt" is because SO MANY of us see projects wrecked by greedily demanding many features and changes as fast as possible in a continuous crunch mode, without conside…

Eh, referential transparency is a thing. And that idea can be extended beyond a simple function.

It's totally possible to contain horrible sins behind a clean API. I've done horrible things, but those things don't leak all over the whole project.

On the other hand, i worked at the same place for a long time. I got to see the benefits and consequences of my mistakes and successes over years. I do think i burned out. It took me a long time to learn how to contain nuclear waste.

In the end, it's easier to just work someplace that doesn't put crazy demands on developers. There's a continuum of perfection functionality. unfortunately for new developers, it takes a while to figure out where you lie on that line. Finding a place that's close to your preference is really best.

It's kind of like driving. Everyone slower is a Sunday driver, everyone faster is a lunatic with a death wish. I'm happy with homogeneous drivers - too far from the mark and i get nervous. I'd bet it's the same for pretty much everyone else as well.

Re: The Way We Look at Technical Debt Is Wrong

#96
post #88

Earlier quoted context omitted.

Just because you don't think anything is wrong in terms of external acceptance criteria, does not mean that there is not something wrong with the code that is of real consequence. Contrarian anecdotes aside, the reason everyone knows the phrase "technical debt" is because SO MANY of us see projects wrecked by greedily demanding many features and changes as fast as possible in a continuous crunch mode, without conside…

I wouldn't want to make myself a part of that problem. If I found myself on a project where the business folks didn't care about things like defect rate or supportability, I'd be looking for a new job pronto. Those things aren't invisible to the business, they're a core part of the customer's value perception. A product manager who doesn't understand that is a product manager who doesn't have the slightest idea how t…

Words of wisdom for sure. I'll add that voting with your feet is a common thing for developers to do, and poor management, being poor at management, won't notice it for what it is.

Re: The Way We Look at Technical Debt Is Wrong

#97
I like the application segmentation strategy (when you can get away with it); it reminds me of the unix philosophy but over a message bus instead of pipes.

Running things over a message bus is slightly more work than one large application, but the upshot is that it lets you experiment with new technologies and ways of doing things without betting the entire product/company on it.

Re: The Way We Look at Technical Debt Is Wrong

#98
In a perfect world I agree. I feel however, that I'd be more successful with slow more correct development over fast and loose development, because the latter requires immense determination and follow-through, at all layers of the business.

The most important thing is always to make money. The most important money is the money you make this week, not the money you might make in a year, and you have weeks of potential money queued. It's equation is never right to spend a few weeks not making money so down the line you can potentially make other money at a slightly fast rate. It's definitely never the right time to do that over and over again to get the many small improvements that will make you much faster in the future.

Re: The Way We Look at Technical Debt Is Wrong

#99
So... be agile agile agile... but, not really.

Don't waste time trying out the latest-and-greatest cutting-edge development techniques. Except SPAs (Single Page Applications) because those (somehow) take less time to implement and are 'easier' to iterate than a traditional UI.

Don't waste time perfecting the data models. Unless you're talking about data structures (ie they're totally not a type of data model) because your data structures should be perfect from the start so as to avoid the technical debt of modifying them later.

Don't waste time enforcing the SRP (Single Responsibility Principle). Unless you're talking about 'siloing areas of concern into microservices' because splitting responsibilities (and designing custom APIs to drive them) isn't just another approach to enforcing SRPs. Designing APIs that connect your app to it's dependencies in a manner that won't change (and break things) later is easy right?

So, code, code, code fast. Don't waste time early on developing a sane architecture, except when you want to spent time developing a sane architecture early on to iterate quickly later.

Forgive the sarcasm, this isn't a troll. I'm just pointing out the blatant contradictions.

The only valuable advice I can grok from this article is. Disregard TDD, build a MVP, push it into alpha/beta ASAP, fix bugs later.

Re: The Way We Look at Technical Debt Is Wrong

#100
Making decisions about technical debt is hard. Anybody who tells you otherwise is someone you want to stay away from in a work environment. Every single one of the decisions you make is context dependent, sometimes massively so. You need to know where you are and where you need to get to at every step. Only then can you make good decisions. For what it's worth, here is my list for the places where most people get it wrong.

1) People lie about what is required. Anyone who has been in the industry for more than a token amount of time has experienced the PM who says that they need X+100 when they really need X because "programmers are lazy". Similarly everyone has worked on a team where one or more of the programmers are more interested in building their beloved architecture than solving the problem at hand.

2)People don't listen to the needs of others. Very often they assume problem #1 exists ("They don't actually need that") and blindly forge ahead without paying attention. They play whatever political game that is required to force the other side to follow their approach.

3) People make mistakes. Often this is due to a lack of experience, but sometimes it's just because the problem is hard. Some people make mistakes more often than others. Good management will recognize those that are making good choices, but sometimes you have to let people crash a few projects before you realize that they don't know what they are doing.

4) Choices are made at the wrong level. With all of the other points I've made, it is exceptionally tempting to move all the decision making to someone who acts truthfully, listens well and has a good track record. However, the information required to make a good decision can be at many levels. Sometimes you need 100% test coverage of something and only the programmer will know when this is going to happen. Sometimes you need to deliver tomorrow even if it doesn't work at all. Only the PM will know this.

In order to build a team that executes at the highest possible level, you need to have people who work well together, trust each other and are competent. If you do not have this, then success will likely be a matter of chance. No amount of heroics from a single person can reliably fix the issue -- and often such heroics just make matters worse because they result in the behaviour listed above.

Post reply on HN