ソフトウェア開発における工数の分布について

ソフトウェアを開発する工数(人数×時間)や作業時間は、要件、開発環境、開発要員、プロセス等によって影響を受け、開発規模が同じであってもばらつきが発生します。この工数や時間の分布を何らかの確率分布で近似できれば、開発プロジェクトの評価や見積もり等に役立てることができます。この工数や時間の確率分布について考えてみました。

目次

1.工数と開発規模の関係

1.1 工数確率密度関数

ソフトウェア開発プロジェクト(単にプロジェクトと呼ぶ)では、開発プロセスに従ってソフトウェアを作成しています。一般に、作成されたソフトウェアの規模(開発規模)はソースコード行数で表すことがありますが、開発規模が大きくなるとそれを作成するのに要する工数は増加していきます。 単位開発規模(例:1KL)を開発するのに要する工数は、一般にばらつきがあるため確率分布になります。今、開発規模が同じで、開発に要する工数が同一の指数分布$λ e^{- λ x}$になっていると仮定します。この工数を確率変数$X_{n}$で表すと、$λ e^{- λ x_{n}}$は$X_{n}=x_{n}$のときの確率を表しています。

$n$個のソフトウェアモジュールの開発規模が$k$のときの全工数を確率変数$Z$で表すと、 \[ Z = X_{1} + X_{2} + X_{3} + \ldots + X_{n} \] であり、 $Z=z$とするとき、 \[ z = x_{1} + x_{2} + x_{3} + \ldots + x_{n} \] とします。

確率変数の和はたたみ込み積分で計算できるため、これを用いて$Z$の確率分布を計算します。 \[ f_{Z}(z) = \int \int \ldots \int λ e^{- λ x_{1}} \cdot λ e^{- λ x_{2}} \ldots λ e^{- λ x_{n}} \delta (x_{1} + x_{2} + \ldots + x_{n} - z) dx_{n} \ldots dx_{2} dx_{1} \] ここで$\delta (x)$はDracのデルタ関数です。

$f_{Z}(z)$の一般解を求めるために、まず$n=4$の場合 \[ f_{Z}(z) = \int \int \int \int λ e^{- λ x_{1}} \cdot λ e^{- λ x_{2}} \cdot λ e^{- λ x_{3}} \cdot λ e^{- λ x_{4}} \delta (x_{1} + x_{2} + x_{3} + x_{4} - z) dx_{4} dx_{3} dx_{2} dx_{1} \] について考えてみます。

まず積分範囲であるが、$ z = x_{1} + x_{2} + x_{3} + x_{4}$、$x_{i} \ge 0$、$i=1,2,3,4$から、 $x_{4} = z - (x_{1} + x_{2} + x_{3}) \ge 0$を得ます。これから、 $z - (x_{1} + x_{2}) \ge x_{3} \ge 0$ となり、$x_{3}$の積分範囲を得ます。 さらに、$z - (x_{1} + x_{2}) \ge 0$から、 $z - x_{1} \ge x_{2} \ge 0$ となり、$x_{2}$の積分範囲を得ます。 また、$z - x_{1} \ge 0$から、 $z \ge x_{1} \ge 0$ となり、$x_{1}$の積分範囲を得ます。

これで計算に必要な全ての変数$x_{i}$の積分範囲を求めることができました。 これより、$f_{Z}$は、 \[ f_{Z}(z) = \int \int \int \int λ ^3 \cdot e^{- λ (x_{1} + x_{2} + x_{3} ) } \cdot λ e^{- λ x_{4}} \cdot \delta (x_{4} - (z -(x_{1} + x_{2} + x_{3}))) dx_{4} dx_{3} dx_{2} dx_{1} \] となり、以下の公式を使うと、 \[ \int_{- \infty}^{\infty} f(x) \delta (x - a) dx = f(a) \] \[ f_{Z}(z) = \int \int \int λ ^3 \cdot e^{- λ (x_{1} + x_{2} + x_{3} ) } \cdot \int λ e^{- λ x_{4}} \cdot \delta (x_{4} - (z -(x_{1} + x_{2} + x_{3}))) dx_{4} dx_{3} dx_{2} dx_{1} \] \[ = \int \int \int λ ^3 \cdot e^{- λ (x_{1} + x_{2} + x_{3} ) } \cdot λ e^{- λ (z -(x_{1} + x_{2} + x_{3}))} dx_{3} dx_{2} dx_{1} \] \[ = λ ^4 e^{ - λ z} \int_{0}^{z} \int_{0}^{z - x_{1}} \int_{0}^{z - (x_{1} + x_{2})} dx_{3} dx_{2} dx_{1} \] \[ = λ ^4 e^{ - λ z} \int_{0}^{z} \int_{0}^{z - x_{1}} \bigl( z - (x_{1} + x_{2}) \bigr) dx_{2} dx_{1} \] \[ = λ ^4 e^{ - λ z} \int_{0}^{z} \int_{0}^{z - x_{1}} \bigl( (z - x_{1} ) - x_{2} \bigr) dx_{2} dx_{1} \] \[ = λ ^4 e^{ - λ z} \int_{0}^{z} \Bigl[ (z - x_{1} ) x_{2} - \frac{1}{2} x_{2}^2 \Bigr]_{0}^{z - x_{1}} dx_{1} \] \[ = \frac{1}{2} λ ^4 e^{ - λ z} \int_{0}^{z} \Bigl \{(z - x_{1} )^2 \Bigr \} dx_{1} \] \[ = \frac{1}{2 \cdot 3} λ ^4 e^{ - λ z} z^{3} \] このことから、一般解は、 \[ f_{Z}(z) = \frac{1}{(n-1)!} λ ^{n} z^{n-1} e^{ - λ z} \] となります。

