プロジェクトの見積、山積みをどう考るか

タイトルとは全く別文脈なのだが、最近「プロジェクトは生き物だなぁ」と、本気で思うようになってきたわけです。

 
 
こんな感じで、色んなサイトや色んな文献に「プロジェクトは生き物だ!」っていう主張が溢れております。まぁ私も同じような主張をしたい訳なのですが、理由は少し違っているような気もします。
 
システム開発であれ、その他のプロジェクトであれ、二度と同じプロジェクトはない訳で、再現性がないからこそプロジェクトと呼ばれている訳です。でも悲しいかな、我々は成功体験や過去事例を元にして、どうにか首尾よく確度の高い推測をして、プロジェクトを進めようとします。しかしまぁ、外れる訳です。なぜなら、前述の通り同じプロジェクトは無いので。
 
で、なぜ私が「プロジェクトは生き物」という主張をするのか、というと「メンバーやチーム、ステークホルダーの成熟度が違うとすべてが変わるということを、オフショア開発で如実に味わった」から。
メンバーがチームが育てば育つほど、ステークホルダーが開発の実情に理解を示すほど、プロジェクトは容易に回るようになっていくように思います。それ以外の要因も多々関係するとは思うものの、この人の成長なくしては、非常にプロジェクトのリスクが高まるでしょう。
 
で、本題です。

プロジェクトをどう見積もるか?

みなさんご存知の通り、開発プロジェクトを始める際には見積や山積みを行います。
毎回やることなので、自分のメモ書きとして、私の考え方や解決に至っていない部分を書いておきます。いくつかは当たり前の内容だと思うかもしれませんが、お付き合いください。
ちなみに開発工数の見積なので、管理工数や移行工数など、開発以外のものはスコープ外です。

必ずプロジェクトの実績を記録する

「いきなりプロジェクト進行中の話かよ」という感じですが、今までのプロジェクトの実績値を参考にしないと、何にも見積もれません。そのためにも、プロジェクトを走らせる時は実績値を集計するためにも、適切な管理を行うことが重要だと思っています。
 
  • 機能
  • 機能種別(画面、バッチ、その他)
  • 難易度
  • 新規/改修
  • フェーズ
  • フェーズのプロセス
  • 担当者
 
などなど、細分化して記録しなくてはなりません。これらを細かく指標化するために、我々のプロジェクトでは専任の進捗記録者を用意しています。

実績値の集計を行う

実績値はノイズ情報を除いて、各指標ごとに中央値を取らなくては使えません。
上記に記載した指標を集計して、大体の中央値を取っています。

似ている実績値をベースにして積み上げる

要求が細分化され、機能要求や技術仕様があらかた見えた前提ですが、実績値を当てはめられるレベルまで要求を画面やバッチ、その他機能に細分化していきます。
それらの一覧を作成した後に、あとは前プロジェクトの実績値の中から、同様な値を抽出して当てはめていきます。
 
ここで重要なのが「チームもしくはメンバーの成長がどれだけ生産性に寄与するか」ということです。全くど新規のメンバー達で構成する場合は(特にラボ契約以外のオフショアや一括発注などはこれに当たるとおもいます)、基本的に最低の生産性を前提として見積るべきだと思っています。
一方で逆の場合においては、メンバーが成熟しきっていない、改善プロセスが回っている、という前提つきで、生産性の向上を見込むべきだとおもいます。ただ、そこの向上がどれくらい見込めるのか、ということはなんとも言えません。
改善ポイントやプロセスの無駄を省いた場合において、何割程度削減できそうか見立てた上でパーセンテージを決定するイメージです。

他工程を見積る

開発工数が算出できたら、今度はそれをベースに他工程の見積を算出します。過去プロジェクト実績で、大体の工数工程比率や期間工程比率が出ていれば、その値を使って開発フェーズの見積工数を元に他フェーズの工数を割り戻して計算します。
もし、実績データが不十分な場合だったりそもそも無い場合は、IPAのソフトウェア開発データ白書が有用です。
 

ただ注意しなくてはいけないのですが、

  • 母数が非常に大きいため、いろいろなプロジェクトの実績が入っている
  • もちろん実績に紐づくプロジェクトの特性はわからない
です。なので、あくまでも参考値として使うに止めて、値を調整する必要があります。
 
また開発期間の調整が可能な場合には、全体期間、工程別の妥当性も検証し、調整します。
我々はIBMで開発されたWF値という指標値を用いて期間妥当性を検証しています。

山を積む

工数と期間が決まりましたので、あとは山を積むだけです。管理工数などの差配が必要ですが、原則今まで積み上げた内容を元に、リソース調整可能な範囲で各月の人月を算出します。
 
これでようやく、全体の金額が算出できるとおもいます。

オフショアならではの見積

我々がオフショア開発をする時には、委託先に見積ってもらう前に、まず自分たちで見積を行います。我々にとってみれば今までこなれてきた開発なので、よほど新しい事をしなければ見積の精度は高くなります。
 
この我々の見積に対して、委託先の見積工数がどれくらいか、ということがキモになります。
 
この比率こそ、国内開発に対するオフショア開発の生産性であり、これを毎回算出し続けることで、見積精度の向上や生産性の向上幅のトラッキング等ができるようになります。委託先へ全てを丸投げするのではなく、自分たちと比較する、ということが非常に重要です。
 

終わりに

これはあくまで私の実体験に基づく方法論です。ですが、オーソドックスな方法論だと思いますので、皆さんのお役に立てれば幸いです。もし他に良い方法論をご存知の方がいらっしゃれば、ぜひ教えてください。
 
では。