Embracing the 3-Month Rule: A Pragmatic Approach to Non-Scalable Solutions
In the world of startups, the common wisdom often echoed by thought leaders like Paul Graham is to “do things that don’t scale.” However, the practical application of this advice, especially in the realm of coding, is rarely discussed.
After spending eight months developing my AI podcasting platform, I have crafted a straightforward guideline that I adhere to: any unscalable workaround is given a lifespan of precisely three months. At the end of this period, if a solution has demonstrated its worth, it is upgraded to a robust version; if not, it is discarded.
Why the 3-Month Rule Matters
As engineers, we are instinctively drawn to create scalable solutions right from the outset. We consider design patterns, microservices, and distributed systems—complex structures engineered to accommodate millions of users. However, this is often a later-stage thinking, particularly for startups.
In the early phases of a startup, focusing on scalable code can become an exercise in costly deferral. More often than not, you end up optimizing for potential users who aren’t even present yet, addressing challenges that may never surface. My 3-month framework compels me to write straightforward, even “imperfect” code that gets deployed swiftly, allowing me to genuinely understand user requirements.
My Current Infrastructure Strategies: Discoveries from Unconventional Choices
1. Centralized Virtual Machine Management
I currently operate everything on a single, budget-friendly virtual machine that costs just $40 per month. The database, web server, background jobs, and Redis all share this machine, which carries no redundancy and depends on manual backups.
This choice has proven advantageous. In just two months, I have gained insights about my actual resource consumption that no capacity planning spreadsheet could have provided. It turns out the needs of my “AI-intensive” platform vary significantly, with peak usage hitting only 4GB of RAM. The complex Kubernetes setup I contemplated would have involved managing resources that weren’t even necessary.
Additionally, when outages occur (and they have, twice), I glean real insights into the failure points—often revealing surprises along the way.
2. Simplistic Hardcoded Configurations
Instead of employing intricate configuration files or environment variables, I use straightforward constants within my codebase:
“`python
PRICE_TIER_1 = 9.99
PRICE_TIER_2 = 19.99
MAX_USERS