Microservices aren't the problem. Incompetent people are
nondv.wtf
nondv.wtf
I don't think you can stop less experienced engineers (or experienced but still bad engineers) from contributing to projects - especially at the scale of a lot of these large organisations.
After all, for people early in their careers, being bad is the first step to being good and it's impractical (or impossible) for organisations to exclusively hire "premium" engineers.
There's also nothing wrong with engineers who program exclusively to collect a paycheck and aren't actually passionate about their work. I believe this is an inevitable side effect of the accessibility of programming today.
Project architects should instead strive to design their systems such that they expect low quality contributions and limit the potential damage those contributions can have. Systems should be able to take a low quality contributions and if the need arises, have the capacity for those circuits to be optimised at a later date without rewriting the entire thing.
I personally find the argument that "bad engineers make microservices bad" to be silly. Bad engineers would poison any poorly architected project, be it a monolith, microservice or otherwise. Microservices are just an architectural optimisation with trade offs that some organisations find value in.
Except in our industry. In our industry the juniors often are the ones making the decisions.
So in one way, OOP is great for limiting side effects.
> Except in our industry
> Except in our industry. In our industry the juniors OFTEN are
try again.
I suppose for some implication is difficult to deal with so let me be explicit.
there often are no seniors. A junior mentoring has another phrase. The blind leading the blind.
You said every other industry the seniors guide the jrs, except ours.
I disagreed, and said it's been my experience that seniors are always mentoring jrs.
That's all I was ever trying to reply
I didn't say that the first time and I didn't say that the second time when I pointed out you were cherry picking.
At what point do you admit that maybe I know my point better than you and your caricature aint it?
If you're not a native speaker then I understand, otherwise lrn2read.
> Except in our industry. In our industry the juniors often are the ones making the decisions.
"Except in our industry". Said after "every other industry has seniors to help guide them and ensure they don't make major mistakes".
I speak perfect english, dumbass. You need to read your own words because you said seniors mentor jrs. Except in our industry. And then closed with a sentence unrelated to everything else you said, "in our industry the juniors often are the ones making the decisions", which has dick to do with mentoring, the thing everyone else had been talking about up until that last line.
In the US buildings have to adhere to legal specifications specifically to ensure that doesn't happen.
And I feel like there are people in software that complain about things like "competence elitism" when other industries encourage doing things right.
Take actual engineers, for example:
https://www.nspe.org/resources/ethics/code-ethics/engineers-...
Consider that there are varying levels of competence required for the different problems in software - for instance someone writing code for medical equipment requires a different type and level of expertise than someone writing a website for a small business.
Consider how many YouTubers and blog posts are out there giving bad advice.
Consider how easy it is to get started but also how many niches there are with differing skill sets required by each niche.
Perhaps we could implement a "bar" exam for programmers - however for which niche would it apply? How many different exams would need to be drawn up? By whom and how would this be coordinated internationally?
Does this apply to esoteric segments like Excel or jobs that rely on basic scripting like bash/powershell/SQL/Python?
Would we need to restrict people from giving advice on platforms like YouTube through a licensing system? - much like how it's illegal to give financial advice online without a license in some countries.
It would be nice but I do think that it's extremely ambitious. I struggle to see how it could be implemented inside of a decade long time frame.
For example tests that ensure that controller actions don't create SQL queries directly but instead always use repositories/services/models (whatever you call data fetching layer).
Another example is a test that ensures that there's no "print" in data fetching layer, only allowing them in HTTP controller actions.
That's the gist of it.
This phrase says it all.
But why doesn't the review process help to improve the quality?
And to a lesser extent some use Pair Programming.
Automated architecture tests helps to keep things tidy during those rushed moments.
Is there some good links to know more about it?
For C#:
1) https://github.com/TNG/ArchUnitNET
For PHP:
1) Pest testing framework demonstration: https://youtu.be/ZidLP7TqXnc?t=133
2) https://github.com/spaze/phpstan-disallowed-calls
3) https://github.com/ekino/phpstan-banned-code
4) https://packagist.org/packages/ta-tikoma/phpunit-architectur...
5) https://qossmic.github.io/deptrac/
Hope that helps.
I only agree if the person who lacks passion can actually do the job and has experience. The trouble with programming computers is that you cannot get sloppy with the implementation details or design decisions. It is absolutely not a field accessible to people who guess too much and code by coincidence.
Often those details are also overlooked at the project planning level so it's unfair to everyone else who has to pick up their slack. It's already bad enough that the people in charge usually don't understand the project very well.
Especially with AI copilots getting better, it feels like we’re headed for a point where you’re either capable of architecting complex systems, or there isn’t much software for you to write: other industries tend to have rote work for beginners while they gain skills, but in software rote work tends to get automated away. AI can help people learn faster, but given what AI has proven good at, I expect more of the gains will go to expert productivity. (or non-programmer domain experts)
Related to that idea is that, with the right definition (unconventional but not tortured), I think that more software is created in Excel than in python today and a large swath of the people making spreadsheets today for their business will be using AI copilots to make better software 20 years from now.
I did try to point out that I don't really blame normal devs but the leadership instead. A fish rots from the head. My writing skills are just not that good (yet) :)
I also used "incompetence" very broadly which was probably a mistake from writing perspective. From bad management decisions all the way to brilliant engineers simply not being familiar with a particular technology/paradigm.
But the attitude that "X that fails at 9/10 companies isn't the problem, we just need to change millions of engineers" is a naive attitude.
If you're going to make claims that micro-services are failing at 9/10 companies you really should have a source.
There are no silver bullets that can solve this. Only well-designed systems accommodate for the flexibility of human error and hubris can do that.
> I understand it’s a harsh title and at times a harsh essay. Such is life. All opinions are my own.
Some takeaways you might have missed:
* Use the right tool for the job - one-tool shops are bound to fail
* (Similar to above) There is a tendency to find _a_ solution rather than the _optimal_ solution
* The engineering halo effect is real and prominent
Then the author goes on to provide some possible solutions:
* Using the SOLID framework for building
* Use services
* KISS
* Developer experience is very important
* Protect your time and your work
* Governance is required to enforce certain principals.
I don't agree with all of these, but they are certainly worth considering.
I did find that lots of people who disliked it, mainly just got put off by the overall tone and the provocative statements from the get go. I basically blame my writing skills (and maybe personality haha). This essay lacks structure and it's more of a stream of thought (sometimes jumping all over the place and going off topic).
I'll just have to live and learn :)
It's even worse than naïve, it's a literal fallacy, a "No true Scotsman" with technology.
System resilience is important at scale, and resilience includes being resilient to the failures in the human component of development; if a system depends that every one developing it to be a master of the underlying foundation then you'll require lots of very specialised, competent people who mastered the technique. That is very costly, if microservices depend on high mastery then we should budget the cost of the talented people required to run it.
My experiences with how to successfully deploy microservices include much the opposite: giving tooling to incompetent people to avoid the worst footguns, training them in best practices over time while designing an architecture that is somewhat resilient to their inevitable failures, one that is easy to be fixed when they've learned how to best use it.
And even in those 9/10 companies, the failure doesn't even prove that the engineers are the ones unable to create meaningful service boundaries, within a monolith or distributed to multiple services. All of those engineers have bosses and, I don't know what others are seeing, but I feel like I've seen Software Development Manager increasingly become Manager of Software Developers.
I suggest that those same management structures which failed to enable their engineers to create meaningful service boundaries in their monolith, which led to the desire for a cure-all solution, also failed to manage (or protect) their developers such that those developers _could_ turn the existing system architecture into one based on microservices.
Technical leadership has just become increasingly abysmal. Developers are tasked to fulfill user stories but those are often written in a way that completely ignores the technical work required to fulfill such a story. That creates a painful disconnect between expectations and reality, even in 90% CRUD, monolith web apps. Even in a monolith with proper separation of concerns, its easy to imagine one service being the "user" of another service for the purpose of more granular and clear tasks but, "that's not how user stories work." :(
If there is an "epidemic" of anything it's hindsight criticism of engineers who made the best decisions that they could. "Incompetence" is doing a lot of leg work in this article, this is not a real specific criticism by itself. To me this a symptom of over antrhopomorphising the failures of a company and glomming them onto a theoretical goblin for which you can blame the ills on.
I believe this behavior emerges from engineers that have not participated at a decision making level in the entire software development process at many different sizes of company in many different contexts. This means a startup from zero, a large company where the marginal cost of issues is so extreme that all code is mobbed, a mid size company being bought out, being in charge of a service from ideation, to development, to maintenance and deprecatio.
They tend to spit out destructive criticism towards legacy code with such an ease and without any context on why things are the way they are.
My usual response, albeit in a more polite manner, is something along the lines of:
"Yes I know the code in this part of the system is not as nice as other parts. And if you bothered to ask why, I'd tell you it's because this code is 6 years old and we learned better ways to do the same thing since. It's called technical debt and we are always working to reduce it. There's no need to demoralize the engineers that worked on that part of the system."
Microservices adoption has largely become a cargo cult thing. It is a part of being cool like FAANG.
Instead of being cool, focus on solving your problems.
This needs repeating to every dev every week. Myself included
Unfortunately, I don't see a wealth of other ready-made practices for companies to copy when they grow and need to solve this problem. I once worked on an enormous Rails monolith that was very well organized and had layered on several additional patterns to improve modularity and maintainability. Still, a SEV in a minor product area could (and did) bring down the whole system, and they were in the process of dismantling it.
One of the troubling practices is tightly-coupled containerized services, though, which only gives us all of the problems of microservices at the same time as we have all of the problems of monoliths.
The most important person in every company is the CEO. He sets down the culture of the company and creates these incentives either directly or indirectly. The only solution to RDD is for the CEO to be tech oriented, avoid hiring people who jump companies every couple years, build a great work environment, and compensate people well.
You don't get many of those people any more, because just about every other employer has burned that bridge to the ground. People, especially the young ones who entered their careers around the 2008ff megacrisis, have zero trust left in anyone.
When companies don't care and ditch us at the first sign of problems (easy, because we were the freshest hires), why should we show any sign of loyalty in return? If you want loyalty, pay us.
I also pointed out that the problem isn't with the developers but the leadership, starting at the top. The programmers are just acting rationally in the environment they are given. The value of a programmer is exponential with time in the code, and yet, they aren't compensated for it. What they are compensated for instead is decorating their resume for their next job.
I learned almost nothing about engineering. It took me quite a while on the job to learn and appreciate the practices that result in long-lived, maintainable systems. Overly complex, fragile systems with inscrutable interdependencies using esoteric frameworks are often the product of smart people who don't understand engineering principles (yet we often call them "engineers").
I've sat next to the engineer who had to write various sort algorithms for the embedded runtime I helped design.
I've witnessed a file system get implemented from scratch.
I have walked through the Windows' kernel source code and knowing my fundamentals sure as heck helped to keep me grounded.
> (and if there aren't, that's often a big red flag that you're doing something wrong).
Or that you've chosen a career building the layers that underpin everything else.
I've found that life is more enjoyable when I understand how things work at a base level, and remembering my fundamentals opened up doors to work on cool projects.
As a fellow 1980s CS person, I too got a lot of DSA coverage, but I ended up using a respectable amount of it when I was working at low-level systems programming jobs. I have never used what I learned in my computer graphics class. But I had classmates who went into animation and used that stuff every day.
Agreed about the lack of any education about the "engineering" side of the work, though. One challenge is that engineering is mostly a group activity but education is focused on individual learning. With some exceptions, you don't get a group grades in classes, and usually, collaborating with other students on your homework or your tests is considered "cheating" rather than "teamwork." Professors aren't in the habit of repeatedly changing the assignment out from under you while you're halfway finished, but dealing well with unpredictably shifting requirements is a huge part of the job.
That would be quite interesting in terms of "real world" education. The unfortunate thing is that most terms/semesters are only a few months long and so work has to be very explicitly defined and scoped to be achievable in that time with the expectation of the student spending maybe 10 hours a week on any one class, tops.
I think it would be too real for the kids.
Coming up to speed on a large existing code base of inconsistent quality and style is another enormously important job skill, as is writing code that can be maintained by the person who has to come up to speed on your code a year later, but you'll never get those skills from writing small precisely-specified programs from scratch.
I think bootcamps try to fill that field but most of the ones I've seen are quite trivial, getting you through the basics. If you're asked to implement 10 greenfield CRUD APIs and then go to a job and have to maintain some huge monolithic repo it's going to be hard.
I think an educational approach where the curriculum involves some sort of "For this task, you have to change this thing in this codebase and deploy it without crashing the thing", "refactor this code base", giving people some sort of project and then switching it up in the middle would be valuable because it's mostly what software engineers do day to day: write tests, fix bugs, implement features in existing projects.
Yep, which is why it's the problem. You will always have incompetent people.
If you get to work on one of those codebases ... good for you. The rest of us are just trying to gatekeep piles of shit from getting in while being pushed by management to open the flood gates.
Write code and design systems so 3am you can fix them!
Sometimes not doing the right thing is the right thing to do.
> Not being smart is totally fine (I certainly am not one). We just need to avoid being stupid.
> Let’s face it, engineers, most of us aren’t smart
> most people don’t give enough shit to improve
Barely even makes sense, and is just a bunch of random opinions
The sad truth is, a smart team can do well with any architecture. A weak team will fail with any architecture. And maybe it's not really too sad.
I've seen organisations that really kick ass using microservices, and I've seen some microservices horrorshows too. The difference is having teams that are talented enough to get the benefits of any given technique and mitigate the drawbacks well. Those teams will execute any architecture to its maximum benefit.
These days everyone and their dog can become a "software engineer", unlike in other professions where the entry bar is significantly higher. Hence, you will find cabals of similarly average engineers agreeing with one another's opinions simply because it's an echo chamber.
Thanks for sharing! I usually just go with reddit and my linkedin (which barely has any network anyway haha).
Looking at ya, DHH.
And of course, it's the same thing here:
> The real problem, I think, is the lack of engineering competence and the lack of “giving a shit” in companies
OOOOH they should just hire competent people? I guess they never thought of that...