The 3-Month Rule: A Practical Approach to Implementing Non-Scalable Solutions
In the world of startups and software development, many of us have encountered Paul Graham’s famous mantra: “Do things that don’t scale.” However, the challenge often lies in translating this philosophy into actionable steps, especially in coding practices.
After eight months of developing my AI podcast platform, I’ve crafted a straightforward framework to navigate this concept: each unscalable solution I implement is granted precisely three months to demonstrate its worth. By the end of this period, it must either prove its utility and receive appropriate enhancements, or it will be discarded.
The Engineering Dilemma
As engineers, we’re often conditioned to create scalable solutions from the outset. We immerse ourselves in sophisticated architectures—microservices, distributed systems, and other scalable design patterns—without considering whether these solutions are relevant at our current stage. In the startup ecosystem, striving for scalability too soon can result in inefficient use of time and resources, focusing on theoretical users rather than real ones.
Thus, my 3-month rule compels me to adopt a different approach. I focus on crafting straightforward, albeit “imperfect,” code that delivers results and reveals what users genuinely need.
Practical Hacks and Their Merits
1. All-in-One VM Deployment
Currently, I’m running my entire infrastructure—database, web server, background jobs, and Redis—on a single $40/month virtual machine. While this setup lacks redundancy and relies on manual backups, it has yielded invaluable insights.
In just two months, I’ve gained a clear understanding of my resource requirements, debunking the need for an elaborate Kubernetes setup that would have been managing empty resources. The crashes I’ve experienced have provided real-world data that highlight unexpected failure points—lessons I couldn’t have gleaned through theoretical planning.
2. Directly Hardcoded Configurations
Many developers advocate for configuration files and environment variables, but my approach involves directly hardcoding important values throughout my codebase. This may seem suboptimal; however, the benefits are considerable: I can swiftly search for any configuration using simple tools, track changes easily through version history, and quickly redeploy as needed.
Creating a dedicated configuration service would have consumed a week’s worth of development time. Instead, I’ve made minimal configuration changes—just three over three months—allowing me to streamline my efforts significantly.
3. Utilizing SQLite in a Multi-User Environment
It may seem unconventional