Embracing the 3-Month Rule: A Tactical Approach to Non-Scalable Solutions
In the world of startups, the advice from Paul Graham to “do things that don’t scale” is often cited for a good reason. Yet, when it comes to putting this philosophy into practice, especially in software development, the guidance tends to go unaddressed. After spending eight months developing my AI podcast platform, I have crafted a straightforward framework that aligns with this principle: every non-scalable approach is given a lifespan of three months. At the end of this period, we evaluate its effectiveness—transforming it into a robust solution or discontinuing it altogether.
The startup Dilemma: The Pitfalls of Premature Scalability
As software engineers, there is a strong inclination to implement scalable solutions right from the beginning. We are trained to leverage sophisticated architecture like design patterns and microservices that can handle millions of users seamlessly. However, this often leads to a mindset focused on hypothetical growth rather than immediate needs—a common trap in startup environments where scalable code can end up being an expensive form of procrastination. My three-month rule compels me to write straightforward and even imperfect code that can be deployed quickly. This enables me to glean insights on user requirements in real-time.
My Practical Hacks: Rethinking Infrastructure Choices
Let’s delve into a few of the unconventional methods I’ve employed, along with the rationales behind them:
1. Consolidation on a Single VM
Currently, my entire infrastructure operates on a single $40/month virtual machine, hosting everything from the database to background jobs. While this may seem reckless, it has imparted invaluable lessons regarding my actual resource demands in a short time frame. Rather than preemptively establishing a complex Kubernetes setup, I’ve learned that my application’s peak usage only necessitates 4GB of RAM—a stark contrast to managing myriad empty containers.
2. Simplified Configuration Management
I maintain hardcoded constants throughout my codebase, such as pricing tiers and user limits. While this approach might appear primitive, it offers the convenience of easily searching and altering values without intricate configuration management systems. The time saved here is dramatic: three changes over three months required just minutes of redeployment, while building a comprehensive configuration service would have taken a week.
3. Utilizing SQLite for Production
In a surprising move, I opted for SQLite to power my multi-user web application. My database, a mere 47MB, manages up to