Embracing Unscalable Solutions: The 3-Month Rule for Tech Startups
In the world of startups, the advice from Paul Graham to “do things that don’t scale” resonates deeply, yet the practical application of this concept in the tech realm often goes unaddressed. Having spent the past eight months developing my AI podcasting platform, I’ve cultivated a simple yet effective framework that I call the “3-Month Rule.” This strategy allows each unscalable hack I implement a lifespan of just three months—at which point, it either proves its worth and gets refined, or it gets retired.
The Challenge of Scalability
As engineers, we often approach problem-solving with a mindset aimed at scalability from the outset. We delve into design patterns, microservices, and distributed architectures, envisioning systems capable of handling millions of users. However, this approach can be misguided in a startup context where resources are limited, and the vast majority of your potential user base is still a fantasy.
In the early stages of a project, prioritizing scalable solutions can turn into an expensive form of procrastination. By sticking with my 3-Month Rule, I force myself to focus on straightforward and efficient solutions—essentially “bad” code—that enables me to ship my product quickly and learn from real user interactions.
My Practical Infrastructure Hacks
Here’s a closer look at some unconventional decisions I’ve made during this phase, and the valuable lessons they’ve imparted.
1. Consolidation on One Virtual Machine
I’ve opted to run everything—from the database to background jobs—on a single Virtual Machine (VM) costing just $40 per month. This setup, devoid of redundancy and reliant on manual backups, has surprisingly been beneficial.
By concentrating my resources, I’ve gained insights about my actual usage requirements that far surpass what a capacity planning document could provide. For instance, I learned that my “AI-heavy” platform peaks at about 4GB of RAM, leading me to realize that the complex Kubernetes solution I considered would have merely been managing idle components.
When the system has crashed—twice so far—I collected invaluable data about the failure modes, which have consistently surprised me.
2. Hardcoded Configuration
Here, variables like pricing and user limits are hardcoded directly into the codebase. While it may seem limiting to avoid using configuration files, I can quickly search my entire codebase for any configuration value. Each price adjustment is tracked in