Embracing the 3-Month Rule: A Practical Approach to Unscalable Solutions
In the tech startup realm, the well-known advice from Paul Graham to “do things that don’t scale” often resonates, yet the implementation of this principle within coding practices frequently goes unexplored. After eight months of developing my AI podcast platform, I’ve cultivated a straightforward yet effective framework: every unscalable workaround is granted a lifespan of three months. At the end of this period, it must either demonstrate clear value and undergo proper construction, or it faces elimination.
As engineers, we are instinctively geared towards creating scalable solutions from the outset. We become enamored with design patterns, microservices, and distributed systems that accommodate millions of users. However, this mindset predominantly serves larger organizations.
In the context of a startup, creating scalable code can often lead to costly delays. Too frequently, we find ourselves optimizing for potential users who haven’t even surfaced, addressing challenges that may never present themselves. By adopting my three-month guideline, I commit to producing straightforward, albeit “imperfect,” code that can be deployed quickly, allowing me to learn firsthand what users genuinely require.
My Current Strategies and Their Unexpected Benefits
1. Consolidation on a Single Virtual Machine
I’ve centralized all my operations—including database, web server, background jobs, and Redis—on a single $40/month virtual machine. While this approach offers no redundancy and relies on manual backups, it provides essential insights into my actual resource needs far more effectively than any resource planning document could.
In just a couple of months, I discovered that my platform typically peaks at 4GB of RAM. The complex Kubernetes architecture I nearly constructed would have only served to manage idle containers. Notably, when the system crashes—happened twice so far—I gain valuable data on actual failure points, which are often surprising.
2. Hardcoded Configuration Values
My configuration setup is straightforward: values like PRICE_TIER_1 = 9.99
and MAX_USERS = 100
are hardcoded, scattered throughout the files. This simplicity means that any modifications necessitate a redeployment.
The advantage of this approach lies in its clarity; I can swiftly search for any configuration value across my entire codebase within seconds. Each modification is recorded in Git history, ensuring that I have a complete record of changes—significantly more efficient than investing a week into developing a configuration service for infrequent updates.