Embracing Imperfection: A Practical Approach to Non-Scalable Solutions in Tech
In the tech industry, the mantra “do things that don’t scale” from entrepreneur Paul Graham resonates deeply with startups and innovators. While the advice is popular, few discuss how to effectively put it into practice in the coding realm.
After dedicating eight months to developing my AI podcast platform, I’ve crafted a straightforward framework: each unscalable solution receives a trial period of three months. After this timeframe, it either proves its worth and gets refined, or it gets eliminated.
As engineers, we often aim to construct scalable solutions from the outset. We gravitate toward advanced design patterns, microservices, and complex distributed systems—architectures designed to accommodate millions of users. This tends to be the mindset of larger corporations. However, in a startup environment, chasing after scalable code can quickly become a costly form of procrastination. We find ourselves optimizing for users who aren’t even part of the equation yet and addressing problems that may never arise. By adhering to my three-month rule, I focus on crafting straightforward, albeit imperfect, code that actually gets deployed and helps uncover what users genuinely need.
My Current Coding Practices: Strategic Simplicity
1. Consolidation on a Single VM
I run my entire platform—including databases, web servers, background jobs, and Redis—on a single $40-a-month virtual machine. While this lacks redundancy and requires manual backups, it has provided unparalleled insights into my actual resource requirements. In just two months, I’ve realized that my “AI-heavy” platform only requires around 4GB of RAM, saving me from overengineering with a complex Kubernetes setup that would have only added unnecessary overhead.
When the server crashes—which it has twice—I gain valuable information about the actual failures in my system, proving that the issues were not what I had anticipated.
2. Hardcoded Configurations
Instead of utilizing configuration files or environment variables, I have opted for hardcoded constants throughout my codebase:
python
PRICE_TIER_1 = 9.99
PRICE_TIER_2 = 19.99
MAX_USERS = 100
AI_MODEL = "gpt-4"
This decision simplifies my ability to search for config values. I can quickly locate changes in my git history, and each modification goes through a personal review process. A dedicated configuration service would have consumed a week of engineering time; instead, I’ve spent