The 3-Month Rule: A Practical Approach to Unscalable Solutions in Software Development
In the world of startups, where agility and rapid iteration are paramount, finding the right balance between scalability and practicality can be a challenge. Paul Graham famously advised entrepreneurs to “do things that don’t scale,” yet how do you effectively apply this principle in the realm of coding and software deployment? After eight months of developing my AI podcast platform, I discovered a simple yet powerful approach: implement a strict 3-month time frame for each unscalable hack. By the end of this period, every solution must either prove its worth and be expanded upon or be abandoned entirely.
As software engineers, we often feel compelled to design for scale from the outset. We’re trained to build complex systems using microservices, distributed databases, and various architectural patterns that can accommodate millions of users. However, in the startup phase, aiming for scalability can lead to unnecessary investment—particularly when the users we’re optimizing for aren’t even on our radar yet. My 3-month rule encourages the creation of straightforward, rudimentary code that not only gets deployed but also provides insights into what users genuinely require.
Current Infrastructure Hacks: Clever Simplicity
1. Unified VM Approach
I currently run my entire infrastructure—a database, web server, background jobs, and caching—all on a single virtual machine costing just $40 per month. This choice might sound reckless with zero redundancy and manual backups, but it has led to significant insights. Within just two months, I learned more about my actual resource usage than I could have from intricate capacity planning documents. My initial idea of a complex Kubernetes setup would have involved managing superfluous resources. Instead, when outages occurred, I gathered invaluable data about the nature of system failures—often surprising me with what exactly broke.
2. Hardcoded Configuration
Constants scattered throughout my codebase dictate variables such as pricing and user limits. Although it may seem inconvenient, this approach allows me to search through the entire code for any values in seconds, with every change being thoroughly tracked in version history. Reconstructing a configuration service might take a week, yet the actual adjustments I’ve made in three months required only 15 minutes of redeployment.
3. Utilizing SQLite in Production
Surprisingly, I’ve opted for SQLite for a multi-user application, storing just 47MB of total database size. This choice has allowed me to handle up to 50 concurrent users effortlessly