Embracing the 3-Month Rule: A Practical Approach to Non-Scalable Solutions in Software Development
In the startup world, there’s a well-known maxim from Paul Graham: “Do things that don’t scale.” However, translating this sentiment into practical coding strategies is rarely discussed. After eight months of developing my AI podcast platform, I’ve devised a straightforward methodology: each unscalable approach is granted a lifespan of just three months. At the end of this period, it either proves its worth and transitions into a robust solution, or it is discarded.
As engineers, we’re often conditioned to focus on crafting scalable architectures from the outset—think microservices, distributed systems, and all that intricate design meant to support millions of users. Yet, this kind of thinking can lead to costly procrastination in a startup setting. We tend to invest effort into optimizing for future users who may never materialize, tackling problems that could be non-existent. My three-month rule compels me to write straightforward, even “imperfect,” code that can be deployed quickly, ultimately giving me insights into what my users truly require.
My Ingenious, Yet Unconventional, Infrastructure Hacks
1. Single VM Deployment
All components of my application—database, web server, background tasks, and Redis—operate on a singular $40/month virtual machine, with no redundancy and manual backups stored locally.
This unorthodox setup has significantly enriched my understanding of actual resource needs in just two months, much more than traditional capacity planning documents could. My “AI-heavy” platform reaches a peak usage of merely 4GB of RAM. The complex Kubernetes configuration I nearly implemented would have resulted in managing idle containers.
When the system crashes (which has happened twice), I gather precise data about what truly fails—surprisingly, it’s never what I anticipated.
2. Hardcoded Configurations
Instead of relying on configuration files or environment variables, I have constants sprinkled throughout my code:
plaintext
PRICE_TIER_1 = 9.99
PRICE_TIER_2 = 19.99
MAX_USERS = 100
AI_MODEL = "gpt-4"
This approach allows me to swiftly search through my codebase for configuration values. Every pricing adjustment is traceable in version history, and any configuration alterations undergo a brief code review process (albeit, by myself). Developing a configuration service would consume a week, but since I’ve only modified these values three times in three months,