In praise of boring backend tech
December 10th, 2023•
6 min read
For awhile now I've had the goal of making a Django Rest Framework boilerplate starter that I could quickly spin up to use as a backend, and pair with my React frontends, for various SaaS ideas. I wanted to be able to just run a few commands and have a fully featured backend that is easy to manage, easy to iterate on, secure, and built on boring, mature, battle-tested technology that makes security and maintenance a breeze.
Django, the python-powered web framework for "perfectionists with deadlines," is famous for meeting all of these production-ready requirements in an efficient and painless way, while also providing the option to override and customize any feature you need. The out-of-the-box admin UI is also a game-changer.
For these reasons, I've noticed a lot of prolific and actually successful indie developers also using mature frameworks like Django or Rails for their backends in order to quickly ship their SaaS MVPs ideas, taking them from idea to (truly) production-ready application in 2-3 weeks of relatively easy/gentle coding, instead of 2-3 months of manically hacking together whatever the NodeJS runtime backend-stack-du-jour happens to be. These coders often sacrifice multiple weekends writing custom code and queries for really basic functionalities that mature backend frameworks have built-in. And, even if they've found ways to cut down their dev time by using boilerplates etc., they're kidding themselves if they are actually convinced that what they've written as a single, indie dev is a) secure by professional standards and b) not going to be a huge timesuck/much more difficult to maintain as months go by and their massive dependency tree of npm packages inevitably leads to breakage.
If not already obvious, I'm in the camp that believes backends should be boring. I think the hype cycle of online web dev communities and twitter routinely brainswashes many young junior/intermediate developers into thinking they always need to be using the latest, shiny, bleeding-edge backend tooling, when in reality, for 95% of startups, you really don't need (or want) anything more than an old-school REST API. I also think this is what most legit, actually productive older developers already know, there's just a visibility bias where we are never going to hear much from these people because they aren't hanging out on tech twitter, gushing over how they added GraphQL and a NoSQL DB to their to-do app; they're shipping their projects and then getting on with their lives.
And an aside for the performance junkies: the boring reality is that the vast majority of opportunities most apps have to meaningfully increase their speed/performance for users (insofar as it relates to the backend) does not have to do with the benchmark speeds of different languages and frameworks; it has to do with caching—yet another thing that mature frameworks all have built-in defaults for. I'm happy for you that the response time and throughput of your async Node.js backend beats my monolithic, synchronous Django backend out of the gate, but if we're being honest, most endpoints are cache-able, at least to some extent, so I can just add a couple lines of code, and now I'm back on top again. That is until you burn at least a few hours (which really add up over time) of your life figuring out how to add Redis to your go-to Node.js backend library of the month, and then we're practically tied.
You're just naturally not going to find a lot of hype-y web influencer content in your tech feeds surrounding old frameworks like Rails and Django. This isn't because they're "dying," there's just nothing new to sell or push with these frameworks because they've already "made it." There's not a deluge of new content for Twitter thread bois (👇🧵) to put out on mature frameworks because these frameworks have already solved every generic problem there is when it comes to backend web app development, including, but not limited to:
- Database models/ORM
- Backend administration (Django's built-in admin UI 🙌)
- CRUD endpoints defaults
- Throttling & pagination
- Robust error handling and debugging
- Background tasks & task scheduling
The fact that you get these features by default is not something to be bored by, it's something to jump around and rejoice over. As developers, we already have to spend tons of time staying current on trends in both tooling and tech in general. I'm going to take any opportunity I can get to use reliable technologies that save me time—without sacrificing quality—so I can focus my bandwidth elsewhere. Life is too short. And, unless your startup is in the 3% of new startups that really do have a foundational need for cutting-edge speed or realtime features, using mature frameworks for SaaS MVP backends is simply the right move from both a technical and businesses standpoint—assuming you're actually serious about things like security, scalability, and developing additional features quickly.
Anyway, I finally made my Django backend starter, and I haven't been this excited to code and build things in a long time (by the way, I’ll be sharing much of what I build on this blog going forward, so feel free to subscribe to receive new post updates if you’re curious). I'm solidly in the React camp for frontends, but I'm burnt out on keeping up with cutting-edge backend technologies to maintain my full-stack status just because young, impressionable developers and first-time SaaS founders think that they need them. It's okay if you like playing around with cutting-edge tech as a hobby, especially if you're new to development and excited and soaking it all up like a sponge, but at this point I'd rather put my time towards my life outside of programming than keep burning the midnight oil, reinventing the wheel every time I want to make a new project. I recommend more people do the same.
And if you're daunted by the prospect of learning a new programming language in order to use more mature backend frameworks, don't be; if you're reading this, there's a good chance that if you took just 1/10th of the time that you spend troubleshooting cutting-edge tech and put it toward learning the basics (all you need) of a new language, you'd be cruising in no time. You would enjoy the learning process, too—learning the basics of mature frameworks is a breath of fresh air if you've spent the last several years fighting in the trenches of the trendy.
P.S. I want to, but I'm not going to open source my new Django Rest starter that I've mentioned above for security reasons, even though it's not exactly the most complex piece of software in the world. However, if you want to talk Django or want any help, feel free to reach out to me on twitter—and don't forget to subscribe to this blog for more tech rants and project updates.