Unknown Error

日頃考えていることとか、読んだ本の感想とか

QCDSの調整の前にまずやること

Engineering Manager Advent Calendar 2023 - Adventar 6日目の記事です。

私はこれまで様々なプロダクトの開発チームに入り、Engineering Manager(EM)を務めてきた。EMとしてやっているときに最も悩まされることの第一位が、開発がうまく進められておらず、スケジュールが期日に間に合わないというものだ。スプリント単位でおおよその開発項目をなんとなく決めてマイルストーンを作っていったとして、ベロシティの関係でこのままだとやばそうというのは割と早い段階で気がつくものだ。

こういうとき、QCDS(Quality-Cost-Delivery-Scope)という言葉を思い出して、これらをうまく調整すれば良いのだ・・・・と一瞬考えるが、いやいやちょっと待った

Qualityつまり品質を落として何とか間に合わせるのは本当に良いことなのか?内部品質を落とすことは技術的負債を抱えることになるが、それは良い行動なのか?

Costつまり増員は本当に解決するのか?新しい人の採用は見つかるとも限らないし、見つかっても活躍するかもわからない。オンボーディングにどれだけ時間がかかるかもわからない。今、現実に困っていることを、そんな不確実性の高い解決策に託して良いのだろうか?

Deliveryつまりリリースを遅らせることはプロダクトにとって本当に良いのか?機会損失につながらないか?

Scopeつまり機能制限をすることはプロダクトにとって本当に良いのか?魅力品質や当たり前品質にまで手をつけてしまわないか?

私の意見としては、スケジュールが期日に間に合わないときにQCDSの調整の前に出来ることはまだある。そこで本記事では、開発スケジュールが逼迫して困ったときに、QCDSに手を付ける前にどんなことをやるかを書く。

1. とにかく落ち着く

いきなり一番大事なことだが、自分が焦っても何も状況は変わらない。数秒早くアクションしたからといって状況が改善するわけではない。まずは落ち着いて、コーヒーでも淹れてみる。もし相談したら気持ちが落ち着く人がいるなら、その人を捕まえて話してみるのも良いかもしれない。とりあえず、自分が焦っているという状態に気が付き、それに向き合う時間を30分でも良いから取ってみる。

2. 開発項目の依存関係を洗い出す

気持ちが落ち着いたところで、いよいよやることを整理していく。最初に着手するのは、開発項目の依存関係の可視化である。各開発項目を見積もって足し算をしてそれを開発人員で割るのは、全ての開発項目が順序の関係性のない、並列作業可能な開発項目であることを暗に意味する。

しかし実際には、コードが整理されていないのであれば先にテストを書いてからリファクタリングする、IaC化してからバックエンドの開発をする、など何か開発をする前の作業・開発をしてから取り掛かるというのは開発において良くある。こういったXをしてからYをする、といった直列作業がある場合は、X+Yの開発時間が必ずかかってしまう。つまり、X+Yが全開発工程の中で最長である場合はこの2つの作業がボトルネックになることを意味する。

開発スケジュールが逼迫している状況では、こういった直列作業が何であるかを明確にするのはとても重要である。開発項目の依存関係を明らかにすることは、全開発工程の中のボトルネック(クリティカルパス)を明らかにすることになる。逆にこういった直列作業を意識していない開発計画を立てている場合、開発人員を増やしたところで開発スピードは上がらない。

3. 誰が開発項目を担うかを明らかにする

開発順序がわかったところで、今度はその開発項目を誰が担うかを明らかにする。開発は必ずそこにいる構成員のキャパシティによって開発可能な分量が決まる。そこで誰がどの開発項目をやるかによって、開発リソース*1ボトルネック(クリティカルチェーン)を明らかになる。

こうすることで、現在検討している開発項目の粒度と開発リソースに対して、現在の開発プロセスでスケジュールに間に合いそうなのか間に合わなそうなのか、の判断がおおよそ出来る。

しかし、どうしてもこの段階で期日に間に合わせるのが絶望的な場合もある。そういった場合は次のステップに進む。

4. 開発項目の内容を分割する

開発項目の中身を考えてみると、直列につながっている開発項目であっても、並列に作業出来るタスクと並列に作業出来ないタスクが何かしら存在する可能性がある。そこで、この並列に作業出来るタスクと並列に作業出来ないタスクに分割して、もう一度クリティカルパスクリティカルチェーンを組み直してみる。この組み直し作業を繰り返すと場合によってはクリティカルチェーンが移動し、運が良ければ開発プロセスが期日に間に合う可能性が出てくる。

上記の図は開発項目の内容を分割して、別の人に分割した開発項目を並列で進めるパターンである。しかし、この場合も全体の開発期間は短くなっても、クリティカルチェーンは移動していない。

このようにどうがんばっても、今の開発チームでは絶対に達成出来ない開発スケジュールになってしまっていることはある。この段階になって初めてQCDSの調整に入るべきである。

QCDSの調整はとても強力であるが故、プロダクトにとって魅力的な要素を失ってしまう可能性のある諸刃の剣である。開発スケジュールに困ったときはひとまずクリティカルパスクリティカルチェーンを調べて、今の開発チームのアウトプットを最大化する方法を模索してみたい。

今回の投稿の内容の元になっているのはCCPM(Critical Chain Project Management)の一部を抜粋したやり方である。よりCCPMの概念を理解するために、The Goalを是非おすすめしたい。

*1:人に対してリソースという言葉を使うのは物を扱っているようで適切ではないが、人の使える時間は限られた資源という意味でリソースといえる。ここでは開発リソースを開発に使える時間的なリソースのことを指す