本題
現職ではスクラムなる開発プロセスを実施しています。スクラムではPBI(Product Backlog Item)という単位にやることが切り分けられ、それらの見積もりにストーリーポイントを利用します。ストーリーポイントはPBIの大きさを測る指標と言われており、大体開発者の所感で決まります。1, 2, 3, 5, 8, 13, 21,...とフィボナッチ数列で表すパターンが変われることが多く、数字が大きくなるほど、重く不確実なPBIとなります。
しばらく開発していて、ストーリーポイントの合計が10で同じでも、5 * 2 の 10 と、2 * 5 の 10では全然重さ違くない・・・?という話がチーム内で出ました。 ぶっちゃけ前者の方が圧倒的に重いです。後者は意外と楽。
そこで、ストーリーポイントのタスクが完了する時間を確率変数としたときに、その従う分布はストーリポイントごとに異なるのではないか?と考えました。
そう考えるのであれば、あるストーリーポイントの確率変数 が従う分布がわかるもしくは仮定すれば、これまでの実績から大体どれくらいの時間でスプリントが終わるのか推測できるのでは?とも。
まずはストーリーポイントごとの完了までにかかる時間を確率変数とし、それぞれ、 とします。確率変数
はそれぞれ確率分布
に従うとします。
例えば、ストーリーポイント5のPBIが40時間以内に終わる確率は
と表現されます。
スプリントは複数のPBIで構成されます。これまでの経験からベロシティが大体10くらいだと分かってるとしましょう。この場合例えばストーリーポイント2, 3, 5で合計10になる3つのPBIをこのスプリントでやろうという話になります。つまり、このスプリントのおける全てのPBIが完了するまでの時間の確率変数Tは
のように表現できます。ここで、確率変数の和について考えますが、一般的なものは以下のようになるので扱うのはちょっと難度が高そうです。。
2つの確率変数 に対して、その和
の分布は
であり(途中式は省略)、確率密度関数は
ここは一旦、確率変数 はそれぞれ独立かつ正規分布に従うと雑に仮定しましょう。
※実際はもうちょっとズレた分布に従ってそうですが実務で問題になることはまだないでしょう。多分。
独立した正規分布を仮定すると再生性という特徴があります。
つまり
かつ、 と
が互いに独立である時、確率変数
は正規分布
に従う
というものです。これを仮定してあげれば平均と分散だけわかっていれば、あとは逆関数(Google Spread Sheet だと NORMINV)で例えば90%の確率で終わるまでにかかる時間が計算できるようになります。
例えばこれまでの実績からストーリーポイントと平均、分散の値が以下のようだったとします。
SP | 平均値 | 分散 |
---|---|---|
2 | 6.5 | 7.3 |
3 | 14.2 | 10.0 |
5 | 30.5 | 22.4 |
この時、SPが2, 3, 5 のチケットで構成されたストーリーポイント10のスプリントは となり、
となります。
また、SP5のチケット2つで構成されたストーリーポイント10のスプリントは
となり、
となります。
よって90%の確率で終わるのにかかる時間はそれぞれ計算してあげると、約59時間、69時間となります。 まあ適当に作ったデータですが、SPが上がるにつれて分散が上がるのは所感通りですし、SPが多いチケットでスプリントが構成されると達成が困難になるのも所管通りなので使えそうな気がします。
このように、各ストーリーポイントの達成にかかる時間を確率変数として定義し、それぞれ独立した正規分布に従うと仮定すれば、どれくらいの時間、どれくらいの確率でスプリントが達成できるかが予想できそうです。
今度社内でも試してみようと思います。
久々の統計でテンション上がりました。色々忘れてるな。。
追記
実際の分布は対数正規またはベータ分布に従うそう。
おー、先日に話してたやつ。いいっすね(ベータ分布か対数正規分布になりそうかも)https://t.co/UDzbLS5hyF
— 田所 駿佑 | Shunsuke Tadokoro (@todokr) 2023年3月19日
対数正規分布やベータ分布は再生性を持たないから上記のようなことはできないのが実用上の難点。。 対数正規分布を正規分布に変数変換してあげればいけるかも?とちょっとだけ思った。