In this tutorial you will learn how to:
When you are planning multiple projects while having a dedicated team for each project, you most likely don’t have the need to schedule multiple projects at the same time.
As soon as some employees are involved in multiple projects in parallel, or tools/rooms/hardware are required, which have to be shared across teams and can not be used by multiple workers at the same time, things become more difficult.
TaskFalcon can help you to create a plan which keeps track of the availability of shared resources.
Since we already have created a project plan in the first tutorial, we’re not going into the details of adding a second one. Let’s assume that the second project is going to implement a mobile application.
Similar to the last project, this requires the implementation of a backend service.
Instead of a web frontend, we now need to develop an application for mobile phones. The backend will again be developed by “Barbara Backend”, while the mobile app will be implemented by “Moses Mobile”, who will work 6 hours per day, excluding Wednesdays.
Lastly, we assume that the app development starts a week after the first project, so that both projects overlap.
Other than that, the second project looks exactly like the first project:
# File: second-project.yaml project: start: 2020-06-08 name: My First Mobile App resources: - resource: BackDev name: Barbara Backend workingtime: mon, tue, wed, thu - resource: MobileDev name: Moses Mobile workingtime: mon:6h, tue:6h, thu:6h, fri:6h - filter: 1hSupportPerDay dailymax: 1h tasks: - task: T1 name: Software design efforts: 5d assign: MobileDev+BackDev - task: T2 name: Create Backend efforts: 5d depends: T1 assign: BackDev - task: T3 name: Create Mobile App efforts: 8d depends: T1 assign: MobileDev - task: T4 name: Testing efforts: 2d depends: T2, T3 assign: MobileDev,BackDev - task: T5 name: Customer Review depends: T4 length: 5d efforts: 4h assign: MobileDev.1hSupportPerDay - milestone: M1 name: Delivery depends: T5
We can now run
TaskFalcon on the second project file:
# Terminal > falcon -show-closed-tasks second-project.yaml
The result will look like this:
Now we have two projects, where each project has its own definition of resources.
This approach is perfectly fine and
TaskFalcon supports this, even if you are going to plan multiple projects with overlapping resource definitions.
But imagine you need to plan 10 or more projects, which all will be done by the same set of people. Wouldn’t it be much nicer to have a separate resource definition and use it from all projects?
Let’s just create a separate file with just resources and call it
# File: resources.yaml resources: - resource: BackDev name: Barbara Backend workingtime: mon, tue, wed, thu - resource: FrontDev name: Freddy Frontend dailymax: 4h - resource: MobileDev name: Moses Mobile workingtime: mon:6h, tue:6h, thu:6h, fri:6h - filter: 1hSupportPerDay dailymax: 1h
Now let’s change
second_project.yaml to import the contents of this file.
For this, we are using the import statement, which will import resources, tasks and updates from other files. Since
resources.yaml only lists resource definitions, it will only import those, of course.
# File: second-project.yaml project: start: 2020-06-08 name: My First Mobile App imports: - resources.yaml # Imports resources, tasks and updates from a separate file # If this file is in a different folder, you need to specify # the relative path to the target file tasks: # not showing task definitions, since they're the same as above
Now you do the same on your
first-project.yaml from the previous tutorial
# File: first-project.yaml project: start: 2020-06-01 name: My First Web App imports: - resources.yaml tasks: # not showing task definitions, since they're the same as before
I would not recommend to let
TaskFalcon schedule resources with 100% utilisation.
There are always planned and unplanned diversions, which will reduce the full capacity, like:
If you’re estimating efforts of a plan sincerely and honestly, I would recommend to set the
dailymax setting for each resource to 1-2 hours less than the actual availability of this resource. You can always update the plan if things go faster - but escalating delays is much more unpleasant.
Now we’re already sharing the resource definitions between two projects, but the projects will still be scheduled independently.
To leverage the full power of
TaskFalcon, we need to combine both projects in one big super-project.
Fortunately, we don’t need to change the original project files or join the contents manually. The original files will remain as they are and you can keep editing them independently of each other.
To combine the two projects, we are going to create a third project, which will just import the first two projects. We will name this file
# File: all-projects.yaml project: start: 2020-06-01 name: Website + Mobile App imports: - first-project.yaml - second-project.yaml
Now we can run
TaskFalcon on the new project file:
# Terminal > falcon -show-closed-tasks all-projects.yaml
TaskFalcon will now gather all tasks and resources from both import files and merge them together in one project.
It will also create a new group as a container for each project and determine the name and start date from the project definition of the imported files.
Let’s assume that we have the same customer for both, web app as well as the mobile app. Their project manager just told us they want to start testing their new website and mobile app on the 13th of July. So they don’t mind a delay of the website, which currently would be done by first of July, as long as website and mobile app can be delivered on 13th of July.
As we can see in our current plan - the mobile app wouldn’t be done before 23rd of July. When looking at the gantt chart with resources, we see that a lot of time is wasted in the design phase of the mobile app, due to the fact that “Barbara Backend” is blocked by the development of the website backend, so the design phase will only start on 16th of June.
Let’s make the following change in the
# File: second-project.yaml tasks: - task: T1 name: Software design priority: 200 # Explicitly gives this task a high priority efforts: 5d assign: MobileDev+BackDev
After scheduling the project again, we get those results:
Awesome. Seems like now we can deliver both apps on 13th of July.
(Yeah, I know this looks staged. Well - it is. But keep in mind that this tutorial is just about teaching you the concepts of
TaskFalcon - not about realistic scenarios :-))
In order to reap the benefits of combined scheduling, you need to run
TaskFalcon with a combined project file.
However, it might be undesirable to see all the tasks of your plan with 20 projects and 800 tasks in one huge gantt chart.
But to see if everything is on track, it is still nice if there was a reduced overview gantt chart.
TaskFalcon provides a couple of command line options to create overview charts.
You can find more details on the command line overview page.
By using the option
TaskFalcon will strip all tasks from your project chart. But it will still show groups and milestones. Let’s see how this looks:
# Terminal > falcon -show-closed-tasks -no-tasks all-projects.yaml
In this example, we only see the top level items, since we didn’t use groups inside the projects to organise the task tree hierarchically.
If you have more groups on deeper levels, you can use the command line option
-max-depth <number> to limit the maximum depth of the task tree on the gantt chart.
# Terminal > falcon -show-closed-tasks -no-tasks -max-depth 0 all-projects.yaml
We now have a good overview over all projects. But what if the sub-projects were contributed by different people and they are not particularly interested in other projects?
For this scenario, you can tell
TaskFalcon to schedule the full project, but only render a subset of tasks.
Before we can do this, we need to understand how task IDs are calculated.
Each task in the
YAML file starts with a unique identifier. If you are using groups to structure your tasks hierarchically, those groups will also have unique identifiers. By concatenating all those identifiers (separated by a ‘
.'), you will get the fully qualified ID of a task.
See Task/Milestone/Group on the task configuration page for more details.
When you import other projects into a combined project file,
TaskFalcon will create a new group for each imported file.
This group will be given the name of the imported file (e.g.
second-project, if it was imported from a file with the name
You can ask
TaskFalcon to show you an overview of those IDs by using the command line parameter
-show-ids to display the fully qualified identifiers instead of task/group names.
# Terminal > falcon -show-closed-tasks -show-ids all-projects.yaml
If you want to show only a subset of the tasks, you can use the
-prefix <name> command line argument. It will only show tasks on the chart, whose IDs begin with the given prefix. However, it will still use all projects and tasks for proper scheduling.
# Terminal > falcon -show-closed-tasks -prefix second-project all-projects.yaml
There is another convenience command line parameter to simplify rendering gantt charts for each of the imported sub-projects.
-sub-projects will render one set of charts for each sub project. However it will not render charts for the main project file itself:
# Terminal > falcon -show-closed-tasks -sub-projects all-projects.yaml Loading 'all-projects.yaml' Loading './first-project.yaml' INFO: Importing resource 'BackDev' from 'first-project.yaml' INFO: Importing resource 'FrontDev' from 'first-project.yaml' INFO: Importing filter '1hSupportPerDay' from 'first-project.yaml' Loading './second-project.yaml' Loading './resources.yaml' INFO: Importing resource 'BackDev' from 'resources.yaml' INFO: Importing resource 'MobileDev' from 'resources.yaml' INFO: Importing filter '1hSupportPerDay' from 'resources.yaml' INFO: Resource 'BackDev' already exists in parent file. Discarding resource from 'second-project.yaml' INFO: Importing resource 'MobileDev' from 'second-project.yaml' INFO: Filter '1hSupportPerDay' already exists in parent file. Discarding filter from 'second-project.yaml' Finished scheduling on 2020-07-13 00:00:00 +0000 UTC Exported chart to 'first-project.gantt.png' Exported chart to 'first-project.gantt-with-resources.png' Exported chart to 'first-project.resources.png' Exported chart to 'first-project.resources-with-tasks.png' Exported chart to 'second-project.gantt.png' Exported chart to 'second-project.gantt-with-resources.png' Exported chart to 'second-project.resources.png' Exported chart to 'second-project.resources-with-tasks.png'
You are now (on the way to become) a master of multi-project planning.
In the next tutorial we will cover the art of tracking projects.