I’m working on the algorithm for automatically generating and updating project schedules according to Critical Chain principles.
Using a set of random, dependent tasks (represented by an identifier
and estimated time
), I can create a full schedule that identifies the critical chain, adds the necessary buffers, and sets the start dates for tasks.


- Red path is the critical chain.
- Purple nodes represent Feed Buffers (i.e. padding on estimates).
- Blue node represents overall Project Buffer (i.e. padding on the entire project timeline).
- The work is estimated to take 57 weeks. A buffer of 29 weeks is added, setting the committed delivery time of 86 weeks.
Special considerations
- Start tasks at late as possible without risking delaying the critical chain. For example,
1091c0
(top left) starts immediately even though it isn’t on the critical chain.b0581b
(bottom left) doesn’t start until week 17, even though it’s not waiting for work. - Everywhere a path feeds into the critical chain, there is a buffer (called a Feed Buffer).
- There is an overall Project Buffer.
- All buffers are 1/2 length of the chain they protect.
- Feed Buffers are slightly tricky.
- They can’t be too big and extend the critical chain. This would occur by pushing tasks to start before first critical task or end after last critical task.
- They also should only buffer against the non-critical chain. Critical chain tasks should not affect Feed Buffers, even if the non-critical chain branches off the critical chain.
Todos
- Take Resources into consideration. Tasks shouldn’t overlap if they use the same resource.
- Allow multiple projects. Scheduling a project in a multi-project environment has more considerations.
- Performance. The above algorithm runs fast enough for now, but making it faster would likely open up useful design options.
I plan to write up more about the details of Critical Chain, as the schedule above probably doesn’t make much sense without that background.