Embracing the 3-Month Rule: A Pragmatic Approach to Early Development
In the realm of startup culture, the mantra “Do things that don’t scale,” popularized by Paul Graham, often echoes in discussions among entrepreneurs and engineers alike. However, the challenge lies in effectively applying this principle to programming tasks. After eight months of building my AI podcast platform, I’ve established my own practical guideline: every unscalable solution is given a lifespan of three months. At the end of this period, it either proves its worth and transitions to a more robust form, or it is discarded.
As engineers, we frequently find ourselves inclined to pursue scalable solutions right from the start—focusing on sophisticated design patterns, microservices, and distributed systems that can accommodate millions of users. Yet, this mentality often belongs to larger organizations. In the startup arena, focusing on scale can sometimes act as a barrier to progress, leading to premature optimization for hypothetical users and unaddressed issues.
By adhering to my three-month rule, I challenge myself to implement direct and sometimes unconventional coding practices that facilitate rapid learning about user needs. Here are some of my current strategies, which may seem unorthodox but have proven insightful:
1. Consolidating Resources on a Single VM
Currently, my entire infrastructure—including the database, web server, background jobs, and caching—is hosted on a single $40/month virtual machine (VM). Despite the apparent lack of redundancy and reliance on manual backups, this setup has clarified my actual resource demands. Within the first two months, I discovered that my supposed “AI-heavy” platform functions perfectly within a 4GB RAM capacity. Had I proceeded with a complex Kubernetes setup, I would have been managing an over-engineered solution instead of gaining real, actionable data when the system encounters issues.
2. Utilizing Hardcoded Configurations
My configurations are straightforward and hard-coded, exemplified by simple constants throughout my codebase. While this may seem primitive, it enables quick searches across files and immediate tracking of changes in Git history. In the past three months, I have altered these values only three times, resulting in a mere 15 minutes of redeployment compared to the extensive hours it would have taken to set up a configuration management service.
3. Deploying SQLite in Production
Using SQLite for a web application that supports multiple users might raise eyebrows, but my database size is just 47MB and effectively manages 50 concurrent users without any