TaskList Project Scheduling Feature Proposal
Tor Norbye
Published Sep 21 2002
The user task list contains tasks the user needs to perform. They
already have descriptions and priorities.
What if the user wants to estimate how long it will take to complete
the tasks? Or what if the user wants to decide which tasks to do
first, assuming there are dependencies between the tasks such that
one has to be completed before another can start?
To help with this, I propose we build a simple project scheduler
into the tasklist.
First, we add some new attributes to tasks. In terms of UI, this means
that in the "New Task" dialog there is a separate tab asking for
scheduling info. You can ignore it, in which case this task is not
considered part of the schedule. These new properties should be shown
in a separate property sheet in the properties window.
The new attributes are:
- Estimated effort - in other words, how many days (or hours
or weeks or months) do you estimate that this task will
require to complete?
- Concentration - how much of your time will you be spending
on this? Typically 100%. However, let's say you want to
work on two tasks concurrently; you can make each 50% and
then the scheduler will allow these tasks to overlap.
Perhaps "concurrency" is a better term (but with reverse
logic) ?
- Depends on - a list of tasks that must have completed before
this task can begin.
- Start time, end time. The start time can be "as soon as
possible", "as late as possible", or a specified date. Ditto
for the end time. (There are some other possibilities too, like
"start no earlier than", "finish no later than", etc.)
Let's take an example. Let's say you've entered the following
tasks:
| Task id (implicit> |
Description |
Effort |
Starts |
Ends |
Depends on |
| 1 |
Turn on oven |
1 min |
As soon as possible |
- |
- |
| 2 |
Add sugar |
1 min |
As soon as possible |
- |
- |
| 3 |
Add milk |
1 min |
As soon as possible |
- |
- |
| 4 |
Add butter |
1 min |
As soon as possible |
- |
5 |
| 5 |
Melt butter |
3 min |
As soon as possible |
- |
- |
| 6 |
Wait until oven has been heated |
0 min |
As late as possible |
- |
1+lag 30 min* |
| 7 |
Bake cake |
15 min |
As soon as possible |
- |
2,3,4,5,6 |
| 8 |
Cool down the cake |
10 min |
As soon as possible |
- |
7 |
The "1 + lag 30 min" notation for task 6 is introducing
the concept of "lead" and "lag"; you can specify that you
depend on some task and you want to wait a specific interval
after the task has completed (lag) or before the task has
completed (lead).
With the above information, the scheduler would order the tasks
as follows:
| Task id (implicit> |
Description |
Effort |
Starts |
Ends |
| 1 |
Turn on oven |
1 min |
now |
now + 1 min |
| 2 |
Add sugar |
1 min |
now + 1 min |
now + 2 min |
| 3 |
Add milk |
1 min |
now + 2 min |
now + 3 min |
| 5 |
Melt butter |
3 min |
now + 3 min |
now + 6 min |
| 4 |
Add butter |
1 min |
now + 6 min |
now + 7 min |
| 6 |
Wait until oven has been heated |
1 min |
now + 30 min |
- |
| 7 |
Bake cake |
15 min |
now + 30 min |
now + 45 min |
| 8 |
Cool down the cake |
10 min |
now + 45 min |
now + 55 min |
As you can see, it would take 55 minutes for these tasks
to complete. It reordered some tasks based on dependencies
(if we had specified priorities those would cause reordering
as well). When you add tasks with specified start and/or end
times, overlapping tasks, etc., it really becomes a help
in planning.
One thing that most project scheduling tools provides is
the ability to schedule multiple "resources" (people). Then
you can assign tasks to people and this helps in the concurrency
computation. I propose we add that in the second version of
the project scheduler.
New Views
So far I've only proposed that we add some new properties
to tasks. Based on that, it will derive "start" and "end"
times for tasks. These, along with dependencies should be
visualized in a "timeline" view so that you get a better
picture of what's taking up time. Here's a mockup of
what the timeline view may look like:
Obviously, you should be able to zoom in/out so you can
both see this at a minute/day granularity, week granularity
or month granularity.
Issues
- Tasks should be marked "include in schedule". We don't
want "mom's birthday" etc. to show up in the schedule, since
not all tasks in the tasklist pertain to your project schedule.
- We need a property editor for dates so that you can
easily and conveniently pick dates from a calendar view
when specifying them.
- The property editor for "estimated effort" should allow
you to specify fractions and suffixes like "m", "d",
"w" and "mo" for minutes, days, weeks and months.
- There are many more "derived" attributes we should list
in the schedule; for example, "duration" can be computed
based on effort and amount of time you're spending on it.
(Let's say you're spending 50% of your time on a task
whose effort is 2 weeks; the duration will be 4 weeks.)
"Slack" is another; some tasks can slip without affecting
the schedule and this tells you how much a task can slip.
- The context menu in the timeline view should allow you
to change the interval shown, either by specifying a
time interval or choosing between a day view, week view,
or month view.
- We should allow ASCII and HTML export. Perhaps export
and import other scheduling tools' files?
- The timeline view should also highlight the "critical path";
these are tasks which directly affect the end date of
the project, so any slips will move out the end date.
- You should also be able to specify the project start
date, and view the computed project end date, somewhere.
- When we support resources, have a resources menu somewhere
where you can add people to the project; specify their
"efficiency" (used to modify duration computation from
estimated effort), time availability, etc.
- Also add a place where you can specify holidays, number of
working hours per day/week, etc.
Implementation
-
Go pick a scheduling algorithm. There are lots of resources on
this on the web. See
this link for an introduction to the math of scheduling.
- Make a new module for this, which subclasses usertasks.
In the "New Task" dialog, have a checkbox (and tab) for
"schedule". When you choose this, a SchedulingNode is created
instead of a UserTaskNode, etc. with additional attributes.
Having a separate module not only leans up the IDE for those who
don't want it, but it means I can have additional toolbar buttons
in the Task toolbar that aren't clutter for those who don't use it.
This does however mean usertasks needs to provide a way to plug
functionality into the New Tasks dialog, tasklist import/export, etc.