Tracking Projects

In this tutorial you will learn how to:


What could possibly go wrong?

You might wonder what this tutorial is about, since you already know how to schedule a multi-project scenario.

In a perfect world, when there is no change in circumstances and everything always works out as planned, you probably wouldn’t need this. If you are in this situation, feel free to stop here and let me know where you are living and what business you’re in. Seriously - I want to know!

For everyone else: The art of tracking a project helps to detect resource problems or slipped deadlines in advance to bring things back on track or escalate problems early on.

Let’s have another look at the previous tutorial. In the section Tweaking projects to meet deadlines, we’ve changed the priority of a task to meet a deadline.

Let’s imagine there are two project managers using TaskFalcon. We will call them Webby, who is taking care of the website project and Abby, who is taking care of the mobile application. After Abby created her project plan for the mobile application the two plans looked like this:

first-project.gantt.png:
GANTT chart

and

second-project.gantt.png:
GANTT chart

Let’s now assume Webby already communicated the delivery milestone on 1st of July to her customer.

Now Abby tries to tweak her project plan to speed up the delivery of her project by increasing the priority, as we did in the previous tutorial.

second-project.gantt.png:
GANTT chart

Awesome, Abby improved her delivery date by 10 days. Life is good.

Or is it? Let’s have a look again at Webby’s project plan.

first-project.gantt.png:
GANTT chart

Of course, since TaskFalcon can not magically create more resources (I’m working on it - but don’t expect results soon…), Abby’s changes have delayed Webby’s delivery day. In this case it’s just by one day - but I’m sure you can imagine that it could have gone worse easily.

While you could say this was to be expected, it actually is a problem. The main problem here is that Webby might not even notice this delay until it is too late and she has to confess to her customer that she can’t deliver on time for reasons completely out of her control.


Don’t change things directly you wouldn’t know right from the beginning

Why did this go south?

When TaskFalcon schedules your project plan, it doesn’t matter whether the project lies in the past, present or future. TaskFalcon always sees the whole set of tasks and schedules it from the beginning to the end. TaskFalcon can not see when you’ve changed something in your project file, in order to decide whether an implicit change was intended or not.

This can result in changes that can alter the past and the future (again - for TaskFalcon past and future means nothing - at least with what we’ve learned so far). Since the past has already happened, it will probably deviate from the plan and it is likely to affect the future as well. And if you have deliveries planned and communicated with a customer, those releases might get moved without a warning and maybe without someone noticing it until it is too late.


Adding updates to change the project incrementally

In order to apply changes to the project safely, you need to tell TaskFalcon a date from which on the changes should be applied.
This can be done with updates.

An update consists of a date and a list of changes for resources and tasks.

Let’s revert the change of the priority and make it part of an update instead:

# File: second-project.yaml
project:
  start: 2020-06-08
  name: My First Mobile App

imports:
  - resources.yaml        

tasks:
  - task: T1              
    name: Software design 
    # priority: 200             # Removed change of priority here
    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

updates:                  # All updates start with an update section, which contains a list of updates
  - update: 2020-06-08    # Each individual update contains a specific date
    tasks:                # An update can contain changes to tasks and/or resources
      - task: T1          # A task inside an update needs to be referred to with a fully qualified task identifier
        priority: 200     # Inside the task setting, you can change any task property you like

Let’s see what happened to Abby’s plan.

# Terminal
> falcon -show-closed-tasks -sub-projects all-projects.yaml

second-project.gantt.png:
GANTT chart

Wait, what happened here? The task Customer Review finishes on 13th of July, but the Delivery Milestone is stuck on 23rd of July. This must be a bug, right?
No, this is actually the intended behaviour. The reason for this is to avoid changing milestones accidentally. If an update is supposed to reschedule a task or milestone, which is not directly, but indirectly affected (i.e. due to dependencies), you need to tell TaskFalcon explicitly to reschedule this task.

Let’s make a small change:

updates: 
  - update: 2020-06-08 
    tasks:
      - task: T1
        priority: 200
      - milestone: M1
        reschedule: true    # Here we're telling the scheduler to explicitly re-schedule this milestone

Let’s check the results again:

# Terminal
> falcon -show-closed-tasks -sub-projects all-projects.yaml

second-project.gantt.png:
GANTT chart

Nice. Abby still improved her delivery date. Life is still good.

Now let’s have a look at Webby’s plan:

first-project.gantt.png:
GANTT chart

For the same reason, the milestone in Abby’s project was stuck on 23rd of July, Webby’s Delivery milestone is stuck on 1st of July. And since the depending task will not finish on time, we now have a broken dependency.

The problem will also show up on the multi-project overview chart (see the previous tutorial on how to create this):

# Terminal
> falcon -show-closed-tasks -no-tasks -max-depth 0 all-projects.yaml

