Embracing the 3-Month Rule: A Pragmatic Approach to Non-Scalable Solutions in Tech
In the tech world, Paul Graham’s mantra of “doing things that don’t scale” often leaves us pondering: how do you practically apply this concept in your coding journey? After spending eight months developing my AI podcast platform, I’ve crafted a straightforward framework that embodies this philosophy: every unscalable experiment receives a lifespan of three months. At the end of this period, we either validate its worth and invest in scaling it properly, or we let it go.
It’s crucial to understand that as engineers, we’re conditioned to create scalable solutions from the outset. We often think in terms of sophisticated design patterns, microservices, and distributed systems—architectures capable of supporting millions of users. However, this mindset can be counterproductive in the startup environment, where focusing on scalability may lead to unnecessary complexity and delayed progress.
By adopting the 3-month rule, I’ve learned to prioritize writing straightforward, albeit imperfect, code that generates real results and deep insights into what users genuinely require. Here’s a look at some of the unconventional infrastructure decisions I’ve made and the valuable lessons they’ve taught me.
Current Infrastructure Hacks: Discovering Value in Simplicity
1. One Virtual Machine to Rule Them All
My entire stack—database, web server, background jobs, and caching—resides on a single $40/month virtual machine. While this might seem reckless, it has provided unprecedented insights into my resource utilization. In just two months, I’ve learned that my AI-centric platform typically peaks at 4GB of RAM. The complex Kubernetes solution I had initially considered would likely have led to managing idle containers.
When my VM encounters issues (which has happened twice), I gain tangible knowledge about failure points that are often unexpected.
2. Hardcoded Configurations
Rather than relying on intricate configuration files or environment variables, I’ve opted for hardcoded constants throughout my codebase. This approach means any configuration change requires redeployment, but it allows me to rapidly locate all configuration values across files using simple search commands. In three months, I’ve modified these values just three times, saving countless engineering hours by avoiding a configuration service build.
3. Utilizing SQLite in Production
Surprisingly, I opted for SQLite to manage my multi-user web application, with my entire database weighing in at just 47MB. It has successfully managed up to 50 concurrent users effortlessly.