Embracing the 3-Month Rule: A Practical Approach to Unscalable Solutions in Software Development
In the world of software development, one piece of advice resonates across the industry: “Do things that don’t scale.” This notion, often championed by Paul Graham, encourages entrepreneurs and engineers alike to prioritize learning and rapid iteration over the meticulous construction of scalable systems. However, the challenge lies in translating this philosophy into actionable steps during the coding process.
After eight months of developing my AI podcast platform, I have devised a straightforward yet effective framework: every unscalable approach gets a lifespan of three months. After this period, it either proves its worth and is refined into a robust solution or, unfortunately, is discarded.
As engineers, we’re often schooled in the art of building scalable architectures—design patterns, microservices, distributed systems—and while these structures are impressive, they may not be suitable for startups. In many cases, striving for scalability from the outset is a form of costly procrastination, addressing hypothetical needs rather than actual user demands. My three-month rule encourages me to implement pragmatic, albeit “imperfect,” code that actually gets deployed, allowing me to better understand what users truly require.
Current Infrastructure Decisions and Their Wisdom
1. Consolidating Everything on One Virtual Machine
Rather than dispersing my resources across multiple systems, I have consolidated my database, web server, background jobs, and Redis into a single $40/month virtual machine. While this setup has no redundancy and relies on manual backups, the insights I’ve gained over just two months have been invaluable.
Managing my platform’s resource usage has revealed that it only peaks at 4GB of RAM. The complex Kubernetes architecture I once considered would have led me to manage empty containers, and through the occasional crashes, I’ve gathered real-time data on failures—information that has often defied my expectations.
2. Utilizing Hardcoded Configuration
My code currently features configuration values defined directly within the codebase:
python
PRICE_TIER_1 = 9.99
PRICE_TIER_2 = 19.99
MAX_USERS = 100
AI_MODEL = "gpt-4"
While this may seem primitive, it allows me to quickly search and track changes through my version control system. Rebuilding a configuration service would require significant resources, yet I’ve only modified these values three times in three months, making this straightforward approach far more efficient.