Relative Sanity

a journal

This was an article that I originally published way back in 2008. I think it’s still relevant, so here’s a slightly updated version.

When freelancing, I like my prices to make sense. This usually means justifying the cost of a particular job by being able to demonstrate to the client the effort involved in a particular area. It’s also useful to know what particular features are expensive because they are difficult, and what ones are expensive because they’re valuable.

To do this, I use OmniPlan from The Omni Group. I love Omni’s software (OmniFocus runs my life, and OmniOutliner stores most of my most important notes), and OmniPlan is built with the same attention to detail as the rest of their apps.

Outlining the effort

The key thing for me is the fact that it uses an outline view for building up your project. Just like OmniOutliner, you can happily drill down deeper and deeper into each “node” in the outline. Each node has a number of attributes, the key one being “Effort”. The amount of effort assigned to each node then translates into a bar on a Gantt chart, and also an addition to the project cost, once you’ve told OmniPlan who’s working on that node, and how much they cost per hour.

Over the many years I’ve been doing this, I’ve developed a standard software development template that stubs out most of the tasks I carry out during a project. Just like any good outliner, the nesting facility means that I can group the project into discrete blocks, which is great for being able to produce a “top line” summary of what each area of the project will cost.

Core outline

Where do all these top line numbers come from? Let’s expand out all the items in Core Development outline:

Expanded core outline

As you can see, the project timeline can now start to build itself from the bottom up. Every task starts out with one hour assigned to it. My first task at the start of a costing is to go through the default outline and prune what isn’t needed for this project, before adding in what is needed. I then go through and start to apply time estimates to each task based on previous experience and “best guess” work.

Bubbling up the costs

The great thing about OmniPlan is that it tends to remove the best guess factor from most tasks. Let’s say, for example, that in my first pass I reckon that I’ll need 4 layouts:

Four layouts needing visual design

I reckon each layout is going to take me half an hour to do, so in they go, and suddenly my visual design budget sits at 2 hours. If I realise I need more layouts as I plan the project, in they go and bump up the cost in a fully justifiable way.

Let’s say, though, that I reckon one of those layouts is particularly complex because there are lots of variations. I might not have a good handle on how long, say, a progressively enhanced “personal content aggregator” might take to design. No worries – I can nest the various sub-tasks to come up with a proposal:

Moar design!

I now have a better feel for how easy or hard that’s going to be. This is all the kind of stuff you do when planning a project anyway, but the fact that you can make simple changes to subdivisions of tasks and have them percolate up your estimates automatically is a real boon for tracking complex projects.

Show me the money

Once I’ve gone through and assigned time estimates to each part of the project (practically writing the spec as I go, incidentally), I can then use OmniPlan to build timescale estimates and cost them up.

First I switch to the Resource view:

JB, get to work

By selecting me (or creating a new resource) and viewing the inspector panel:

He costs how much?

I can set hourly rates, and how “available” I am for the project. No, I don’t charge £100 per hour for development. I wish I did.

Back to the Task view, and I expand all tasks, select all, and choose Structure -> Assign Resource -> JB. This hammers through all the hourly estimates and gives me a cost based on my hourly rate, as well as displaying a project total in the status bar at the bottom of the window. By selecting View -> View Options then enabling “Total Task Cost” in the Outline Columns pane, I can now see how my top lines work out:

Fat stacks. Yo

If you click in the status bar in the bottom, it will cycle through various notes on the project. One includes a total project cost, as shown here.

Awesomeness!

Time keeps on slippin’

Next up is to get a timescale plan. Usually, to the right of the outline we get a Gantt chart. I tend to collapse it while I’m outlining by dragging the divider all the way over to the right.

The Gantt chart is smart enough to build up a timing plan automatically based on how many people you have working on the project, how available they are, and what dependencies you build into the project.

Since we’ve only got one person working on this full time, we can’t have any concurrency, so it’s all about the dependencies. As you can see, there are some small arrowed lines running from the end of each task group to the beginning of another:

I can still hear you saying you would never break the chain

Each one of these arrows represents a dependency, and we set those up quite simply by hovering over any task in the Gantt chart, grabbing one of the arrows at the end, and pulling it to the start of any other task that depends on it. We can set up prerequisites too, pulling arrows from the start of a task up to a task that it depends on.

For more complex dependencies, we can use the inspector, selecting a task and dragging other tasks into the Prerequisite or Dependent lists as required:

Depend on it

This ensures that our Gantt chart never schedules anything before its pre-requisites are completed.

Once all THAT’s done, we select all the tasks and choose Project -> Level Resources. This rebuilds the Gantt based on what we’ve said about the project, and gives us a good estimate of how long the project will take to complete.

All you do is write code, right?

The final super-smart thing about OmniPlan is the ability to restrict a Resource’s availability. Go into Calendar view, and select your resource. By default, that resource is made available to the project full time. Let’s say we only want to spend half of each day on this project, the rest of the time left for maintenance, admin, phone calls, email, and other freelance stuff. Simple – just make sure that the “Normal Hours” for your resource is set from 8am to 12noon (just drag on the calendar like in iCal).

Workin 8 till 12!

Now if we go back to the Task view and run Project -> Level Resources again, we’ll see that we now have a much longer looking Gantt chart:

S t r e t c h

Even better, we can see that the Duration of the project (see the status bar, click again to cycle through the various bits of info this can display) is over nearly 3 days, but the actual effort involved spans just under 2 days.

Now all we need to do is write up a proposal based on these timings and specs, send to the client, and wait for approval so we can bill them their deposit.

You do charge your clients deposits, don’t you?