An excellent product doesn't need maintenance if it doesn't rely on any online services. Once it's done, it's done. It does everything it needs and nothing it doesn't need.
Engineering projects usually have a finished state. Software engineering is no different, no matter how much the industry wants you to believe otherwise.
OSes also can be "excellent products". They don't need yearly updates, there's nothing inherent to them that would prevent them from being made perfect, finished and never updated again.
The only case when an otherwise perfect OS would truly need to update is when new hardware capabilities require OS-level changes to support. Sometimes it may be beneficial to expose these new hardware capabilities as APIs for apps to consume. But again, adding new APIs shouldn't break the existing ones. For example, on phones, this would include things like notched screens, fingerprint readers or multiple rear-facing cameras.
> Dependencies break.
Don't update dependencies. Pick one version that serves you well and stick with it forever. I'm serious.
> Security updates.
It seems like we've already realized that writing code that deals with complex data structures received from untrusted parties in memory-unsafe languages like C is a terrible idea. If you exclude memory safety vulnerabilities, the attack surface shrinks drastically. You'd run out of security vulnerabilities pretty fast if you'd have any to begin with.
> Your house/car need maintenance. Your cities roads/bridges/tunnels need maintenance.
Houses, cars, and road infrastructure are made out of atoms and exposed to elements and stress of our imperfect real world. They wear out. Code doesn't. In 100 years, the bits would be the same they are today (as long as you use a reliable enough storage medium).
I'd rather use an imperfect product that does a good-enough job instead of waiting for a perfect product.
The perfect OS doesn't exist yet. Right now, I'd rather use some OS than no OS.
Why a perfect OS doesn't exist? Good question. Maybe because the programming field is relatively immature so we're still figuring things out and we don't apply formal verification to everything. Compare that to say, architecture, where we can calculate how much weight a structure can withstand. Or the other way around: what do we need to do to support an X amount of load.
I guess the stakes are lower too. I wouldn't walk on a wobbly bridge, but I don't mind if a desktop app I use crashes occasionally under unusual circumstances. Critical software (say, aviation) is generally written with more care but it's still not perfect.
This all sounds fine hypothetically, you might want to take a look around at the world for a while to see why it doesn't fit your model. Obviously your idea hasn't happened, and there's good reasons why this is the case that you could readily discover if you took a look at reality instead of your model of reality.
And? How do updates help any of this? Firewalls are a thing. Memory-safe languages are a thing. Unit tests are a thing. Fuzzing is a thing. And it is not an OS's job to protect the user from themselves (i.e. social engineering). If you've installed malware, you deserve the consequences and you will be more careful next time. It's okay for powerful technologies to require a minimum level of education.
Software engineering is like if a car was built and thus "finished", but the systems it depends on (like roads, and gas stations) changed every N years (with N < 10).
Imagine the gas stations (operating system) changed the kind of fuel they dispense every few years. No, by no means a car (software) that is fully finished today would be able to continue doing its thing tomorrow, without ongoing updates.
This also happens in the real world, it's just that changes are more likely in the decades or centuries, so we as humans don't perceive them so well.
The fact that Microsoft spends a whole lot of money to avoid this, is circumstantial. Apple doesn't so much, and at some point your finished software will stop working with newer MacOS releases if you don't update it to the newer system versions.
Linux is even more of a moving target. Good luck having a perfectly well working compiled program today, and trying to run it in 10 years time.
Is there any reason — other than "we're paying our graphic designers full-time salaries so we better get our money's worth" — why OSes have to change so drastically and can't be finished as well, only ever updated to add new APIs for apps and drivers to support new hardware features?
Security is probably the biggest reason. With attacks growing continually more sophisticated, it’s not enough to just patch holes as they’re found — you have to engineer entirely new systems to not be drowned in holes. This unfortunately has compatibility implications.
Look at macOS for example, which over the years has gained app sandboxing and mobile-like access permissions. Software pre-dating these additions that assumes that it has access to everything all the time will have its functionality impaired. Devs had to update their software to not make such huge assumptions and to handle no access cases gracefully.
So, how secure is "secure enough"? Android's security model is okay, and Google knows it, so they just keep redesigning the UI without substantial API changes because the updates have to be coming out with each lap the planet makes around its star.
> Devs had to update their software to not make such huge assumptions and to handle no access cases gracefully.
Sure. But at some point it will reach the "secure enough" state, won't it?
(Actually, macOS permissions work mostly transparently API-wise. Apps can request access explicitly so it better fits their particular UX, but the prompt would also pop up the first time the protected resource is accessed. No code-level changes are necessary to support this.)
> Android's security model is okay, and Google knows it, so they just keep redesigning the UI without substantial API changes because the updates have to be coming out with each lap the planet makes around its star.
Google is a bit of a special case I think due to their culture of using big projects as a means of climbing the corporate ladder. The only thing that could ever possibly result from that is endless churn.
> Sure. But at some point it will reach the "secure enough" state, won't it?
Maybe, I’m too much of a layman in the field of infosec to be able to say.
> (Actually, macOS permissions work mostly transparently API-wise. Apps can request access explicitly so it better fits their particular UX, but the prompt would also pop up the first time the protected resource is accessed)
True, but it’s still problematic if e.g. the user accidentally denies access unknowingly, which will result in the app producing seemingly nonsensical errors. For a good user experience the app needs to be able to tell the user what the real problem is.
The program's interface with environment won't change forever, when you write your program as a pure function which only touches exactly the thing it fundamentally needs to, you use a pretty much finalized interface.
> only ever updated to add new APIs for apps and drivers to support new hardware features
Sounds like it's not "finished" if it needs all these updates.
As for why change the window dressing, the market for style changes over time. Why do car companies change the look of their products? Why does the outside of a cereal box ever change? Do the inside of our houses today look the same as the 80s? The 70s? The 40s?
Are you arguing that Windows and MacOS should continue to look like it's 1.0 release?
> As for why change the window dressing, the market for style changes over time.
Software is a tool, a means to an end. It doesn't need to participate in fashion.
> Are you arguing that Windows and MacOS should continue to look like it's 1.0 release?
Yes. It should remain an option at least. Not the literal "1.0", but the version when a decent UX was figured out. For Windows in particular, that's clearly 95. I know people who used the "classic" theme in Windows 7 and earlier, which remained mostly unchanged from Windows 95, and are resentful of its removal in subsequent versions that they have to use in order to have support for modern hardware.
I wouldn't say that's very clear. There were still lots of refinements and redesign that happened as Windows started becoming more of a multi-user OS with NT and later XP. Just because there was a classic skin in 7 doesn't mean it was the same UX. Even with the "classic" skin there's pretty massive changes in the behavior and usability of most of the UI.
Maybe you find 95 to be the end-all be-all of design, but many don't. UI, and to an extent UX, is partially subjective and then also very different based on the user. Imagine a user who has only used an iPad gets dropped in front of a Windows 95 machine, would they consider it the peak of OS UI/UX design?
And as the product's target market evolves and changes so too should the software for what customers expect. Which brings me to...
> Software is a tool, a means to an end. It doesn't need to participate in fashion.
One could make the same argument of a bed or a couch or hell even a whole house. A house is just a tool, something to keep the environment consistent and shelter from the elements. A couch is just a tool to support a sitting human being.
It doesn't need to participate in fashion. And yet people are pretty dang picky about their furniture choices and paint comes in thousands of colors.
Any piece software competes in a market of software. Say there's two pieces of software with identical feature sets. One looks like an ancient Java Swing UI and has bad colors and overall just looks ugly, meanwhile the other looks nice and pleasing (insert your own ideas of "nice and pleasing" here). One is probably going to hemorrhage users over time, can you imagine which?
> Even with the "classic" skin there's pretty massive changes in the behavior and usability of most of the UI.
The windows themselves, the taskbar and the desktop all worked the same in 7 as they did in 95. Many of the changes made over that time came with settings to revert them — like that new thicc taskbar with icon-only buttons and window grouping.
> Imagine a user who has only used an iPad gets dropped in front of a Windows 95 machine
I'm sick of perfectly good desktop UIs getting redesigns which are compromised by the existence of iPads and other touchscreen devices. This just should not happen, period. Windows 95 UI is straightforward enough once you get the basic principles, which takes all of one hour of poking around. Microsoft didn't conduct all that research for nothing, after all.
What frustrated people about Windows 95 (and 98, and ME) when it was current wasn't the UI. The UI was nice. It was the inherent instability of the system itself due to its architecture. Same for classic Mac OS, it doesn't matter how nice your UI is if the system itself can be trivially crashed or locked up by a single misbehaving app because of cooperative multitasking and lack of memory protection.
> One could make the same argument of a bed or a couch or hell even a whole house.
All beds and couches work the same and look largely the same. You know a bed when you see one.
All buttons and text fields and window titles used to also look largely the same and everyone was fine with that. But then the plague of flat design happened.
Imagine being exhausted after a long flight, walking into your hotel room only to see white, textureless walls, floor, and ceiling, and multiple white textureless blocks of different sizes inside. You get to figure out which one is a bed, which one is a chair, which one is a toilet, and which one is a sink! How exciting! This is what modern affordance-less UIs feel like. A good tool shows how it's meant to be used by its form.
> And yet people are pretty dang picky about their furniture choices and paint comes in thousands of colors.
That same classic Windows theme was extremely customizable for that very reason. You could change all colors and fonts to your liking, and some people did! You could make yourself a dark theme way before dark themes became mainstream.
> Say there's two pieces of software with identical feature sets.
You mean the control skins are the only thing different between them, otherwise all UI/UX being identical down to the layouts?
> All beds and couches work the same and look largely the same.
It's almost like you've never been in a furniture store. They come in tons of different sizes, shapes, textures, colors, features, and more. There's not just a single couch model that you can then change the color on.
> The UI was nice.
I highly disagree. The taskbar would get filled up quickly and get squished for me since there was no grouping. The notification tray couldn't hide things. No virtual desktop support. The start menu was incredibly basic in form. No search from the start menu. Editing the start menu programs list was extremely non-obvious and not self explained. Navigating the nested start menu shortcuts was a huge pain. Installers just threw everything in the start menu leading to a ton of clutter. UI elements are miserable at scaling, in that there is zero scaling support. The taskbar was only on your primary display. Difficult to change default sound output device straight from the taskbar. No central place to see previous notifications. No jumplists. No Win+Number shortcuts to quickly swap between things on the taskbar. Alt+Tab prompt doesn't have window previews. I could go on and on and on and on and on about what I perceive to be massive failures of 95's UI/UX.
I didn't really care for the overall icon design throughout the OS and generally see the overall style in the OS as pretty basic, bland, and boring. Changing the color or setting the title bar font to Comic Sans isn't solving that.
In the end though, you probably disagree with a lot of these things. I think your couch is ugly and uncomfortable, and you probably think my couch is ugly and uncomfortable. UI/UX has some subjectivity involved. Not everyone agrees 95 was the ultimate software design unable to be improved upon.
Uh, look at curl. It is an excellent product, no doubt about it (or if you do, I wonder what your standards for excellence are), and yet we are here, at version 8.0, 27 years after its first release.
Edit:
"if it doesn't rely on any online services"
That is a big IF. How many things don't, at least indirectly? (e.g. by relying on HTTPS, which requires TLS, which requires keeping up with current cryptographic standards.)
If cryptography can't possibly be figured out once and for all and must remain a moving target forever, I'd separate TLS into a module that can be updated independently of the rest of the system.
Engineering projects have a finished state? So once they build a road or bridge or dam, nobody needs to touch it again forever? It's finished right, no more work anymore.
Even in electronic hardware there's often continuation of design and refinement. Have you never seen a board with a revision number on it?
Real-world objects like these wear out. Code doesn't.
> Have you never seen a board with a revision number on it?
Of course I have. There's a difference though. You can't ship an electronic device that's unfinished with a promise to "fix it later". Yet this is what routinely happens with software these days. Also, if your device serves its purpose well, you'd probably have a "final" board revision with all flaws fixed. If you want to add features to an electronic device, you'd make it a different model, possibly sold concurrently with your existing one to serve people with different needs and budgets.
You just said "engineering". Bridges and roads are engineering as well buddy. And it's not even just the wear, it's the continued refinement and upgrade of these structures which is a constant engineering effort.
> Engineering projects usually have a finished state
This is the statement I'm addressing. And it's just not entirely accurate. Things change, assumptions get proven wrong, there's always a newer and better way to do something, etc.
Sure your widget was probably about as good as you could do at the time you first launched it, but several years later there's better components available. Or maybe a supplier stops making some part you were using. Or a few years later you start getting parts back failing early in their service life and need to make an update. What was once your finished state now isn't.
Engineering projects usually have a finished state. Software engineering is no different, no matter how much the industry wants you to believe otherwise.