プロジェクトの計画

ファンクションポイントでプロジェクト規模を算出する方法 – 工数換算まで

はじめに

「見積もり」はプロジェクト成否を分ける重要なポイントです。
この見積もり精度が低いと予算や工期が足りない等のトラブルに発展するため、プロジェクト炎上につながります。
その対策として必要以上にリスク費用を見積もりに含めた結果、見積もり金額が高額になることが往々にしてあります。
すると顧客と開発側に軋轢が生じたり、顧客側も他に行いたかった投資を見送りにするといった問題につながることがあります。

そのため、顧客と開発側で相互に納得できる見積もりを作成することは非常に重要になります。

プロジェクトのコスト見積もり方法はいくつかありますが、その手法としてファンクションポイント(以下、FPと記す)について解説します。

FPについて

FPとは

FPとは、システムの機能に着目して規模を見積もります。
ここでいうファンクションとは、機能の「データ」と「トランザクション」を指します。
保持するデータ項目数、それらを登録・更新する数をカウントし、それぞれ複雑性である「重み付け」を加味することで算出します。

FPを活用するメリットとして、ボトムアップ見積もりをするほど情報が出ていない段階で、決まったルールに則り見積もりをすることで規模の可視化ができることです。
類推見積もりや、担当者の経験値から算出するよりも説得力のある見積もりを出すことができます。

FPの測定は新規開発、機能拡張によって区分けします。
それぞれ考慮すべきポイントがあるので注意が必要です。

新規開発プロジェクトFP(DFP)
新規開発するときに使用します。
既存システムからデータ移行する場合、新規開発と移行作業の両方について規模を見積もります。

機能拡張FP(EFP)
既存システムへ追加・変更・削除するときに使用します。
エンティティやトランザクションを変更しない改修の場合、FP値は0となるので、その部分は工夫が必要です。
この工夫は決まったルールはありません。
例えばトランザクションを何かしらカウントするルールを決めたり、そのプロセスだけはFP以外で算出するといった対策を行うことになります。

アプリケーションFP(AFP)
既存システムの開発規模を算出するために使用します。
機能拡張FPを算出する際、既存システムの規模が必要となります。

計算で使用する情報

前述のとおり、FPでは「データ」「トランザクション」が必要になります。
これらの情報はトランザクション一覧とエンティティ一覧が該当するため、事前にこれらの情報が揃っている必要があります。
システム開発においてエンティティ一覧(もしくはテーブル一覧)が無いケースは少ないと思いますが、トランザクション一覧を作らないケースはあると思います。
その場合は画面/帳票の表示項目やデータ連携ファイルなどデータの入出力がわかる情報をもとに計算します。

ここで非常に重要なポイントなのですが、FPで計算するのはユーザが見える情報だけでなく、エンジニアしか見えない内部管理のトランザクションやデータも対象とします。
昔はユーザが見える情報のみを取り扱うケースも多かったようですが、その結果、見えない部分の作り込み工数が足りず過小見積もりになることが往々にしてありました。
見えない部分の工夫や作り込みも重要な機能なので考慮します。

FP算出方法

FP算出ではファンクションごとにエンティティやトランザクションの項目数をカウントするのですが、その種類によって重み付けをして算出します。
この値を「未調整FP」と呼び、データFPとトランザクションFPの合算値となります。
これだけではシステム特性による規模増減が反映されないため、未調整FPにシステム特性係数をかけ合わせて算出します。

未調整FPを算出する

トランザクション、データごとに項目数と重み付けをかけ合わせてポイントをカウントして未調整FPを算出します。
この算出は、以下の全体イメージを見ると理解しやすいと思います。

次からデータファンクションとトランザクションファンクションの算出方法を説明します。

データFP

トランザクションファンクションを算出するためには、データファンクションとの関連を確認しながら進めるため先にデータFPを算出します。
このデータFPはデータベースやデータ格納ファイルのようにデータ保持するための機能です。
テンポラリファイルやバックアップデータのような一時データは対象外なので注意してください。

