Embracing the 3-Month Rule: A Framework for Non-Scalable Solutions
In the entrepreneurial tech landscape, the well-known mantra from Paul Graham, “Do things that don’t scale,” often echoes in the ears of aspiring innovators. Yet, how does one bring this wisdom to life in a practical coding context?
After eight months of developing my AI podcast platform, I’ve crafted a straightforward strategy: every unoptimized hack I implement is given a lifespan of exactly three months. After this period, the solution must either demonstrate its worth and transition into a fully developed feature, or it will be retired.
As engineers, we tend to focus on scalable solutions right from the outset. We think of elegant architectures, microservices, and distributed systems—all designed to accommodate vast user bases. However, such an approach often reflects the mindset of large corporations rather than startups.
In a startup environment, building scalable code can sometimes translate to costly indecision. We frequently find ourselves enhancing systems for hypothetical users while overlooking the immediate demands in front of us. My 3-month rule encourages me to write straightforward, sometimes “imperfect”, code that actually gets deployed and reveals genuine user needs.
Current Infrastructure Hacks: Why They Work
1. Consolidated Operations on a Single Virtual Machine
I run my database, web server, background jobs, and Redis on a single virtual machine costing just $40 a month. Though it lacks redundancy and relies on manual backups to my local machine, this setup is revealing invaluable insights.
In just two months, I’ve grasped my genuine resource requirements more effectively than any extensive capacity planning document could have provided. For instance, my AI-centric platform only peaks at 4GB of RAM. The sophisticated Kubernetes architecture I nearly adopted would have only served to manage idle containers.
When the system crashes—an event that has happened twice—I receive concrete data about the actual failure reasons, which are consistently surprising.
2. Hardcoded Configuration
Currently, configuration values such as pricing tiers and user limits are hardcoded into my files, requiring a redeployment for any change.
This may seem inefficient, but it carries a significant advantage: I can swiftly search my entire codebase for any configuration value and keep track of updates through git history. Since I’ve made only three changes in three months, this method has saved me countless hours of engineering.
3. Using SQLite in Production
Despite running SQLite for a multi-user web application, my database is a mere