The 3-Month Framework: A Pragmatic Approach to Non-Scalable Solutions in Development
In the realm of tech startups, the popular phrase from Paul Graham—“Do things that don’t scale”—is frequently accepted wisdom. However, the intricacies of implementing this advice in a coding context are rarely discussed. As I continue to develop my AI podcast platform, I’ve established a pragmatic approach that I like to call the 3-Month Framework. This method involves assigning each unscalable solution a lifespan of three months to either prove its worth and evolve into a scalable solution or be discarded.
Rethinking the Approach to Scalability
As engineers, we often focus on building scalable solutions from the outset, employing design patterns and distributed systems meant to handle massive user bases. While this strategy is beneficial for larger organizations, for startups, it can lead to unnecessary complexities and expenses. My 3-Month Framework encourages me to adopt a simpler, more agile coding style that focuses on shipping features quickly and gathering real user feedback. Here are some of the unconventional infrastructure choices I’ve made:
1. Consolidated Infrastructure on a Single VM
Currently, my database, web server, and background jobs all operate on a singular VM that costs merely $40 per month. While it lacks redundancy and requires manual backups, I’ve gained invaluable insights into my resource utilization. In just two months, I’ve discovered that my platform’s peak usage is a modest 4GB of RAM. This is in stark contrast to the complex Kubernetes setup I initially considered, which would have been managing resources that weren’t being utilized.
2. Simplified Configuration Management
Instead of using separate configuration files or environment variables, I utilize hardcoded constants throughout my codebase, such as pricing tiers and user limits. Changes require redeployment, but this simplicity allows for rapid discovery of configuration values across my entire project. Since deploying a comprehensive configuration service would have consumed a week of development time, I’m ahead by simply making quick adjustments as needed.
3. Utilizing SQLite in a Multi-User Environment
Surprisingly, SQLite serves as the backbone of my multi-user web application, managing a database size of just 47MB. It thrives under load, easily supporting up to 50 concurrent users. Through this setup, I’ve learned that my access patterns lean heavily towards reads rather than writes, which aligns perfectly with SQLite’s capabilities. Had I chosen a more robust solution like PostgreSQL prematurely, I would have