Embracing the 3-Month Rule: A Pragmatic Approach to Non-Scalable Solutions in Software Development
In the realm of startup culture, a piece of wisdom often echoed is Paul Graham’s mantra: “Do things that don’t scale.” While this advice resonates with many, the conversation seldom delves into actionable ways to adopt this mindset, particularly in the coding sphere.
After eight months of developing my AI podcast platform, I’ve crafted a straightforward yet effective framework I call the “3-Month Rule.” This principle dictates that any unscalable solution is given a shelf life of three months. At the end of this period, we assess its value; if it isn’t proving its worth, it gets discarded.
As software engineers, we’re conditioned to prioritize scalable solutions right from the start. Concepts like design patterns, microservices, and distributed systems may sound appealing, but they often reflect the mindset of established companies rather than startups. In early-stage ventures, focusing on scalable code can become an expensive form of procrastination—optimizing for potential users who haven’t even arrived yet and addressing problems that may never materialize. By adhering to my 3-month rule, I’m able to craft simple, straightforward code that brings tangible results and provides real insights into user needs.
Current Infrastructure Hacks: Learning Through Simplicity
Here are some of the unconventional practices I’ve adopted, each designed to enhance learning rather than simply focusing on scalability.
1. Consolidating Everything on a Single Virtual Machine
I’ve opted to run my database, web server, and background jobs on a single $40/month virtual machine, without redundancy or automated backups. While this may seem reckless, this setup has allowed me to gain insights into my actual resource requirements far faster than formal capacity planning would have. In just two months, I’ve discovered that my platform’s peak usage only calls for 4GB of RAM. The complex Kubernetes setup I considered would have only served to manage idle containers.
When the unforeseen crashes occurred—twice, to be exact—they provided valuable data on failure points that weren’t what I initially expected.
2. Hardcoded Configuration Values
Instead of conventional configuration files or environment variables, I use hardcoded constants scattered throughout my codebase:
python
PRICE_TIER_1 = 9.99
PRICE_TIER_2 = 19.99
MAX_USERS = 100
AI_MODEL = "gpt-4"
While this may