PSP:Personal Software Process – Lesson1

Facebook にシェア
このエントリーをはてなブックマークに追加
[`livedoor` not found]
Delicious にシェア

PSP: Personal Software Process とは、ソフトウェア開発効率の向上の為に、個人毎のソフトウェア開発プロセスを見直しする枠組みです。
PSPはグローバルに多くの大学やソフトウェア開発会社で適用しており、マイクロソフトやボーイングでも使用しているそうです。
個々がPSPによって、自分の開発時の癖やパフォーマンスを把握・改善を行い、開発効率向上を行います。
最終的には全チームメンバがPSPを実施し、TSP:Team Software Process へと発展させます。

今回はPSPガイドブック ソフトウェアエンジニア自己改善 (IT Architects’ Archive)に沿いながら、8本ほどのプログラムを開発し、開発プロセスの見直しをしました。
各プログラムは小さいものばかりで、コーディング自体は2時間程あればコーディング出来ると思います。
今回使用する言語はJAVAを選択しましたが、PHPやPascal、Cでも何でも大丈夫です。
但し、狙いはコーディングではなく、実装前の全体計画や設計、テスト、バグの傾向等を含めた事後分析と多岐に俯瞰する必要があります。
なお、各回のスクリプトはSoftware Engineering Instituteよりダウンロード可能です。

Lesson1: 「ファイルから数値データのリストを読み込み、データの平均値と標準偏差を計算する」
● プログラム仕様スクリプト
ASGKIT PROG1を参照のこと

● 実行結果

Average: 60.32
Standard Deviation: 62.26

● ソースコード

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.Iterator;
import java.util.LinkedList;

/**
 * PSP Lesson1:
 * ファイルから数値データのリストを読み込み、データの平均値と標準偏差を計算する
 */

public class Program1 {

    private LinkedList<Double> linkArray;
    private double resultAvg;
    private double resultStgDeviation;

    public static void main(String[] args) {

        Program1 pg1 = new Program1();

        try {
            File f = new File(args[0]);
            FileInputStream fi = new FileInputStream(f);
            BufferedReader br = new BufferedReader(new InputStreamReader(fi,
                    "UTF-8"));
            pg1.linkArray = new LinkedList<Double>();
            String line;
            while ((line = br.readLine()) != null) {
                pg1.linkArray.add(Double.parseDouble(line));
            }

            pg1.calcAvg();
            pg1.calcStgDeviation();

            System.out.println("Average: " + pg1.resultAvg);
            System.out.println("Standard Deviation: " + pg1.resultStgDeviation);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 平均値を計算する
     * 
     */
    private void calcAvg() {

        double avg = 0;
        for (Iterator i = linkArray.iterator(); i.hasNext();) {
            avg = avg + Double.parseDouble(i.next().toString());
        }

        resultAvg = this.changeScale(avg / linkArray.size(), 2);

    }

    /**
     * 標準偏差を計算する
     * 
     */
    private void calcStgDeviation() {

        // 1. データ毎に平均値との差分を2乗し合計値を取る
        // 2. 合計値をデータ個数-1で除算し、平方根を計算する
        double wkStg = 0;
        for (Iterator i = linkArray.iterator(); i.hasNext();) {
            wkStg = wkStg
                    + Math.pow(Double.parseDouble(i.next().toString())
                            - resultAvg, 2);
        }

        resultStgDeviation = this.changeScale(
                Math.sqrt(wkStg / (linkArray.size() - 1)), 2);

    }

    /**
     * 四捨五入を行う
     * 
     */
    private double changeScale(double val, int i) {

        BigDecimal bd = new BigDecimal(val);
        return bd.setScale(i, BigDecimal.ROUND_HALF_UP).doubleValue();

    }

}