The Three-Month Rule: A Pragmatic Approach to Unscalable Solutions in Development
In the world of startups and tech innovation, the mantra “Do things that don’t scale,” famously coined by Paul Graham, resonates deeply. However, practical implementation of this concept in the realm of coding and development often goes unaddressed. After eight months of building my AI podcasting platform, I’ve developed a straightforward framework: every unscalable solution has a lifespan of three months. After this period, if it hasn’t proven valuable, it’s time to let it go.
Typically, as software engineers, we are inclined to chase scalable solutions from the outset—embracing design patterns, microservices, and distributed architectures that can accommodate millions of users. Yet, this approach can lead to complications, especially in the startup environment. Often, establishing a scalable architecture is merely delaying essential decisions, as we end up optimizing for hypothetical user bases rather than focusing on current needs. My three-month rule encourages me to focus on producing straightforward, functional code that can be rapidly deployed, ultimately revealing what my users truly require.
Current Infrastructure Strategies: Innovative Yet Practical
1. Consolidated Operations on a Single VM
I have consolidated my database, web server, background jobs, and caching system (Redis) onto a single, cost-efficient $40/month virtual machine (VM), with no redundancy and manual backups.
Why is this approach wise? Within a mere two months, I’ve gained more insight into my resource requirements than traditional planning documents could provide. For my “AI-heavy” platform, resource peaks have shown to be around 4GB RAM. An intricate Kubernetes environment would have only managed empty containers.
When my system has crashed (twice so far), I have received actionable data regarding what actually fails, which is often unexpected.
2. Simple Hardcoded Configurations
I utilize hardcoded constants throughout my codebase for configurations, such as pricing tiers and user limits—eliminating the need for external configuration files or environment variables.
This method offers a unique advantage: I can effortlessly search the entire code for any configuration value. Any price modifications are tracked in version history, and every configuration update is subjected to a review (by myself, albeit, it still counts).
Setting up a dedicated configuration service would have taken a week, whereas I’ve modified these settings only three times in three months. This translates to a mere 15 minutes of redeployment versus an estimated 40 hours of