All code is technical debt
131–140 of 178 posts
Re: All code is technical debt
#132Earlier quoted context omitted.
I think it could make more sense if it's rephrased to 'all code is a liability'. Then the equation is simpler. More code = more to maintain = more liability. It says nothing about the quality of the code, just the quantity. Tech debt is a trade-off between near term and long term ambitions - it is literally impossible to build a successful project without accruing this kind of debt, simply because you cannot perfectl…
"My point today is that, if we wish to count lines of code, we should not regard them as "lines produced" but as "lines spent": the current conventional wisdom is so foolish as to book that count on the wrong side of the ledger." -- Dijkstra in 1998 ( https://www.cs.utexas.edu/users/EWD/transcriptions/EWD10xx/E... )
For similar sentiments consider "Science and the Compulsive Programmer" from 1976.
https://www.sac.edu/AcademicProgs/Business/ComputerScience/P...
"Programming systems can, of course, be built without plan and without knowledge, let alone understanding, of the deep structural issues involved, just as houses, cities, systems of dams, and national economic policies can be similarly hacked together. As a system so constructed begins to get large, however, it also becomes increasingly unstable. When one of its subsystems fails in an unanticipated way, it may be patched until the manifest trouble disappears. But since there is no general theory of the whole system, the system itself can be only a more or less chaotic aggregate of subsystems whose influence on one another’s behavior is discoverable only piecemeal and by experiment. The hacker spends part of his time at the console piling new subsystems onto the structure he has already built—he calls them “new features”—and the rest of his time in attempts to account for the way in which substructures already in place misbehave. That is what he and the computer converse about."
Re: All code is technical debt
#133Re: All code is technical debt
#134Earlier quoted context omitted.
I think it could make more sense if it's rephrased to 'all code is a liability'. Then the equation is simpler. More code = more to maintain = more liability. It says nothing about the quality of the code, just the quantity. Tech debt is a trade-off between near term and long term ambitions - it is literally impossible to build a successful project without accruing this kind of debt, simply because you cannot perfectl…
'All code is a liability' is also not a particularly accurate application of finance jargon. A car or a house also have ongoing maintenance costs, but they would normally be classified as assets (because they generally produce value in excess of the maintenance, or because you can sell them in a secondary market). I think an accurate, useful, but not very catchy rephrasing is just 'working code requires ongoing maint…
I don't love this either because working code needs no maintenance whatsoever. After all it's already working. There's also no notion of "repairing" code because it isn't something that can just break suddenly.
So really what we're talking about is that necessary changes to the codebase can arise from not just the stakeholders as we typically define them but also because the environment around the code changes.
Someone who invested in shutters that can close instead of being purely decorative will be able to adapt more quickly and cheaply to a wind storm than someone who has to go out and buy wood to board them up.
Re: All code is technical debt
#135Earlier quoted context omitted.
I think it could make more sense if it's rephrased to 'all code is a liability'. Then the equation is simpler. More code = more to maintain = more liability. It says nothing about the quality of the code, just the quantity. Tech debt is a trade-off between near term and long term ambitions - it is literally impossible to build a successful project without accruing this kind of debt, simply because you cannot perfectl…
Agreed, or similarly: all software has a carrying (maintenance, but I think that has connotations of not including full ongoing TCO) cost. Code is a liability in the sense that it has a non-zero carrying cost. The ideal software implementing a given functionality has as low of a carrying cost as possible. More code, in quantity and complexity, typically means more carrying costs. One of the appeals of SAAS is that th…
The under-appreciated corollary to that: tests are code, hence tests have non-zero carrying cost as well.
> The ideal software implementing a given functionality has as low of a carrying cost as possible. More code, in quantity and complexity, typically means more carrying costs.
You understress the complexity point. Higher quantity of code with high clarity and low complexity would have lower carrying cost. This is where DRY bites people: ill-suited or excessive abstractions can be worse than a little bit of copy-paste that are immediately visible to the eye.
> In this analogy tech debt is a tradeoff for some short term benefit (like simplicity, time to market) at the expense of higher carrying costs down the line.
In a general sense, doesn’t this hold for everything we do? If you really dig into it, is there an activity that is not a trade-off of short-term benefit for higher costs down the line (be it waste, pollution, something unknown or generally entropy)?
Re: All code is technical debt
#136Earlier quoted context omitted.
Gold bars don't need to be maintained and don't degrade. They just exist. That's the type of asset to own. A white elephant needs a living are, food, elephant experts, vets, etc. That's much closer to the type of asset most code is.
I bet you five gold bars that five gold bars left "unmaintained" won't be there when you pop back in a year. It's not a big thing and there's no need for us to fall out over this .. but gold bars are famous for requiring additional ongoing security costs. Even just burying them in the desert isn't as secure as it used to be.
Re: All code is technical debt
#137Earlier quoted context omitted.
'All code is a liability' is also not a particularly accurate application of finance jargon. A car or a house also have ongoing maintenance costs, but they would normally be classified as assets (because they generally produce value in excess of the maintenance, or because you can sell them in a secondary market). I think an accurate, useful, but not very catchy rephrasing is just 'working code requires ongoing maint…
> working code requires ongoing maintenance I don't love this either because working code needs no maintenance whatsoever. After all it's already working. There's also no notion of "repairing" code because it isn't something that can just break suddenly. So really what we're talking about is that necessary changes to the codebase can arise from not just the stakeholders as we typically define them but also because th…
And working code, no matter how well it works, imposes a cost to implementing new features. A new feature might be a cinch to implement in a new app. But it can easily take much longer to implement the same feature in an existing app.
Re: All code is technical debt
#138Earlier quoted context omitted.
I think it could make more sense if it's rephrased to 'all code is a liability'. Then the equation is simpler. More code = more to maintain = more liability. It says nothing about the quality of the code, just the quantity. Tech debt is a trade-off between near term and long term ambitions - it is literally impossible to build a successful project without accruing this kind of debt, simply because you cannot perfectl…
And all code is an asset. Have we just reduced the conversation to: everything has a cost, and everything has a benefit?
Re: All code is technical debt
#139So what should our goals be?
Less code means fewer features, which can make the UX path longer. More code means more features, which can make the UX path more confusing and strenuous. There is some kind of balance to be struck. The goal is for every UX path to be flexible and easy. Is that even possible? Can we have our cake and eat it, too?
> Adding new assumptions increases debt
There's the word I have been thinking about all week: "assumption". It's a tricky little bastard, and it really deserves more focus than it has any right to.
You see, that word is the heart of our problem. It's not the amount of code you write, the features you add, the way you design your UI/UX, or even how flexible your user configuration is. It's the assumptions themselves.
Assumptions are walls. Once an assumption has been added, it’s there to stay. It's easy to move an assumption around. Too easy! So easy that you move it without even knowing; but it is still there, lurking. No matter how hard you try to get rid of it, or to get around it, the assumption is guaranteed to stand in your path. Your only hope is that the assumption is there to guide you; its only other option is to guard you.
So what can we do about it? We can not. No need to get rid of something you never made in the first place, right?
But how do you make software that is unassuming? How can you make a tool without catering that tool to its intended work? How can you make a path without a destination?
There's something we have gotten notoriously used to as software engineers: a finished product. After all, what else would an engineer strive to make?
Finished products are things. Programs aren't. Programs are systems! Programs are stories. What kind of system is ever finished? I can only think of one: a dead one. At the end of its life, a system becomes cold, hard, sturdy, and complete; and the story meets its end. How did we ever convince ourselves that that is a worthy goal for software?
I'll tell you how: we assumed. That assumption has been lurking at the heart of software design ever since, and all we can do now is move it. It's time to start over.
---
This is where I answer my very first question: who? Who designs the software? Don't assume it's the engineer's job: it's the user's turn now.
The next question is, when? When does the user design their software? When they use it. Any time before that would make them an engineer.
What should our goals be? That's the best part! The user already knows her goal. That makes her precisely the right man for the job.
---
If you followed any of my rambling so far, you are probably asking yourself the most important question, "What could this possibly look like?" That's a good question. I have something really close to a coherent idea. If you would like to hear about it, feel free to ask.
Re: All code is technical debt
#140Earlier quoted context omitted.
I bet you five gold bars that five gold bars left "unmaintained" won't be there when you pop back in a year. It's not a big thing and there's no need for us to fall out over this .. but gold bars are famous for requiring additional ongoing security costs. Even just burying them in the desert isn't as secure as it used to be.
I'll take that bet for 5 unmaintained gold bars. If you win you get all 5. If I win you give me 1. I'll let you know when they are buried.
You do realise that if I were to win then the five gold bars would be gone in the wind and you'd be ponying up for another five to pay out on the wager?