Embracing the 3-Month Rule: A Framework for Non-Scalable Solutions in Software Development
In the realm of startups, the common wisdom echoed by thought leaders like Paul Graham is to “do things that don’t scale.” However, for many developers, the challenge lies in understanding how to apply this advice effectively, especially when coding.
After dedicating eight months to my AI podcast platform, I’ve crafted a straightforward framework: every unscalable approach I employ is given a lifespan of three months. At the end of this period, these methods must either demonstrate their value and evolve into a scalable solution or be discarded.
As engineers, we are often trained to seek scalable solutions right from the beginning, gravitating towards concepts like microservices and distributed systems that cater to potentially millions of users. However, during the early phases of a startup, these sophisticated architectures can become a costly form of procrastination—optimizing for hypothetical users and problems that may never arise. My three-month rule encourages me to write straightforward, albeit “imperfect,” code that can be implemented quickly and reveals real user needs.
Insights from My Current Infrastructure Strategies
1. Streamlined Setup on a Single VM
I’m currently hosting everything, including the database, web server, background jobs, and Redis, on a single $40/month virtual machine (VM) without redundancy and with manual backups to my local system.
Why is this approach smart? I’ve discovered more about my actual resource requirements in just two months than any elaborate capacity planning model could provide. My AI-heavy application peaks at just 4GB RAM. Had I opted for a more complex Kubernetes setup, I would have been managing empty containers instead of practical resources. Each time the system encounters a crash (which has occurred twice), I gain valuable insights into the failure points—rarely aligning with my expectations.
2. Hardcoded Configuration Parameters
For my configuration values, I use hard-coded constants scattered throughout the codebase like:
plaintext
PRICE_TIER_1 = 9.99
PRICE_TIER_2 = 19.99
MAX_USERS = 100
AI_MODEL = "gpt-4"
While this may seem inefficient—eschewing config files and environment variables—it has its advantages. I can quickly search my entire codebase for any configuration value, track change history in Git, and efficiently manage updates. Building a configuration service could take a week, but as I’ve