開発工数と開発規模の関係は比例関係か、指数関数的な関係かについて

IPAのデータ白書を見ると開発工数は開発規模を用いて指数関数で関係付けられています。開発工数はガンマ分布で近似できるかもしれないことは「ソフトウェア開発における開発工数の分布について」で記述しましたが、これによると開発工数は開発規模と比例関係にあり、比例係数は生産性の逆数になります。この違いについて考えてみました。

目次

1.はじめに

ソフトウェア開発で開発工数(人数×時間)を見積もる際に開発規模を用いるときがあります。開発工数が開発規模とどのような関係があるかを知ることは、見積もりだけでなく、品質評価などの参考にもなり役立ちます。
生産性が一定の時は以下のページに記載したように、開発工数と開発規模は比例関係にあると考えられます。

しかし、文献1)にあるように、開発工数$Z_{ I }$と開発規模$k$は、 \[ Z_{ I } = A \cdot k ^{B} \qquad \ldots \text{(1)} \] のような指数関数的な曲線の傾向があることが分析で示されています。ここで$A$、$B$は定数です。
開発工数と開発規模が比例関係になることを考慮して、このような指数関数的な曲線の傾向が生じる理由について考えてみました。

2.生産性が異なる2種類の開発が混在した時の開発工数と開発規模の関係

開発規模が$k_{1}$、$k_{2}$であるソフトウェアを、生産性$λ _{1}$、$λ _{2}$で開発するとき、開発工数が$Z_{1}$、$Z_{2}$であるとします。このとき、$Z_{1} = z_{1}$、$Z_{2} = z_{2}$となる時の確率密度関数は、以下のガンマ分布 \[ f_{ Z_{1} }( z_{1} ) = \frac{1}{Γ ( k_{1} )} λ _{1}^{ k_{1} } z_{1}^{ k_{1} - 1} e^{ - λ _{1} z_{1} } \qquad \ldots \text{(2)} \\\\ f_{ Z_{2} }( z_{2} ) = \frac{1}{Γ ( k_{2} )} λ _{2}^{ k_{2} } z_{2}^{ k_{2} - 1} e^{ - λ _{2} z_{2} } \qquad \ldots \text{(3)} \] になるとします。
$Z_{1}$、$Z_{2}$の平均は \[ E[Z_{1}]=\frac{k_{1}}{λ _{1}} \qquad \ldots \text{(4)} \\\\ E[Z_{2}]=\frac{k_{2}}{λ _{2}} \qquad \ldots \text{(5)} \] になります。
開発規模$k=k_{1} + k_{2}$のときの全体の開発工数を$Z$とすると、開発規模$k$のときの開発工数は$Z=Z_{1} + Z_{2}$になります。
このときの開発工数$Z$の平均$E[Z]$は、 \[ E[Z]=E[Z_{1}+Z_{2}]=E[Z_{1}]+E[Z_{2}]=\frac{k_{1}}{λ _{1}}+\frac{k_{2}}{λ _{2}} \qquad \ldots \text{(6)} \] になります。
今、$\frac{k_{1}}{k}$が関数$r(k)=e^{-bk}$で表されるとします。 $k=k_{1}+k_{2}$から、$k_{2}=k-k_{1}$であるため、 \[ \frac{k_{1}}{k}=r(k)=e^{-bk} \] \[ \frac{k_{2}}{k}=1-r(k)=1-e^{-bk} \] になります。 したがって、 \[ E[Z]=\frac{k_{1}}{λ _{1}}+\frac{k_{2}}{λ _{2}}=k \cdot \Bigl \{ \frac{k_{1}}{k} \frac{1}{λ _{1}}+\frac{k_{2}}{k} \frac{1}{λ _{2}} \Bigr \} \] \[ =k \cdot \Bigl \{ e^{-bk} \cdot \frac{1}{λ _{1}}+(1-e^{-bk}) \cdot \frac{1}{λ _{2}} \Bigr \} \] \[ =k \cdot \Bigl \{ \frac{1}{λ _{2}}+(\frac{1}{λ _{1}} - \frac{1}{λ _{2}} ) \cdot e^{-bk} \Bigr \} \qquad \ldots \text{(7)} \] となります。
$k \to 0$のとき、$E[Z] \approx \frac{k}{λ _{1}}$、$k \to \infty$のとき、$E[Z] \approx \frac{k}{λ _{2}}$となります。
$k_{1}$をソフトウェアの改造規模、$k_{2}$をソフトウェアの新規開発規模とし、$λ _{1}$を改造時の生産性、$λ _{2}$を新規開発時の生産性とします。
また、$r(k)$を全体開発規模$k$のときの改造割合の平均を表す関数とし、$r(k)= \frac{k_{1}}{k}=e^{-bk}$とします。 この場合、開発規模$k \approx 0$のときは$r(k) \approx 1$であり、開発はほとんど改造であり、このときの生産性は$λ _{1}$です。開発規模が大きくなり$k \to \infty$のときは$r(k) \approx 0$となり、開発はほとんど新規開発で、このときの生産性は$λ _{2}$です。

