Embracing the 3-Month Rule: A Pragmatic Approach to Development in Startups
In the world of startup development, there’s a well-known piece of wisdom from Paul Graham: “Do things that don’t scale.” While many recognize this advice, fewer discuss how to effectively implement it in the realm of coding. With eight months dedicated to building my AI podcast platform, I’ve constructed a straightforward methodology: every temporary, non-scalable solution gets a lifespan of three months. After this period, I evaluate its effectiveness—if it adds value, it evolves into a more robust solution; if not, it gets phased out.
Why the 3-Month Rule Matters
As engineers, we often find ourselves conditioned to create scalable architectures from the very beginning. We dive into design patterns, microservices, and distributed systems with the grand ambition of accommodating millions of users. However, such approaches often align better with the mindset of large companies rather than startups.
In the startup arena, overly focusing on scalable solutions can lead to unnecessary delays and expenses. We might end up optimizing for potential users that don’t yet exist or tackling problems that may never arise. My three-month framework compels me to write straightforward, sometimes “imperfect” code that actually deploys, giving me invaluable insights into what users genuinely need.
Exploring My Current Infrastructure Hacks
Let’s dive into some of the unorthodox strategies I’ve implemented and why they are turning out to be more strategic than they might seem at first glance.
1. Unified Deployment on a Single VM
My entire infrastructure—database, web server, background jobs, and caches—runs on a single $40/month virtual machine. I have zero redundancy and rely on manual backups to my local storage.
This approach has proven to be insightful. Within just two months, I grasped my actual resource requirements far better than any formal planning document could have provided. Surprisingly, my AI-intensive platform only peaks at 4GB of RAM. The complex Kubernetes orchestration I initially considered would have been a case of over-preparing for needs I didn’t have.
When the system encounters issues (which has happened a couple of times), I glean useful data regarding the failures. Spoiler alert: it’s rarely what I anticipated.
2. Hardcoded Configuration Throughout
Instead of using configuration files or environment variables, I’ve opted for hardcoded constants scattered across my codebase, such as:
“`python
PRICE_TIER_1 = 9.99