Embracing the 3-Month Rule: A Practical Approach to Non-Scalable Solutions
In the ever-evolving world of technology, the advice from Paul Graham resonates: “Do things that don’t scale.” However, the challenge lies in the execution, especially within the realms of coding and engineering.
After dedicating eight months to developing my AI podcast platform, I created a fundamental framework: every hack that lacks scalability is given a three-month trial period. At the end of that time, it either demonstrates its worth and receives the necessary infrastructure, or it is discarded.
As engineers, we often feel compelled to architect scalable solutions from the outset. We’re drawn to design patterns, microservices, and distributed systems that are capable of supporting millions of users. However, this mentality is often better suited for large corporations rather than agile startups. In a startup context, focusing on scalability too early can lead to unnecessary expense and delayed progress.
My 3-month rule encourages me to implement straightforward, albeit imperfect, code that is shipped quickly. This approach allows me to discover what users truly need, rather than what I assume they might require.
Insights from My Current Infrastructure Hacks
1. Single Virtual Machine Strategy
All essential functions—database, web server, background jobs, and Redis—operate on a single, cost-effective virtual machine. While this setup lacks redundancy and relies on manual backups, its simplicity has taught me invaluable lessons about resource needs. For instance, I learned that my platform, which I anticipated to be heavily reliant on AI, only requires 4GB of RAM. The complex Kubernetes infrastructure I nearly constructed would have ended up managing largely unused resources.
2. Hardcoded Configuration
Instead of relying on external configuration files or complex systems, my application utilizes hardcoded constants for critical variables. This method, while seemingly outdated, allows for rapid tracking and changes. Each price adjustment is logged in version history, and the overall time investment for occasional redeployments is significantly lower than developing a dedicated configuration service.
3. Utilizing SQLite for Production
Running SQLite for a multi-user web application is unconventional, yet it has proved effective. My entire database remains under 50MB, and it effortlessly supports 50 concurrent users. This choice revealed essential access patterns—primarily read-heavy—validating that for my current needs, SQLite is more than sufficient. If I had opted for a more robust database solution initially, I would have wasted time on optimizations