システム開発:見積り工程についてまとめてみた
見積もりについて、自分なりにまとめてみました。
TL;DR
1.特に初期の見積もりは誤差が大きいので、各フェーズで見積もりなおす必要がある(不確実性コーン)
2.見積もり時にリスクを洗い出し、見積もりに組み込む必要がある
3.誰が見積もるかも重要で、実際の作業者に見積もらせるのがいい
4.どうやってもブレるものはブレるので、MosCow分析などを使って優先度をつけることが重要
アジャイルな見積りと計画づくり ~価値あるソフトウェアを育てる概念と技法~という本が良いらしい(まだ読んでないので、後で読む)
自分の場合の話
自分は概算を出すときは「感覚的にこれくらいだろう×2+α」で出していて、大体ちょうどいいか収まる感じ。ざっくり要件聞いて、10日で終わりそうだと思ったら23日とかで出す(あるいは何もなければ最短で10日、現実的には20日程度~とか)。
多分、感覚的=楽観的で、Nな地点で、そこにリスクを乗せてちょうどいい感じになっている。
※人によって違うので、あくまで一例
※N、この日までに完成する確率は1ナノパーセント程度なので、この地点をN(ナノパーセント日)と呼ぶ
見積りの誤差
概算見積もりだと400%程度の誤差がありうる。基本設計まで落とし込んで、25%程度(1人月の見積もりであれば、0.75~1.25人月くらいまでは普通にブレる)。なので、概算見積もりのまま突き進むと、1人月の見積もりでも0.25~4人月までぶれるので、普通に死ぬ。
大体の案件は、これが原因で死んでいる気がする。最初の提案=400%の誤差がありうる状態で予算と日程を決めてしまい、それが確定なものとして扱われてしまう。……まあ、死ぬよね、っていう話。
見積りの誤差については、不確実性コーンの話が面白い。
プロジェクトの本質とは何か? プロジェクトマネジメントの基本1
後工程に行くにつれて誤差が減っていくのは、情報が増えるから?
⇒リスクが見えてきて、ある程度潰せるようになっているから。
リスクとバッファ
・熊とワルツを
見積もりを出す前に、リスクの洗い出しが必要。リスクの軽減策などを考えておく、必要であれば見積もりに入れる。納期は後ろに倒れるが、その分リスクが実現した際のダメージが小さくてすむ。
リスク図といって、プロジェクトの成功確率がどう推移するかをあらわした図がある。誰のための見積もり・何のための見積もり part2の15pを参照。
N:成功率がほぼ0の地点を見積もりとして出しがちだが、実際は顧客にはもっと後ろの方を提示して、内側にはもう少し前を出すべき。
「顧客への見積もり>スケジュール>N」
誰が見積もるか
・ピープルウェア
見積りの精度は、誰が見積もるかにもよる。一番生産性が高いのは、見積もらない(納期を決めない)。
目標設定者 | 生産性 |
プログラマー | 8.0 |
マネージャー | 6.6 |
プログラマーとマネージャー | 7.8 |
システムアナリスト | 9.5 |
目標なし | 12 |
誤った目標の設定、すなわち絶望的に厳しい目標はプログラマーのやる気を吸い取ってしまう。実際に作業する人に見積もらせることが大事。
実際に作業を振るときに、敢えて納期を伝えずにやってみたことがあったが、確かに期待していたよりも早く終わり、暇だから次の作業くれーという催促まで来たことがあった。目標なしが一番いいのだろうが、上に説明しづらいのが難点……。
実際にやるときに心がけていること
大抵の案件は納期が決まっているので、MosCoW分析で「Must、Should、Could、Won’t」を洗い出してスコープを決める。当たり前だけど、顧客と一緒に決める必要がある(一見大事そうに見えても、顧客から見たらCouldだったりということが往々にしてある)。
んで、詳細が終わったくらいで改めて見積もりなおしてMust全ていけそうか、ShouldやCouldはどこまでやるか、を決める。Mustだけは死んでも収めるくらいの心意気で、その代わりMustは本当に必要最低限にする。
まあ、この辺は受諾だと調整が難しい気もする。自社サービスであれば調整しやすいけども。受諾でアジャイルが適用しづらいのも結局は契約の問題だし。
ともあれ、最初に一回見積もって終わりではなく、各工程で見積りを更新するーというのが大事。
疑問
QCDはトレードオフといわれているが、本当にそうなのか(品質を犠牲にすることで、納期は本当に早くなるのか?)。ピープルウェアによると、品質を下げると士気が下がるので効率が落ちる。つまり、品質と納期はトレードオフの関係にない?実際に試してみたい……。