Embracing the 3-Month Rule: A Practical Approach to Unscalable Solutions
In the world of startups, the advice from Paul Graham, “Do things that don’t scale,” is well-known yet often overlooked in terms of practical application, especially in the realm of software development. After eight months of tackling the challenges of building an AI podcast platform, I’ve crafted a straightforward methodology: each unscalable hack I implement is given a three-month trial period. After this timeframe, I assess whether the approach warrants further development or should be abandoned altogether.
As engineers, we frequently find ourselves conditioned to prioritize scalable solutions from the outset. We dive into intricate architectures involving design patterns, microservices, and distributed systems, all designed with the expectation of supporting millions of users. However, this mindset often proves counterproductive in the startup ecosystem, where a focus on scalability can lead to costly delays and unnecessary complexities. My three-month rule encourages me to utilize straightforward, even imperfect, coding practices that deliver working solutions and, just as importantly, provide insights into user behaviors and needs.
Current Infrastructure Hacks: A Smart Simplification
1. All-in-One VM
At the moment, my entire system operates on a single virtual machine that accommodates the database, web server, background jobs, and caching, all for a modest $40/month. While this setup lacks redundancy and relies on manual backups, the benefits have been immense. Within two months, I gained a clearer understanding of my true resource requirements than any theoretical capacity planning document could have provided. For instance, my AI-driven platform usually peaks at just 4GB of RAM—leading me to realize that the sophisticated Kubernetes infrastructure I was contemplating was unnecessary and would have required maintenance for virtually idle containers. Each crash incident has offered valuable insights into failure points, consistently revealing unexpected issues.
2. Directly Hardcoded Configuration
In my codebase, you’ll find hardcoded values for configurations like pricing tiers and user limits, with no extensive setup procedures beyond straightforward constants. Although this means that any change requires a redeployment, it also allows for rapid searches and tracing through my git history for any configuration updates. Over the past three months, I’ve adjusted these constants a mere three times, which results in much less time spent than if I had created a full-fledged configuration management system.
3. SQLite for Multi-User Applications
Yes, you read that right—I’m utilizing SQLite as the database for my multi-user web application. It