データファンクションの種類
ILF(Internal Logical File):内部論理ファイル
自分のシステム内で作成、更新、参照、削除するファイル。

EIF(External Interface File):外部インタフェースファイル
他システムで作成したファイル(参照のみ)。

カウント方法
DET(Data Element Type
取り扱うデータ項目数のことで、エンティティのカラムなどを指します。

RET(Record Element Type)
サブエンティティ(エンティティに属するエンティティ)です。
例えば対象テーブルと明細テーブルが1対Nの関係である場合にカウントされます。

各エンティティごとにDET数とRET数を比較して重み付け「簡単/平均/複雑」を判定します。
その重み付けをデータFPの表に当て、それぞれのカウントに重みの掛け算をしたものがデータFPの未調整FPになります。

<補足>
この表はIFPUG(International Function Point Users Group)というファンクションポイント法の非営利組織が提供しているものです。
次のトランザクションFPも同様です。
必ずこの表を使う必要はないのですが、他に妥当な表がないのでこちらを活用するのが一般的です。
ただしRET数が1の場合、DET数が51以上でも平均になっていますが実際は複雑だと判断されるケースがあります。
そのため20~50を平均、51以上を複雑としてカウントすることもあります。

トランザクションFP

データファンクションに対して登録・更新や出力などのデータ操作を行う機能です。
画面からの入出力、帳票出力、データ連携ファイルの入出力などが該当します。

トランザクションFPの種類
EI (External Input):外部入力
データを追加、変更、削除する。

EO (External Output):外部出力
データを加工して出力する。

EQ (External Inquiry):外部照会
データを加工せずに出力する。

カウント方法
DET(Data Element Type)
データファンクションと同様に、入出力するデータ項目、およびプロセスを起動するトリガー数です。
画面・帳票のヘッダーなどはDETの数に含めません。

FTR(File Type Reference)
プロセスが読み書きするデータ保存先やファイル数です。

システム特性の取得

上記で取得した未調整FPに、システム特性の係数をかけ合わせることでFPを取得します。
システム特性は以下の14項目ごとに0~5までのランクをつけ、それらを合算することでTDI(システム特性の合計値)を求めます。
そこから未調整FPにかけ合わせるVAF(システム特性係数)を算出します。

TDI(Total Degree of Influence):システム特性の合計値
VAF(Value Adjustment Factor):システム特性係数

  VAF = (TDI × 0.01) + 0.65

FPを算出する

これまでに算出したポイントをもとに、次のように計算します。

新規開発プロジェクトFP(DFP)

 FP = 未調整FP × VAF

未調整FPには移行開発のFPも含まれます。

機能拡張FP(EFP)

 FP = (未調整FPA ×VAFA) + (未調整FPD × VAFD)

未調整FPA:追加、変更する機能の未調整FP
未調整FPD:削除する機能の未調整FP
VAFA:機能改良後のアプリケーションの調整係数
VAFD:機能改良前アプリケーション(AFP)の調整係数

工数換算する

取得したFPを工数に換算するのは、おもに2つの方法があります。

・FP/人月の生産性から工数を算出する
・COCOMO/COCOMOⅡモデルを利用してSLOCを算出する

ここでは前者の生産性から算出する方法について言及します。
基本的に1人月で対応できるFPをもとに、FPから割り算して工数を算出します。
つまり、1人月で対応できるFP(生産性)の精度はそのまま見積もり精度にも直結します。

この生産性の取得方法ですが、一番良いのは過去プロジェクトの実績データをもとに算出するのが望ましいです。
しかし、この生産性を算出するには過去データの蓄積が必要であり、それらのデータが揃っていないのであれば生産性算出に相応の時間を要します。

そこで、過去実績データから算出できない場合は、IPAのソフトウェア開発データ白書のFP生産性を活用する方法があります。
この中に主要開発言語別、プラットフォーム別などの生産性を使用するのですが、構築するシステムの難易度から中央値、最小値、最大値を使い分けて選定するとよいでしょう。