A couple of weeks ago, I had another "bright idea" -- a website full of puzzles... "a house that the wealthy toymaker was to build. A strange house, a house that scared people..." The task looks fairly straitforward -- make a website similar to the UVa online judge or Sphere, only simpler and not targeted at computer programmers. It seemed like a couple of weeks worth of work that I could do on my free time. So I went into my "projects" directory and realized that I was about to repeat the same mistake.
How could I make sure this was not going to become another "90%-finished" project? I needed a way to track my progress, estimate the difficulty of each task and predict the time each task would take to get done. As reluctant as I was to admit it, I needed a project manager!
Step 2: Find the cheapest solution
I started having flashbacks of UML diagrams, flow charts and team meetings. Oh, the horror! I'm not doing any of that; not voluntarily! What is the minimum possible amout of boring non-programming work I could do to solve my organizational problem? What tools do I need? What fraction of my time should I spend organizing tasks? The problem didn't look too difficult. After all, I had no people to manage, no meetings to schedule and no deadlines to meet. All I had to do was ensure some minimum level of progress over time to prevent the project from freezing at the 90% mark.
Here is what I came up with. I wrote down a list of the features I wanted to have in version 1 and made a decision to release my first version as soon as those features were done. I ended up with a list of 8 features.
As soon as I had these featuers completed, I would release the website to the public and let people play with it. That would give me a chance to fix bugs and get ideas about the set of features I should work on next. Writing down this list took about 10 minutes.
Next, I made a promise to myself that I would try to look at this list every day, or whenever I had at least 30 minutes to work on my project. Whenever I would look at the list, I had to perform one of the following actions.
- Complete the top task on the list.
- If the top task is not what I should be working on next, move that task down in the list.
- If the top task is too difficult to complete in 30 minutes, remove it, split it into several smaller tasks and add those to the list instead.
The goal was to force myself to make some progress every single day.
I kept a progress indicator in my gTalk status message. It started at 0/8, but soon became 2/10, then 3/12, then 5/12, then 7/14. Both the numerator and the denominator were growing fast, as I contined to complete and divide tasks. I got to "50% done" in a couple of days. By the end of the first week, I was at 13/20 (65% done). After the second week, I was at 19/30 (63% done). I started getting smirky messages from my friends, confused by my negative 2% of progress on "whatever it is I'm working on". I was creating tasks at a faster rate than I was completing them. That is not surprising -- by that point, I started running out of easy tasks and started splitting difficult ones into a large number of smaller, easier pieces. I knew this trend had to end, so I was not worried about the "negative progress".
That is, until I hit a wall. The next task on my list was "A way to create an join teams". I wanted my users to log in with their individual user names and passwords. They would then be able to join teams with each other and solve puzzles together. I would compute team statistics (like the number of puzzles solved) and rank teams accordingly. I also had the great idea of automatically assigning users to certain fixed teams, like their "country team" or their "university team", which would give me a unified way of computing country and university rank lists.
This turned out to be very difficult to do in Google App Engine. I went through a number of designs and rejected all of them for various technical reasons. For 3 of 4 days in a row, I had made no progress. There was no way to split the difficult task into smaller pieces, and I could not find a good solution. I tried pushing it down the list and working on other tasks, but eventually I had to face the wall. Things looked bleak.
With no good solutions in mind, I gave myself two new abilities.
- Remove a task from the list.
- Add a new task to the list.
These could only be used in situations of crisis, like the one I was faced with. I decided to abandon the idea of teams and instead find other ways to promote cooperation among the puzzle solvers. I decided to add a forum, or a discussion board, and a page of generally useful puzzle solving hints and tools.
Similarly, I decided to let go of the idea of timed contests. Instead of forcing people to be logged in at a particular time on a particular day, I would instead promote a more casual, less competitive atmosphere. Competitions tend to alienate girls, and there is no reason to drive away half of my audience.
Another week went by, and I was at 30/34 tasks on my list. The remaining four were all easy and well-defined, and the website was beginning to look usable. I recruited a few of my friends to be alpha testers. They gave me some great ideas and bug reports that I turned into a few more tasks to be added to the list. After about a month of work, I was at 39/39! 100% done. Of course, there were lots of things I could improve, but a deal is a deal -- it was time to release version 1.
Step 3: Profit!
HenryStauf.com was born. I posted a link to the TopCoder forums and watched the little wave of requests coming in. The site looked ugly, and it had a few bugs, but it worked, and people seemed to enjoy my puzzles. In the weeks since then, I fixed a few bugs and added a few more puzzles. The task list is still growing, and I am going to make similar lists for some of my other unfinished projects.
What have I learned? Estimating the time required to complete a project is hard! Something that looks 90% done probably isn't. People tend to work on the easy parts first and leave the difficult parts until the end. Sometimes, you have to rethink your goals and re-prioritize your features. A tiny bit of bureaucracy helps. Project managers are useful, even when you only have one person on the team.
If you like finishing projects more than you like starting them, I envy you. If you are instead like me, try the task list method and let me know whether it works for you.