ここで、$(n-1)!$について一般化するために、ガンマ関数$Γ (n)$を使うことにします。 ガンマ関数$Γ (n)$は、 \[ Γ (n) = \int_{0}^{\infty} x^{n-1} e^{-x} dx \] です。 $Γ (n) = (n-1)!$であることから、 \[ f_{Z}(z) = \frac{1}{Γ (n)} λ ^{n} z^{n-1} e^{ - λ z} \] となりガンマ分布が得られます。

$x_{n}$は単位開発規模(例えば1KL)についての工数を表していましたので、$n$はモジュール数を表していることから、$n$と全開発規模$k$は同じになり、$n$を全開発規模$k$で置き換えることにします。

以上より、工数の確率分布として \[ f_{Z}(z) = \frac{1}{Γ (k)} λ ^{ k } z^{ k -1 } e^{ - λ z} \ldots \text{(1)} \] を得ることができます。

式(1)を使って、$k=4KL$、$λ = 0.005KL$/人時($5L$/人時)のときの工数確率密度関数の分布の例を図1に示します。

図1 工数確率密度関数の分布の例

図1 工数の確率密度関数の分布の例

1.2 工数の平均

開発工数$Z$の平均$E[Z]$を計算します。 \[ E[ Z ] = \int_{0}^{ \infty } z \cdot f_{ Z }( z ) dz \] \[ = \int_{0}^{ \infty } z \cdot \frac{1}{Γ ( k )} λ ^ k z^{ k -1 } e^{ - λ z} dz \] $x = λ z$とおくと、 \[ = \frac{1}{Γ ( k )} λ ^ k \int_{0}^{\infty} \Bigl( \frac{ x }{ λ } \Bigr) ^{ k } e^{ - x} \frac{1}{ λ } dx = \frac{1}{Γ ( k )} \frac{1}{ λ } \int_{0}^{\infty} x ^{ k } e^{ - x} dx \] となります。ガンマ関数の定義から、 \[ Γ ( k +1 ) = \int_{0}^{\infty} x ^{ k } e^{ - x } dx \] \[ E[Z] = \frac{1}{Γ ( k )} \frac{1}{ λ } \int_{0}^{\infty} x ^{ k } e^{ - x } dx = \frac{1}{ λ } \frac{Γ ( k +1 )}{Γ ( k )} \] $Γ (k+1)=k Γ (k)$より、 \[ E[Z] = \frac{1}{λ} \frac{Γ ( k +1 )}{Γ ( k )} = \frac{ k }{ λ } \ldots \text{(2)} \] 工数の平均は$E[Z] = \frac{k}{λ}$となり、開発規模$k$に比例します。
また、$\frac{1}{λ}$は、工数(人時)を開発規模$k$で割ったものになるため、$λ$は生産性を表しています。

1.3 工数の分散

工数$Z$の分散$V[Z]$を計算します。 \[ V[Z] = E[Z^2] - \{ E[Z] \}^2 \] 右辺第1項$E[Z^2]$について考えます。 \[ E[ Z^2 ] = \int_{0}^{ \infty } z ^2 \cdot \frac{1}{Γ ( k )} λ ^ k z^{ k -1 } e^{ - λ z} dz \] \[ = \frac{1}{Γ (k)} λ ^k \int_{0}^{\infty} z^{k+1} e^{ - λ z} dz \] $x = λ z$とおくと、 \[ E[Z^2] = \frac{1}{Γ (k)} \frac{1}{λ ^2} \int_{0}^{\infty} x^{k+1} e^{ - x } dx \] ガンマ関数の定義から、 \[ Γ (k+2) = \int_{0}^{\infty} x^{k+1} e^{-x} dx \] したがって、 \[ E[Z^2] = \frac{1}{λ ^2} \frac{Γ (k+2)}{Γ (k)} \] $Γ (k+1)=k Γ (k)$より、$Γ (k+2)=k(k+1) Γ (k)$ \[ E[Z^2] = \frac{1}{λ ^2} k(k+1) = \frac{k^2}{λ ^2} + \frac{k}{λ ^2} \] \[ V[Z] = E[Z^2] - \{ E[Z] \}^2 = \frac{k^2}{λ ^2} + \frac{k}{λ ^2} - \Bigl( \frac{k}{λ} \Bigr) ^2 = \frac{k}{λ ^2} \ldots \text{(3)} \] 標準偏差σは、 \[ σ = \sqrt{V[Z]} = \sqrt{\frac{k}{λ ^2}} = \frac{ \sqrt{k}}{λ} \ldots \text{(4)} \]

2.まとめ

以上のように、工数はガンマ分布で近似できるのではないかと考えています。この場合、式(2)より工数は開発規模に比例し、比例係数は生産性の逆数になります。


本ブログの記載内容に関する免責事項

  • 著者は、数学、特に確率統計の専門家ではありませんので、本ブログに記載した内容については厳密性の欠如や誤りが含まれているかもしれません。しかし、導出された結果については、著者の現場経験から概ね妥当であると考えており、そのためブログとして著者の考えをまとめました。「プライバシーポリシー及び免責事項」に記載していますが、本ブログの内容の利用により生じた損害に対して、いかなる理由であっても著者は一切の責任を負いませんので予めご了承ください。
  • 本ブログの内容は、予告なく変更・削除する場合がありますのでご了承ください。