Embracing the 3-Month Rule: A Technical Approach to Unscalable Solutions
In the tech world, there’s a well-known piece of wisdom from Paul Graham: “Do things that don’t scale.” While it’s easily quoted, few discuss how to put this advice into practice, particularly when it comes to coding and software development. Over the past eight months of building my AI podcast platform, I’ve created a straightforward yet effective framework: every unscalable method I employ is given a lifespan of three months. After this period, the idea must either demonstrate its worth and be fully developed or be discarded.
As engineers, we’re often encouraged to craft scalable solutions from the very beginning. Concepts like design patterns, microservices, and distributed systems highlight the beauty of architectures that can support millions of users. However, in the context of a startup, focusing exclusively on scalability can lead to costly delays. Too often, we find ourselves preparing for users who may not even exist or troubleshooting issues that are mere possibilities.
A Practical Framework for Learning
My three-month rule compels me to produce straightforward and even “imperfect” code that can be deployed quickly, providing invaluable insights into what my users genuinely require. Here are some of the unconventional hacks I’ve implemented and the reasoning behind their effectiveness:
1. Consolidation on One Virtual Machine
I run everything—from the database and web server to background jobs and caching—on a single $40/month virtual machine. This approach sacrifices redundancy for simplicity and extensive learning. Over the last two months, I have gained unparalleled insight into my actual resource needs. Surprisingly, my platform consistently peaks at just 4GB of RAM. Had I opted for a more complex Kubernetes architecture, I would simply be managing idle containers.
When the system crashes (which has occurred twice), I obtain real data about failures—often in areas I least anticipated.
2. Hardcoded Configuration Values
Instead of utilizing configuration files or environment variables, I’ve opted for hardcoded constants scattered throughout the codebase:
python
PRICE_TIER_1 = 9.99
PRICE_TIER_2 = 19.99
MAX_USERS = 100
AI_MODEL = "gpt-4"
While not ideal, this design allows me to quickly search for any configuration value. Every price adjustment is documented in the version control history and undergoes my personal review during pull requests. Creating a dedicated configuration service would demand a week’s effort, yet