Embracing the 3-Month Rule: A Practical Approach to Unscalable Solutions in Software Development
As many entrepreneurs and innovators are aware, tech visionary Paul Graham famously advises, “Do things that don’t scale.” However, the direct application of this principle to software development often remains uncharted territory. After dedicating eight months to creating my AI podcast platform, I’ve developed a straightforward framework: every unscalable approach I implement will be evaluated after three months. By then, a hack must either demonstrate its utility and deserve a more robust solution, or it will be discarded.
Typically, engineers are conditioned to develop solutions aiming for future scalability. From employing design patterns to architecting distributed systems, the focus is often on building structures meant to withstand vast amounts of user traffic. While this mindset is prevalent in large corporations, it can lead to inefficiency in a startup environment where scalability often turns into costly procrastination. The 3-month rule encourages the creation of straightforward, if somewhat “messy,” code that can be quickly deployed and tested against real user interactions.
My Current Unscalable Approaches and Their Unexpected Wisdom
1. One VM to Rule Them All
I’m operating my entire application—from the database to backend job processing—on a single virtual machine costing me just $40 a month. Yes, it lacks redundancy and involves manual backups, but the insight I’ve garnered in just two months about my resource utilization has been invaluable. I initially anticipated needing loads of capacity; instead, my AI-centric platform only peaks at 4GB RAM. Amid crashes (there have been a couple), I’ve gained practical insights about system failures that data wouldn’t have suggested.
2. Embracing Hardcoded Configurations
Think of this: constants scattered throughout my codebase define crucial parameters—such as pricing tiers, maximum user limits, and AI model specifications—without the complexity of configuration files. This might seem old-fashioned, but it allows me to swiftly locate values across my entire code with simple searches. When configuration changes are necessary, the time committed to redeployment pales in comparison to what it would take to develop a proper configuration service. In the last three months, I’ve made those changes just three times!
3. Leveraging SQLite for Production Needs
Interestingly, my choice to use SQLite for a multi-user application has proven effective with a modest database size of just 47MB. It seems counterintuitive, but the data access patterns we’ve observed show that we