If I received $1 each time I expressed frustration with the modern web development experience, I could buy two pizzas and a coffee.
To give a bit of context, I have about four years of experience as a web developer and have worked on developing and shipping full-stack web applications both as a hobby and professionally. Some of these applications have over 30K lines of code and a few under 2K lines. Some have thousands of users, others just a few hundred.
This post is a rant about what I’ve disliked about my experience developing some of these applications.
Before we get there, I think it’s worth noting that I’m still involved in some web development projects and will continue to be because I love developing web applications. Reasons below.
I can ship however and whenever I want
My most significant selling point in web development is that I could quickly develop an application in my bedroom, type a few commands in my terminal, and voila! It’s on the web, and anyone can open and use it. I don’t have to deal with the obscure verification processes of Apple or Google to have my application used by people.
Additionally, updates are frictionless for me and those using what I build. Oh, there’s a bug? Easy! I fixed it on my side, pushed my changes, and the update is live. If I need to add a new feature, same thing, and the next time they open the app, it’s already there. The user isn’t even aware that I’ve made some changes (unless they’re visual); they keep using the app.
Contrast that with a mobile application: I would have to push the updates to Google/Apple and wait for them to verify them before they move it to their store. More importantly, the user has to be notified there’s an update or go to their app store themselves and click “Update” before they get the fix or new feature I’ve pushed.
It’s everywhere
The other thing I like about web dev is that the app I build now can potentially run on your overpowered M4 Max MacBook Pro or the 2GB Android potato someone far, far away is holding in their hands. I also don’t have to pull my hair out over supporting Android 4.1 SDK and Android 12 at the same time (which usually results in overly complicated build processes and a large codebase filled with edge cases).
Moreover, the application is going to run just as well 10 years from now (now that also depends on what direction you take in development, but this is generally true; we can still run web apps from 2012 now)
The bar is low
I could write a web app on my phone or on a 2GB HP Notebook without struggling, as long as we keep the fundamental trio of HTML, CSS, and JavaScript.
Things break down when we introduce “modern” technologies like React.
It’s nearly impossible to develop a reasonably large web dev project on a low-end computer
Before moving to Mac, I drove a 4GB RAM HP Notebook daily. I was all-in into web development; I developed web applications from morning to evening. As the projects I was working on grew, I began to notice that I was reaching the limits of my low-end laptop. I did everything I could think of to make my experience better. I uninstalled Windows and switched to an Arch-based Linux distribution (Manjaro, yeah, I was your Linux boy :D); I was writing code using Vim in my terminal, no GUI-based text editors like vscode because it was too slow. I maxed out my swap memory and did all sorts of configurations I could think of. Yet, changing the large codebase I was working on at my part-time job could take up to 20 seconds to finish an incremental build, just for my laptop to then freeze.
Sometimes, I’m working on a project, and I’m in a file with over 1000 lines I’ve been editing since morning; then, for some reason, my laptop crashes, and when I reboot, the file is empty. It was an awful experience. In worst cases, my laptop would overheat and shock me (if I had my headphones on) before crashing.
I recall performing a major migration to the project’s codebase at work just to save a few more CPU cycles and have a better experience.
Sadly, those weren’t enough. In my fourth month, I quit my part-time position to focus on other important things for myself and recharge because the stress was taking a toll on me.
I eventually moved to an Apple Silicon MacBook, which was a big jump in terms of experience. I don’t have any of these issues anymore, but I still think the experience developing these web applications could be better.
Huge dependencies
There’s this meme going around comparing the
node_modules
folder to a black hole. It’s both funny and sad at the same
time. Running the
du -h node_modules
command on some
projects on my laptop gives me these.
[REDACTED_NAME] size: 573MB
[REDACTED_NAME] size: 416MB
[REDACTED_NAME] size: 203MB
(Name redacted because these are either private projects or I don’t feel comfortable disclosing which one)
That’s just the size of the dependencies folder, not counting the actual source code in the project. I find myself regularly purging projects out of my computer to free up some space (I have just 256GB of storage). One could argue that I should have just bought more storage, but Apple is being unreasonably selfish with storage upgrades, and that is beside the point. These projects have very deep dependency graphs that intertwine.
Things break sometimes, and it’s not clear why
I’ve started a few side projects only to abandon them later because of obscure errors with no clear fixes. The very nature of the way dependencies are put in these node projects makes it easy for conflicts to occur. Sometimes, I find myself forcefully upgrading packages in a project to fix a security vulnerability.
I recall having to dig and read into the source code of one of a project’s dependencies just to understand it enough to fix another higher-level problem. It’s frustrating.
I happen to be someone who likes to have a deep or first-principles understanding (or just the right mental model) of what I’m working on. Without that, I get easily frustrated when everything looks like a black box, and I have to make a change, cross my fingers, and pray it works.
But when a project has more lines of code than there are lines in every single book in your home, phone and laptop combined, it’s just mad even to try to dig into it. The behaviour of the language also sometimes leads to horrific code. There’s a repository of some of its quirks here.
I wouldn’t be surprised if someone got PTSD working like this. ## I still do web development, but closer to the fundamentals The bad experiences I’ve had are mostly with using technologies like Next.js and React, among others. To be fair, these are great technologies that make the life of a developer working on a large project easier. However, I don’t think one should use any of these if you’re just making a basic website or app. Using a templating engine like Jinja or Pug or what have you will do just fine.
Let me be clear: I do not intend to shame those involved in developing these technologies. Heck, I wouldn’t be where I am today without them. They’re much, much smarter than I am.
However, it’s no excuse for the experience of using these tools to be so frustrating sometimes. Fortunately, projects like Next.js have been working towards much better error messages, and Vercel has been developing a faster compiler/transpiler for your projects.
I think there’s a value factor as to why there’s so much cruft here. While it’s essential to get things done, we need to consider a bit more as engineers and not fear getting our hands dirty. Like Alex Russell puts it: Frameworkism isn’t delivering. The answer isn’t a different tool; it’s the courage to do engineering..
I’m still involved in projects that use technologies like those described above, but I’m using tools that allow me to use more basic HTML, CSS, and JS to get things done quickly. It’s a breath of fresh air to go back to simplicity.
Closing
Besides web development, I’ve been doing systems programming and embedded development. These are hard and can be frustrating, too. I guess we never run out of that. I just love having a bit more granular control over the execution of my program, and it’s fun. I can also benefit from writing highly optimized code that I can ship to the browser through WebAssembly, which is great.
This is purely my personal experience, and this article is also a rant. I hope this does not discourage you from pursuing a particular field of Computer Science if you’re interested. Hopefully, it helps you approach it with an idea of what you could expect. There’s so much bad stuff, but there are just as many good things there. The barrier to entry is low as well, which makes it a good starting point for newbies.