Embracing the 3-Month Rule: A Pragmatic Approach to Unscalable Solutions in Software Development
In the realm of startups and software development, one piece of advice resonates across discussions: “Do things that don’t scale.” While Paul Graham’s wisdom is widely acknowledged, the practical application of this concept—particularly in coding—often remains underexplored.
After eight months of developing my AI podcast platform, I’ve crafted a straightforward framework that I call the “3-Month Rule.” Under this guideline, each unscalable solution receives a trial period of three months. At the end of this time, it must either prove its worth and be refined into a robust solution, or face the axe.
The Problem with Scalability at Startups
As engineers, we are conditioned to prioritize scalable solutions from the outset. Concepts like microservices, distributed systems, and intricate architectural designs are all geared toward accommodating vast user bases. However, in the environment of a startup, focusing on scalability can often lead to unnecessary complexities and hinder timely progress.
With the 3-Month Rule, I challenge myself to create straightforward, if not “inefficient,” code that delivers tangible results while allowing me to understand my users’ actual needs.
My Infrastructure Hacks: Simplified Choices with Big Impacts
Here’s a look at the unconventional infrastructure choices I’ve implemented and the insights they’ve afforded me:
1. Unified Virtual Machine Environment
Running my database, web server, background jobs, and caching on a single $40/month virtual machine may seem ill-advised. Yet, this singular approach has provided me with invaluable insights into my resource requirements. For instance, my AI-driven platform operates with only 4GB of RAM during peak usage. This scenario has reinforced the notion that extravagant setups, like Kubernetes, could lead to managing more complexity than necessary.
2. Hardcoded Configuration throughout the Codebase
With key parameters like subscription prices and user thresholds hardcoded directly into the files, I eliminate configuration files and environment variables. Yes, this means redeploying for any changes, but it comes with a surprising advantage: easy tracking through git history and rapid searches across my codebase. Since my configurations have only changed three times in three months, this approach vastly reduces overhead compared to investing significant time in a separate configuration service.
3. SQLite for Production
Running SQLite to support my multi-user application might raise eyebrows, yet my experience shows it handles concurrent users effortlessly,