The Three-Month Rule: A Practical Approach to Building Scalable Solutions
In the tech world, we often hear the mantra “do things that don’t scale,” popularized by entrepreneur Paul Graham. While many understand this concept, few delve into how it can be effectively implemented in software development. After dedicating the past eight months to developing my AI podcast platform, I’ve created a simple framework for navigating the challenges of unscalable solutions: I give every unscalable hack a three-month lifespan. At the end of this period, the hack either proves its worth and gets transformed into a more robust solution or is discarded.
Breaking Away from Conventional Thinking
As engineers, we’re often trained to prioritize scalability from the start. We design sophisticated systems using design patterns, microservices, and distributed architectures—all fantastic for managing millions of users. However, this is a mindset that better suits established companies, not startups.
In a startup environment, striving for scalability often results in costly delays. You find yourself optimizing for hypothetical users, tackling challenges that may never arise. My three-month rule compels me to write straightforward, even “imperfect,” code that can be deployed quickly, offering valuable insights into what my users genuinely require.
Current Infrastructure Hacks: Smart Choices for Learning
1. Simplified Setup with a Single VM
I’ve consolidated my entire architecture onto a single $40/month virtual machine, running everything from the database to the web server. This approach is intentionally lacking redundancy and relies on manual backups to my local machine.
Why is this beneficial? In just two months, I’ve gained a deeper understanding of my actual resource needs than I would have through extensive capacity planning. My AI-driven platform peaks at just 4GB of RAM—something I would have wasted time over-engineering with a Kubernetes setup. Each time the system crashes, I gather real data on failures—insights I wouldn’t have anticipated.
2. Hardcoded Configuration
My configuration is incredibly straightforward: parameters like PRICE_TIER_1
, MAX_USERS
, and AI_MODEL
are hardcoded into my files, avoiding the complexities of config files and environment variables.
This setup, while seemingly primitive, allows for rapid access and version tracking. Any changes require only a brief redeployment, saving me significant engineering time compared to implementing a complex configuration management system.
3. Using SQLite in Production
Surprisingly, I have opted for SQLite in a multi-user application,