最適な工期を算出するプログラムを作成してみた(javascriptとbookmarkletで)
この記事によると、「全体工数の(人月)の立方根の2.4倍」が適切な工期(月)らしい。
ここには載せないが1人月から1000人月の工期と投入人数をグラフにしてみたところ、なるほどなんとなく経験と一致する。
算出方法や実際とのずれの検証は他のブロガーに任せるとして、ここでは簡単な算出プログラムを書いてみる。
ここには載せないが1人月から1000人月の工期と投入人数をグラフにしてみたところ、なるほどなんとなく経験と一致する。
算出方法や実際とのずれの検証は他のブロガーに任せるとして、ここでは簡単な算出プログラムを書いてみる。
javascriptの場合
大した事はしていない。
ただ、良い名称が思い浮かばなかったため、関数名が長すぎ。
ただ、良い名称が思い浮かばなかったため、関数名が長すぎ。
/*
================================================================================
Name : 工数から工期と必要人数を算出する関数
In : [Number] 工数(人月)
Out : [Object] ["manmonth":工数(人月),"months":工期(月),"men":人数]
Note : 「日本情報システム・ユーザー協会」発表「ソフトウェアメトリックス調査2007」による工期・人数算出
--------------------------------------------------------------------------------
Version : Ver1.0.0 | 2007/07/07 | 新規作成
--------------------------------------------------------------------------------
License : MIT license
URL : www.kanasansoft.com
================================================================================
*/
function getMonthsAndMenByManMonth(manmonth){
var months,men,returnValue;
if(manmonth.constructor==Number&&manmonth&&manmonth>0){
months = Math.pow(manmonth,1/3)*2.4;
men = manmonth/months;
returnValue = {"manmonth":Number(manmonth),"months":months,"men":men};
}else{
returnValue = null;
}
return returnValue;
}
================================================================================
Name : 工数から工期と必要人数を算出する関数
In : [Number] 工数(人月)
Out : [Object] ["manmonth":工数(人月),"months":工期(月),"men":人数]
Note : 「日本情報システム・ユーザー協会」発表「ソフトウェアメトリックス調査2007」による工期・人数算出
--------------------------------------------------------------------------------
Version : Ver1.0.0 | 2007/07/07 | 新規作成
--------------------------------------------------------------------------------
License : MIT license
URL : www.kanasansoft.com
================================================================================
*/
function getMonthsAndMenByManMonth(manmonth){
var months,men,returnValue;
if(manmonth.constructor==Number&&manmonth&&manmonth>0){
months = Math.pow(manmonth,1/3)*2.4;
men = manmonth/months;
returnValue = {"manmonth":Number(manmonth),"months":months,"men":men};
}else{
returnValue = null;
}
return returnValue;
}
bookmarkletの場合
普段はIEの制限に収めるまで文字数削減を行うが、今回は限界まで切り詰めてみた。
(但し、[eval]の使用禁止と文字リテラル[']は使用禁止)
戻り値のメンバ変数(プロパティやフィールドとも言う)の名称変更を行えば更に減るが、I/O変更にはあえて手を出さなかった。
(上記の関数[getMonthsAndMenByManMonth]と下記の変数[f]はI/Oは全く同じになっている。)
(但し、[eval]の使用禁止と文字リテラル[']は使用禁止)
戻り値のメンバ変数(プロパティやフィールドとも言う)の名称変更を行えば更に減るが、I/O変更にはあえて手を出さなかった。
(上記の関数[getMonthsAndMenByManMonth]と下記の変数[f]はI/Oは全く同じになっている。)
/*
================================================================================
Name : 工数から工期と必要人数を算出するBookmarklet Ver1.0.0
In : [none]
Out : [none]
Note : 「日本情報システム・ユーザー協会」発表「ソフトウェアメトリックス調査2007」による工期・人数算出
--------------------------------------------------------------------------------
Version : Ver1.0.0 | 2007/07/07 | 新規作成
--------------------------------------------------------------------------------
License : MIT license
URL : www.kanasansoft.com
================================================================================
*/
javascript:(
function(){
var
p
,r
,n=Number
,d=function(v){
return Math.round(v*10)/10
}
,f=function(a){
var o;
return a.constructor==n&&a&&a>=0?{"manmonth":n(a),"months":o=Math.pow(a,1/3)*2.4,"men":a/o}:null
}
;
while(true){
p=prompt("input man-month.");
if(p==null){
return
}else if(isNaN(n(p))||0>=n(p)){
continue
}else{
r=f(n(p));
break
}
}
alert( "man-month:" + d(r.manmonth) +
"\nmonths:" + d(r.months) +
"\nmen:" + d(r.men) )
}
)
()
================================================================================
Name : 工数から工期と必要人数を算出するBookmarklet Ver1.0.0
In : [none]
Out : [none]
Note : 「日本情報システム・ユーザー協会」発表「ソフトウェアメトリックス調査2007」による工期・人数算出
--------------------------------------------------------------------------------
Version : Ver1.0.0 | 2007/07/07 | 新規作成
--------------------------------------------------------------------------------
License : MIT license
URL : www.kanasansoft.com
================================================================================
*/
javascript:(
function(){
var
p
,r
,n=Number
,d=function(v){
return Math.round(v*10)/10
}
,f=function(a){
var o;
return a.constructor==n&&a&&a>=0?{"manmonth":n(a),"months":o=Math.pow(a,1/3)*2.4,"men":a/o}:null
}
;
while(true){
p=prompt("input man-month.");
if(p==null){
return
}else if(isNaN(n(p))||0>=n(p)){
continue
}else{
r=f(n(p));
break
}
}
alert( "man-month:" + d(r.manmonth) +
"\nmonths:" + d(r.months) +
"\nmen:" + d(r.men) )
}
)
()
結果
このプログラムは役に立つのか?
プロジェクトの工程によって実稼動の発生する人数が違うであろう事から、算出された投入人数は信憑性が低いと思われる。
プロジェクトの工程によって実稼動の発生する人数が違うであろう事から、算出された投入人数は信憑性が低いと思われる。