Embracing the 3-Month Rule: A Pragmatic Approach to Non-Scalable Solutions in Tech Development
In the tech community, advice like Paul Graham’s directive to “do things that don’t scale” is often echoed, yet the implementation of this principle, particularly within coding practices, is rarely discussed. Having spent the past eight months developing an AI podcast platform, I’ve pioneered a straightforward approach centered around a critical tenet: any non-scalable tactic is given just three months to demonstrate its worth. After this period, it either warrants further development or is phased out completely.
Why the 3-Month Rule?
As engineers, we frequently focus on creating solutions designed for scalability from the outset. We immerse ourselves in design patterns, microservices, and distributed systems—all ideally suited for applications serving millions of users. However, this mindset can be limiting, particularly for startups. Here, attempting to engineer scalable code can often become a form of expensive procrastination, as we find ourselves optimizing for hypothetical users and problems that might never arise.
This self-imposed three-month timeline compels me to favor straightforward, albeit imperfect code, which is swift to deploy and instrumental in unveiling genuine user needs.
Implementing My Approach: Key Infrastructure Innovations
Here are a few current strategies I’ve employed, along with the rationale behind their effectiveness:
1. Consolidating Resources on a Single Virtual Machine
I operate everything—my database, web server, background jobs, and Redis—on a single $40-per-month virtual machine. While this setup lacks redundancy and relies on manual backups to my local system, it has proven invaluable. Within just two months, I’ve gained insights into my platform’s true resource needs, learning that its maximum RAM usage peaks at 4GB. The complex Kubernetes configuration I nearly built would have been wasted on empty containers. Additionally, each crash (which has happened twice) has provided unexpected data on the actual points of failure.
2. Embracing Hardcoded Configurations
Instead of utilizing separate configuration files or environment variables, I’ve opted for hardcoded constants for parameters like pricing tiers, maximum user limits, and AI models. While this might seem impractical, it allows me to quickly search my codebase for any configuration value. With only three changes made in three months, the time saved by not building a configuration service has been substantial—fifteen minutes spent redeploying versus potentially 40 hours in engineering.
**3. Choosing SQLite for Production