The growing complexity of modern software systems
infoworld.com
infoworld.com
Both can be a great pattern applied properly (nasty scaling problems), but they became a religion or a replacement for entire stacks. I see so many devs these days who are clearly confused but have no idea what they're doing is overly complex—they just think it's normal.
AWS and the like are great, but the move to make everything cloud-based is going to lead to a lot of unmaintainable (or in extreme cases, unsalvageable) messes later. It will be a sad day when devs only understand how to build or deploy something if it's using a heavily-abstracted corpo stack, or even worse, "no code."
We say one or the other is overly complex, but I think both are knife throwing just with slightly different details. If you can grok system design, microservices are easier to reason about. If you maintain your monolith well, it's easier to reason about.
I too have seen this. The one benefit of monolith in this case is the three files are in the same repo so at least it's (theoretically) easier to standardise on just one.
If they're cross-repo duplicates, then it's a little trickier.
So no, I think only trained teammembers should be allowed to touch them. Even simple coding with workflows is difficult for non-programming oriented people.
If people really think that no code is acceptable, then I am going to cry. It won't be an improvement.
I'm not really familiar with micro-services.
Could you give me a concrete example of a system that people would built with a micro-services approach but would be simpler as a monolith?
It's not a binary decision. Micro-services are a tool/technique best applied piecemeal for specific things. For example, "we started out with our API in the monolith but it's got more traffic than we expected so we should split it off to its own service."
The point I was making is that people take this wholesale approach and add unnecessary complexity (i.e., split the API, the payments system, the DB/ORM layer, etc. off into services from day one).
It does not work so well for interactive reading applications like a REST-api.
SW dev has always been overly complex, long before AWS and the web existed. It's just how we do things in software engineering. Too many choices and lack of physical constraints leads us right to the edge of where things totally fall apart.
None of these technologies are bad. They're just bad in the hands of mediocre developers.
but people, especially those involved in this complexity, insist that this is all normal. simplicity (or whatever it will be) is coming for modern software. we are seeing the early stages of that upcoming change: denial & resistance.
denial is when we hear engineers say that software is simpler or no more complex than it was. resistance is when engineers try to convince us that "we need that complexity".
following the well-known psychological curve, next up is acceptance. and i have started to see it already. kubernetes, for example, continue to deprecate poorly designed or overly complex features. it is hard because of backward compatibility.
all that to say that change is coming. maybe we will simplify and start the cycle all over again :)
Yeah. "Denial, resistance, acceptance" -- isn't that from the six (or was it seven?) stages of grief? But grief is for something inevitable and irresistible, a fait accompli: When a loved one has died that has already happened and there is nothing you can do about it.
Here, though, if enough of us think that our industry is going the wrong way, maybe we can still stop it.
Also, I think that relatively, we are still in the early days of software where lots of people are clamouring to invent the silver bullet to make it all work better, but after a bit longer, we will have more experience of what works and doesn't work and we will consign certain things to history.
Think about what medicine was like in the first few centuries? Leeches, trepanning, toxic "medicines", they presumably had the same issues until they established a much better foundation of what works and what doesn't which has made medicine move on.
We will keep some of our cool things but others (XML anyone!) will just die off as we realise they are a solution to a problem that most of us don't have.
I spend thinking about medicine quite a lot (health problems in my family run deep) and this does not give me great deal of hope for our industry at all. There is so much quackery everywhere - most of diagnostics is based on some magic guess work. If symptoms are non-specific than You are out of luck - You have to spend years visiting random doctors hoping that one of them will have fresh enough memory of some book that he read years ago to guess right.
And even when the diagnosis is easy the therapy can be not that far away from leeches.
Few years ago I had wart on my hand and dermatologist offered me three options:
- freeze it to death
- burn it to death with acid
- cut it out
If You look at this options closely they require some high tech to be possible but from medical point of view they are as primitive as leeches. I honestly belive that in 100 years time when nanorobots will be available to everyone the doctor will prescrabie therapy that is basically nanorobots attacking the wart with little flamethrowers.
I have a feeling that (especially in devOps/kubernetes) often there is a wish to have a magic button/command that does everything. Like in a rube-goldberg machine.
What is forgotten then is the cognitive overhead of templating YAML inside templating YAML which is needed for the magic-button to be configured.
And if the buttons behaviour needs to be changed very few weeks, not much is gained.
20 years ago, it was about how virtual machines (like the JVM / CLR) abstract memory management and developers write bloated software.
We simply have more layers of abstraction that we depend on, and the interesting problems move up the stack. That trend will continue until the machines take over and write software.
Until then, we'll continue to see this article show up, s/kubernetes/next-new-hotness.
The fastest java software I use feels much slower than the slowest c++ one (talking about UI lag)
I think we can have another in anoter level: "What the language giveth, complex patterns and libraries taketh away". This works not only on performance levels, but also in terms of complexity.
"A QEMU case study in grappling with software complexity" — https://lwn.net/Articles/872321/
Although the article uses QEMU as an example, the lessons discussed in it are equally applicable to many other projects.
(If you're short on time, read the intro, "Sources of complexity", "Ways to fight back", and the short conclusion. The QEMU command-line case study section might be interesting for those who use a lot of QEMU, or to those devs who use QEMU to write higher level tools.)
Now, with things like AWS, Terraform, increasingly converging popular programming languages, frameworks and best practices like tests, code review etc, in some ways things are less complex.
Beyond that, in some instances even for simple apps there is less complexity once you know the technology. That's not complexity though. That's a buffet of useful options.
Good architecture decision are even more critical today.
You're wrong. Complexity has increased by a huge magnitude so much so that it's actually unmanageable by a single person.
What's going on in your case is that the complexity of all of this has been abstracted away from you by amazon. They have entire teams of people making sure you don't have to deal with the actual complexity. That's the difference. This isn't an actual abstraction in the same way a high level language abstracts the details away from you. This is an abstraction where a team of people take care of you. It is not a true abstraction because you cannot wield this abstraction yourself in the same way you can wield a high level programming language.
Make no mistake, the actual complexity of it all has increased by huge orders of magnitude.
Amazon abstracts complexity away by having someone else deal with it. Big difference. One would imagine software progressing towards abstractions that are simpler and allow one person to do more, what we are getting is instead abstractions that only make it seem this way when in reality it's going in another direction.
Complexity is increasing to the point where one person can do less, but companies like amazon don't let you realize this by hiding the true complexity behind other people who deal with it.
And that completely ignores how well PHP works for standard web sites.
So, if anything, I would say that things peaked with very understandable deployments about a decade or so ago. Sure, we now have "web scale" orchestration frameworks for the giants out there, but... I question how well this actually solves problems that folks have.
Worse, I also challenge that anyone really has a handle on scale. Walmart's site, as an example, was completely garbage today when they released there silly supply of PS5s. In all sorts of ways that showed that eventual consistency is the unnamed assumption in how all "web scale" things are created.
Even inside AWS there's no standardised way of doing deployments. Are we using EC2, Lightsail, Lambda, Elastic Beanstalk, EC2 with ECS, Kubernetes? For databases, are you hosting yourself or with EC2 or using RDS? Or are you using containers? Or Kubernetes? Too many options.
Pre-AWS, however, things were much more standardized: Linux servers. Or Windows for 5-10% of cases.
These days I fight with npm or nuget dependencies problems, 20 years ago I was trying to write Delphi code to do simple REST requests, the complexity moves around but is still there.
Out of the Tar Pit (http://curtclifton.net/papers/MoseleyMarks06a.pdf) was written 15 years ago, and it's all about curbing complexity
About Out of the Tar Pit, complexity manifests itself in various shapes. The essay itself lists some that have gotten better: state is one, with people using more functional code. The "Power corrupts" part has also gotten better, IMO, with languages becoming simpler (Go) or more restrictive (Rust).
I think the "Code Volume" part is still a big one. One thing I'd like to see curbed to avoid code volume are the proliferation of code for handling edge cases. Having libraries and code able to handle tens of edge cases is both a blessing a curse. However most developers and business people can only see the blessing part.
> The shift from building applications in a monolithic architecture hosted on a server you could go and touch, to breaking them down into multiple microservices, packaged up into containers, orchestrated with Kubernetes, and hosted in a distributed cloud environment, marks a clear jump in the level of complexity of our software. Add to that expectations of feature-rich, consumer-grade experiences, which are secure and resilient by design, and never has more been asked of developers.
Comparing the most complicated way to build and run an app with something that isn't as complicated is just a straw man. Today you can still build a simple, monolithic app and deploy it into a completely managed service. All the points raised address certain problems:
- microservices - sliced out of a monolith when complexity or scalability becomes difficult
- containerisation - deploy an app with all of its dependencies down right down to the OS
- orchestration - ensure reliability when pods/tasks fail, rolling updates, commoditize hardware
- distributed cloud environment - remove the need for on-prem, or have the ability to elastically scale without monthly VPS commitments
- secure & resilient by design - apps that make money should have good uptime, not leak data
None of those are mandatory for all apps - it's pick and choose as and when you get the need. But also what is the alternative provided from "years ago" when things were seemingly simpler? - microservices - ever tried keeping velocity when building XMLSOAP based apps?
- containerisation - write a bunch of ansible scripts or maintain disk images that can be sent to server fleets with bash scripts, else more scripts to apt-get/apk install stuff. On windows before package managers? enjoy shipping zips and exes with your code.
- orchestration - scripts?
- distributed cloud environment - build your own datacentre if you're big enough, lease out some racks if your not and have a systems team maintain them, patch them, RAID stripe disks and swap out dying infrastructure; or sign up to managed VPSs and raise a requisition order each time you want a new server that'll take a week to go through.
- secure & resilient by design - a lot to do for a 6-9s uptime; so just lock down your release process with a ton of bureaucracy and approval gates by different teams. not releasing is great to improve uptime SLAs.
I don't have a good impression of the "good old days". The complexity was always there, it was just managed by different teams.The real question is should a software developer need to know and work across all of these things, or are people who no longer have "systems management" job move into DevSecOps and augment a software team?
when we are still using monolith and using old deploy to one server, that would be easy. Then there is scaling issue and that's where the cloud came because really, when you have to manage a lot of things at once, it's better to let someone manage it for you and you can focus on your business logic.
Obviously, the practice wasn't perfect. A lot of "micronization" comes up instead domain driven problem but that's the problem on mostly people not the tech