待ち行列システムを用いて、プロジェクトの同時進行について考える。プロジェクトの同時進行はアンチパターンとされることが多いが、それはなぜなのかを考えていきたい。
すべてのプロジェクトのリードタイムが悪化する
ここでは、2つのプロジェクト(と)を1つのチームが並行開発することを考える。とはそれぞれ3個ずつのプロダクトバックログアイテムに分割できるとする。
を完了してからに着手する場合、プロダクトバックログはこんな感じ。
このチームの平均サービス時間(平均サイクルタイム)をとすると、の滞在時間(リードタイム)は、はとなる。
一方、とを同時並行した場合のプロダクトバックログは以下のようになる。
このとき、とのリードタイムはそれぞれ、となる。のリードタイムがも遅くなっている。
ガントチャートで表現すると以下。
並列にプロジェクトを増やせば増やすほど、すべてが等しく遅くなる傾向がある。
コンテキストスイッチングの損失でさらにリードタイムが遅くなる
『 ワインバーグのシステム思考法 』では、スイッチングコストによる損失について経験則的に以下のように言及されている。
| 並行作業数 | スイッチングコストによる損失 |
|---|---|
| 1 | 0% |
| 2 | 20% |
| 3 | 40% |
| 4 | 60% |
| 5 | 75% |
2並列でパフォーマンスが20%ロスする。さきほどは直列でも並列でも平均サイクルタイムは変わらずとした。しかし、2並列の場合パフォーマンスが20%悪化する。直列ならある期間で個のプロダクトバックログアイテムを完了させられるチームが、個しか完了させられなくなる。平均サイクルタイムは平均サービス率の逆数なので、2並列の平均サイクルタイムは、
になる。ガントチャートで表すと、
は遅くなり、も遅くなる。
どうしても同時並行しなければならないならチームを分けたほうがいい
もも諸事情によりどうしても同時並行しないといけない場合はどうしよう。それならもうチームを分けたほうがよいのではないだろうか。ただ、もとのチームと同じようなクロスファンクショナルなチームに分割できれば、だけど。
こうだったのを、
こうする。
このとき、サイクルタイムはどうなるだろう。それはやってみないとわからない。少なくとも、スイッチングコストによるロスは考えなくていい。1チーム内の労働力が減ることでサイクルタイムが増加するかもしれないし、コミュニケーションコストが減ることでサイクルタイムも減少するかもしれない。メンバーのスキルや経験の差で、サイクルタイムが良くなるチームと悪くなるチームが生まれるかもしれない。
単純にそれぞれのチームのサイクルタイムが2倍になってしまうとする。その場合、こうだ。
1チームで並列するケースよりはいい。
別の考え方もある。もともと1チーム直列のとき、はのリードタイムで完了できる見込みだった。つまり、は以下の平均サイクルタイムでなければ1チームのときよりリードタイムが長くなってしまう。
はだったので、の平均サイクルタイムは以下である必要がある。同時に着手が必要ということは、プロジェクト内に重要なマイルストーンなどがあったのだと思うのでこんなに単純ではないだろうが、単純に考えるならこうなる。
他にも、とのリードタイムの合計で考える方法もある。もともと合計かかっていたので、それぞれ以内に終われば効率化されたとも言える。このとき、とはそれぞれ以下のサイクルタイムが求められる。
チームの一部だけしか分けられないケースは要注意
チーム分割しようとして、一部だけしか分けられないケースもよくある。もともとチームにPOやデザイナー、QAエンジニアが1人しかいないケースでは、分けられたどちらのチームにも所属することがある。エンジニアは2チームに分かれコンテキストスイッチから解放されるが他のメンバーには依然残るようなケース。
とはチームが小さくなりコンテキストスイッチからも解放された。このふたつのサイクルタイムは良くなるかもしれない。一方で、DesignerとQAは依然コンテキストスイッチを抱えている。とのサイクルタイムがよくなり、QAがまだコンテキストスイッチを抱えていることで、QAフェーズで待ちが長くなるかもしれない。実装は速くなってもリードタイムは長くなるケースも出てくる。ボトルネックをチームで協力し合えるなら問題ないけど。
まとめ
複数のプロジェクトを1チームで同時進行すると、コンテキストスイッチの損失により遅くなる。1チームで直列的に実施するか、2チームに分けてしまったほうがよさそう。
部分的にチームを分けるしかない場合は、コンテキストスイッチを抱えたままの部分がボトルネックになりやすい構造になる。チーム内で協力し合い、ボトルネックをなんとかできる前提があるときの選択肢になりそう。
サポートもお待ちしております!