The 3-Month Experiment: A Framework for Embracing Unscalable Solutions
In the entrepreneurial landscape, startup founders often hear Paul Graham’s widely recognized mantra: “Do things that don’t scale.” While this advice is invaluable, there’s often little guidance on how to practically implement this in the realm of coding and development. After spending eight months constructing my AI podcast platform, I’ve devised a simple yet effective framework: every unscalable tactic is assigned a lifespan of three months. At the end of this period, it either reveals its worth and is transformed into a robust solution or it’s phased out.
A Shift in Mindset
As engineers, we are conditioned to design systems with scalability in mind from the outset. We tend to focus on sophisticated architectures like microservices, distributed systems, and other scalable solutions intended to accommodate millions of users. However, for a startup, this approach may turn out to be an expensive exercise in procrastination—one that prioritizes hypothetical users over actual needs. My three-month rule encourages me to create straightforward, albeit “imperfect,” code that can be deployed quickly, allowing me to gain real insights into what my users require.
My Current Approaches: Practical Choices with Purpose
1. Consolidated Infrastructure on a Single VM
Hosting my database, web server, background jobs, and Redis on a single $40/month virtual machine might seem reckless, but it has been incredibly instructive. With no redundancy and manual backups to my local drive, I have gained unparalleled insight into my actual resource requirements. I discovered that my platform, which I assumed would be resource-intensive, only peaks at 4GB of RAM. The complex Kubernetes set-up I nearly implemented would have only managed idle containers. Plus, each crash has provided valuable information about the real issues at hand.
2. Hardcoded Configurations
Rather than employing separate configuration files or environment variables, I have opted for hardcoded constants throughout my codebase. This approach makes accessing any configuration value quick and easy, drastically reducing the time spent on redeployments when changes are needed. Over three months, I’ve altered configurations just three times, highlighting the efficiency of my current strategy.
3. Using SQLite for a Multi-User Application
Despite the common belief that SQLite shouldn’t be used for web applications with multiple users, my 47MB database supports up to 50 concurrent users effortlessly. This setup has revealed my access patterns—95% reads and only