『Clean Coder』を読んで見積もりについて考える
見積もりについて
はじめに
ロバート・マーティン 著『Clean Coder』をテキストとして学習した記録です。
本書を読んで私が解釈した内容について記述しています。
なので本書の内容の間違った解釈やあるいは単純に間違った記述がある可能性があります。
遅れ
何をしてはいけないか
してはいけないことは締め切り間際になって間に合わないことが明らかになってからその報告をすることだ。
このようなことが起こる原因は遅れの管理ができていない事による。
遅れ自体は見積もりの間違いや不確定要素によっていつでも起こる可能性はある。
常に遅れの管理を行っていることが大切なことである。
遅れの管理の秘訣は早期発見と透明性である。
定期的に進捗を確認して下の三つの期日を出来るだけ正確にチームのメンバーやリーダーに伝えることで透明性を担保することができる。これは常に見積もりを更新することでもある。 見積りには願望を反映させてはいけない。 というか基本的に願望を持ってはいけない。 他の誰かに期待することもあってはいけない。
- 最早終了日
- 通常の終了日
- 最遅終了日
なぜ三つも必要なのか?
見積もりとは
見積りとコミットメントは分けて考えるべきである。
コミットメントは確実な数値である。 それは絶対に守られなければならないもので残業や休日返上など様々な犠牲を払っても、そのために努力しなければならないものである。 残業が続くとパフォーマンスが落ちて、全体の生産性は大きく低下する確率が高い。コミットメントは避けるべきである。
対して見積もりとは予測である。
そもそも、見積りが必要なのは必要な時間がわからないからである。
見積りとは数値ではなく、確率分布。 本の著者は多くの人が見積もりを間違うのはこの違いを明確に意識できていない場合が多いのだという。
確率分布
通常不確定要素は作業が完了に近づけば近づくほど、少なくなっていく。
見積もりの段階では行う作業の不確定要素が最も多い状態と言える。
不確定要素がある以上は見積もりというのは確率にされるということである(当たり前だけど)。
例えば3日で終わる可能性が高い作業であっても、4日かかる可能性もあるし、5日や6日かかる可能性も多少はある。10日かかる可能性もあるかもしれない。
この場合見積もりの時間を聞かれたらどう答えるべきなのか? 3日で終わる可能性が高いように見えても、10日かかる可能性もある。確実に完了できる日数(数値)を計算できるのは不確定要素が限りなく0に近い場合のみということになる。通常見積もりを行う段階ではそのような状態にはなっていない。
コミットメント
このような理由で確実な日数(数値)の約束(コミットメント)は極力避けるべきである。
コミットメントには暗黙的なものも含まれる。例えば「試してみる」などの対応も控えるべきである。そのような曖昧な表現は期待や願望を生むだけで見通しが不透明になり、誰にとっても良い結果にならない。あくまで、確率の分布を伝えるように努力するべきである。透明性を保てるように注意しなければならない。
3点見積もり
コミットメントができないとしたら、見積もりをどう捉えるべきか? また確率分布はどのように扱うべきなのか?
3点見積もりは下記の三つの見積もりを元に作業期間を予想する方法である。
- 楽観値(O): 全てがうまくいってこれ以上なくスムーズに進行することを想定した極端に楽観的な値
- 標準値(N): 最も確率が高いと思われる値
- 悲観値(P): 考えられる最悪なケースを想定した極端に悲観的な値
これらを元に下記の式で確率分布の計算を行う。 μが予想される作業期間である。
μ = (O + 4N + P) / 6
この方法には確率分布をうまく取り扱い妥当な数値を出すとともに楽観的な予想を防止するという意図もある。傾向として悲観値は楽観値よりも大きく影響することが多いため、計算結果も悲観的な数値がでることが多い。
私の場合見積もりの段階では見栄なのか願望なのかよくわからないが、楽観的な見積もりを出す傾向にある。
このような方法を使うことで、そのような失敗の防止が期待できると思う。
チームメンバーの意見を聞く
また、見積もりは一人で行うよりもなるべく多くの人の意見を聞けた方が精度が上がる。一人では気づくことのできない不確定要素も気付きやすくなり、異なる意見を聞くことで新たな視点も獲得できる可能性もある。ただし、楽観的な意見に影響を受けすぎる危険性に注意しなければならない。
大数の法則
大きい作業をそのまま見積もるよりも、小さい作業に分割してそれぞれについて見積もりを行い、それらを合計した方が正確性が増す。間違いが平準化されるからである。