The Three-Month Rule: A Framework for Embracing Unscalable Solutions in Tech
In the tech community, Paul Graham’s mantra, “Do things that don’t scale,” is widely recognized but often misunderstood. The challenge lies in how to effectively implement this philosophy in the realm of software development. Over the past eight months, as I’ve been crafting my AI podcast platform, I’ve devised a straightforward framework that optimizes this concept: each unscalable solution has a lifespan of three months. After this period, it must either demonstrate its worth and be developed further or be discarded.
As engineers, we tend to prioritize scalable solutions from the very outset. We get caught up in designing intricate architectures—think microservices and distributed systems—aimed at seamlessly supporting millions of users. However, this “big company” mindset doesn’t always translate well to the startup environment. In fact, the pursuit of scalable code can turn into costly procrastination, as it often addresses hypothetical user demands rather than the real needs at hand. My three-month approach compels me to produce straightforward, albeit imperfect, code that is actually deployable, revealing essential insights about user requirements along the way.
Ingenious Infrastructure Hacks: Why They Work
1. Unified Virtual Machine Management
I operate all essential services, including the database, web server, background jobs, and cache, on a single $40/month virtual machine. This setup has zero redundancy, and I conduct manual backups onto my local machine.
The brilliance of this approach? It has provided me with invaluable insights about my actual resource usage in just two months—discoveries that would have eluded any overly complex capacity planning. My “AI-heavy” platform, for instance, peaks at merely 4GB of RAM. The Kubernetes environment I nearly implemented would have left me managing idle containers, not understanding real operational needs.
When outages occur (which they have, twice), I gain concrete data on what truly falters—far from my initial expectations.
2. Hardcoded Configuration
For configuration, I’ve opted for simplistic hardcoding:
plaintext
PRICE_TIER_1 = 9.99
PRICE_TIER_2 = 19.99
MAX_USERS = 100
AI_MODEL = "gpt-4"
With no separate config files or environment variables, constants are directly embedded in code, meaning any change necessitates a redeployment.
The upside? A swift search across my codebase allows