I've been thinking a lot about task dependency over the last few days, and while what I initially thought I wanted was subtasks, it isn't. What I really want is task dependencies. After finally finding a few tools that supported subtasks, I found that what I wanted to do with them was really awkward.

The use case for this for me is that you look at a list of tasks and realize that you can't complete one without first completing another. I look at my list of tasks frequently and each time I have to realize that that one task is dependent on another is time wasted. So I would then want to mark that task as dependent on the other task. At that point, that task would be hidden from my list of tasks until its blocking task has been completed, at which point it would reappear in the list of tasks.

A trivial example is:
  1. Read "Getting Things Done"
  2. Purchase "Getting Things Done"
I obviously can't read it before I purchase it, and I don't want to be reminded to read it until I can actually do so. So I mark task 1 as dependent on task 2 and then my task list looks like:
  1. Purchase "Getting Things Done"
When I mark that task as complete, my task list suddenly looks like:
  1. Read "Getting Things Done"
It seems like this is doable with sublists, but it's not. Here's an example:
  1. Install Apache
  2. Install Linux
I can't install Apache before I install Linux. Fair enough. I mark task 1 as dependent on task 2. In the naïve sublist implementation, this looks like:
  1. Install Apache
    1. Install Linux
Now I realize that I also want to install MySQL:
  1. Install Apache
    1. Install Linux
  2. Install MySQL
I can't install MySQL until I install Linux, so I want to mark task 2 as dependent on task 1a. But with a sublist implementation, there's no way for multiple items to depend on a single item. You'd have to have some sort of group item containing both Apache and MySQL that depends on Linux, and then once Linux is completed, for that group item to explode into its constituent items.
  1. Install Apache / Install MySQL
    1. Install Linux
And then you get into problems with dependencies in the other direction. Say I now want to install PHP. But I have to install Apache first. But it's now part of a group with MySQL, which PHP doesn't depend on.

It's probably possible to come up with ways to force these scenarios into being represented by sublists, but it gets really awkward really quickly, and then you end up wasting time trying to figure out how to create the structure of your lists instead of doing productive work.

That said, having a more abstract dependency model can end up making things hard to visualize. I think the middle ground is to merely notice these dependencies as they arise in your task list and just mark them then. There's (probably) no reason to delve deep into the planning process for this sort of thing. Notably, making sublists forces you into that mode, assuming that your project gets even remotely complicated.

I think that the real answer is just to recognize that one task depends on another when it occurs and mark that dependency then and forget about it. That way you're not wasting time doing ridiculous planning, but you're also not repeatedly wasting time remembering why you haven't started on that one task in your list yet.
_________________________
Bitt Faulk