Embracing the 3-Month Rule: A Practical Approach to Unscalable Solutions
When it comes to startup advice, few principles resonate as strongly as Paul Graham’s directive to “do things that don’t scale.” Yet, the application of this philosophy, particularly in coding, often remains unexplored. Over the past eight months, while building my AI podcast platform, I devised a pragmatic framework: any unscalable hack is given a three-month lifespan. After this period, it must either demonstrate its effectiveness and be refined or be phased out.
Typically, as engineers, we are conditioned to think on a grand scale from the outset—crafting intricate designs, microservice architectures, and distributed systems that can support millions of users. However, this mindset often aligns more closely with larger organizations than startups, where investing in scalability prematurely can amount to costly delay tactics.
Through my three-month approach, I intentionally prioritize quick, albeit rudimentary, coding solutions that yield valuable insights into user needs. Below are some ongoing hacks in my infrastructure that may seem reckless, but are actually strategic in their own right.
1. Consolidation on a Single VM
Currently, my entire system—database, web server, and background jobs—operates on a single $40 monthly Virtual Machine. While this design lacks redundancy and relies on manual backups, it has provided invaluable data. Over a two-month period, I gained a concrete understanding of my resource demands, revealing that my platform requires a maximum of just 4GB of RAM during peak usage. The more complex Kubernetes setup I initially considered would likely have squandered resources managing idle containers.
When the system fails (and it has twice so far), I gather actual insights into what caused the crash, which is often unexpected.
2. Hardcoded Configuration Values
My configuration is currently hardcoded throughout my codebase—constants specify pricing tiers and user limits. While this may seem maladaptive, the simplicity offers a unique advantage: I can swiftly search my codebase for configuration values. Any changes I make are captured through Git history and subject to my self-review, ensuring a streamlined process that is vastly more efficient than developing a dedicated configuration service.
In three months, I’ve altered these values only three times, which took a mere 15 minutes to redeploy—a stark contrast to the potential 40 hours of engineering work.
3. Utilizing SQLite for Production
Yes, SQLite serves as my database for a multi-user web application and surprisingly