inessential by Brent Simmons

How I get started on a new app

I’ve been working on small-ish apps lately. Web apps and Cocoa apps. Here’s how I get started on a new app.

1. Define precisely what it does. I may or may not write it down—the goal is the feature list should be so small that I can keep it in my head without even trying. Also, the app should be describable in one sentence, even if that one sentence doesn’t cover all the features.

2. Sketch out the user interface. I use actual pen and paper. I may make several sketches until it’s right. A few days may pass between sketches as it gels in the back of my mind. The final sketch has labels and arrows so there’s no question of what does what.

3. Layout the interface in Interface Builder (if a desktop app) or with BBEdit and a web browser (if a web app). There may be iteration here, and I may have to go back to step 2.

4. Write a list of milestones. They should be simple, very fine-grained. The first milestone is usually just a do-nothing app that builds and displays the interface. The second milestone will do some small thing with hard-coded data. I’ll usually write down the first five or so milestones. I do not do a milestone list that takes me to the final product. Why not? Because I know to expect the unexpected. So what I do is add to the milestone list as I go along. I won’t know what milestone 10 is until I do milestone 5, for example.

I do fine-grained milestones because otherwise I get discouraged. I like crossing items off lists, and the more often I get to do that, the happier a developer I am.

I also use pen and paper for lists instead of a computer so I don’t have to switch out of my development environment to look at my list.

5. Now vee may perhaps to begin... In other words, get to milestone 1 and keep going.

I don’t necessarily advocate this process, by the way, I’m just describing how I personally get started on a new app. Note that I’m not working on a team or doing apps to someone else’s specs, both of which would require different processes.