all-projects.gantt.png:
GANTT chart

I guess Abby and Webby now need to get together to solve this issue - but that’s outside the scope of this tutorial.


Default behaviour of TaskFalcon and how to change it

As we have seen in the previous chapter, by default, TaskFalcon will warn you when an update moves a dependant milestone. But is there a way to change this behaviour? And can TaskFalcon also warn me if the end date of a task is changed?

Short answer: Yes.

We already learned one way to tackle this by using the property reschedule: true in an update for a task/milestone.

On top of this, each task or milestone has a property locked, which determines if a task/milestone will stay at the scheduled date of the original plan. With this date being fixed, TaskFalcon just checks if all dependencies are met for this task/milestone and if all work got done by the end of a task.

You can change this behaviour by manually adding the property locked: true or locked: false to a task or milestone. Unlike reschedule: true, this can be done on a task/milestone definition as well as in an update. Also unlike reschedule, this will permanently change the behaviour of the task (or until changed again).

The default setting for tasks is locked: false, while for milestones it is locked: true.

# This is just an example - don't make that change to your tutorial file
tasks:
  - task: T1              
    name: Software design 
    efforts: 5d
    assign: FrontDev+BackDev
    locked: true

    ...

  - milestone: M1
    name: Delivery
    depends: T5
    locked: false

Cook book

Here a couple of recipes for common problems when tracking projects:

Q: A task is going to take longer than expected. What should I do?

Let’s start with what you shouldn’t do: Just change it in the task definition. The reason is that another task/milestone might depend on it. And now TaskFalcon would assume this task was always supposed to be that long and move the depending tasks/milestones accordingly without raising a warning.

Instead, you should create an update, where you can either set the new total length/efforts of the task (including the time that already passed) or set the remaining length (lengthleft) or efforts (effortsleft) from the time of the update.

Example

tasks:
  - task: T1
    start: 2020-06-01
    length: 5d
  
  - task: T2
    start: 2020-06-01
    efforts: 5d
    assign: xyz

  - task: T3
    start: 2020-06-01
    length: 3d
    efforts: 3d
    assign: xyz

updates:
  - update: 2020-06-03
    tasks:
      - task: T1
        length: 10d
      - task: T2
        effortsleft: 8d
      - task: T3
        efforts: 10d
        lengthleft: 7d

Q: A task has finished. How can I close it?

Length based tasks can be closed by setting lengthleft: 0d.
Efforts based tasks can be closed by setting effortsleft: 0d. If a task has a length and efforts set, you can do both at the same time.

Example

tasks:
  - task: T1
    length: 3d
  
  - task: T2
    efforts: 3d
    assign: xyz

  - task: T3
    length: 3d
    efforts: 3d
    assign: xyz

updates:
  - update: 2020-08-01
    tasks:
      - task: T1
        lengthleft: 0d
      - task: T2
        effortsleft: 0d
      - task: T3
        effortsleft: 0d
        lengthleft: 0d

Q: A task is no longer needed. Can I completely remove it?

You should never remove a task if someone already started working on it. Otherwise TaskFalcon doesn’t know that it ever existed and would assume that this someone was free to work on other tasks, which didn’t happen in real life.

However in an update, you can disable a task, which will accomplish the same from the time of the update on. A disabled task will no longer be considered by the scheduler, nor will it show up on the GANTT chart. For disabling a task, you would need to set active: false as part of an update.

Example

tasks:
  - task: T1
    efforts: 3d
    assign: xyz

updates:
  - update: 2020-08-01
    tasks:
      - task: T1
        active: false

Q: An employee left the company. What happens if I delete him/her?

This will most likely screw your whole plan, since TaskFalcon would now assume that this employee never existed, so all the work he/she already did in the past would be assigned to someone else.

Instead, you should add an update, where you disable this employee. This can be done by setting active: false for this resource. From the day of the update, this resource is no longer available and won’t show up on the resource charts.

Example

resources:
  - resource: FrontendDev
    name: Freddy Frontend

updates:
  - update: 2020-08-01
    resources:
      - resource: FrontendDev
        active: false

Q: I added a new task to my project, now TaskFalcon has changed the schedule without me noticing. What can I do to prevent this?

When adding a new task or group of tasks and you want to make sure it doesn’t interfere with your current plan, the best approach is to disable this task/group in your task definition and re-enable it with an update:

Example

...
tasks:
  - task: T1
    name: My new task
    efforts: 10d
    assign: xyz
    active: false

updates:
  - update: 2020-06-01
    tasks:
      - task: T1
        active: true

Q: Using updates is so inconvenient - can I avoid using updates?

If you want to track projects safely, I would recommend getting used to using updates.

However, if you follow a few rules, you should be fine without using updates most of the time


Well done!

You should know everything to plan, schedule and track complex projects.