The 3-Month Rule: A Practical Guide to Non-Scalable Solutions in Development
In the world of software engineering, a frequent piece of wisdom is to “do things that don’t scale.” This advice, often attributed to Paul Graham, is common knowledge, yet few delve into how to effectively apply it during the coding process.
Having spent nearly eight months developing an AI podcast platform, I’ve created a straightforward method for implementing unscalable hacks: each one is given a trial period of three months. After this timeframe, it either demonstrates its value and becomes a robust solution, or it’s discarded.
As developers, we often feel inclined to construct solutions that are scalable from the outset — utilizing design patterns, microservices, and complex architecture built for millions of users. While this approach is typical for larger corporations, it can be a costly distraction in a startup environment. My three-month rule encourages simplicity; I focus on producing clear, if imperfect, code that helps reveal what users truly require.
My Current Infrastructure Hacks and Their Logic
1. Consolidated Computing on a Single VM
I run my database, web server, background jobs, and Redis on a single VM costing just $40 per month. This setup has no redundancy and relies on manual backups to my local machine.
This may seem reckless, but here’s the brilliance: in just two months, I have gained invaluable insights into my actual resource requirements — far beyond what any planning document could offer. To my surprise, my “AI-centric” platform only requires about 4GB of RAM at peak times. The complex Kubernetes architecture I almost implemented would have resulted in unnecessary overhead.
When the system crashes (and it has twice), I obtain real, actionable data on the failures, which consistently surprise me.
2. Simplistic Hardcoded Configuration
Within my codebase, I utilize straightforward constants like:
python
PRICE_TIER_1 = 9.99
PRICE_TIER_2 = 19.99
MAX_USERS = 100
AI_MODEL = "gpt-4"
There are no config files or environment variables — just these hardcoded values. Changing any of them necessitates a redeploy.
Here’s the advantage: I can quickly search the entire codebase for any configuration value. Each price change is recorded in the git history, and every configuration adjustment undergoes a code review (even if it’s just my own). Creating a configuration service would have consumed a week, yet