Embracing the 3-Month Rule: A Pragmatic Approach to Non-Scalable Solutions
In the world of startups, the adage coined by Paul Graham—”Do things that don’t scale”—is familiar yet often misunderstood, particularly in the realm of software development. How do we embrace this philosophy while still ensuring we’re making meaningful progress? After dedicating the last eight months to developing my AI podcast platform, I’ve implemented a straightforward strategy: any unscalable hack is granted a three-month trial period. Following that duration, it must either demonstrate its value through tangible results or be discarded.
As software engineers, we often lean toward crafting solutions that are designed for scalability from the very beginning. We get drawn into the allure of sophisticated design patterns, microservices architecture, and distributing systems meant to accommodate millions of users. However, this mindset can veer into what I call “big company thinking,” especially in a startup-focused environment.
In smaller ventures, prioritizing scalable solutions early on can feel like an expensive exercise in procrastination. You’re often preparing for a hypothetical user base, addressing challenges that may never arise. The three-month rule compels me to produce straightforward, no-frills code that is actually deployed and essentially informs me of what users genuinely require.
My Current Infrastructure Shortcuts: Smart Moves or Just Cutting Corners?
1. Single VM Deployment
I currently host everything—a database, web server, background jobs, and caching—on a singular $40/month virtual machine. While this might sound risky, it has provided invaluable insights into my real resource needs. Within just two months, I’ve discovered that my AI-driven platform only requires around 4GB of RAM during peak times. The complex Kubernetes setup I nearly implemented would have left me managing unused resources. Each time the system crashes, I gain genuine feedback about what truly fails—information that often surprises me.
2. Hardcoded Values Across the Codebase
Instead of using configuration files or environment variables, I’ve hardcoded critical values like pricing tiers and user limits directly into the code. While this may seem primitive, it allows for quick searches within the codebase. Any price adjustments are easily tracked through Git history, and each update involves merely a short redeployment. Creating a dedicated configuration service would have taken a significant block of time—time I’ve instead invested in learning from agile iterations.
3. Utilizing SQLite in Production
Yes, I made the intentional choice to use SQLite for a multi-user