Embracing the Unscalable: A Three-Month Framework for Rapid Learning in Development
In the world of startups, the mantra “do things that don’t scale” is often repeated, yet the practical application of this advice in the realm of coding is seldom discussed. Over the past eight months while developing my AI podcast platform, I’ve adopted a unique framework: any temporary and unscalable solutions are given a lifespan of just three months. After this period, these solutions must either demonstrate their value and evolve into well-structured ones, or they face elimination.
Traditionally, software engineers are equipped to create scalable solutions from the outset, focusing on sophisticated architectures like microservices and distributed systems that can manage millions of users. However, in a startup environment, this approach often results in costly delays, focusing on hypothetical users and solving potential problems that may never arise. My three-month rule encourages me to craft straightforward, even “subpar,” code that can be deployed quickly, providing invaluable insights into user needs.
My Pragmatic Infrastructure Hacks: Insights and Lessons Learned
1. Consolidated Resources: Running on a Single VM
My entire infrastructure — database, web server, background jobs, and cache — resides on a single virtual machine that costs just $40 a month. While this may seem risky due to the absence of redundancy or automated backups, it has proven incredibly insightful. Within two months, I gained a clearer understanding of my resource requirements than any detailed planning document could provide. For instance, my platform’s peak RAM usage was only 4GB. The intricacies of a Kubernetes setup that I nearly implemented would have resulted in overhead and inefficiencies.
When crashes occur (and they have happened), I’m able to analyze real-time data about the failures, which often reveal unexpected issues.
2. Simplified Configuration Approach
Rather than employing complex configurations and environment variables, I’ve opted for hardcoded constants scattered throughout my code. Each time a value needs adjustment, it requires a redeployment. This method, which may appear antiquated, allows me to quickly search my entire codebase for any configuration value and track every change in the git history. In three months, I’ve only needed to modify these values three times, saving significant hours of engineering effort.
3. Utilizing SQLite in Production Environment
Surprisingly, my multi-user web application runs on SQLite, with a database size of merely 47MB, efficiently handling up to 50 concurrent users.