海と山が好き

海と山が好きだけど埼玉に住むおっさんが遭遇したアジャイルとかのはなし

見積もりを振り返らない

やってみたら大きかったので、ストーリーポイントを見直してもいいですか?

見積もりの精度を上げるにはどうしたらいいですか?

いい加減飽きたんやそのやりとり。


例えば、通勤にかかる時間は?って聞かれると、

各工程を積み上げて計算→誤差多い

昨日とどれくらい違う?→たぶん一緒

じゃあ毎日ずっと一緒?→たぶんね。でもたまに遅れる。早くなることより遅れることの方が多い。

っていうのはなんとなくわかる気がする。

個別のアイテムは誤差が出る。開発は複雑度が高いのでたまに地雷を踏むのでハマる?すると想定よりも時間がかかる。山手線が止まるのと一緒。

これを誤差がなくなるには?とか、地雷を全て見つけてから見積もりをしては?とやりたがる人がいるが、おすすめしない

なぜなら、完璧な見積もりなんて存在しないし、意味がない。なんならネガティヴな効果さえ生んでしまう

ネガティヴな効果=コブラ効果、グッドハートの法則に代表されるような観察者効果。 見積もりと合うことが求められるなら、死ぬほどサバ読んで使い切るのが関の山。それを求める阿呆はいないけど、結果そうなる。

測りすぎ――なぜパフォーマンス評価は失敗するのか?


見積もりは完璧にいかない。上振れもあるし下ぶれもある。

これは確率密度分布で理解すると手っ取り早い。

確率密度関数は、どの値になる可能性がどの程度の確率か、の分布を示したもの。

よく言われる?のは↓の正規分布のもの。

f:id:Bashiko:20210210020036p:plain:w300

どのあたりに分布するかはわかるが、実際にどこの値をとるかは蓋を開けるまでわからない。シュレーディンガーの見積もり。

ソフトウェアの見積もりは Putnam モデルから言われるとレイリー分布に従うとか言われる。要はロングテールがあるよね(課題が見つかったりしてどハマりしたら割と無限に時間が溶けるよね)って話。

Putnam model - Wikipedia

レイリー分布はこんな形 f:id:Bashiko:20210602041546p:plain

ここで見積もりが実績と必ず乖離する理由が現れる

電車で何時間かかる?と聞かれたときには、"いつも"何時間くらいかかるか、を返すことが多いと思う。

それは統計で言えば 最頻値 になる。

この絵でいえばピーク部分が最頻値。

ところでじゃあその確率次第(見積もりだしね)の結果、やってみた結果を見てみるとどうなるかというと、それぞれの工程は最頻値を取りながらもトータルとしては 期待値 に落ち着く。

レイリー分布の期待値は、\sigma\sqrt{\pi/2}

一方、最頻値は \sigma

なので、期待値は常に最頻値、これくらいかかると見積もった値に対して、 \sigma\sqrt{\pi/2}/\sigma = \sqrt{\pi/2} \approx 1.25 と、25%上振れする。

f:id:Bashiko:20210602044349p:plain

僕らは、最頻値で見積もり、現実は平均値でやってくる

この2割の上振れを踏まえてキャパシティに組んでおく必要が出てくる。(積み上げ見積もりの場合)

ちなみに、この不思議な2割という数値は、ウォーターフォールのPMだろうがスクラムマスターだろうがだいたい取っておかないといけないと思うという直感の数値と一致する。なんとも不思議というか必然というか。

積み上げるとバッファが必要とは書いたが、アイテムによっては山の左側、つまり予想より早く終わることも起こりうる いくつかのアイテムの実績を集めると、上振れしたものと下振れしたものが合わさって出てくる。 全てのアイテムの合計を行うと、これらの見積もりとの乖離が相殺する。意外とこの数値はブレない。 (期待値同士の比較になるため。)

(まあ実際には、確率密度関数の最頻値=見積もりより低くなることは少ないことが多いのでより高く上振れする。パーキンソンの法則が働くので)

要はアイテムの見積もりはそこそこダイナミックにブレるが、それらを足し合わせたベロシティはそんなにブレない、ということになる。


じゃあ手取り早くやるにはどうしたらいいか、って考えると、ベロシティで見積もるのが手取り早そう。

例:段ボールにMサイズのみかんが何個入りますか?

っていう問題に対して、

  1. みかんのサイズを分析し、充填率を分析し、何個入るか考える

  2. 何箱か実際に詰めてみて、どれくらい実際に入るのか確かめて、平均値採用する

という2つのアプローチのどちらが効率が良いかと言われると、間違いなく後者でしょう。

なお前者のアプローチを採用した場合、待っているのは予実の乖離の分析なぜなぜ祭りと完璧な精度を求める箱詰め予測のプロフェッショナルの道。いいからコードを書けこの管理屋が。

というわけで、積み上げてどれくらいできるよね、って見積もるよりも、実績をベースに見積もった方がまだマシそう。理性主義は現実見てから唱えてくださいね、ってなる。


そもそも見積もりなんて、作る価値があるかを判断するために、価値に見合うだけのコストで収まるかが知りたいから必要とされる。

無駄なコストを抑えるための見積もりに無駄なコストを掛けてたら本末転倒以外の何物でもない。

ましてや本質的にブレるのが見積もりであるのに、見積もりがなぜブレたのか、を考えるのは考えるのは大した意味が無い。

マネジメントしているつもりになっていてやることがなくなる人ほどそういうことをし始める。

サイコロを振ってなぜ1が出なかったのか?って考えてるのと同じで正直アホだと思う。


当然実績ベースで見積もったところで結果はブレるかもしれないが、そこを気にしていてもしょうがない。

唯一精度を上げる方法があるとしたら、全ての見積もりサイズを同程度にしておく。小さくしておく。くらいしかない。(唯一のまともなアドバイス


そもそもスプリントの精度ってなんのために必要なのか、っていうと答えられないことが多いんじゃ無いかなって気はする。

スプリントが達成できたかどうかは、計画したアイテムが終わったかどうか、ではなく、計画したアイテム(と、計画していなかったけど必要だとわかったアイテム)を通じて、インクリメントが結果としてスプリントゴールを満たしているかどうかしかない。

スプリントゴールは各 PBI とは別に、それらの PBI を通じて ”どんな状態を実現したいのか” で表現されているとわかりやすいのだと思う。

作戦目標をスプリントゴールだとすれば、各 PBI はそれぞれの作戦過程における戦術目標に相当する。

戦術目標を全て満たしたとしても、作戦目標を達成するかどうかは怪しい。

なぜなら作戦立案時から状況が変わっているかもしれないし、立てた作戦が間違っているかもしれないから。

なので、戦術目標(PBI) をクリアーしながら、作戦目標を達成できるかを評価し続けないと危ない。これはデイリースクラムでやればいいと思う。

これは長そうだしいつか別に書く。多分。知らんけど。