図1に、$λ _{1}=5$、$λ _{2}=10$、$b=5.1 \times 10^{-6}$のときの生産性、開発規模、改造割合の関係をグラフにした例を示します。改造割合の曲線は$r(k)= \frac{k_{1}}{k}=e^{-bk}$を使って計算した結果です。また、生産性の曲線は、まず式(7)の$E[Z]$を$k$で微分して$\frac{1}{λ_{Z}}$を求め(式(8))、その結果である式(9)を用いて生産性$λ_{Z}$を計算してグラフにしています。 \[ \frac{d E[Z]}{dk} = \frac{1}{λ_{Z}} = \frac{d}{dk} ( k \cdot \Bigl \{ \frac{1}{λ _{2}}+(\frac{1}{λ _{1}} - \frac{1}{λ _{2}} ) \cdot e^{-bk} \Bigr \} ) \qquad \ldots \text{(8)} \] \[ = \frac{1}{λ _{2}} + (1 - bk) \cdot (\frac{1}{λ _{1}} - \frac{1}{λ _{2}} ) \cdot e^{-bk} \qquad \ldots \text{(9)} \]

図1 生産性、開発規模、改造割合の関係

図1 生産性、開発規模、改造割合の関係

また、図2に開発規模と開発工数の関係をグラフにした例を示します。図2は式(7)の結果とIPAの計算式(1)を用いて計算した結果のグラフです。IPAの計算式では、文献1)に掲載の数値である$A=12.8$、$B=0.64$を用いています。

図2 開発規模と開発工数の関係

図2 開発規模と開発工数の関係

図2の式(7)の計算結果とIPAの計算式(1)では一定の差がありますが、開発規模が小さい部分(0〜100000L付近まで)については曲線になっていることや開発規模が大きくなるにつれて直線になっていることなど共通点があります。
改造割合$r(k)= \frac{k_{1}}{k}=e^{-bk}$は、開発規模が小さいときは改造開発が多く、開発規模が大きくなるに従って新規開発が多くなるという経験から適当に設定したもので、本来は多くの開発プロジェクトの実績値から妥当な関数を設定すべきです。しかし今回は、開発規模が小さい場合と大きい場合で生産性が異なる場合に、開発工数と開発規模の関係がどのようになるか示せればよかったので、$r(k)= \frac{k_{1}}{k}=e^{-bk}$という簡単な式を用いています。

3.まとめ

以上の考察から、文献1)のIPAの計算式(1)に示されている開発工数と開発規模の指数関数的な傾向は以下のように推測しています。
新規開発のときは開発規模が大きく生産性が高いですが、改造開発は開発規模が比較的小さいものが中心で、改造による既存のソフトウェアへの影響調査やリグレッションテストの実施などで開発工数が増加し生産性が低くなります。そのため、図2に示すように、開発規模が小さいときは生産性が低いためグラフの曲線の傾きは比較的急になっており、開発規模が大きくなるにつれて生産性が徐々に高くなり曲線の傾きは緩やかにほぼ一定に増加するようになります。本来は開発工数と開発規模は式(4)と式(5)のように直線的な関係ですが、開発規模が大きくなるに従い、様々な生産性を持つ開発が1つのプロジェクト内に混在することによって全体の生産性が変化し、開発工数と開発規模の関係が指数関数的な関係となって現れているのではないかと推測しています。

参考文献

1) 独立行政法人 情報処理推進機構 社会基盤センター:“ソフトウェア開発 データ白書 2018-2019”, P149, 2018/10/1