Thursday, December 9th, 2004
When I finished VoodooPad 1.0, I told myself I would write a post-mortem about my experiences working on it. Only I never did that. Then when I finished 1.1 told myself I'd really do it this time. Bzzt. Ok, this time I really mean it.
So here's my VoodooPad 2.0 post-mortem. Let me just preface this by saying you won't find anything new in here that you haven't already read about somewhere else. 99.9% of the techniques and ideas used I just took/stole from books, websites, or just talking to people about what they do.
Also, part of the reason I'm writing this is so I can look back in a couple of years and think to myself "Wtf was I doing that for? Was I really that much of a moron?" and maybe get a chuckle out of it. That comes to mind sometimes when I look over old code I've written.
There is also going to be lots of programmer speak in here, so if you don't get excited about that you might just want to go visit some other site for a while. Ok, so let's start off with the mistakes I made working on VP 2.0:
BAD: Sticking an outliner in VoodooPad.
I don't think I ever showed it to anyone except a couple of people at the day job, but at one point I had the beginnings of an outliner in VoodooPad. It was kind of fun to use, and it was useful, but it was wrong. VoodooPad is a desktop wiki, not a freaken' outliner. Focus Gus, focus. I did sort of make a compromise with this though, the auto-bullets feature + text shifting is like a poor man's outliner.
So the lesson learned here is to stick to the core of what an application is, and improve on it in ways that will make what the application is better. Duh. I knew that, you knew that, but I kept on getting feature requests for it and it seemed like such a good idea...
BAD: Switching to a new file format and breaking VoodooPad for long periods of time isn't good.
In fact, it's really depressing. I use VoodooPad every day, and I always use the latest builds. So not being able to use it left me in a bit of a bind and actually stalled development. Sometimes this technique works on software projects, but in my case it certainly didn't.
Here is what happened: I worked quite a bit in moving VP2 over to SQLite for it's data store. The new format worked pretty good- but I also kept at the same time the older plist format. I can't remember why. Probably so I could keep on using VP in the interim.
But in order to have both formats around, I had to juggle the document classes- NSDocument was extended by VPBasicDocument which had the most common code. And that was extended by both VPLocalDocument and VPRemotePage (online editing, ya.), and then VPLocalDocument was extended by VPSQDocument and VPDocument (which was the original class that did all the data store). Having 3 different ways to get at data sucked, so I dropped the whole sqlite thing.
But I really want to come back to sqlite in the future since it provided lots of great benefits like using less memory, and being quite a bit faster for larger documents. I got a dump of CocoaDev for testing, and stuck it in both the plist format the the sqlite format. The differences were very noticeable.
I could also file this mistake under "Don't bite off more than you can chew".
BAD: Not letting people use the latest builds from the very beginning.
I love feedback. Positive feedback, negative feedback, it's all good to me. It drives me. The #1 thing that really got me on the track to finishing 2.0 was showing it to my friends at WWDC, and handing out some private builds. I got feedback right away, and that kicked my ass into gear.
But at the same time I didn't want the whole world to download it. It had warts, and it had bugs. And first impressions are very powerful. I didn't want someone downloading VP to see temporary buttons and other placeholders and thinking "This is crap". Chances are they would never download it again no matter how better it got.
So that's when I setup a little "private beta" group, where you gave a little effort and filled out a form to prove your worth. And pretty much as long as you didn't say anything about my fianceé you got access to it. (What the hell was that guy thinking? It wasn't anything dirty, but... strangers just shouldn't be talking about another guys' woman. He's lucky I didn't send out a pack of ninjas to come kick his ass.)
Ok, this is really a holdover from VP1. There was a preference where you could say "let my windows be metal". I figured, hey, what they heck- I don't have to use it, and some people seem to like it. That's all fine an dandy until a MacWorld editor turns it on and takes a screenshot of it to put in their magazine. Freaken' A! Those buttons were meant for an light background, not some metalish monstrosity! So I took that option out for 2.0. And if you had the pref still set from 1.1, the checkbox is there in the preferences window to turn it off but as soon as you uncheck that button, POOF, the option disappears.
Ok, that's enough bad stuff, time for the positive side:
GOOD: Plugin API
I love the plugins api. Someone asked on the FM Board how to get attachments out of VoodooPad, and I had to say "You can't". Then I wrote a quick plugin and I got to say "Call me a liar, yes you can." I've got 100 ideas that don't really belong in VoodooPad, but there's no reason they can't go in a plugin.
GOOD: Automated builds.
I've got a single command that I can type in the shell, which will pull the VP source out of subversion, compile it + VP Lite and the plugins, script FileStorm to make my disk images, and scp them up to the "latest builds" location for my daring beta testers to download. This is the exact same process I use for the final build as well. Consistent, effortless builds are the way to go.
GOOD: Moving to Subversion.
Subversion is a great versioning repository. VoodooPad started out with CVS, and I originally told myself I would switch to subversion once I was done with 2.0. But at some point over the summer I just couldn't take it anymore. I probably just wanted to rename a folder or something insanely simple like that, but which CVS just does not support.
It's not until you switch to something like subversion that you realize what a crutch CVS can be. I don't want to rip on CVS too much since it's saved my butt in the past, but it really does hinder development when you can't move things around like you need to sometimes.
GOOD: Installing exception handlers and auto-collecting crash reports.
At startup, if VP notices that there's a crash log it'll ask if it's ok to send that off to the FM servers. I've gotten lots of great data that way- and even if I can't always reproduce the crash I know the general area to be looking at, and over time those crashes just go away (once I've fixed the bug and get the new builds into peoples' hands of course).
GOOD: Version checking.
VoodooPad will check for new versions at startup if you say it's ok. Along with the query to my server I send the AppKit version so I can collect statistics on what version of the OS my customers are using. Right now 10.2 is at 3%. That's good to know :)
GOOD: Charging an upgrade fee.
I was actually pretty torn about doing this. I was afraid people thought I was trying to milk them for cash somehow, but that reaction never really came. I had 2 people complain about the upgrade fee, and a handful thank me for it. I didn't expect that at all, I expected people showing up at my door with axes and chain-saws ready to drag me out into the streets.
People bought the upgrade- in fact more than I expected to. I know how many people bought VoodooPad, but I've really got no idea how many actually use it. And to see the upgrade purchases go by really makes me feel like I've written something useful for a group of people. I don't know how to put into words what that feels like.
And last, but probably the most important good thing:
GOOD: No set date for delivery.
It's done when it's done.
I didn't always feel this way about 2.0. I had a date of August for the final release when I started getting into serious development of it. I even pre announced that purchases after June 1 get a free upgrade. But August just kind of flew by. And I was getting really frustrated by "being late".
At one point I when I was working and getting frustrated at it not being done, Kirstin basically said to me "So what?". Since I'm doing this in the evenings and weekends there is no penalty for being "late"- it's not a mortgage payment. And by rushing it I was starting to make compromises that I didn't want to make. So I just sat back and relaxed, and let the positive vibes just flow. I'm certain that VoodooPad turned out better for it as well.
When I had the final candidate done I just sat on it for 10 days waiting for the last critical bug to come in. It never happened. I casually got the website ready and when the 10 days were up, I released it. And I got more sales than bug reports, so I figure I must have done something right :)
There is plenty more I could say both about the good and bad, but I'll save those for some other time. I've got a couple of bug fixes lined up for 2.0.1 and plans for what's going into 2.1, as well other projects in the works (Flying Meat can't just be a one trick pony after all).
I climbed the Grand Teton once with a good friend of mine. It was probably one of the hardest and most rewarding things I've ever done. While I didn't feel it at the same magnitude, on the inside finishing VoodooPad 2 reminded me alot of that trip.
-- posted 12:17 am