I've noticed a common theme among the projects in trouble I've encountered over the past few months: functional milestones without deliverable milestones as a part of the functional milestone. Here are examples of functional milestones: “requirements complete,” “code complete.” These milestones raise these questions for me: How can you know something is complete when you're dealing with software, and how do you know the milestone itself is met? (I'll get to “complete” later, maybe tomorrow.)
Milestones are met when all their sub-tasks are met. For requirements to be complete, the requirements for each deliverable has to be complete. If you're building a system with three features, then the requirements for features 1, 2, 3 all have to be complete before you mark the milestone as met. People understand this when I talk to them. But, they don't always include each of the specific completions as sub-tasks. A common reason is “It's too much work to put all those tasks/sub-milestones into the project plan.” Whoa, baby. Stop right there. If it's too much work to create a project plan that tracks deliverables, why do you have such a big project? The project teams have to track their work to this level of detail, or they never meet the milestone. Oh, the people are well-intentioned and think they've met the milestone, but they haven't — because they're not tracking all the deliverables that make up the milestone.
If you're faced with a daunting schedule because you have so many interdependent handoffs, make the project smaller. Move to iterations, start fewer simultaneous mini-projects, add more project managers, whatever it takes to be able to get your arms around the project. But whatever you do, create deliverable-based milestones. (Agile lifecycles only have deliverables; that's one of the reasons status is so easy to see.) Project teams (and PMs) can track deliverable-based milestones. They can't easily track functional milestones. If the project isn't on track, it's easy to see with deliverable-based milestones. Functional milestones can hide whether something is “complete” or not.