Embracing Imperfection: The 3-Month Rule for Non-Scalable Solutions
In the startup world, the mantra “Do things that don’t scale,” popularized by Paul Graham, is often repeated among entrepreneurs and engineers. But how do we translate this wisdom into actionable strategies in software development? After eight months of building my AI podcast platform, I’ve established a straightforward framework: every unscalable solution gets a three-month test period. Post that, it either demonstrates its value and evolves into a robust system, or it gets phased out.
The Scalable Dilemma
As engineers, we are traditionally educated to prioritize scalable architectures from the get-go—think design patterns, microservices, and distributed systems all designed to accommodate millions of users. While this mindset is essential in large enterprises, at startups, it often leads to expensive delays. Instead of aiming for hypothetical future users, my three-month rule invites me to focus on crafting straightforward, sometimes “messy,” code that actually delivers functionality. This approach provides genuine insights into the critical needs of my users.
Current Infrastructure Hacks: Smart Simplicity
Let’s dive into the practical solutions I’ve adopted and why they work effectively.
1. Single VM Deployment
My entire infrastructure—database, web server, background jobs, Redis—runs on a single $40/month virtual machine. Sure, there’s no redundancy and I manually back up data to my local drive, but here’s the upside: I’ve quickly grasped my actual resource requirements. After two months, I learned that my platform only uses about 4GB of RAM at peak. What I initially considered an elaborate Kubernetes setup ended up being an unnecessary complexity as I was simply managing underutilized resources.
2. Hardcoded Configuration
Instead of using configuration files or environment variables, I have constants like PRICE_TIER_1
and MAX_USERS
directly in the code. While some may see this as a flaw, it’s a strategic advantage for me. I can search my entire codebase for any configuration instantly, and each change is logged in my Git history. Over three months, I made three updates, which, in turn, cost me merely 15 minutes of redeploying, a stark contrast to the 40 hours it would have taken to implement a full-fledged configuration service.
3. SQLite as a Production Database
Yes, I’m utilizing SQLite for a multi-user application, and it’s holding strong at just 47MB