I have a lot of ideas for things that get stuck in the design phase. I’m thinking about what I want to make, and I don’t want to make anything unless it’s groundbreaking, awe-inspiring, a perfect diamond descending from the sky, and that’s kind of a lot to ask, you know? For example, I have an idea for a resource-network management game inspired by Settlers II. I’ve been studying backpressure in distributed systems and the transshipment problem for inspiration, because I want the game to be sufficiently complex to be interesting, and also actually teach you something about asynchronous, decoupled networks. And it has to be multiplayer, because single player games are boring, so it has to have a balanced economy. And I’m going to write it in Clojure, and everything’s going to be immutable state and it’s going to be testable and small and Simple. And by now I’m completely lost, adrift at sea trying to imagine this perfect thing, and I can’t bring myself to work on it because I don’t yet know what it really is that I want to build.
The idea that I might grasp that perfect, whole, fully-formed idea and pry it piece by piece from the æther is seductive. But the more I reach for that thing that doesn’t exist, the more frustrated I become that I cannot reach it.
This approach to designing things sucks. The field of software construction has noticed that fact and coined the term “waterfall” to describe it, and it’s been known since the 60s to be a terrible way of building software (and probably for much longer in other fields). In most projects, you don’t really know enough about the thing at the beginning to plan out something really good. Changing direction in the course of a project gives you at least some of the benefit of hindsight: you can see how things are going, apply what you’ve learned so far and tweak the design.
Nearly all great things start out as okay things, then improve. From the relatively small-scale—Gmail, the screwdriver, concrete—to the massive—democracy, the internet, feminism. All of those things started out as good ideas, but they did not emerge fully formed. Gmail has been rewritten from scratch at least three times. Pozidriv is a way better version of the Phillips head screw that doesn’t slip and cam out so easily, possible because we now have torque-limited power drills. Reinforced concrete as a building material has enabled all sorts of stuff that wasn’t possible with regular concrete. Democracy began in Greece as something only the rich and powerful land-owners participated in. The Internet started out as “hey wouldn’t it be cool to connect your computer to my computer?”. Since its inception, the feminist movement has expanded and evolved dramatically — a lot of early feminists did amazing things for social equality and were undeniably heroes, and were also homophobic and hella racist. Now we have intersectional feminism and a broad social justice movement that grew out of the seeds those women planted.
So build things that are flawed, on purpose. Celebrate those flaws, even. Instead of reaching for that empty promise of perfection, reach for interesting and imperfect. Make things that are intentionally flawed. Choose some way in which you know your idea sucks, and enshrine that, bask in it.
Legend has it, the producer on Battle Chess needed to see his hand in every part of the game. So an animator, working on the model for the queen piece, added a pet duck to the animations. Come review time, the producer said, “Looks great! One thing though — get rid of the duck.” In a similar fashion, purposefully incorporating a flaw into a project gives you an out. “I know it’s not perfect — I made it that way!”