The 3-Month Rule: A Practical Approach to Unscalable Solutions
In the tech world, one adage that resonates across discussions is Paul Graham’s classic advice: “Do things that don’t scale.” While this principle is often cited, the practical application of it in software development is rarely explored. After eight months of building my AI podcast platform, I have formulated a unique approach—what I call the 3-Month Rule. This framework assigns each unscalable hack a lifespan of three months, after which the hacks either prove their worth through real use cases or are sunsetted.
Rethinking Scalability in Startups
As developers, we are conditioned to develop scalable solutions from our first line of code. We envision intricate architectures—microservices, distributed systems, and other complex solutions meant to accommodate millions of users. However, this kind of thinking often belongs to larger corporations, where the luxury of time and resources allows for such elaborate infrastructures. In a startup environment, optimal scalability can often translate into costly delays. We find ourselves optimizing for users that do not yet exist while potentially missing the immediate needs of our actual users.
My 3-Month Rule encourages me to write straightforward, albeit imperfect, code that can be deployed promptly. This approach not only accelerates learning but also sheds light on user requirements in a genuine manner.
Current Infrastructure Decisions and Their Rationale
1. Consolidating Resources on One VM
My entire setup—database, web server, background processes, and caching—resides on a single $40-per-month virtual machine without redundancy. Manual backups are performed to my local machine.
This arrangement has proven insightful. Within just two months, I’ve gained a clearer understanding of my resource consumption than any theoretical planning document could have provided. It turns out my AI-focused application peaks at just 4GB of RAM. The intricate Kubernetes architecture I almost implemented? It would have merely managed empty resources.
When crashes occur (which they’ve done twice so far), I gather real data regarding failure points—unlike what I originally anticipated.
2. Hardcoded Configurations
Features like pricing tiers and user limits are embedded directly into my code, eliminating complicated configuration files or environment variables.
This seemingly simplistic approach offers surprising benefits. I can quickly search my codebase for any configuration parameter, and every modification is documented in Git history. I’ve changed these values just three times over the past three months, which translates into a mere 15 minutes of redeployment