Embracing the 3-Month Rule: A Pragmatic Approach to Unscalable Solutions in Tech
In the startup world, the mantra “do things that don’t scale” is often echoed, yet seldom dissected, particularly within the realm of software development. Frameworks and architectures are frequently designed with scalability as a primary objective from the get-go, which can lead to a skewed focus on the future rather than the immediate needs of your user base. Over the past eight months of developing my AI podcast platform, I’ve devised a productive strategy: implementing a “3-Month Rule” for all unscalable hacks. After this period, each approach either earns its place through demonstrated value or is retired.
As engineers, our training tends to promote robust, scalable systems that can accommodate a vast user base. This encompasses the likes of design patterns, microservices, and distributed systems. However, such extensive planning can often lead to what I term “expensive procrastination,” especially in a startup setting where your user base may still be a concept rather than a reality. The 3-Month Rule encourages me to write straightforward, even “imperfect,” code that actually gets deployed and provides direct insights into user behavior and preferences.
Current Infrastructure Practices: Simplified Yet Effective
1. Consolidation into a Single Virtual Machine (VM)
My infrastructure operates entirely from one $40/month VM, where the database, web server, background jobs, and caching all coexist. This configuration lacks redundancy and relies on manual local backups. Contrary to initial impressions, this approach has led to valuable learning experiences regarding my actual resource requirements. I have discerned that my platform peaks at just 4GB of RAM. The complex Kubernetes framework I considered would have been wasted on managing empty containers, and crashes—though inconvenient—have provided essential real-time data on system vulnerabilities.
2. Hardcoded Configuration Values
I leverage hardcoded constants throughout my code, dealing with parameters such as pricing tiers and user limits directly in the source code. This decision simplifies my setup significantly; I can swiftly search for configuration variables across my codebase. Each modification can be made within minutes, versus the lengthy ordeal required to establish a dedicated configuration service. This method has saved me considerable engineering time while maintaining clarity.
3. Utilizing SQLite in a Multi-User Environment
While many might balk at using SQLite in a web application meant for multiple users, my 47MB database handles up to 50 concurrent users effortlessly.