A dependency occurs when one deliverable is needed in order to make progress on another deliverable. Dependencies can occur at many different levels – one task may be waiting on another, one project may be waiting on another, and even one organization may be waiting on another.
The word “dependency” is often misused, for example, if we said “the project is dependent on having enough resources in place”, we are referring to a general dependency on a particular resource pool, and not a dependency in a project sense. Because of this it is a good idea to cross check your dependencies to ensure they are not risks, assumptions, issues, or constraints on your project.
There are only three underlying reasons why a dependency can exist. There are:
- Logical Reasons: for example, it is impossible to eat a cake before it is made. In essence, the Make Cake stage must logically come before the Eat Cake stage.
- Resource Reasons: it is possible to bake 100 cakes at the same time, but we only have one small oven.
- Discretionary Reasons: I want to bake a chocolate cake before I bake the cake containing figs. This is because I prefer chocolate cake to fig cake, so I choose at my discretion to bake the chocolate cake first.
Although there are three underlying reasons why dependencies can exist, there are actually four different types of dependency. These are known as finish-to-start, start-to-start, finish-to-finish, and start-to-finish dependencies.
Finish-to-Start Dependencies (FS)
This is the most common type of dependency. With this type of dependency, then given two tasks, the second task can’t start until the first task has finished. Cooking pizza is used in the example below to shows that we must prepare both the topping and base before we can cook the pizza.
Start-to-Start Dependencies (SS)
This type of dependency simply requires that the first task has begun, not that it is finished, before the second task can start. Going back to our pizza example, given no resource constraints, then there is no reason why we can’t prepare the toppings as we prepare the base.
Finish-to-Finish Dependencies (FF)
This type of dependency simply requires that the first task be finished in order for the second task to finish. Both tasks do not have to complete at the same time, and the second task can be completed at any point after the first task completes. In our pizza example, after the pizza is cooked, we deliver it. We could use a finish-to-finish dependency to show that we take payment for the pizza during this delivery process, and that the delivery step doesn’t finish until after payment is taken.
Start-to-Finish Dependencies (SF)
With this type of dependency we are saying that the second task cannot complete until the first task is started. The second task can finish at any point after the first task starts. In our example we could say that the process of billing the customer begins as soon as the order is received from the customer, but isn’t completed until delivery begins.
Putting all the different dependencies together around our Pizza example we end up with the following project plan:
There are four different dependencies you need to be aware of when planning projects and programs. These are finish-to-start, start-to-start, finish-to-finish, and start-to-finish. I hope that by looking at the example you can see how understanding the differences between these dependencies, and their nuances, enables you to better plan your projects and programs.