The 3-Month Experiment: A Practical Approach to Learning Through Unscalable Hacks
Paul Graham famously championed the idea of “doing things that don’t scale” in startups, but rarely do we discuss how to translate that wisdom into practical coding strategies. Over the past eight months of developing my AI podcast platform, I’ve established a straightforward framework: each unscalable solution gets a dedicated three-month trial. After this period, we assess whether it deserves a full-fledged approach or should be discarded.
As engineers, we often gravitate towards creating scalable solutions from the onset—envisioning architecture that supports millions of users, complete with design patterns and microservices. Yet, this approach is often more suited to established companies than to agile startups. In the early stages, focusing on scalability can lead to costly delays, as time is spent optimizing for hypothetical users and issues that may never arise. My three-month rule encourages me to embrace simple, direct, and sometimes considered ‘bad’ code that is deployable and illuminates the genuine needs of users.
Innovative Infrastructure Choices: Smart Hacks for Fast Learning
Here are some of my current infrastructure strategies and the rationale behind them:
1. Consolidated Operations on One Virtual Machine
I operate my database, web server, background jobs, and Redis all on a single $40/month virtual machine with no redundancy, relying on manual backups to my local drive. This decision has revealed valuable insights about my resource requirements within just two months, far surpassing what any theoretical capacity planning document could offer. For instance, my platform’s peak resource usage is only 4GB of RAM. The complex Kubernetes setup I almost implemented would have simply managed idle containers, leading to wasted resources.
Whenever the system crashes (which has happened twice), I glean practical data about the real points of failure—often unexpected ones.
2. Hardcoded Constants for Configuration Management
I’ve opted for hardcoded constants for settings such as pricing and user limits scattered across my code. While this might seem impractical, it allows me to quickly search for any value and track changes through Git history. Over three months, I’ve only modified these values three times, which took about 15 minutes to redeploy. In contrast, creating a configuration service would have required a week’s work.
3. SQLite in a Multi-User Environment
I’m currently using SQLite for my web app, which features a database size of only 47MB and comfortably supports up to 50 concurrent users.