Never update anything
blog.kronis.dev
blog.kronis.dev
In the world of JS and Typescript this ratio looks more like 80%. I swear that node hipsters at my last job spent four out of five of their working days wrangling with dependencies or their transpilers, linters, packagers, bundlers and whatever the hell else needs to happen to actually make a node program run. Meanwhile the geezers that worked on Java services reliably pushed new versions of their code sprint after sprint, no heroics, no drama required. What the fuck happened to those "modern stacks" that babysitting them takes the vast majority of developers time? It's a nightmare.
So I keep producing Rails apps that get the job done without the bells and whistles and without much polish.
I wish I could hire a config expert for half an hour and have them create the setup I want. Because I will never get my masters in webpack/rollup/postcss/stimulusjs/mystery sauce working config du jour.
This whole conversation only pertains to people who work in large companies, on salary, who both need to follow standardized procedures and have the time to spend days doing so. I always find it interesting, because it illuminates an entirely different set of priorities and a completely different universe of tools versus what an individual or 2-3-person team needs to focus on to get things running.
I cannot understand what idiot thought it d be fancy cutting everything into mini dependencies that update every day without you knowing made by amateurish hipsters who transitive depend on each other like their life depended on it. Yes you can lock but every build script I ve seen forgot this detail and resolve anew the dependencies !! Why !?!?
Yes it s a pain to move up a version sometimes in Java, but we decide to do it for a reason, spend a few days tops fighting it if we must and it's done. You re right that in JS I cant even teach my more backend colleagues how the fuck it works and how I can navigate it. And I m very against transpilers and linters which I try to avoid for sanity but sometimes you inherit a hero's code and you re like omfg a vue js to typescript to js hacky build chain that worked 2 years ago on bower and now bower is gone and yarn wont build it. And you re 2 weeks well into it before you start building and discussing what you actually wanted to change :D
What kills me the most is when someone in management calls the java backend that is ultra optimized, instant to change, a dream to deploy "legacy" and the yarn soup that is coded by 200 successively burnt out juniors, does 40k binding function calls on a non moving DOM (you know, to "hydrate" it with whatever framework du jour was fancy 5 months ago), and we cant redeploy without a full budget proposal, that people do everything to be assigned out of "modern" grrr
I kid you not we have an entire team in charge of one small frontent management tool for a pretrade backend, they literally spend 99% of their time justifying why they wont change it, and 1% begging me to join for a week to reorder their column or put a new button... and THEY re in charge of it argl, and I cannot for the life of me spend more than 30 minutes teaching them before they snooze "I dont get it, let s pick our battles and change that one thing with you and promised it s the last time" ...
Fast forward 5 or 8 years and we have a very fragmented ecosystem of NPM modules—some built to be used on the web, some not—built on a legacy of tiny modules and deep dependency trees.
Add on to all that the pace at which the JS and browser ecosystem moves and it’s not too surprising that things have ended up the way they are.
Teams don’t need to build projects with deep dependency trees, but it’s pretty hard to avoid them with the NPM registry in the shape it’s in.
Also due to JS having a very small stdlib. Compare built-in functions to eg Kotlin, its a different world.
Other than that, there s probably a way for you to propose a change, ive worked on the same nightmare you describe and, well, I was lucky enough I guess I could make enough changes to both stack it was possible to get either a light java subset running just the frontend to test, or make the js independent for testing, yes with a yarn soup lol, which is how I learned it in the first place I guess.
A few things worth elaborating on.
> 10 core SMT xeon with 128G of RAM for everyone in the team In our case, most frontend web devs realistically use macOS or some other unix env. Not only did our bunk-ass windows machines suck spec-wise, and in terms of physical dimensions, they also sucked because they were windows based. This was shortly before WSL, so it was a pain. The DevOps guy did have a crazy machine with tons of ram and so on.
> I cant build in less than 10 minutes This was literally the case for me every time I made a change. Sometimes the previous result would be cached and I'd need to do it again. I was constantly fighting a stupid battle, and nobody really understood why things were the way they were or how to change them, including the java devs that had been working on it for years.
I kind of won the dev machine battle, because the VPN wasn't really sophisticated and I just set up some system on my personal mac, against the wishes of management. When a designer came in, they got a mac, and had to ask me how to connect it to the VPN.
> it was possible to get either a light java subset running just the frontend to test, or make the js independent for testing, yes with a yarn soup lol
Someone had set up a node instance that attempted to replicate the output of the java system, but without some bits that I can't recall atm. The inconsistencies and trying to maintain a one-for-one replica was just as much of pain. If I remember correctly, that was in part because there would really have had to have been a deliberate time investment in creating a sustainable replica that involved communication when any data changed server side. It was a crap-shoot, and I should give myself more credit for lasting as long as I did, but less credit for not jumping ship way earlier.
I ended up literally burning out, getting fired, and didn't find employment again for years. I have it on my resume that I did a few things successfully while I was there, but quite honestly I don't completely remember what those were, and am just guessing at this point.
I don't know about them right now but before I resign, I told them "have you ever calculate how much time and money wasted by just restarting our app server for local dev? you probably should be worry about that because I believe you pay us to wait for app server comes online more than we develop a feature"
I'm tempted to enforce lockfiles at every stage of the product cycle, making upgrades an explicit action, rather than the side-effect/byproduct of another action. Does it make sense? What do you think?
I'm amazed anyone wouldn't do this, it's the only sensible course of action.
I'm not sure you're thought things through in your comment, and that you are being fair or reasonable.
No one cuts "everything into mini dependendencies". You have dependencies you reuse. That's it. When one of those dependencies gets updated, say to fix a bug or a security issue, your package manager of choice handles it for you without any issue. Still, if you do not want to fix bugs or vulnerabilities in your code then you are free to pin them all and move on with your life.
At most, the JavaScript or NodeJS crowd needs to have a serious talk about standard libraries and third party lackages, such as whether using packages such as rimraf is desirable.
> and yarn/npm frontend projects that cant be even rebuilt two weeks later
You only experience that sort of problem if you're incompetent in how you manage your dependencies.
With npm you can a) pin major/minor/patch versions of specific packages, b) save your package-lock.json file which specifies exactly which dependencies you use. If you free-float any dependency then that's something you chose to do.
With JavaScript/NodeJS + npm you only shoot yourself in the foot that way if you purposely aim at your foot, remove the safety, and press the trigger really hard.
> And I m very against transpilers and linters which I try to avoid for sanity (...)
Complaining about linters because they test your sanity is a major red flag on your approach to mundane coding tasks. This, and your casual criticism on everyone else's code, leads me to suspect that you really need to do some introspection.
> I kid you not we have an entire team in charge of one small frontent management tool for a pretrade backend, they literally spend 99% of their time justifying why they wont change it, and 1% begging me to join for a week to reorder their column or put a new button...
Based on your comment and on my experience with similar projects, I suspect you're either oblivious and/or leaving out important bits of the story just to continue plowing with your humblebrag, or you're succumbing the need to be hyperbolic.
Frontend development has to deal with far more details and constraints and requirements than any backend task. Frontend is what both clients and PMs and executives look at, and the tiniest changes like resizing a button has deep implications on the business side of things. Furthermore, it's both harder to automate tests and their tests need to be more extensive.
Thus any change, no matter how small, is a uphill battle.
It's beyond me how someone who is so hard on their entire team ends up showing such weak understanding and insight of the problem domain. I know that on the internet no one knows you're a dog, but let's not get silly here.
Eh, no. You'll get shot no matter what, even if you have no gun.
For example, let's imagine you now have your version locked down codebase and after a month you want to install a new package. This one is only compatible with XYZ V1 while what you have is V2. No worries, npm will just handle that right? Well, you'll have both versions, but the prototype constructor name changed from V1 to V2, so the versions won't work together, so now you need to upgrade XYZ V1 everywhere anyways. And when XYZ did the V1->V2 upgrade, they also upgraded to GKS V53, so now you need to also do that upgrade.
Continue ad-infinitum or simply stay away from a broken ecosystem.
What's your point? If you want to update a dependency then you also need to go through all their dependencies. This is not a javascript/npm problem; it's a software development problem. Dependencies don't get magically updated, even with semver. You experience the exact same problem with other tech stacks. I'm fact, I've experienced this problem far more with C++ projects than with JavaScript/typescript ones.
Why are we expecting and demanding random updates to work with JavaScript/npm when that belief and expectation was always totally unrealistic with any other stack?
On the JS side there's a way deal with that if people use modules. Good dependencies don't clobber the global namespace. Multiple versions can exist side by side. It'll just make your build bigger.
If you absolutely need to have multiple versions of the same dependency, you probably need to use OSGi.
Using Java 6 is major red flag. Even Java 8 should be red flag nowadays, if it weren't so extremely common. Both versions no longer receive any security updates or bug fixes. If an organisation doesn't care to put a system on a platform with active security updates that tells me one of three things:
1. The system is unimportant and is basically value-less. I don't want to work on systems like that. 2. The engineers are incompetent and lack even the most rudimentary learning skills (or will) to follow even the most basic updates on the tech they use every day. I don't want to work with people like that. 3. Engineering management is too incompetent to listen to very important messages from their team. The system likely has major issues and a fear of fixing even minor technical debt. I don't want to work in an environment like that.
It's not seldomly more than one of these.
Interesting, I was not aware of this. I've not seen people use Corretto either, but it seems OpenJDK has a separate project just to maintain Java 8. So that's indeed still fine to use.
> And java being java and jumping to 11 won't be that bumpy either.
The update from 8 to 9 was rather painful in the beginning, mostly due to libraries not working well with the module system. I'm not sure how it is nowadays, it could have gotten better.
9→10→11→12→13→14→15→16→17 were very painless. I don't foresee a lot of companies getting stuck on those, though it's too early to tell.
That being said, I still have way more fun writing TypeScript and React code _when it works_ than I do writing yet another Java API. Might just be personal preference but the amount of fun that I have doing it makes dealing with the tooling hell all the more worth it.
Like they say - a cushy job if you can get it.
The java service releases every month or so, the microservice, on average, release every week, sometimes more.
You can build bad software with any tool, it all depends on how you use it.
Setting up a new project is a 5 minutes task. Npm init, then install express, typescript and some useful middleware. Install eslint then eslint --init and choose airbnb style guide, and I'm off to go.
And if I take over an existing codebase it just takes npm install then npm run dev <script name> and I can start adding bugs.
With react and vuejs it's even easier with nextjs/nuxtjs.
I never fight dependencies.
Yet I sometimes read stories like yours while typescript/nodejs has only been the smoothest experience I've ever had.
It's never easy. For some projects it took me about a week to do this (because of a breaking change in some library that's used everywhere that you are forced to update).
I just spent another two hours fighting with breakage because of a library that shall remain nameless. The author introduced yet another major breaking change in a minor release. I'm thinking of migrating to a hand-rolled solution, it probably makes sense in the long run.
Edit: just for comparison, the backend for this project is written in Java/Spring. I recently updated it from a five year old Spring version (plus a dozen dependencies from the same time frame), and it took less than an hour to fix everything. This is simply unthinkable in the JS world.
No typescript. No import syntax. Nothing extra.
It was magical. The entire build stage was npm install && node app.js
Admittedly, once or twice a quarter, we'd update the dependencies and we'd spend a few hours fighting it, but the rest of the time it just worked.
I worked in such a project who never upgraded once. And then Specter/Meltdown hit, and we had the mandate to patch all our systems (and the threat was very real). Welcome to a hellish mess of outdated deps that took weeks to sort out.
But is not only me. I watched a talk from a Principal Engineer from Amazon builder tools, and one of their biggest mistakes was not to upgrade often enough, which made each upgrade more painful.
So what do we do now working in multiple, large, multi-year projects?
First, we set tools that tell us when deps are outdated, and alarm when vulnerabilities are found.
Second, upgrading deps is part of the regular dev process. When you make a change, take the chance to upgrade the deps. Vulnerabilities are addressed proactively. The vast majority of times upgrades require no code changes.
Third, we regularly upgrade deps of inactive packages.
Lastly, if a dependency upgrade requires significant work, we create a ticket for it and address it as a new feature. In practice this happens very rarely, so it doesn't disrupt the development process much.
As other's said, the key is to upgrade often, and then it wont be as painful.
* and have a very good test suite
Did you read the part in the first paragraph where the author complains about people shutting down the idea without even giving it any discussion?
I mean you just dismissed the idea entirely and went off on a "have you tried jQuery" tangent.
> one of their biggest mistakes was not to upgrade often enough, which made each upgrade more painful.
The mistake isn't not updating frequently enough. The mistake is that the industry thinks maintaining backwards compatibility is a waste of time.
Updating more frequently doesn't magically make updating less painful, it just spreads the pain out over longer timeframes.
There is some benefit given that you won't be building on top of more and more stuff that may eventually be rug pulled by something that may already be released, but again, this isn't about update frequency, it's about a lack of respect for backward compatibility.
If everyone maintained backwards compat indefinitely we wouldn't have so many damn problems and updating would be nearly painless at whatever frequency you like.
Maintaining backwards compat isn't actually all that hard. There is two types of change. Breaking and non breaking. Most changes can be done without breakage. Want to make a breaking change to that function? Make a new function, put a 2 on the end. Problems solved. How often does leaving that old function actually cause you problems? Technically it's tech debt, but tbh it's the most benign tech debt you'll ever see.
So anyway, my point isn't that we should update frequently or not at all, it shouldn't matter. My point is that semver gives inexperienced devs a pass for lazy development practices that cost everyone instead of eating the cost themselves.
Want to release a major version change? Go for itz but understand it's a fork and not everyone needs your special new features you think is so important.
> I appreciate the contrarian point of view, and I don't want to pick on the author, but this sounds like words of wisdom from someone who doesn't have much real world experience.
I see why you'd say this, but what i'm mostly advocating for in the article is that breaking changes often being the only option for updates (which may be forced upon you because you NEED the security updates that are included) is a problem, since no one wants to (or even feasibly can) keep a maintenance branch of their software around forever, for every single version.
A pretty good example of software that doesn't cause many problems in this regard would be something like MySQL 5.7, which was released in 2015 and will be supported until 2023. Personally, 8 or more years seems like a pretty good amount of time to support a software product for, as opposed to forcing you to update to something newer after just a few years if you want security updates and bug fixes, especially if you don't have the proper amount of resources at your disposal to properly migrate over and test everything.
For example, for the past few months at my dayjob i've been:
- working to migrate about 7 Java services over from Java 8 to Java 11
- this also necessitated not only the migration of minor framework versions, but also major versions in some case (Java 8 --> 9 was a generational shift of sorts)
- furthermore, the decision was made to also abandon Spring and migrate over to Spring Boot, both because it historically "won" and also because some of the services already ran with it, so this should increase consistency across the board
- the decision to utilize containers also was made, after much deliberation and problems with the environments not being consistent otherwise
- the decision to also use Ansible was made, because historically changes to the server configuration weren't entirely traceable easily and diverged otherwise
- the decision to reorganize all of the servers with modern and up to date OS versions was also made, as well as the tools to manage the container clusters, as opposed to having systemd in one environment, sysvinit in another and manually run scripts in yet another environment (about 5 of those environments in total, each with all of the apps, though previously sometimes strewn across multiple servers for historical reasons, e.g. temporary environments that became permanent)
- tack on a few topology changes, introducing a proper ingress, as opposed to sometimes managing SSL/TLS through Tomcat, but not always
- if the scope creep doesn't sound bad enough, throw in some load tests that needed to be made due to issues in productions with performance, that had to be addressed in parallel
- oh and since AngularJS is essentially a dead technology, some of those systems needed to be split up into proper separate front ends and back ends for the eventual migration to something else
- besides all of that, i've also been working on introducing proper CI for all of that IaC and app builds within Docker containers, as well as any and all package repositories (Maven, npm, Docker) that we may need, both to avoid rate limits and improve performance, as well as cache dependencies in case the main source goes down
It's as if "the business" looked at everything they should have been doing in the past years and decided to put it all on my plate, only very good prioritization can avoid situations like this turning into an utter failure. Is that too much for one person to do successfully? Quite possibly. Have i also been mostly successful in all of the above and have learnt a lot? Most certainly. But does something like that possibly lead to burnout? I'd say that yes, in most cases. It's not healthy.Now, i agree with you that updating often would have noticeably lessened my pain, yet when your department isn't seen as a profit center or you cannot sell your clients (assuming consulting) on the idea of things like SRE and constant updates, at most people will bump smaller versions every couple of months to tick a checkbox somewhere, because they cannot feasibly do what i'm attempting now.
Not only that, but most of your suggestions simply wouldn't be seen worth the time and effort, unless you'd prefer to ask for forgiveness rather than permission, which is hard to do when you're also expected to deliver features and fixes:
- you won't have much automation or automatic scanning of outdated packages with proper alerts in place; i only recently sorted out the package management with proper caching registries myself
- you won't care about vulnerabilities (unless very high impact or incidence), at least not to the level of being able to react to them proactively (ITSEC teams often viewing the services as a black box, which doesn't tell them much about a whole class of issues)
- you won't care about upgrading dependencies regularly, because you probably won't want to be the person who breaks something with 0 perceptible benefit to anyone
- most importantly, you probably won't have an all encompassing test suite that'd do both unit tests, integration tests, performance tests and would also check everything from end to end, to make sure that everything would indeed work in a browser (or if you do, they're probably not updated regularly and don't have good enough coverage to matter)
Furthermore, if you need to do a generational shift, like i had to Java 8 --> 11 and how we'll soon have to do with AngularJS to something else, you can't just go to whoever writes your checks and say: "Okay, i'll need the next 3-12 months to work on this migration to do basically a full rewrite," unless they're really on board with your past incentives and are aware of the need for keeping up with the current technologies. Any such incentive, no matter how important would generate pushback and long discussions, worst of all, you wouldn't even know if any of that is even feasible.Would you want to be to known as the person who spent 9 months migrating an enterprise monolith, just to fail in the end and deliver absolutely nothing? In most cases that's a hard sell and almost impossible to put a positive spin on it.
For example, one of the systems that i haven't been able to split up and by far the largest one has the following:
- i can't update from Java 8 to 11 because the version of Spring doesn't support it
- if i attempt to migrate over to Java 11 alongside newer versions of Spring (Boot), the old web.xml configuration no longer works
- some other configuration is randomly ignored and isn't loaded at all, whereas other needs refactoring because certain classes no longer exist
- speaking of classes, there are now class path conflicts and i need to scan through the pom.xml and figure out which of the hundred dependencies are misbehaving
- not only that, but about 50 of them are out of date and thus need updates, given that many of them are also incompatible with Java 11
- worst of those are the classes that just break at runtime, like class loader functionality at app startup
- after all of that, i discover that many of the configuration values have been changed and need updating
- some of the servlets also aren't loaded properly and thus i cannot figure out how to get the app responding to requests properly
- since the back end also bundles JSP/JSF/PrimeFaces, all of those also provide further challenges, as does Java EL
- there are also scheduled processes within the app that break
- there are also services that deal with file uploads that break
- there are also services that deal with reports and PDF export that break
- there are also services that deal with database migrations that break
- there are also Maven plugins that break so certain front end resources cannot be built
- there are other things too, but sadly i don't keep a full list of everything that broke...
I have no illusions about the fact that too much was put on my plate, but surely you can understand why in my eyes it could be pretty nice to have a framework version that's supported for 10-20 years and is so stable that it can be used with little to no changes for the entire expected lifetime of a system?Either that, or you have to do updates often, keep your individual services small so they're easier to rewrite (maybe divided by functionality within a bounded context, e.g. PDF service, file upload service, migration service) so that 5% of "dead end code" doesn't keep the rest 95% from being kept up to date. Essentially, you'd have to constantly invest time into this and not pretend that code doesn't rust.
Knowing how little "the business" can care about these finer points in many industries, it doesn't surprise me that you see numerous neglected projects out there and i don't believe that it'll change - thus, we should slow down, if possible, and consider building solutions for the next decade, not just the next monthly iteration of our CVs.
Maybe that's a bit of a rant, but i felt like i needed to elaborate on my point of view. Now i'll probably go write my own little tool that alerts me when a new article of mine gets posted on HN, so i can provide comments in a timely manner.
Long-term I'm not sure what you mean building solutions for the next decade, it seems quite hard to design something perfectly in hindsight. And of course you have to compare the cost of it to just slapping something in a VM and putting a firewall over it and calling it a day...
Oh, certainly. Though right now i'm more concerned with making the lives of my colleagues more easy and actually shipping software that works in the end.
> Long-term I'm not sure what you mean building solutions for the next decade, it seems quite hard to design something perfectly in hindsight.
That is a very fair point, but in my eyes trying to create stable software is a worthy pursuit in many cases regardless!
Perfection is probably never going to be achievable, but the difference between creating something that will break in 3 months versus 3 years is probably pretty impactful (e.g. using bleeding edge/immature frameworks which will necessitate a rewrite, or will have breaking changes). I'd say that both the technologies used and the architecture of the solution can impact this greatly.
What's also useful is thinking about limiting the fallout when something does break, e.g. making the system modular enough that it can be fixed, updated or changed bit by bit, as well as thinking about scaling, at least a little bit. I'm not saying that everything needs to be microservices, but having a tightly coupled codebase can and probably will create problems down the road.
> And of course you have to compare the cost of it to just slapping something in a VM and putting a firewall over it and calling it a day...
That's also a reasonable take. Of course, costs aren't always the only consideration - if my blog or personal site goes down, the impact probably isn't too bad, whereas if a governmental health care system goes down, many people won't be able to receive the services that they need in a timely manner. The latter is probably worth the investment, both monetary and in regards to consideration about all of the stuff mentioned before.
I've actually experienced what it's like to see queues building up in one such institution, with the medical personnel also being frustrated, all because a system component in a data center somewhere had been neglected and had DB connection pooling issues, leading to a complete standstill.
I was called in to fix that external project and somehow managed to do it by ripping out the DB pooling solution and replacing it with another one. That was problematic when the actual codebase was badly commented and there were no proper tests to speak of in place and the failure mode was both odd and hard to debug.
In the end, i didn't manage to repair the old pooling solution without swapping it out entirely, because one moment everything was fine, the next threads just got stuck waiting one by one, with no errors or debug messages, regardless of the config, whereas breakpoints didn't lead to anything useful either.
In short, there are systems out there that should be as stable as possible and tolerant of failure, given that not all of them will receive the constant love and care that they deserve.
I'd also like to link this lovely article and talk: http://boringtechnology.club/
Especially the bit towards the bottom about the "known unknowns" and "unknown unknowns" - knowing what you can and can't do with a particular piece of technology and its characteristics is probably a good thing.
Upgrade everything all the time and it will never be hard. You'll have full context for breaking changes, and the diff from A to B is always smaller than from A to Q, and less likely to break in strange and confusing ways.
Debts have a way of compounding. Tech debt is no exception. Tech debt begets tech debt begets tech debt, and it will hang on your velocity like a ball and chain.
The reason to do maintenance constantly is practice, which makes the difference between taking weeks or days vs. hours. When the time spent is evenly distributed, it's also less likely that an important task would be blocked by unavoidable maintenance.
The worst place to be is having to fix a CVE in a hurry, but first having to upgrade your framework a few major versions including fixing some breaking API changes. I’d rather pay a small tax every month than have to risk those late nights.
Dependabot is great here, you can get updates for free, or at least preview if they are going to pass all your tests.
It pays for Red Hat/SUSE/Canonical to maintain and old stable version CVE free for you, so you don't have to update so often.
It's wonderful.
I wish they would just drop it from their repos and suggest users to use flatpaks (or Nix?) or the proprietary variant Chrome (which is what most likely want due to sync), it is a big liability to keep an insecure browser around.
So pardon the plug, but finding a happy middle-ground to exactly this problem for Django based projects is what I now work on with https://www.codestasis.com/
Projects that can't upgrade, because of the ensuing cascade of breaking changes and dev time needed, subscribe to CodeStasis to minimally update Django to new non-breaking patch versions.
So you can keep your trusty old version yet also stay patched and secure if you find someone to do the heavy lifting for you at reasonable cost, which I think we deliver.
Last week I force-downgraded after I got an exception because it is my busy time of year. That exception was not respected and I realized fighting it weekly would be the same time investment as fixing compatibility issues.
"What compatibility issues? Win11 is fine, I have had no problems." My coworkers say.
Well on Day 1, 2 pretty important pieces of software crashed and exited on first run. And then the screen snipping tool failed to take a snapshot and helpfully suggested I reinstall the OS.
I actually really like the MSFT stack, but I know enough to avoid any totally new release for a while. I actually feel confident enough that I no longer try and skip major releases (like I skipped Vista, 8).
Just cannot accept things changing without my consent on my workstation.
The earlier responses in the thread were talking about forced upgrades. I'm not sure about MacOS since I don't use it much, but most Linux distros do not forcibly apply upgrades like Windows does; you can continue to use old packages and even reboot the machine indefinitely. Sure, you might not get security fixes or keep unrelated packages up to date beyond a certain point, but that's not at all the same thing as updates being applied without actually being invoked by the user.
I dunno, I've heard multiple reports of people leaving their machine alone and coming back to it having upgraded and rebooted into a new version, sometimes into an unrecoverable blue screen.
How would they have opted out of that?
In this case, the forced W11 upgrade was forced on me by my company via push.
Fool me once, etc.
Eh, not very accurate in my opinion. If you want to use the latest software you are very much forced to upgrade Linux because they have no concept of separating the platform from the applications that run on it. Either everything is bleeding edge or nothing is. Or you compile things from source like it is 1979.
There are Windows programs released today that will run just fine on Windows 7. How many Linux programs released today will run on Karmic Koala without recompilation?
Compiling from source is the most reliable way to run the latest and greatest version of a particular application that I've found to date, leaving out all the middlemen like package mantainers, whose competence I may or may not trust.
And generally speaking, I'd trust a several-decades-old technique much more than something just released.
As far as Windows software goes, I've found Wine to be a much more reliable platform for old Windows applications than Windows 7 or 10, although there's nothing better than emulated Windows 9x for running programs of that era.
(I make "any browser" websites, so running 1995+ software is something I do on the regular.)
I have not tried to use that recently, but I am quite happy running 14.x today, and it runs everything I need.
I use IntelliJ 13.x for my Git stuff, Geany for most of my text editing, a dozen different browsers at whatever versions they are for my Web things, and whatever versions of mpv, mc, LibreOffice, etc. it came with for what those programs do.
With only 1GB of RAM it's not always as snappy as I'd like, but I use the periods of swapping to meditate.
I don't have to use programs released today, only ones which I need today.
Some GNU/Linux distributions do it, but not all of them. And I have way more control over it when it does happen.
Apple was pretty solid until around Mountain Lion. Once I saw them messing with "Save As", I jumped.
I've had good experiences with LXDE and Xfce so far on multiple distros.
Anything Gnome are no longer in the running, however.
If you're using a "mainstream" desktop environment (e.g. GNOME), then yeah, but that's not universally true. I've been using exactly the same desktop environment for something like ~12 years; I love Linux because if you set it up right it's essentially zero maintenance (significantly less than Windows and macOS), and almost nothing changes without your consent. The only forced change during those 12 years that I've noticed was the migration to systemd, and Firefox reskinning their GUI for no good reason every other release.
They might scream in horror at how containers often get (ab)used though.
Also, previous incarnations were hard to maintain, had no logging before the mount of filesystems, had ill-defined service life cycle, etc. Booting is a hard problem. Having it all around the system in million shitty bash script is a ridiculous idea. Make it declarative as much as possible and have it handled by a single core program. And systemd does these perfectly, my only gripe with it is that it should not have been written in C, but such is everything in linux land.
The reality is that systemd's wide adoption has made many people unhappy, for many reasons, some outlined in the Wikipedia article[1]. Systemd is overly complex, to the point of being obfuscated; systemd has many interlocked dependencies; systemd takes control away from the sysadmin and puts it into a fat binary; systemd goes against the Unix philosophy of "do one thing well"; systemd creates a pattern of homogenizing Linux architecture, and so on.
Lucky for us, unlike with Windows and Mac, there is no "One And Only GNU/Linux Distribution", and instead there are many options and alternatives, many of which have not integrated systemd at all, or only ported small parts of it.
Every day I am ever so grateful for the miracle and gift of FOSS. Thank you. Gracias. Spasibo. Dyakuyu. Merci. Danke.
> It made people so unhappy there were forks, protests, and even suicides.
...a suicide over a different init system? Seriously?
https://en.wikipedia.org/wiki/Systemd#Reception
Summary: It's overly complex, it has many interlocked dependencies, it takes control away from the sysadmin and puts it into a huge binary, it goes against the Unix philosophy of "do one thing well", it creates a pattern of homogenizing Linux architecture...
Sure, MATE has evolved to give more options, and distros seem to like defaulting its look to something non-traditional, but the traditional look is still very GNOME2 and very much alive. I've got an old desktop from 2009 that's run Gentoo the whole time , I never upgraded to GNOME3, but I did switch to MATE when it came out, and haven't had to mess with it since apart from trying out different icon sets or other small theme changes. It looks basically the same as ever, even compared to my old laptop screenshots from 2007 -- I still have my wobbly windows from Compiz (fka Beryl) too.
The Mac-like global menubar which they've grafted on without being able to adopt the applications is an atrocity IMO.
I consider Windows 95 / NT4 / 2000 to be "peak desktop GUI" and use distros which allow me to emulate that look, feel, and behavior. I use it until it fails to deliver that experience and then keep trying other distros until I find another one who has not yet rotted out.
So far, I have only had to switch distros a handful of times.
I used Windows 2000 starting three betas before gold, downloading each build over dialup from AOL warez scene releases and didn't stop until a while after they stopped patching Pro, don't recall having any issues. What an amazingly solid OS.
My choice today is Xfce with the Chicago95 script, I can barely tell the difference.
I'd say Mint has the best default tuning for Xfce, with Manjaro I have to add the fewest additional packages on top of the base install, and Fedora is somewhere in between.
Thanks for the memories :)
My Arch + AwesomeWM setup I've been running for the last 5+ years would disagree with you. Kinda one of the reasons I went with this setup, I have total control over all updates, installed software, etc.
I know it's probably a typo, but I can't help but imagine the wonderful OS that Windows 6 never was :)
I still stuck around until Windows 7 because I had just grown so into it, was very comfortable with keyboard controls, etc. Then a computer I knew upgraded itself to Windows 8 without being asked to, and started booting into a bsod...
The overall intent and attitude matters more to me than the details, and the general intent of Microsoft (and Apple, and Gnome, and Ubuntu, and many others) seems to be "we know how your desktop should look and operate better than you do."
This is completely the opposite of what I want, which is to have a workstation which is configured to facilitate my work, where nothing changes without my explicit REQUEST.
It's probably something hardware related, but the Pro version works great so far, even if it ignores update time and sticks my files into a black hole because it thinks it's a virus.
Hopefully the last version I'll use on bare metal as I move away from soldered processors and more centralized garbage.
https://social.technet.microsoft.com/wiki/contents/articles/...
To get the snipping tool working, close the snipping tool, manually set the date to around the start of October. Reopen the snipping tool and it should be working. The date can now be set back.
https://blogs.windows.com/windows-insider/2021/11/04/releasi...
My snipping tool again works, and exactly how I need it to.
No amount of things I've tried makes it work, so to change the volume I have to either use keyboard shortcuts or open the volume mixer in the control panel.
Meanwhile the defender itself keeps running and preventing me from installing latest qBittorrent because it decided that it's malicious and to overwrite I need to open Defender...
https://forums.aws.amazon.com/ann.jspa?annID=8499
So obviously I was embellishing the language, but the sentiment remains the same. I found this because I checked the RDS admin panel, which I rarely do. I didn't get an email. It was very alarming to discover and makes me anxious about what other forced upgrades I'll miss.
I appreciate the point of this, but I think forcing upgrades is absolutely the wrong way to do it. Scream at me all you want, but don't force my stack to mutate and potentially break services.
What do you want AWS to do here? Keep running software that won't get security updates? That seems a bit wild to me.
Communication could have been better, but there is no universe in which a managed database provider should be expected to continue to maintain instances with discontinued versions of software.
Why were you still running 9.6 anyway?
PostgreSQL is open source, so they could keep patching the old version with security fixes.
Or... they could keep using just the community-supplied free-of-charge version and pocket all the money from not maintaining security patches themselves.
I'm not saying RDS couldn't be better, but I wouldn't expect them to maintain unsupported versions of 3rd party software.
https://www.postgresql.org/about/policies/sponsorship/
But AWS should not have to take responsibility for providing indefinite updates to every version of every managed open source project it operates. The only way I could see this working would be if AWS charged the holdouts the cost of keeping them supported.
However, performing RDS Postgres upgrades is relatively quick and painless process. If a company doesn't have the capacity to do that every five years, then it shouldn't be running its own infrastructure.
That actually sounds like a great idea. They could charge more for use of older versions, so that people could calculate their tradeoffs, and migrate when they decide themselves.
We did our upgrades few months back (9.6 -> 13) and luckily in our case it wasn't big of a hassle. Just finding out correct upgrade path with Postgis took some investigation, but overall the upgrade documentation was good.
It's frustrating when you update in order to get the latest security updates - and you get forced to do a bunch of pointless busywork because some asshole has made some arbitrary change like deciding that 'which' is deprecated now.
I kind of hate that this is going to live on as some example when the actual event was somebody proposing it, it failing in some builds on testing, and then a vote deciding against it. It was an example of good project governing preventing breakage, but for some reason it's already being remembered as the opposite.
But a good migration is a quiet migration. When internal Debian discussions reach the user's stderr and causes builds to fail, the system has failed.
There's only two ways to remember this sort of kerfuffle. Not at all, or as a lesson in deprecating things smoothly.
This made me uninstall Docker Desktop.
If they are the kind of people who would try something, then they are still the same people and that problem did not go away.
They will try something else again, and may in fact already be failing to work to my advantage right now in ways I just can't see.
Once you know that, I prefer to just live without whatever the awesome thing is, somehow I will survive.
This is one of the attitudes that makes the internet so toxic IMHO.
There are an infinite number of ways to make enough money to survive.
You can sell your work honestly without artificially witholding work that is already done so you can sell it a million times over, and get people to do it by artificially creating or at least artificially preserving a pain point and randsoming the salve.
That is not simply doing work and paying for that work.
If a thing is at all useful enough that anyone even wants to use it, then there are a million businesses that would love to pay you for expert installation and training and support of perfectly free software.
Ahh but that doesn't scale. You can sell your time to a few people and live very very well, but you can't sell your time to a billion people.
No one is "trying to survive" in this story. What a strange and incredible thing to even try to say.
Yes. That is exactly what I said.
Right up there with removing all nuance from a discussion and attacking a strawman...
Dealing with a normal mistake isn't a problem because I can just opt out. They removed that ability here.
Something like this should never happen. I hate spending my weekends troubleshooting the Samba configuration. Maybe I will connect the printer to a Windows VM.
"Be on this version. Now."
What i mean is that I value decent changelogs, ability to diff changes between package versions, etc. much more. When a package regresses on my desktop, my next task is sadly to try to debug it.
Well if you wanna debug it, go back to 5.13. I just mean I want Nix or Guix style declarative systems.
Now all my IOT devices on the 2.4ghz now fall off the network after ten minutes and have to be manually restarted. I'm sure if I spend the time to look into it I'll find some fascinating difference of opinion regarding a detail of the 802.11b spec between the manufacturer of my very cheap wifi router and the manufacturer of the very very cheap wifi radios in my internet-connected thermometer.
Instead of doing that, I factory reset the router, and spent fifteen minutes restoring various configuration details from memory.
I have an iPad running iOS 8.x, which I'm also happy with, especially when I do testing on the clusterfucks that are later iOS and Firefox releases.
Browsing a handful of reputable text-based websites from behind a NAT, I don't see the problem. (And I feel the same way about HTTP, which is faster, more compatible, and more accessible.)
By conservative, I mean something which would still work today if I wrote a script for it 10 or 20 years go.
There are important positive things that people don't realize are lost as we "modernize" society.
For example, these days the TV spies on my usage and sends that data back to the maker company; they will then sell it to advertisers. Every update is aggressively pushed to me, and after i accept it, i notice more ads (rebranded "you may enjoy" or "now trending") on the home screen.
Another example would be how awesome paper is. It displays information without requiring an energy source. It can be folded and unfolded. May not impress you until your phone battery dies on a trip or at the airport/stadium where you need to present your e-ticket
Have you considered getting rid of that TV and TV in general?
Greetings from Germany as well...
I have nothing against running lynx where you don’t even have js support.
“ Browsers run untrusted code 0-24, which get JIT compiled to machine code through a very complex and bug-prone process. Add to that that desktop OSs are quite lacking when it comes to sandboxes, so even with browser sandboxes, the potential for serious damage is quire big. So, staying ahead of bugs is a must.”
But if I only visit sites where this is unlikely (and don't allow JavaScript, which you seem to have missed) I am much safer than when browsing willy-nilly with the latest patches.
No updates: ignorance is bliss. Until you need to breathe -- then you die.
All updates: maybe I can just drink the whole thing...
There are many other examples of this. Breaking compatibility by fixing bugs people rely on for instance.
Any change can break something for a user downstream. It's a very subjective evaluation for the producer to imagine potential impact to their consumers. It's easier if the relationship is rich and exclusive. In open-source where people do it on their free time and have thousands of consumers with widely different interests, it's pretty much impossible to label the release in a way that's conveying the right message to every user.
Semver, the way i see it, is just a way for the producer to subjectively label the amplitude of changes. The consumer should then ideally be familiar with the producer and get a sense of how they work and what they perceive as big. Still at the end of the day it's a very subjective judgment call system that doesn't offer real guarantees to consumers. If your software needs to be stable, don't upgrade, or spend time to review the changes in the dependencies. The version numbers are no guaranty.
You confused XKCD with reality: <https://xkcd.com/1172/>
I believe the point i made still stands though
The idea was that the OS gave more cycles to interactive sessions … something like that. It may be apocryphal.
Allowing most software companies to update anything on an running functioning work-related machine that you use to make $$, is ASKING FOR IT. WHEN it breaks something that is your fault for being so stupid.
I update software in most cases by installing it on another machine/device and then once it is confirmed to work, switching devices and wiping the former-work-device.
Yes I have more than 2 of everything critical for making $$.
Yes I filter all my inbound and outbound network traffic and default deny, at home and on the road
Software that prevents you from disabling auto-updates is a virus.
Part of the fear of updating though is the time sink.
Even if I attempt to update one mac laptop to the new version (of which I believe there is a new one just released, doesn’t seem long since I last updated…) knowing that I have a safe backup, I dread the thought of spending hours knowing something _should_ be working but is now broken. It can be infuriating. Especially when it’s a pattern/way of working you have become so accustomed to.
Or just one, exposing your data in a ransom attack.
Dependency and update management is hard. Welcome to IT.
From my experience, extreme viewpoints and religions are convenient in the way they have answers to all hard questions in life that are simple, clear and wrong.
If you like simple and correct answers, you're usually better off choosing simple questions instead.
Unpatched and unmitigated? Yes.
Taking the time to build “defense in depth” into the architecture has saved my ass on many occasions.
Ignoring upstream security fixes on a work-related machine that you use to make $$, is ASKING FOR IT. WHEN it breaks something that is your fault for being so stupid.
Neither of these extremisms are helpful. It's clearly more nuanced than any of this.
Sorry, this one raises my hackles. It's exactly such a user-hostile worldview that makes everything suck. It's just more victim-blaming and elitist tongue clicking that helps absolutely no one.
Everyone is stupid when it comes to software. There are hundreds of millions, if not billions, of lines of code, written by tens of thousands of different people, with myriad internal and external complexity, all breaking and falling apart at the same time. It is literally beyond human comprehension all the niggling details that could go wrong.
I whole-fist pushback against this "oh you should know what you are doing with metric asstons of other people's code". Uh, no. That's the attitude of unserious people who want to ship garbage and make it users' problem.
Can not agree with the React part though.
They keep so many things backward compatible. React 16 is 3, 4 years old now? I've updated pretty big code base from early 16 to latest 16 version painlessly - like in a day. Used some of the available code-modes for some really old part of the project. It worked flawlessly. Currently there are console warnings to fix certain things and that is it. No breaking changes, no nothing.
Now, React 17 will be a problem - there are a lots of 3rd party UI libs that will not work with it. But I think we are pretty well set to use react 16 for the next couple of years, making it work for 6, 7 years total. I think that is a century in terms of FE and is great.
Also, "...React pulling a sneaky on everyone and introducing hooks, which was a pretty bad move, especially if you needed to migrate to them" - just don't use hooks then - no problem.
From ignorance, it seems like react has changed a fair amount during its lifetime, in terms of good practices, features available, etc. Where can one find resources that are both complete for a begginer and not outdated?
As for changes during its lifetime, I would say that it is fairly on par for most web-focused frameworks, both front and backend. You could look at how ASP.NET has changed over the last few versions for example and see it being similar to React’s changes. The largest changes in React recently have been a greater focus on moving from syntactic sugar JS classes to pure functions, and React Hooks that go along with that. There’s definitely a shiny things syndrome you get if you just google for React tutorials, which is a bit annoying, but the official docs are pretty solid, and a few of the core devs are great to follow from a philosophical standpoint (like @dan_abramov).
Hope that helps!
There’s an O’Reilly book called Learning React (2nd Edition) which is great. It brings you up to speed on the history of the framework as well.
Also, Android: One day we will stop giving you updates, so your apps can't talk to new versions of online services anymore.
Newer versions of Android have done a lot to decouple the device tree from the rest of the OS so you can update without OEM involvement.
Google also moved a lot of functionality into Google Play Services that updates over the air (but that's a negative for some people)
So, for old hardware:
- Install Linux to desktop/laptop computers
- Install Ubuntu Touch to smartphone, if available
It works, I'm not all that impressed with Angular 47 or whatever they are up to now, nor React, and, to repeat myself, it works.
When you have tens and hundreds of thousands of lines of code and a only handful of people, it ain't worth it to rewrite everything to make it just work the same and look the same.
author lost me at this point
Your time is limited and you can't get more of it. That isn't the case for a company. There, time == money, because if their employees don't have enough time to do all the work, they can just hire more to do the rest. But because they're only interested in growth and not sustainability, most of that money goes into developing new features, not keeping up with security updates. The vast majority of large companies could very easily hire one engineer and task them exclusively with updating legacy dependencies. And the smaller ones could instead re-task half their dev team for a month each year.
Sauce: had to deal with that recently. It was not pleasant.
I'd rather deal with 50 points of failure spread over 5 years than 50 points of failure once. Far less stressful, far easier to diagnose.
Besides your points, it also sucks if you hit an old bug that's been fixed yyy versions down the line and you can't get there reasonably
(I tend to agree with many small chunks than a couple huge ones)
Of course those folks don't have these luxuries. npm upgrades without testing, dependency tracking in XML, closed source deps, no symbol versioning, loose dll hell.
But even with simple glibc binaries I have to maintain up-to-date and lts (ie outdated) versions for the recent fstat and time64_t changes. Then you start appreciating go. And podman.
Something work calling out though - the author appears to have completely unironically updated their own post.
- JS dependencies are a problem because of the sheer number, which is really because of all the authors of the dependencies and how they update, backwards compat or not etc. if you had 10 big things by 10 authors they would coordinate better than 1500.
- The Lazarus example is interesting but “trusted components” also means walled gardens, who gets to choose? Is there competition? How is that decided in vs out? Logical conclusion to much of this ends up with a central community package manager like maven central..
There will be a major update in xx.xx.20xx date, it will break many things, so plan accordingly. And there won't be any more security updates one month after that.
Meanwhile, security updates are pushed in realtime.
Also, this disclaimer in the very first sentence of the article:
> "Here's a fair warning: this article is reductio ad absurdum"
Why?
[0] https://blog.malwarebytes.com/android/2021/04/pre-installed-...
[1] https://www.businessinsider.com/asus-acknowledges-computers-...
I don't do much fronted today and the reason are the frameworks.
I still do it but I use Blazor to generate web assembly.
im not sure i agree with the accident theory though because 'i' looks a lot more deliberate that 'I'
Boots immediately too.
Well, blown-fuse ROM is called PROM. Real ROM is made from hard metal VLSI masks or old ladies weaving copper wires.
https://packages.debian.org/stretch/redis-server
So much about not breaking things.
My solution to this isn't "never update anything", but rather "never version anything". People can choose to stick to the bits they originally got, which is perfectly fine, or they can switch to the current "live" one. As a developer I'm only ever building and maintaining the latest source.
I'm with the GP on this. Pinning to a specific version is a code smell. You should have enough confidence in your regression suite to always use the latest version. And hopefully enough confidence in your vendors that they're not going to break a bunch of stuff.
Even if you go through a deprecation cycle, you're still going to eventually have a build N with feature X, and build N+1 without feature X. That's a breaking change.
You now have no way to indicate that you know your changes are breaking.
On the other hand, the longer you wait to update, the worse it gets. Updating more frequently you can suss out packages moving quickly vs slowly vs not at all and address the problem before you're in update paralysis
That's valid under semver.
The crazy diagrams show what happens when you want to support lots of old versions.
I have semver stuff at work where I only maintain the latest version. Bugfixes bump the patch version, adding a feature bumps minor, removing a feature bumps major.
I don't make any special effort to bump or avoid bumping anything. It gives me a rough idea of whether a given version has new stuff in it (x.1.0 or x.2.0) or is just a bugfix (x.0.1 or x.1.1)
Dependency hell has nothing to do with how you label your versions and everything to do with how much you want to annoy users by breaking whatever you like vs annoy yourself by taking the time to set stable APIs and hold compatibility backwards and forwards.
Semver vs. Git commit hashes vs. "just one number" vs. web browser versioning vs. "just timestamp" is all just different labels on the same soupcans.
I've noticed (more frequently) npm packages quickly climbing in versions (1-17 in a couple years) but at least it's painfully obvious.
literally the first sentence...
"My premise is that updates are a massive waste of time, most of the time. Obviously, someone will jump out and say that "Hey, if you don't update, your Windows XP installation will get added to a botnet in less than a week," and they'll also be right at the same time. "
So my understanding is, when compared to a academical, idealistic point of view, handling of updates is not optimal. Sure thing.
But in reality, you still must patch your WinXP system if you have no better alternative and the author likely agrees. And if you do have a shitty legacy java project that is still needed in production - you still have to patch it, if you have to use it in the wild.
In a more serious note: it is a rant
React Router, however, feels like the one major React package that constantly breaks things on major versions and requires refactoring to get back to where you were.
Yeah, i'm pretty sure the author doesn't know what that phrase means.