Embracing the 3-Month Rule: A Strategic Approach to Non-Scalable Solutions
In the world of startups and innovative projects, the wisdom of Paul Graham’s mantra, “Do things that don’t scale,” is often echoed. However, translating this concept into actionable strategies, especially in coding, tends to be overlooked. After eight months of developing my AI podcast platform, I’ve crafted a straightforward framework that I call the “3-Month Rule.” This principle allows any non-scalable hack a trial period of three months, after which it either proves its worth through successful implementation or is phased out.
The Essence of Non-Scalable Solutions
As engineers, we are conditioned to pursue scalable architectures from the outset, focusing on sophisticated design patterns, microservices, and distributed systems—essentially, structures intended to support millions of users. However, in a startup environment, striving for scalability can often lead to ineffective procrastination. Instead of focusing on hypothetical future challenges, my 3-Month Rule compels me to write simpler, more straightforward code that emphasizes immediate deployment, helping to clarify what my actual users truly need.
Insightful Infrastructure Choices
Here are some initially unrefined yet effective infrastructure decisions that illustrate my philosophy:
1. Consolidating on a Single VM
Currently, my database, web server, background jobs, and caching run on a modest single $40-per-month virtual machine, which lacks redundancy. While this may sound risky, it has afforded me invaluable insights into my resource requirements. Within just two months, I learned that my “AI-heavy” platform generally requires only 4GB of RAM. The intricate Kubernetes architecture I once considered would have ended up managing mostly dormant resources. Each crash provides crucial data about system weaknesses—often in areas I didn’t anticipate.
2. Using Hardcoded Configurations
Instead of employing configuration files or environment variables, I’ve opted for hardcoded constants throughout my codebase. This approach, while seemingly outdated, allows me to track changes swiftly via Git and ensures that my configuration updates are always effectively reviewed, even if it’s just by me. In three months, I’ve made a handful of changes, proving that a complex configuration service would be an unnecessary investment of time.
3. Employing SQLite in Production
Running SQLite as my database for a multi-user web application has proven surprisingly effective. With a mere 47MB database capable of handling 50 concurrent users seamlessly, I’ve learned that my usage is