Textual Gantt Scheduling

Gantt Visualized

I have not found an easy and cost effective way to organize tasks as a Gantt chart to allow a better understanding of a project timeline.


The idea is to define a simple text format which defines project tasks. This can then be easily converted to a Gantt schedule through a simple conversion tool.

A textual representation is preferred because it is easily edited and can be version controlled.

There is a very powerful Gantt environment (pgfgantt) supported in LaTeX which could be used to visualize the Gantt scheme.

Wanted features

The following features are needed:

  • Define task with name, completeness (50%), effort (2w) and id (t1)
  • Define dependencies between tasks (t1)
  • Specify allowed resources working on a specific task
    • Specific resources PL AK
  • Define checkpoints which depend on a set of tasks with an optional target date

Reasonable defaults for most parameters should be defined to avoid unnecessary editing.

  • Default effort 100%
  • Default marginal 0%
  • Default workday 8h
  • Default today date to current date

Textual format

The textual format is showed in the following example.

project "Build TxProject tool"
p0 "Make specification"
  t11 "Define textual format" 4h 50% (PL)
  t12 "Make language spec" 1d 50% (PL)
  t13 "Make Haskell ADT" 4h 75% (PL AK)
p1 "Build Haskell implementation"
  t21 "Build ADT in Haskell" 1d 75% (p0 PL AK)
  t22 "Build planner from ADT to time" 2d 50% (t21 PL)
  t23 "Build parser to ADT" 3d (t22 PL)
t3 "Write docs" 2d (p1)

mid "Mid project" (t3) 2018-02-02

PL "Peter Ljung"
AK "Anders Karlsson" 50%

workday = 8h
start = 2018-01-13
today = 2018-02-01

Special formatting

50% - part done
1h - 1 hour effort
1d - 1 day effort
1w - 1 week effort
p0 - identity/name
"" - description
() - dependencies and resource constraints

Some notes on formatting

  • A task is not split in time
  • Any set of optional resources may work on a single task at a time
    • Selected resources work all available time on the task until it is finished
  • A resource may be defined as a group of people
    • All resource groups are disjunct i.e. no resource is part of different groups
    • A resource may have an efficiency in percent where 100% means full workday
  • A (sub-)project is a set of tasks
    • A task must include an effort
    • A project must not include effort or completeness (involved tasks define that)
  • A task may have constraints in terms of …
    • Dependencies to other tasks
    • Set of alternative resources used to complete task
  • Constraints set on a project are directly mapped to every project task and sub-task
    • Constraints on sub-projects or tasks may override parent constraints, but must be more restricted
  • A project dependency is the same as a dependency on all (sub-)project tasks
  • A milestone is a point in time where a set of tasks is finished
    • A milestone may have a “wanted” completion date
    • If want completion date is surpassed it will be shown in the resulting diagram
  • Project start defines when project started
  • today defines current time and is defined directly after finished parts of the project

Markdown compatability

The text format should be defined so that it is compatible with markdown.

project “Build TxProject tool” * p0 “Make specification” * t11 “Define textual format” 4h 50% (PL) * t12 “Make language spec” 1d 50% (PL) * t13 “Make Haskell ADT” 4h 75% (PL AK) * p1 “Build Haskell implementation” * t21 “Build ADT in Haskell” 1d 75% (p0 PL AK) * t22 “Build planner from ADT to time” 2d 50% (t21 PL) * t23 “Build parser to ADT” 3d (t22 PL) * t3 “Write docs” 2d (p1)

resources * PL “Peter Ljung” * AK “Anders Karlsson” 50%

milestones * mid “Mid project” (t3) 2018-02-02

settings * workday = 8h * start = 2018-01-13 * today = 2018-02-01

Haskell ADT

-- A project is a tree of tasks where each task can have sub-projects
-- A project only structure tasks in a tree hierarchy, independent on dependencies
data Project = Project { name :: Id
                       , desc :: Desc
                       , projects :: [Project]
                       , tasks :: [Task]
                       } deriving (Show, Eq, Ord)

-- A work task
data Task = Task { name :: Id
                 , desc :: Desc
                 , effort :: Effort
                 , compeleteness :: Completeness
                 , resources :: Set Resource   -- one of dep. resources must perform task
                 , dependencies :: Set Task    -- all dep. tasks must be performed before
                 } deriving (Show, Eq, Ord)

-- A milestone specified in time
data Milestone = Milestone Id Desc UTCTime deriving (Show, Eq, Ord)

-- A project checkpoint with dependencies to a set of tasks
data Checkpoint = Checkpoint Id Desc (Set Task) deriving (Show, Eq, Ord)

-- A specific resource which may represent an individual or a group
data Resource = Resource Id Desc Size deriving (Show, Eq, Ord)

Example output

project "Build TxProject"
  p1 "Make specifications"
    2018-01-01 00:00 (AK) - t13 "Make Haskell ADT" (50% of 0.5 days)
    2018-01-01 00:00 (PL) - t11 "Define textual format" (50% of 0.5 days)
    2018-01-01 12:00 (PL) - t12 "Make language spec" (50% of 1.0 days)
  p2 "Build Haskell implementation"
    2018-01-02 12:00 (AK) - t21 "Build ADT in Haskell" (50% of 1.0 days)
    2018-01-03 12:00 (PL) - t22 "Build parser to ADT" (0% of 3.0 days)
    2018-01-06 12:00 (PL) - t23 "Build planner from ADT to time" (0% of 2.0 days)
  2018-01-08 12:00 (AK) - t3 "Write docs" (0% of 2.0 days)