Embracing the Unscalable: My 3-Month Experimentation Framework
In the tech world, we often hear Paul Graham’s maxim: “Do things that don’t scale.” However, when it comes to applying this principle in the realm of coding, advice can be sparse. I want to share an effective framework I’ve developed during my eight-month journey of building an AI podcast platform: every unscalable solution I implement is granted a lifespan of just three months. After this period, I evaluate whether it has demonstrated its worth and deserves further investment, or if it should be discarded.
As engineers, our training leads us to prioritize scalable solutions from the outset. We often get entrenched in the allure of sophisticated design patterns, microservices, and elaborate distributed systems that can accommodate millions of users. Yet, this mindset can be detrimental in a startup environment. Focusing excessively on scalability can become a costly form of procrastination, catering to hypothetical future users while ignoring the immediate needs of those currently engaged.
My three-month rule encourages me to create straightforward, albeit imperfect, code that is practical and expedient. This approach has propelled me to genuinely understand user requirements in a way that theoretical frameworks cannot.
Current Infrastructure Experiments: The Benefits of Simplification
1. Consolidated Environment on a Single VM
Imagine running your entire tech stack—including the database, web server, and background jobs—all on a single, $40-per-month virtual machine without redundancy or automated backups. At first glance, this might seem reckless, but it has proven to be a formidable learning experience. In merely two months, I’ve gleaned valuable insights into my resource requirements, finding that my “AI-heavy” platform peaks at a mere 4GB of RAM. Had I pursued a complex Kubernetes setup, I would have been managing excess resources instead of honing in on real usage patterns.
Moreover, every crash (which has occurred twice) provides concrete data about actual failure points, often revealing surprises that defy my expectations.
2. Hardcoded Configuration for Efficiency
With a focus on simplicity, I use hardcoded values instead of complex configurations. Constants like pricing tiers and user limits live directly within the code. While some may argue this is obsolescent, it enhances my workflow. I can quickly search my codebase for configuration values and track historical changes effortlessly through version control. The straightforward nature of this method saved me the 40 hours it would have taken to develop a configuration service, proving