I've been working in web development coding mostly in PHP / Laravel since 2008. I enjoyed my time at the beginning when everything was procedural code and things started changing (for the better).
At the digital agency I worked at, we moved to frameworks like Laravel and the frontend side of things was pretty static with custom CSS and some custom Javascript. Everything was hosted on a big dedicated server that would eventually become a VPS per client. The web was really simple then but understandly so were users' expectations of what the web could do and so there wasn't this mismatch that I feel I'm finding now.
Fast forward to today and I'm doing primarily product development for early stage startups.
CSS is a problem that is solved with Tailwind (for me at least anyway, I know it's a contentious topic).
Backend is a problem solved with Laravel which truly does provide everything I've ever needed and in cases where it hasn't (for compute heavy services), I've pulled those areas out into a mini Go service and whacked it on a separate server.
Javascript is just a problem...
Anecdote 1: I've worked at startups that had Laravel Monoliths where they tried to decouple it into microservices of their own, but this failed; it introduced so much complexity, mental concentration overhead of switching between code-bases and reduced developer autonomy: unless you knew how to deploy these new things and how code libraries should be shared amongst the new services you might as well pack up your toys and go home; you're not smart enough for this. Anyway, the services were bought back into the main repository because it was getting out-of-hand and frustrating to work with.
Anecdote 2: I recently deployed a Laravel app for a startup on an EC2 server. It worked great. I used Laravel Forge to do it and it took me half a day at most (once the dependancies I needed in PHP extensions were sorted). The startup wanted to move to Docker and have a CI / CD system. Previously I could just push changes to `master` and it would deploy using Forge. I watched as a CI / CD system was built that when production moved to it, it kept falling over and not really working very well. Additionally my autonomy to fix things was then taken away because there are layers or technologies stacks some of which I know but some of which I don't in the way. The whole thing became so frustrating to see. What was a perfectly working server that took me half a day to setup has now taken over 3 - 4 engineers full time work to end up with something that gives 0 benefit (except the idea that the server can never die, but that doesn't seem to be the case because it kept dying on any deployment and ended up with more downtime than the EC2 server ever had).
So why are companies with technology stacks that really arne't getting huge amounts of traffic or require huge amounts of complexity, choosing to use microservices based architectures or build their entire application in something like next.js which requires wiring together so much stuff (Prisma, Auth0) etc. Why do we introduce so much complexity that needn't be to this entire thing?
At some point, even though my speed of delivery with my framework and stack setup is frankly very fast and I can provide real value to people, it seems the perceived value of the above shennanigans is greater than the value of actually shipping stuff that matters if you look at the job boards, technologies used and pay given. I would love to be Bilbo Baggins in The Shire minding his own business, but I worry that if I don't jump on the bandwagon of overengineering everything to make myself feel smart then I'll quickly become irellevant in the job market. Am I completely missing the point of why these things are being done or is modern web development choices with regards to language and architecture just certifiably insane?
After grasping HTML and CSS basics, prototyping my heavily interactive tool seemed impossible with JS alone, until I learned React. React solved real problems for me. Create-react-app with a firebase backend got me VERY far with zero formal education.
But I struggled with SEO, load times, and needed a sprinkle of server-side logic. Next.js solved those problems, and more.
As my prototypes grew into products, complexity was hard to manage. Refactors were impossible, even with small, modular components and well tested functions. Enter TypeScript. The single most important tool in my toolbelt. I refuse to work in plain JS now.
I'm several years in now, at my 2nd full-time dev gig and working on my 3rd side-business. My stack is Typescript, Next, vercel, firebase. Both at work and at home. Hardly any third-party dependencies needed beyond these (stripe, coingate, mapbox). I write most my CSS by hand with css grid because its the least verbose way I've found so far. I auto-format with Prettier.
I can use types and tests across my stack, I can enforce bespoke auth/permissions behavior, all kinds of queries, media upload, pretty much everything I'll ever need outside of real-time collaboration. I can build and maintain profitable products by myself. I've done it.
This also happens to be a very popular stack. What's insane about it? Every alternative I've looked at looks way less sane. Multiple languages and repos for one app? No thanks. Managing server instances and databases migrations myself? I hope I never have to. Software is fun, but I like making products more. JavaScript just happens to be the best way I've found so far.