Embracing the 3-Month Rule: A Pragmatic Approach to Non-Scalable Solutions in Engineering
In the startup world, the idea of doing things that don’t scale—a principle famously advocated by Paul Graham—often feels crucial yet challenging to implement, especially in the realm of coding. Over the past eight months while developing my AI podcast platform, I have formulated a straightforward but effective framework that I like to call the “3-Month Rule.” This rule posits that any unscalable solution is granted a temporary lifespan of just three months to either demonstrate its worth and evolve into a robust system or be discarded altogether.
The Scalable Dilemma
As engineers, our instinct is to create scalable solutions right from the outset. We often focus on elegant design patterns, microservices, and distributed architectures capable of supporting millions of users. While such methodologies are essential in larger organizations, they may become unnecessary overhead for startups where the demand is not yet established.
In a startup setting, pursuing scalability from the get-go can turn into an exercise in expensive procrastination. It compels us to design for potential users who may never materialize, prompting us to tackle issues that may never be relevant. My 3-Month Rule helps me remain grounded, encouraging me to develop straightforward, even “imperfect,” code that gets deployed quickly, allowing me to discover the real needs of my users.
Current Infrastructure Hacks: The Smart Choices
1. Single-VM Deployment
My current setup operates entirely on one virtual machine, which handles everything from the database and web server to background jobs and caching. For just $40 a month, this consolidated approach has taught me more about my resource usage in two months than any capacity planning document could achieve. Surprisingly, my platform only requires about 4GB of RAM at peak usage. Initially, I had considered implementing a complex Kubernetes setup, but that would have meant managing resources likely to remain underused.
When the system crashes (which it has a couple of times), I gain direct insights into what went wrong—data that’s far more informative than my initial assumptions suggested.
2. Hardcoded Configurations
Instead of utilizing config files or environment variables, my codebase contains hardcoded constants for everything, from pricing tiers to user limits. This setup may seem primitive, but it allows me to quickly search my entire codebase for any configuration value. Each change I make is trivial in terms of redeployment time—just