> I don't think software is ever finished.
Back when it came on physical media, it was very much finished. Needing an update to fix a critical bug or a UX issue was a very costly problem to have, both in money and in reputation. Users had to be convinced to buy and install major updates, instead of being strong-armed into it. Staying on an older version was easier, and in case of operating systems, much more widely accepted.
Many video games fall into that category even today. Sure, the "we can always release an update" mentality did infest game developers as well, but, unlike apps and OSes, most games do have a finite scope and stop being developed once that scope has been realized.
It's a great situation when a bug is discovered and it is hard to patch.
You're fantasizing about a time that never existed. Software isn't "ever finished" because we are not omniscient writers who can foresee all problems, fix all bugs, and write software that is unhackable. That's the mindset that "all tests pass" or "it works for me" means the software "works."
We can't address the problems, as discussed in the article and that I mentioned in my comment, if we're going to retcon history and redirect ourselves to a worse environment. That doesn't fix anything.
We'll never be omniscient, sorry. The world changes. Hardware changes. Software rots. Time marches on. These do not change and we have to operate in a world where we acknowledge these basic facts of reality. We'll never make decent software if we can't acknowledge reality first.
> Back when software came on physical media we still had patches. We had patches that came through the internet and we had patches that came through physical media.
Did you live at a time where Internet was not a thing?
I remember very clearly buying software on physical media and never, ever "receiving" a single patch. I don't even know how that would have looked... "buy this floppy disk, it's a patch for a bug in the other floppy disk you bought recently"?
I remember being able to buy "the next version", though. But the expectation was that I was buying a "finished" version, not something unfinished that required me to buy all the next versions.
> Did you live at a time where Internet was not a thing?
You must be relatively young. Software existed before the widespread adoption of the Internet.
> I remember very clearly buying software on physical media and never, ever "receiving" a single patch.
You had to take action to receive them. They weren’t automatic updates like they are today.
> I don't even know how that would have looked... "buy this floppy disk, it's a patch for a bug in the other floppy disk you bought recently"?
That’s exactly what it looked like. That’s still the process today for some systems —- avionics updates for Boeing 747s are provided on 3.5” floppies.
> You had to take action to receive them.
What did that look like? Remember, back then, developers and users often had no after-sale communications at all. It was a technical impossibility more than anything. There was paper mail. There were telephone networks. That's about it.
I suppose you could occasionally call the developers of every software product you're using to ask if there is an update. I doubt anyone ever did that.
> Remember, back then, developers and users often had no after-sale communications at all.
They often had no pre-sale communications either, indeed no communication of any kind. It was just like buying a spatula or a pair of shoes. You went to a retail outlet and bought the software; the developer wasn't involved in the transaction at all. It was just the consumer and the retailer.
Sometimes there was a postcard you could send to "register" your purchase with the developer, and they'd send you mail about new versions or the like, but many people never registered.
I'll also add that if it was a big enough bug that it'd end up on the news and that's how people got informed. Otherwise, like you suggest, good luck. But it was possible.
It is baffling to me that we are having this conversation on Hacker News of all places. Aren't we a community of programmers? How in the world does any programmer think for a hot second that code is bug free? Last I checked formally verifying your code was 1) very rare and 2) still impractical if not impossible for anything of sufficient complexity. Unless we're formally verifying our code, I absolutely guarantee it has bugs. I know we have big egos, but egos so big that we think we're omniscient?
> How in the world does any programmer think for a hot second that code is bug free?
If you stop bloating the scope of your product by endlessly adding features no one ever asked for, you'll eventually run out of bugs.
Also, while it does not make you "omniscient", working with a known stack instead of following fashion does help a great deal with preventing bugs.
The problem is that the scope changes based on circumstances outside your control.
I agree that not expanding scope makes things easier but it doesn't solve the problem.
I also agree that knowing the stack goes a long way, but again, doesn't go all the way.
Omniscience is required, by definition. Even if just omniscience about the software you are building. MEANING you know not just all your lines, but all the lines of all the dependencies, the compiler, and the system it is operating on. I have yet to meet anyone that comes anywhere near approaching this knowledge, including many gray beards.
It is utterly foolish to proclaim your code as "bug free". Since you don't seem to be aware of sayings like "software rot" allow me to introduce to you to another one
In case it isn't obvious, the joke implies that all programs have bugs, it is just that developers are less likely to be aware of them when few people use them. This is, of course, because there are too many variables for any developer to account for, even in simple programs.I won't deny that all software is going to have bugs. But I think there has been a real shift in mindset over time. When it was harder to patch and, there was greater incentive to make each release a well-tested, coherent product that offered clear advantages over the last one. As it's become easier to patch, it's become more tempting to make each release just a sort of snapshot of what's more or less ready at a certain time, or alternatively a tiny increment. In other words, users are now the testers.
I'm not saying things were perfect in the era of physical-media software. I'm just saying there were some good practices that were made necessary by the constraints of that era that still can be beneficial today, even though we don't have those same constraints.
I'd even go so far as to say that the selling of hype creates an environment where we almost certainly will have worse products. The business people are most interested in the sale, not maintaining the customer. The incentives to fix things or bring them out of alpha or beta release disappears. Even if this is harmful to the longevity of the company. But that doesn't matter either if you're only thinking one quarter at a time...
The point was never that it is easier to patch now and back then it wasn't possible. The point of this conversation was that we can't begin to solve the actual problems if we can't recognize why they happened in the first place. To base our premise on products being finished in the past will only lead to us cycling back to where we are. Someone just has to come up with the /brilliant idea/ of "what if instead of mailing patches, we send them over the internet!" It is good intentioned and will result in more users getting patches. We should not throw out the baby with the bathwater!
But the abuse of the environment is an entirely different problem. You're right that the ease of shipping patches lubricates this abuse of shipping to prod to early. But it isn't a causal variable. The causality here is the business people being uncaring about the quality of the product. The causality here is engineers not taking enough pride in their work to push back against the business people. The causality is that we've structured our work environment to reinforce this behavior and promote those who fall in line instead of those who do quality work. (quantity over quality) The causality here is that customers cannot differentiate a well designed product from a half baked idea and a promise. The causality here is that we call product vision a product demo (demonstrating what we want the product to be, not what the product is).
There's more causal variables, but these are clearly part of the chain of problems. The problem is that the situation is complex! But we can't fix complex problems by oversimplification and denial of their complexity. We have to break them down into simpler parts and address those smaller and more manageable problems. I mean we use this same procedure every day to write code and do numerous complex tasks!
But we can't solve complex problems if we deny the existence of their complexity.
I basically agree, but I would say that that "lubricating" effect is still causal. I mean if something is stuck and lubricant is added and then it starts to move, well, the lubricant was at least one of the causes of its moving.
It's true that the major factor is the ideological shift away from caring about doing a good job. I'm not sure how to address that though.
A lubricant doesn't cause something to move, but it makes the movement easier. It doesn't apply the force, even if it reduces the force required to create the movement.
Causality is the force, not the modifiers.
Think about it this way:
We can make things less likely to move by removing the lubricants but we can add as much lubricant as we want and it won't start making things move.This is why I say "don't throw the baby out with the bath water" because we actually still want the baby. But we do want to address the root issues.
I want to be clear, there is not a singular factor.Normally we solve problems by breaking them down into little ones. But the harder version is finding what little ones result in the big one. It's like working from the top of a graph to find a node and it's children vs starting at a leaf.
Start with the little things. Start where you can. If you have the chance to make something better or hold someone to higher standards, try that. If you see someone else trying to, lend them a hand. Often we don't stick or necks out because we're afraid we're alone. But we're not. The "first follower" is one of the most important people in creating a group. They're a lubricant ;) You don't have to be first or take the most risks, but if you can make it easier for people to do so then that's still very helpfulI think I'm taking a more broad reading of causality than you. A lubricant can cause something to move, if the thing was previously stuck. Causality is not just "the" force, it is the totality of contributing factors to the event. If a dam bursts, then the weight of the water above it, the weakness of the sluice gate (or whatever), and the unseasonably warm weather that induced bolts to expand can all be causes.
> Start with the little things. Start where you can. If you have the chance to make something better or hold someone to higher standards, try that. If you see someone else trying to, lend them a hand.
I'm increasingly convinced that this isn't even close to sufficient. I mean, not to say it shouldn't be done, but I don't think that doing that is going to turn the tide against people doing the wrong thing. There needs to be more deliberate and forceful action to actually stop people doing the wrong things, not just encourage people doing the right things.
> You must be relatively young.
Did you read my comment at all? :-)
> You had to take action to receive them. They weren’t automatic updates like they are today.
Are you saying I was doing it wrong?
> updates for Boeing 747s
Oh I get it. Maybe we just weren't playing with the same toys :D
Everything @mechanicalpulse said was accurate.
To answer @grishka's question (because it seems you also don't know)
Well I literally answered that in my comment! I broke it up and emphasized the key parts.If you are going to accuse someone of not reading your comment you damn well better be reading the comments you're responding to.
Considering it was "harder to patch", yes, it does also mean "things often went unpatched." Mind you, this doesn't mean patches didn't exist nor does it mean, as you suggest, patches don't matter.But again, I already addressed that in my original comment, so I'm not going to repeat myself again...
I didn't say it was impossible to put a patch on a physical media.
I was saying that in my experience as a user, I never, EVER received a patch or got any mean to request one.
My point being that the expectation was that what I was buying was "finished". When there was a bug, FOR ME, it was there forever.
With modern software, I encounter so many bugs everyday that I don't even realise anymore. Look at someone using something that depends on software for a while (not very long), see how they work around bugs (by restarting the app, or retrying the button, or going through a different path). When they do one of those things (like retry), if you ask them "wait, what did you just do?", chances are that they won't even know that they had to retry because of a failure. Why? Because modern software fails constantly.
Code is never perfect, that's for sure. But back when it was hard to update, the code had to be a lot more stable than today.
Look, we don't disagree on this fact. I'm not encouraging the shipping of low quality or untested software. But patches coming through online was a good thing. We were finally able to fix those bugs effectively, not leaving tons of users stranded and vulnerable. This feature is not going to go away because it provides such high utility.
But shipping low quality software is a completely different issue. The ability to patch easily is not the cause of shipping low quality work. It is the abuse of this high utility feature. It is based on the greed and lack of pride in the product. There are so many little things that add up and create this larger problem. But pretending that software was ever finished is ignoring these problems. It oversimplifies the reasons we got to this point. We won't actually solve the problem *that we are both concerned about* if we oversimplify. We need to understand why things happened if we're going to stop it.
> You came out swinging. You can't throw out punches and expect to not have one thrown back.
I was not throwing punches. One can be 25 years old now and never have lived in a world without smartphones or social media.
> But pretending that software was ever finished
I'm not saying it was perfect (or bug-free). I'm saying that when you shipped, in many situations there was no way to patch the bugs. And even when there was a way, it was painful. So when you shipped, it was finished, as in "fully functional". Doesn't mean there wasn't any bad software or that good software did not have bug. But the teams shipping a product had to finish it before.
Nowadays, the norm is to ship unfinished software, with the expectation that there will be plenty of bugs, and those that are deemed worth fixing will be fixed.
And I do believe that it became like that precisely because it's easy to send patches. It's now economically viable to ship bad software, because people are used to having to wait for bugfixes. I'm guessing that back then, people would not have bought twice from the same company if the first time had ended up with unusable software.
> if we're going to stop it.
There is no stopping it. The quality of software is going down because it's economically viable, and I don't see that changing anytime soon (especially with LLMs).
Besides that, I just don't believe you can blame the ability to patch over the internet as the reason for shoddy work.
Is Linux full of bugs and shipping half built products? I don't think so.
The great thing about the future is that it is in our hands to control.The bad thing about the future is we need foresight and to work together to avoid pitfalls.
Luckily humans are quite adept at having foresight. I mean here we are talking about likely future problems. But we're also often feeling helpless to address those issues. But this is an observation bias. Look at the Y2K bug, it is a perfect example. The average person brushes it off as if we made too big of a deal about it. But the thing is, it was a big deal. The thing is... we solved it before it created major issues. We also had similar success in big problems like fixing the ozone layer. We've done this countless times. We just have a tendency to focus on problems that are still problems and not look back and use our success as motivation to keep going.
Every big problem can be broken down into many smaller problems that are much more manageable. "They" win by making us believe that the little things don't matter. "They" win because it means we aren't taking the first steps or making progress, killing any momentum. The worst thing that can happen is to make us feel like the problem is too big to be solved. But that's a lie. We've created this mess and frankly I would like to try to fix things before it becomes an even bigger mess. Personally, I'm a big fan of not doing unnecessary and avoidable work.
So the question is are you with me? Are you going to help try to fix this problem? Or are you going to just sit by and let it grow worse? Hoping that it just solves itself or someone else solves it? Frankly, we need as many people in on this as we can. You don't need to do a lot of work. All I ask is that you speak up and question when the teams you work for are trying to push unfinished products. All I ask is that you help encourage others to do quality work, and not let slop just slip by. I'm not asking you to change the world, certainly not over night. I'm asking if you will make just a modest attempt to address the problem in your own sphere of influence.
> Look, we aren't going to go back to a setting where we don't patch software.
And I never said we should. I was just describing the situation.
> Look at the Y2K bug [...] We also had similar success in big problems like fixing the ozone layer
That's an optimistic point of view :-). I would argue that both of those were infinitely easier to solve than, say, the current mass extinction, energy problem and climate change. We've past what, 7 of the 9 planetary boundaries? We've pretty much lost the Amazon, we've pretty much lost coral reefs, we've definitely failed at the 1.5C goal and are now moving forward to failing the 2C goal. With the inertia in that system, once you fail there is no coming back in the next thousand years (unlike the ozone, BTW).
Those are real problems that we are not only not solving: we're making them worse. All of them.
> All I ask is that you speak up and question when the teams you work for are trying to push unfinished products.
Most software is part of the problem. The problem is that we do too much in general. Doing requires energy. The more we do, the more energy we use. The more energy we use, the more we screw up the planet. You want to help? Do less. But at the end of the day, you still need to get paid, right? And for that you need your company to be profitable, right?
> we are not omniscient writers who can foresee all problems, fix all bugs, and write software that is unhackable
We can come close to that in all other areas of engineering, but somehow not software? We can build buildings and bridges and be certain that they won't collapse. We can engineer machines that work reliably and safely. But for some reason we can't do the same for software? I call bullshit.
> Hardware changes.
And operating systems do need to be updated for that sometimes, sure. They would even sometimes need to expose new APIs to apps, so the apps could make use of new hardware capabilities. However, there isn't much reason to update an OS on existing hardware. Especially when all that update does is bring a new stupider UI design that no one asked for.
> Software rots.
What the heck do you even mean by that? Software is a sequence of CPU instructions. It can't "rot". It's the runtime environments that rot for no good reason.
Look, March of *THIS YEAR* (2025) SpaceX had a rocket *EXPLODE*[0].
Rapid unscheduled disassembly[1] does not indicate we can "foresee all problems and fix all bugs". In fact, it indicates the *exact opposite*.
There is absolutely no field where we've become omniscient. To think we are is just laughable! But if you want to know why physical engineering tends to be more robust, you might want to take an engineering class. You'll find that the way they do things is... a bit different... There's a lot more verification and testing.
It is an old, yet common, phrase that encompasses a wide range of issues that result in "no changes were made, but now the program doesn't work"[2][0] https://www.bbc.com/news/articles/cj92wgeyvzzo
[1] https://space.stackexchange.com/questions/10022/who-coined-t...
[2] https://en.wikipedia.org/wiki/Software_rot
> Look, March of THIS YEAR (2025) SpaceX had a rocket EXPLODE[0].
It's a Starship. It's still in development. It's not a finished product like Falcon. And it's not an unexpected outcome either — after all, SpaceX is doing something that no one has done before, so there does not exist any prior knowledge about the behavior of rockets this huge, and especially reusable. They aren't failing, they are making this knowledge so they could build a rocket that does not explode.
But then again, comparing rockets to software is unfair. Rockets have a finite scope. They go up to safely put things or people into space. In case of SpaceX, they also preferably come back down in one piece to be reused. The more specific requirements only change as a response to new discoveries in the development and testing process — not because some manager has nothing to do, or infinite exponential growth needs to be shown, or investors are demanding AI to be shoehorned into every product, or some designer is desperate for promotion.
> no changes were made, but now the program doesn't work
Some changes for sure were made, because otherwise that would violate the core principle of computer science that the same algorithm executed with the same inputs will always yield the same exact result.
It was an illustrative example, but this is true for even things that are much more mundane. Maybe you'll come back and say that this is on builders or engineers taking shortcuts, but we could draw the analogy to programmers not using formal verification systems[0].
You are literally talking to someone who worked in that space and now works in software. How confident are you that you know more about that space than someone with years of professional experience? I'll add that I also have a degree in physics. My shift to software was through modeling and simulation of engineering designs. I'm sorry, I think you are overestimating your knowledge about rocket science. I'm pretty sure even in Russia they have "it's not rocket science" (or some equivalent) jokes.I promise you, your years of expertise in software makes you an expert in software, distinguishing you significantly from other experts. But I also promise you that this is true for any profession. Being an expert in physics doesn't make one automatically an expert in software. But the same is true in the other direction. You need to get your ego checked if you think differently.
[0] https://en.wikipedia.org/wiki/Formal_verification