2012年10月17日水曜日

ソフトウェア開発における見積もりに関する仮説

…いや、仮説ってほどじゃない、と言うほどでもない思い付きなんだが。

かつてハードコアIT戦士を名乗っていた俺はソフトウェア開発プロジェクトの見積もりというものをしばしば作っていた。俺自身は最近はこれをしていないのだが、依然としてIT企業に勤めているにはいるわけで、同僚達は依然、その不毛な作業を続けている。

なぜ、不毛と言うのか。

それは、業界の人間ならば周知の通り、この見積もりというものがおよそ呼び名が示すような役割を果たすことがないからだ。守れないことが前提の計画、外れることが運命の期待、そんなものを「見積もり」とは呼ばざるを得ない…これは明らかに不毛だ。

で、まあ、見積もりがそんな哀しいことになってしまう原因は…まったくわからない、くない。つまり、むしろわかる。わかり過ぎると言うか、うまく行くと納得できる根拠を探す方が大変で、うまく行かないと理由を考えるのには何の苦労もいらない、ということもまた周知のことなのである。


そうなのであるが、そこでタイトルに戻ると、俺は今日、ふとした思い付きで、数ある「うまくいかない理由」にさらに新たに加えるべきひとつを発見したのだ。

これは理由というより、メカニズムと言うべきかも知れないが。


つまり、個々の機能に関する見積もりの精度が不足している場合、再見積もりを含む要件定義を経ての最終的な見積もりは開発側に不利となりやすい、ということだ。

何を今更。いつも不利になるのだから。当たり前だろう。と、思ってはいかん。

単に見積もりの精度が足りないなら、当たるも八卦というやつで、工数が余っちゃってラッキーだあ、という事も、頻繁に起こっていいはずだ。だが、そうはなりにくい。つまり、精度の不足の作用はランダムではない。そこが問題だ。



  1. 機能リストに項目が30個とかあるとして、これを項目ごとに見積もるとする。
  2. 実現される機能に対して、意図的であろうとなかろうと不当に高い見積もりと不当に安い見積もりが混在しているとする。
  3. 見積もりはたいがい顧客から見れば高過ぎるので、どれかの項目を削ることになる。開発側は、どの項目も妥当な見積もりをしたと主張するだろう。顧客はそれをある程度は信じて(そしてある程度は疑って)、とにかく、「要求した機能に対してこれは割安だ」と思う項目は残すだろうし、逆に割高だと項目は見積もりから外すだろう。
  4. しかし、その後、要件が詳細化される過程で、また別の項目が追加される。この中には、過去に除外された項目が、形を変えて復活していることもあろう。業務上、重要なものは重要なのだから、割高だという理由だけで要件は消滅しない。
  5. 追加の要件を盛り込んで再見積もりをすると、また予算をオーバーする。そこでまた項目レベルの調整をする。で、再び、顧客は割高な項目を削り、割安な項目を残す。
  6. こうして要件の削除と追加、それにともなう再見積もりと項目調整を繰り返し、顧客の選択には常に「機能に対して割安に感じる」ものを優先するというバイアスがかかっているとすると、結局、最終的な見積もりは、顧客に取って割安な項目が多く、その逆は少ないという状態になる。
  7. したがって、開発側は、名目上はしっかり利益率も確保したはずなのに、なぜか実際には工数がかさみ、コストもかかるし納期も危うくなるという憂き目を見る。
  8. ちなみに、「割安である」という顧客の判断を開発側が実感するのは、見積もり確定後の詳細設計段階であったりすることもある。

どうであろうか?

もちろん、いくら適当なことを言うのが好きな俺でも、プロジェクトの問題がこれだけで説明されるなどと思ってないが、しかし気がつくと「あれ?」な感じになるメカニズムの一端が垣間見える気がしないだろうか。俺は自分でそこそこ納得してるんだけど。

このメカニズムの真に恐ろしいところは、開発側の見積もりの不正確さが意図的である場合にも作用するという点にある。顧客が重要視しているがちょっとわかりにくいような機能に対して、バッファのつもりでちょっと水増しした工数を見積もっていたりする場合、その不正確さは見積もった本人はわかっている。わかっているのだが、自分に有利なチョイスが出来ない。選択に関するイニシアチブは発注者たる顧客側にあるからだ。


まあ、しかし、この問題に対する有効な対策はある。そりゃもう明快にある。

分散した誤差がある特定方向に収束して行くという話なのだから、最初から誤差が小さければいいだけなのだ。つまり、個別の機能は出来るだけ正確に(その為に具体的に)見積もることと、その正確であろう見積もりをそのまま顧客に示すことだ。案分したバッファや項目間の調整で、全体金額を恣意的に決めるために要素の見積もりを不正確にするようなことはしてはならない。…言われなくともそんなことはしないわ、と言われるとまあ、ああ、立派ですね、としか言えないが。


ちなみに、項目の見積もりを正確に出すということは、バッファをバッファとして見積もり、顧客にバッファだと伝えることも含んでいる。それに、個別の項目を誠実に見積もることは、その後におなじみに「仕様変更」が発生した際に追加費用についてまともな議論をするための礎になる。項目(機能)と工数/金額の相関関係を曖昧にすること(たとえExcel表で明確に対応させてあっても、論理的に説明できない関係は曖昧だ)は、自分からその交渉のテーブルを叩き割るに等しい愚策だと、俺は思っている。



…なんで急にこんなこと言ってんだろ俺。まあ思いついてしまったから、というだけか。



0 件のコメント:

コメントを投稿