The 3-Month Rule: A Practical Approach to Non-Scalable Solutions
Beneath the well-known mantra from Paul Graham to “do things that don’t scale,” lies the challenge of effectively applying this concept in software development. During my eight-month journey building an AI podcast platform, I’ve devised a framework that has positively impacted my development process: non-scalable hacks get a strict three-month trial period. Their efficacy is tested, and based on their performance, they either evolve into more sustainable solutions or are discarded.
As engineers, we’re often conditioned to prioritize scalable solutions from the outset. We’re enticed by the allure of design patterns, microservices, and distributed systems that can support millions of users. However, this mindset often aligns more with large-scale enterprises than with startups. In the early stages, focusing on scalability can delay progress and consume valuable resources while attempting to anticipate future user bases that don’t yet exist. My three-month rule encourages me to write straightforward and, admittedly, “imperfect” code that can be deployed quickly, revealing genuine user needs in the process.
My Current Infrastructure Tactics and Their Value
1. Consolidation on One Virtual Machine
I run my database, web server, background jobs, and caching on a single virtual machine that costs just $40 a month. While this setup lacks redundancy and relies on manual backups, it’s proven to be insightful. Within two months, I gained a comprehensive understanding of my resource requirements. My assumption that an “AI-heavy” platform needed extensive resources was dispelled as I discovered it peaks at only 4GB of RAM. The intricate Kubernetes framework I nearly implemented would have been an unnecessary complexity.
2. Hardcoded Configurations
Constants like PRICE_TIER_1
, MAX_USERS
, and AI_MODEL
are spread throughout the codebase without configuration files or environment variables. While it requires redeploying for any changes, the advantage is clear: I can quickly search my entire codebase for these constants, ensuring every price alteration is tracked seamlessly in version control. In three months, I’ve only modified these values three times, illustrating that the effort to build a separate configuration service would far outweigh the minimal tweaks needed.
3. Utilizing SQLite in Production
SQLite currently serves as the backbone of my multi-user application, with the entire database size being a mere 47MB and comfortably supporting up to 50 concurrent users. This experience has taught me that my access patterns