The 3-Month Rule: A Practical Approach to Non-Scalable Coding
Paul Graham’s well-known mantra, “Do things that don’t scale,” encourages entrepreneurs and developers to embrace inefficiencies in the early stages of their ventures. However, there’s a notable lack of guidance on how to apply this wisdom in the realm of coding. Through my journey of creating an AI podcast platform over the past eight months, I have established a straightforward framework: each non-scalable tactic is assigned a lifespan of exactly three months. After this period, the approach will either demonstrate its worth and be refined, or it will be discarded.
As engineers, we often feel compelled to architect scalable solutions from the outset, emphasizing design patterns, microservices, and complex frameworks capable of managing vast user bases. While this approach is fitting for larger companies, in the context of startups, endlessly focusing on scalability can lead to unnecessary delays. The reality is that we often find ourselves planning for users who don’t exist yet and addressing challenges that may not arise. My three-month rule encourages me to develop straightforward, even “imperfect,” code that can be deployed quickly, providing me with firsthand insights into actual user needs.
Current Infrastructure Hacks That Prove Effective
1. Consolidation on a Single Virtual Machine
I currently operate everything—from the database to the web server and background jobs—on a single $40/month virtual machine without redundancy or elaborate failover plans. While this approach may seem reckless, it has allowed me to accurately assess my resource requirements. In just two months, I’ve determined that my “AI-centric” platform typically requires only 4GB of RAM. The Kubernetes architecture I nearly implemented would have merely managed unused containers.
Whenever the machine crashes (which it has twice), I receive vital data on what caused the failure—often unexpected insights that help in honing my platform.
2. Simplistic Configuration Management
Instead of utilizing configuration files or environmental variables, I rely on hardcoded constants across my codebase. This approach simplifies tracking and updates—each change is easily searched, and any adjustment requires minimal redeployment time. Over the past three months, modifications have been infrequent, translating into a mere 15 minutes of deployment time rather than potentially 40 hours spent developing a sophisticated configuration service.
3. Utilizing SQLite for Production
I am leveraging SQLite for my multi-user web application, successfully managing a database size of just 47MB. This setup supports 50 concurrent users effortlessly