通常、システムは「現状抱えている問題を解決するための手段」です。
その解決のために「このようなソフトウェアやハードウェアが必要」という要求があり、そのための開発が行われます。
見積もりを行うためには以下のようなことをお客様から確認する(もしくは一緒に考える)必要があります。
(1) システムの目的
私はこれが一番重要なことと考えています。そもそもの目的がお客様と一致していなければ、最終的な製品を「お客様の望むもの」にすることは出来ません。目的を正確に把握できていないと効果的な提案を行うことも出来るはずがありません。
(2) 要求や要望事項があるのか?
システムを開発するときにはお客様は漠然とでも「あんなふうにしたい」「こうならないか?」という要求や要望事項を持っていると思います。
お客様が本当に望んでいることを実現できなければ意味がなく、要件定義の段階でこれらを漏れなく把握する必要があります。
(3) 希望納期は?
ソフトウェア開発の難しいところは人手を2倍に増やしても効率は2倍にはならない事です。お客様が「どんなに費用がかかってもよいから1ヶ月後に完成希望」と言われて、どんなに費用をかけても何ともならない事もあります。
その場合でも「出来ません」ではなく、少しでも希望に答えるためには「お客様にとって、その期日はどのような意味があるのか?」「機能単位のリリースでは不都合があるのか?」などを確認する必要があります。
なぜソフトウェア開発の見積もりは難しいのでしょうか?
ソフテックの場合はお客様に見積書を出して実際に発注していただかないと仕事となりません。
お客様は当然「これくらいだろう」という予算を考えているわけで、見積もりの内容について「なんでこんなにかかるのか?」というお言葉を頂くこともあります。
お客様は最終的には「機能の価値」を求めているのに対して、ソフトウェアの見積もりは「実現するためのコスト」を提示します。
優れた機能がソフトウェア的にも簡単に実現できれば問題ないのですが、ぱっと見には大したことのない機能でもソフトウェアで実現する場合には非常に難しいということがよくあります。
ソフトウェアは外から見ただけでは分かりません。「ソフトウェアは8割が非正常系の処理」と何かで読んだことがありますが、経験的にもその通りだと考えています。
【ファイルを読み込む】という機能についても
「ファイルが無かったら・・・」
「ファイルを別のプロセスがアクセス中なら・・・」
「ファイルの内容が間違えていたら・・・」
「想定以上の容量があったら・・・」など
プログラムを作る上ではさまざまな状態を想定してその場合の処置というのが記述されています。
ソフトウェア見積もりの方法についてはいろいろな手法がありますが、「これが最良!!」という見積もり方法がないのも現実です。
ソフテックの場合は、システムを構成する機能を細かい単位に分けて、それぞれでの設計、製造、テストなどを積み上げて全体見積もりを出す事が多いです。
それぞれの工数を出すのはこれまでの同様開発などでの実績や経験などをもとに算出しています。
機能算出に失敗すれば当然見積もりも不足する事になりますし、お客様が求めている以上の機能を過剰に算出しても、コストの折り合いがつかなくなってしまいます。
見積もるための大前提としては、要件定義が固まっていることが必要ですが、この要件定義が固まっていない状態で見積もる場合は特に注意が必要です。