1. 導入:なぜエンジニアがクリティカルパスを理解すべきか
インフラ構築やCI/CDパイプラインの整備において、納期遅延はチーム全体の生産性を低下させる大きな要因です。特に複数のタスクが依存し合う複雑なプロジェクトでは、「どのタスクがプロジェクト全体の終了日を決定しているのか」を正確に把握しなければなりません。クリティカルパスを理解することは、単なるスケジュール管理ではなく、限られたリソースをどこに集中させるべきかを判断するための「エンジニアリング上の戦略」そのものです。
2. 基礎知識:クリティカルパスとは何か
クリティカルパスとは、プロジェクトの開始から終了までの全工程の中で、「最も時間がかかる一連の作業経路」のことです。この経路上のタスクが1日でも遅れると、プロジェクト全体の完了日も1日遅れます。
対照的に、クリティカルパス上にないタスクには「フロート(余裕時間)」が存在し、多少の遅延が許容されます。エンジニアとしては、この「余裕がないタスク」を特定し、そこに対して優先的にリソース(人員や計算資源、検証環境など)を投下することが、プロジェクトを成功させる鍵となります。
3. 実装/解決策:クリティカルパスの特定手順
クリティカルパスを求めるには、以下の手順で論理的な整理を行います。
1. タスクの洗い出しと依存関係の整理: WBSを作成し、タスク間の「先行・後続」関係を明確にします。
2. PERT図(ネットワーク図)の作成: タスクをノード、依存関係を矢印で結びます。
3. 所要時間(工数)の入力: 各タスクの完了までにかかる時間を算出します。
4. 最長経路の特定: 全ての経路の合計時間を計算し、最大となる経路がクリティカルパスです。
4. サンプルプログラム:Pythonで簡易的なクリティカルパスを算出する
実務では専用ツールを使うことが多いですが、依存関係のロジックを理解するためにPythonで簡易的な計算スクリプトを作成しました。
各タスクの所要時間と依存関係を定義
tasks = {
‘A’: {‘duration’: 2, ‘deps’: []},
‘B’: {‘duration’: 3, ‘deps’: [‘A’]},
‘C’: {‘duration’: 5, ‘deps’: [‘A’]},
‘D’: {‘duration’: 2, ‘deps’: [‘B’, ‘C’]}
}
def get_earliest_finish(task_name, memo):
# すでに計算済みであればその値を返す
if task_name in memo:
return memo[task_name]
task = tasks[task_name]
# 依存先タスクの終了時間の最大値を取得
if not task[‘deps’]:
earliest_start = 0
else:
earliest_start = max(get_earliest_finish(dep, memo) for dep in task[‘deps’])
# 完了時間 = 開始時間 + 作業時間
finish_time = earliest_start + task[‘duration’]
memo[task_name] = finish_time
return finish_time
計算実行
memo = {}
for task_name in tasks:
get_earliest_finish(task_name, memo)
print(“各タスクの最短完了時間:”, memo)
結果:{‘A’: 2, ‘B’: 5, ‘C’: 7, ‘D’: 9}
この場合、Dが完了するまでの最長経路は A -> C -> D となる
5. 応用・注意点:現場での陥りやすい罠
現場でクリティカルパスを運用する際、以下の点に注意してください。
・リソース制約を見落とさない:
論理的なタスク依存関係だけでなく、同じメンバーが複数の作業を抱えている場合、それが実質的なボトルネックになります。これを考慮に入れた「クリティカルチェーン」の考え方も併せて意識しましょう。
・一度作ったら終わりではない:
開発中のトラブルや要件変更により、クリティカルパスは動的に変化します。週次の定例会などで必ず「現在のクリティカルパスはどこか?」を再確認する習慣が重要です。
・余裕の扱い:
クリティカルパス以外のタスクに余裕があるからといって放置すると、それが新たなクリティカルパスへと変化するリスクがあります。余裕時間は「サボるための時間」ではなく、「不測の事態に備えるための保険」として管理しましょう。
クリティカルパスを可視化することで、プロジェクトマネジメントは「感覚」から「データに基づく意思決定」へと進化します。ぜひ次回のプロジェクト計画から取り入れてみてください。

コメント