Every year, there's something new to learn and play with in the web development world that's considered something you must use: React, Vue, GraphQL, Docker, whatever it might be. And, every year I mess around with these new things and find myself stuck, regretting even trying to use them when I could have just launched something.
The obsession with finding better frameworks is killing ideas before they reach the world, and nobody's really talking about it.
Modern web, dependency hell
In 2018, I spent most of my time tinkering with new ideas and trying to launch a handful of web-based products. I went public with reCharged in early 2018, and toward the end of the year I launched Write Together—both based on PHP frameworks with templating engines—but in the middle I found myself lost in a sea of frameworks, never really shipping anything, starting over and over again.
Perhaps it was reading too much Hacker News, or simply seeing these famous developers from Facebook and Google using it... but I wanted the latest and greatest in web technology, or at least something that felt more 'modern.'
So, I experimented with the ones that seemed relevant: I tried Vue, React, GraphQL, Docker, and so many more different tools. Instead of becoming more productive, I ended up in an endless learning loop paired with dependency hell, rebuilding logic that's been provided for free in more mature language for years.
What I've come to realize over the last few months is that your first version of your idea almost always doesn't need that hipster web framework you're thinking about using.
If you're building a new idea, you want to get it to market as fast as you can, so the absolute best thing you can do is ignore all of these new fads, frameworks, and fancy patterns—instead just using whatever works to ship a first cut.
Every time I start a new side-project or product, I find myself pulled in by the allure of the shiny new tools only to end up spinning my wheels. I'll get tangled in some gotcha, or required other thing like VueX, Apollo, GraphQL, or whatever else, getting nothing in particular done outside but fighting the tool and the array of packages that come with it.
This has always been the case on the web, but I don't remember it ever feeling this awful. Usually I'd start a new project by scaffolding out a blank Laravel template or a new Rails site and building out with the included templating language, but in the development community that seems to be considered incredibly old-school.
But, when I started on my work to rebuild reCharged into an 'app' rather than a custom-rolled solution, it felt like I was missing out on something by not building an all-React app or going head-first into a Vue SPA, so I'd try the 'modern' way.
Essentially, I wanted to build a 'productized' version of the tooling I had already created for myself. It allows creators to easily spin up a subscription newsletter or community with their own Stripe accounts—I had proved the model was interesting with reCharged, and wanted to help others do the same.
Not wanting to bet on the wrong horse, I chose Vue as my framework of choice, as a single-page app. I went away and built a RESTful back-end, with a Vue SPA that made it all seem snappy and futuristic... but it's unbelievable how complicated it was to get to a point where I could put a MVP into the world.
Passing data back and forth between the backend and my SPA was a recurring hellscape. Basic routing became an exercise in futility, duplicating the logic needed to render a single view into insanity. I spent more time trying to figure out how to properly deal with state than actually building my app. Ever tried to do server-side rendering if you're using anything other than Node? Good luck.
I don't even think I really needed a SPA. The site was fast, when it worked, but it was just a bunch of pages of content. I probably picked the wrong thing, but it seemed like everyone was doing it, and there were a bunch of reasons not to build the old way.
Since then, I've discovered how many others have felt similarly, overwhelmed by the choices we have as modern developers, always feeling like there's something we should be doing better. The web is incredible these days, but I'm not sure every app needs to be a React-based single-page application, because the complexity is so great in a product's infancy.
These SPA tools are incredible, and fun to use, but unless you're a crack team of developers, have a bunch of financing to blow, or just time to spare, it's really difficult to maintain them without scale.
Almost always, I'm finding that the tightly-coupled back-ends that ship with a templating language, like Laravel (which is a delight, by the way) or Ruby on Rails, have put so much thought into the tooling experience that they get out of the way—generate a controller at the command line and pass some data into a view, that's it.
I've gone back to the tried and true ways of building my own products, for now. I still use Vue, but instead of introducing the complexity a SPA, I'm building with single-file components. Write Together renders Vue's bits inside the Blade template, which loads fast while delivering the flexibility of things like Vue's great event system.
It's a compromise, but one that almost always seems to be better; I'm able to deliver the benefits of Vue without the witchcraft involved in full server-side rendering of a SPA, or the complexity of adding a routing and state management layer.
But, this has all made me wonder: has the modern stack killed experimentation, and shipping bad ideas? Do weird experiments and fun ideas die on the floor, tangled in complexity, more often now? I'd hazard a guess that the answer is yes, and that you should probably skip that hipster framework—for now—as well. Just ship something instead.