09. シナリオ
同じタスクツリーを、条件だけ変えた複数のシナリオで同時にスケジュールし、
結果を横並びで比較する。what-if 分析の基礎。
同じタスクツリーを、条件だけ変えた複数のシナリオで同時にスケジュールし、
結果を横並びで比較する。what-if 分析の基礎。
| ファイル | 内容 |
|---|---|
01-compare.html |
3シナリオの比較 (1タスクにつき3行) |
02-milestones.html |
リリース日だけを抜き出した比較 |
03-gantt.html |
シナリオを重ねたガントチャート |
3 つのシナリオでリリース日を比較した結果。
| シナリオ | 条件 | リリース日 |
|---|---|---|
| 基本計画 | — | 2026-09-16 |
| 突貫案 | 実装を2人体制 + テスト短縮 | 2026-08-28 |
| 遅延ケース | 設計と実装の工数が膨張 | 2026-10-05 |
同じタスクツリーから、1 回の実行で 3 通りの結果が同時に得られる。
/*
* 09: シナリオによる what-if 分析
*
* 実行: bundle exec tj3 -o 09-scenarios/out 09-scenarios/scenarios.tjp
*
* 同じタスクツリーを、条件だけ変えた3つのシナリオで同時にスケジュールし、
* 結果を横並びで比較する。
*/
project sc "シナリオ比較" 2026-08-03 +4m {
timezone "Asia/Tokyo"
timeformat "%Y-%m-%d"
now 2026-07-29
/*
* トップレベルのシナリオは1つだけ。その中に入れ子で派生を作る。
* 派生シナリオは親のすべての値を引き継ぎ、
* 明示的に上書きした属性だけが変わる。
*
* 既定では plan という名前のシナリオが1つだけ存在する。
*/
scenario plan "基本計画" {
scenario crash "突貫案"
scenario risk "遅延ケース"
}
}
resource alice "Alice"
resource bob "Bob"
resource carol "Carol"
resource dave "Dave"
/*
* シナリオ固有の値は「シナリオID:属性」の形で書く。
* 指定しなかったシナリオは親の値をそのまま使う。
*
* どの属性がシナリオ固有かは tj3man task の [sc] マークで分かる。
* effort / duration / allocate / depends / start / priority などが該当する。
*/
task design "設計" {
effort 5d
allocate alice
// 遅延ケースでは見積りが甘かったことにする
risk:effort 8d
}
task impl "実装" {
depends !design
effort 20d
allocate bob
// 突貫案では2人体制にする (工数は同じでも期間が縮む)
crash:allocate bob, carol
// 遅延ケースでは工数そのものが膨らむ
risk:effort 30d
}
task test "テスト" {
depends !impl
effort 8d
allocate dave
// 突貫案ではテストを削る
crash:effort 5d
}
task release "リリース" {
milestone
depends !test
}
// ---- レポート ----
/*
* scenarios にシナリオIDを並べると、1タスクにつき
* シナリオの数だけ行が出る。scenario 列でどの行がどれか分かる。
*/
taskreport compare "01-compare" {
formats html
headline "3シナリオの比較"
columns name, scenario, start, end, effort, resources
scenarios plan, crash, risk
}
// リリース日だけを比べる
taskreport milestones "02-milestones" {
formats html
headline "リリース日の比較"
columns name, scenario, start
hidetask ~ismilestone(plan)
scenarios plan, crash, risk
}
/*
* ガントチャートに複数シナリオを重ねると、
* 同じタスクのバーが縦に並んでずれ方が視覚的に分かる。
*/
taskreport gantt "03-gantt" {
formats html
headline "シナリオを重ねたガントチャート"
columns name, scenario, chart
scenarios plan, crash, risk
}
トップレベルのシナリオは1つだけ。その中に入れ子で派生を作る。
派生シナリオは親のすべての値を引き継ぎ、明示的に上書きした属性だけが変わる。
scenario plan "基本計画" {
scenario crash "突貫案"
scenario risk "遅延ケース"
}
既定では plan という名前のシナリオが1つだけ存在する。
「シナリオ ID : 属性」の形で書く。
task impl "実装" {
effort 20d
allocate bob
crash:allocate bob, carol // 突貫案では2人体制
risk:effort 30d // 遅延ケースでは工数が膨らむ
}
どの属性がシナリオ固有かは
task のリファレンス の
[sc] マークで分かる。
effort / duration / allocate / depends / start / priority などが該当する。
name) は上書きできない。task のリファレンスの [sc] マークで確認するscenarios に複数指定すると、1 タスクにつきシナリオの数だけ行が出る。scenario 列を入れておくとよいtrackingscenario を指定すると、そのシナリオと派生シナリオが projection モードになる「増員したら間に合うのか」「最悪ケースではいつになるのか」といった問いに、
同じ計画データのまま答えを出せるようになる。
計画を複製して別ファイルで管理する必要がなくなる。