コンテキストスイッチとタスク分割コスト
ある作業をしている途中に割り込みが発生して別の作業に切り替える、ということは仕事上よくあります。
フロー状態でプログラムを書いているところに電話がきて強制的に集中状態が途切れてしまったり、障害が発生して緊急的に調査タスクが発生し、その対応が終わった後に、もともとやっていた自分の作業に戻ったりする時、脳内メモリが一度リフレッシュされてしまいます。
A作業からB作業に切り替わる際、それぞれの作業で必要な情報や思考は別物なので、別の作業に取り掛かるために必要な情報を脳内メモリにリロードする必要があります。
ここでの脳内メモリのリフレッシュと再割当て作業による頭の中の切り替えをコンテキストスイッチと呼びます。
そして、このコンテキストスイッチは当然オーバーヘッドが発生します。
仮にAとBのタスクがあり、それぞれ50の労力が必要だとします。(図の灰色枠)
AとBのタスクをそれぞれ最初から終わりまでまとめて処理できれば、純粋に合計100の労力で終わらせられます。(図1A)
しかし、Aのタスクの途中でBのタスクもこなそうとした場合、コンテキストスイッチのオーバーヘッドにより合計100以上の労力が必要になります。(図1B)
Aのタスクが複雑であればあるほど「切り替えコスト」の数値は上がり、Bのタスクが途中で差し込まれると労力がどんどん膨らんでいきます。
特に「フロー状態」を崩されると再度フロー状態に持っていくのに時間がかかるため、より切り替えコストが掛かるようになります。(図1C)
「フロー」という言葉の意味が分からない人はここでは説明しないのでググるか無視してください。
各単体のタスクごとのコストだけをみて見積もりを出したとしても、その作業の必要集中度によって、割り込みが発生した際の作業者の負担はどんどん膨らんでいく可能性があるのです。
![]() |
個人の頭の中だけでもこれだけマルチタスク処理にオーバーヘッドが発生するのですから、これがさらに複数人の作業になってくると、いよいよオーバーヘッドファンタジーが始まってしまいます。
先程のAとBのタスクを10人で振り分けてやったとしましょう。するとどうなるか。
単純計算だと合計100の労力で終わるので一人あたり10の労力で済む計算になります。
ところがどっこい、そうは問屋がおろしません。
それぞれの「10」の作業を繋ぎあわせたり、前任者までの作業内容を確認したり、伝えあったりするにもコストがかかります。
自分担当分の実作業をこなす以外にも多大なコストがかかるようになります。
結果、実際のタスク自体の作業コストよりも分担したことで発生したオーバーヘッドのコストのほうが高くなり、トータルの労力が一人で完結させた場合の倍、もしくはそれ以上になってしまいます。(図2D)
またAとBのタスクを並列して5人ずつで作業を行ったとしても一人で完結させるより時間がかかってしまう可能性すらあるのです。(図2E)
![]() |
後半の話は『人月の神話』に似たことが書いてあるので興味があればぜひ読んでみてください。
作業と作業の間には可視化されていない作業がたくさん潜んでいるのです。