Small Victories
I often find myself at the start of very large projects that are scheduled to ship in way less time than is seemingly necessary to complete them. However, I don’t think this is such a bad thing.
The fastest way to get something out the door is to set an arbitrary ship date. I could iterate over the same algorithm or interface for weeks, perfecting it, if I had the time. But, if I did that, I’d never actually ship anything. And when it comes down to it, if you don’t ship software, you may as well not write software.
At the start of a big project, I lay out the major things that need to be done. I write them all down in a list on a big whiteboard next to my desk. I set a date that isn’t very far away, a date I’d love to get this stuff out the door by, not necessarily a date that would give me enough time to feel comfortable. That’s the key, you shouldn’t have so much time that you feel comfortable that everything will be perfect. I’m not sure where I read it, but someone once wrote, if you aren’t embarrassed even a little when you ship something, you didn’t ship it soon enough.
Once I get started on the project, I cross things off the list on my whiteboard, I don’t erase them. I make sure that the list is somewhat general at first. I try my best not to stay on one area of the project for too long. If I notice I’m spending too much time on one thing, it usually means I’m obsessing over some small detail. I step back, figure out what I need to do to round out the area and make it good enough to ship. Then, I take all of the small details that the perfectionist inside me would really like to finish, and I add those to a second list on my whiteboard.
I keep iterating like this, moving from large area to large area and then circling back and crossing off smaller details where time permits. The best part of this is that as you move from large area to large area and cross things off, you start to get on a roll. Looking up at a huge whiteboard with tons of things crossed off gives you the feeling of accomplishment. I’d rather cross off ten small to-do items in a day than one large to-do item in two days. And let me be clear, it isn’t starting with a large to-do list. Large to-do lists never get done. You start with a small to-do list and as you cross off things because they’re good enough, you add much smaller to-do items to another list. Don’t keep adding things unless you’re also crossing things off.
But, it isn’t just the feeling of accomplishment. Because you’re worrying about the details later, the entire project progresses forward faster. If you need to ship something large in two weeks, you can still ship it if the majority of things across the board are done without worrying about completing every little tiny thing in each section before moving on to the next section.
I usually end up being able to complete almost everything in my arbitrary timeframe, but by doing things this way, it lets me easily evaluate the necessity of specific items. I believe that constantly adjusting scope to what’s important now rather than blindly implementing some predetermined “feature list” is the only way to ship software on time. Who knows, by the time you ship, you may circle back to some little fringe feature that you realize isn’t even necessary anymore.
Set a date and ship the damn thing.