システム工学概論 第1回 プログラム設計の原理

システム工学概論
第2回
プログラムとテスト
2004. 11. 4
Copyright Z. Koono 2004
第2回 概要
復習プログラム設計
構造化チャート(PAD)
原理的なテスト
プログラム構造とデバッグ
宿題案内
Copyright Z. Koono 2004
復習 時計の設計
フ ロ ーチャ -ト
設計中
データ フ ロ ー
設計中
フ ロ ーチ ャ -ト
仕様
時
計
コ -ディ ン グ 中
実時間
クロック
デ
|
タ
フ
ロ
|
設
計
1秒
クロ
ック
時刻を
える
時計
盤面
時計
時
刻
時刻表示
を 求める
時刻
表示
時計
盤面
表示
する
時針分針 秒針
時針を
求める
角
度
時 幅
針
分針を 求める
秒針を
求める
長
さ
フ
ロ
|
チ
ャ
|
ト
設
計
コ
|
デ
ィ
ン
グ
Copyright Z. Koono 2004
プログラム論理の表記
親概念のDFD
時刻表示
を 求める
時刻表示
時刻を
える
時刻
1 秒ク
ロック
開始
表示する
時計
盤面
子概念のDFD+フローチャート
終了
プログラム論理は,
データフロー図+構造化チャートで表記される
Copyright Z. Koono 2004
フローチャートの表記
開始
機能/ Y
処理
分岐
終了
X
? 0 > X
? 0 > Y
飛越
長所:書き方が簡単
欠点:書き方が自由
GO TO X
GO TO Y
誰でもすぐ書ける(入門教育向き)
・デタラメにでも書ける
グチャグチャな構造でも!
・概念レベルが揃い難い
概念の展開関係が示せない
Copyright Z. Koono 2004
階層展開「時刻表示を求め
る」
展開
時針を 求め
る
時針の角度
を 求める
Jisin_Kakudo
=Jikoku_Ji*30
時針の幅を
求める
Jisin_Haba
= SaidaiHaba
時針の長さ
を 求める
制
御
の
流
れ
時刻表示
を 求める
分針を 求め
る
秒針を 求め
る
Jisin_Nagasa
= Saisyou
分針の角度
を 求める
Funsin_Kakudo
=Jikoku_Fun*6
分針の幅を
求める
Funsin_Haba
= TyukannHaba
分針の長さ
を 求める
Funsin_Nagasa
= Saityou
秒針の角度
を 求める
Byousin_Kakudo
=Jikoku_Byou*6
秒針の幅を
求める
Byousin_Haba
= SaisyouHaba
秒針の長さ
を 求める
Byousin_Nagasa
= Tyukann
Copyright
Z. Koono 2004
構造化チャート
連接
繰返
選択/分岐
IF THEN
前判定 DO WHILE
UNTIL 後判定
条件
F
F
条件
時をえる
X
表示する
出 1
Y
出 2
図面ではループ無し
時をえる
条件
表示する
出
X
条
件
条
件
F
F
Y
出
出
出
Problem Analysis Diagram, PAD
Copyright Z. Koono 2004
PAD(繰返し)
前判定 DO WHILE
UNTIL 後判定
条件
F
F
F
条件
条件
後判定の書直し
F
F
条
件
F
条
件
F
条
件
F
Copyright Z. Koono 2004
PAD(記法の拡張)
多分岐
場合1
呼出
CASE
場合3
条件
場合2
X
Y
Z
関数名称
場合1
X
条
件
関数名称
場合2
Y
場合3
Z
プログラム,関数,サブルーチン
Copyright Z. Koono 2004
時
分
秒
初
期
状
態
開始
時刻をえる
1秒毎にプログラムが動く
秒に1を加える
秒に1を加える
60秒か?
Y
60秒か?
秒を0にする
N
秒を0にする
分に1を加える
Y
60分か?
Y
分に1を加える
分を0にする
N
時に1を加える
終了
Y
時を0にする
12時か?
N
Copyright Z. Koono 2004
プログラム設計の完了
ソース
○ ○
プログラム
仕様書
誤
関数仕様書
データ
仕様書
誤
設計書
構造化
チャート
データ
フロー図
コード
誤
リスト
誤
設計書:
設計を固
める前の
根拠/
(各)方
式/比較結
果の記録
チェック
チェック
チェック
初心者は1件/10行の誤り(Bug)を作込む
十分に考えて設計し,事前に机上で除去すること
設計工数の1/3の工数を掛けてチェックして
80%を事前摘出せよ
Copyright Z. Koono 2004
ソフトの誤りによる事故
ソフトウエアには,誤り(バグ)がつきもの
バグの為に正常でない動作/不充分な性能
ソフトウエアバグによる障害
・広汎な地域
北米の市外電話が一日麻痺
・社会の活動阻害
証券取引/銀行システムのダウン
・被害金額大
火星着陸人工衛星が使命達成に失敗
数百億円の損害
・多数の使用者
携帯電話56万台の機能異常/リコール
IT化の進展につれ,ソフトの占める立場が大きくなる
ITS ハイウエイ自動走行システム
バグ 0 でなければ?
1960年代 0.数件/K行….1990年代 0.001件/K行….
では2000年代は ?
それは如何にして達成できる?
Copyright Z. Koono 2004
設計の正しさのテスト
設計は誤りを免れない
目的
仕様
設
計
プログラム
(計算機
言語表記)
計
算
機
働き
機能
効果
効用
テスト
仕様の一部を対象とし
プログラムを動かして
実動作を確認する
Copyright Z. Koono 2004
テスト作業
仕
様
テスト設計
期待
出力
テストも誤りを免れない
必要
入力
対象
プログラム
実
出力
テスト
デバッグ
Debug
照合
一
致
不一致
原因切分け
誤り修復
再
テスト
Copyright Z. Koono 2004
何処を如何にテストするか
各種のテスト (見方が異なる)
・時系列:
・立場:
・規模:
今回例
単体,統合,システム,評価,検収...
開発者,検査/品質保証,ユーザ..
単体,サブシステム,システム....
小プログラムの確認を行う原理的なテスト
・設計結果を見ながらテストを考える(White box)
・単体テストでは,全ての経路を塗りつぶす
(大きくなると異常時のルートは通せない)
テストケースとチェックポイント
・ケース(試験する場合)幾つかのチェックポイント(確認個所)
Copyright Z. Koono 2004
「時刻表示を求める」のテスト
チェック
ポイント
時針を 求め
る
時針の角度
を 求める
Jisin_Kakudo
=Jikoku_Ji*30
時針の幅を
求める
Jisin_Haba
= SaidaiHaba
時針の長さ
を 求める
時刻表示
を 求める
分針を 求め
る
秒針を 求め
る
Jisin_Nagasa
= Saisyou
分針の角度
を 求める
Funsin_Kakudo
=Jikoku_Fun*6
分針の幅を
求める
Funsin_Haba
= TyukannHaba
分針の長さ
を 求める
Funsin_Nagasa
= Saityou
秒針の角度
を 求める
Byousin_Kakudo
=Jikoku_Byou*6
秒針の幅を
求める
Byousin_Haba
= SaisyouHaba
秒針の長さ
を 求める
Byousin_Nagasa
= Tyukann
Copyright Z. Koono 2004
開始
「時刻をえる」のテスト
秒
秒に1を加える
Y
60秒か?
2
3
59
60/0
分
0
1
2
59
60/0
時
0
1
2
11
12/0
秒を0にする
N
分に1を加える
Y
60分か?
終了
1
時
分を0にする
N
時に1を加える
Y
0
分
0
秒
0
チェック
ポイント
時を0にする
12時か?
N
Copyright Z. Koono 2004
「表示する」のテスト
疑似的出力
時刻表示
表示する
hyoujisuru
時針
角度 幅 長さ
分針
角度 幅 長さ
秒針
角度 幅 長さ
出力は単純なプログラム言語範囲外なので
疑似的な出力ルーチンとする
Copyright Z. Koono 2004
テスト条件書(サンプル)
大 小
項 項
目 目
時 分
を
え
る
チェックポイント
実績/
備考
判
定
テスト
ケース
設定
条件
試験入力 期待出力1
中間
分=38
+1
分=39
○
桁上り前
分= 59
+1
分=60
○
桁上り
分=60
+1
分=1
×
分=30
+1
分=61
+1
分=2
×
分=29
同2
秒
精密にみっちり考え,
正確に文書化する
正確に
記録する
Copyright Z. Koono 2004
テスト/デバッグへの取組み
大
項
目
小
項
目
テスト
ケース
設定
条件
試験入力
出力確認
時
を
え
る
分
中間
分=38
+1
分=39
○
桁上り前
分= 59
+1
分=60
○
桁上り
分=60
+1
分=1
×
分=30
+1
分=61
+1
分=2
×
分=29
チェックポイント
判
定
実績/備考
秒
テスト実行工数の大半は,設計/作成者ではない人による
一連のテストは,どんどんと続けて行う(他人で可能)
テスト中に考えるな!
実績は,几帳面に記録する
一連の異常なデータを解析して,バグを推定する
ソフトは論理的なものだから
論理的に立ち向かえ
Copyright Z. Koono 2004
テストと誤りの摘出
使用開始
特殊な場合
に異常
累計
誤り数
組上げ
段階
即時に立上れない
時に凹が生じる
初期的
段階
高い信頼度
を得るには
確認項目密度を
数百/K行にする
K 103
開始後日時
Copyright Z. Koono 2004
機能構造とプログラム構造
1秒毎にプログラムを起動
ma i n
時計
Tokei
時刻を
える
J i kokuwo
Er u
時刻表示
を 求める
J i kokuHyouj
i wo
Er u
全体を制御する親
表示
する
Hyouj
i sur u
子である部品
内部的なモジュール
C言語では関数
時計プログラム
Copyright Z. Koono 2004
プログラム構造とテスト
ドライバー(駆動する)
ma i n
進行を確認
する手段
時刻を
える
J i kokuwo
Er u
時計
Tokei
時刻表示
を 求める
J i kokuHyouj
i wo
Er u
テスト対象
表示
する
Hyouj
i sur u
スタブ(部品を疑似)
データを確認する手段
Copyright Z. Koono 2004
テストの進め方
One at a time 一つずつ確実な物を増やす
重要なテストの戦略 テスト仕様書を貫くもの
ma i n
トップダウン
時計
Tokei
併用
時刻を
える
J i kokuwo
Er u
時刻表示
を 求める
J i kokuHyouj
i wo
Er u
入力系
内部処理系
試験入力
が容易化
表示
する
Hyouj
i sur u
ボトムアップ
出力系
試験出力
が容易化
Copyright Z. Koono 2004
テストでの切分け
One at a time 一つずつ確実な物を増やす
増やして異常なら,増した所を疑え
ma i n
時計
Tokei
時刻を
える
J i kokuwo
Er u
時刻表示
を 求める
J i kokuHyouj
i wo
Er u
表示
する
Hyouj
i sur u
Copyright Z. Koono 2004
テスト対象の大きさ
時刻を
える
J i kokuwo
Er u
ma i n
単位 大
小
時計
Tokei
手間 小
大
切分 不十分
十分
時刻表示
を 求める
J i kokuHyouj
i wo
Er u
表示
する
Hyouj
i sur u
初心者は小さ目が良い
急がば廻れ!
Copyright Z. Koono 2004
デバッグの切分け
クロ
ック
ク
ロ
ッ
ク
時刻
を
える
時計
時
刻
求
め
る
異常個所の摘出は
最も時間を要する
盤面
時刻
表示
時
求める
時針
分
求める
分針
秒
求める
秒針
表示
する
盤
面
ソースを読むのは
最も面倒
プログラム,関数単位に
切分ける 他人で可
追詰めて,修正の為
ソースを読む
Copyright Z. Koono 2004
修正の管理
現物をあれこれ
いじり回すと
混乱が起こる
ma i n
時計
Tokei
時刻表示
を 求める
J i kokuHyouj
i wo
Er u
時刻を
える
J i kokuwo
Er u
表示
する
Hyouj
i sur u
切分単位毎に
1版,2版..と
現物を差換え,残す
面倒でも手違が無い
時刻表示
時刻表示
.....
.....
.....
.....
2版
1版
現
物
保
存
時刻表示
.....
.....
プロ
アマ
面倒でもキチンとやる
手順を飛ばして,却って損する
ー常に基本を厳守ー
3版
Copyright Z. Koono 2004
標準化した設計作業方法
階層的な機能分割
データフロー直/並列
データフロー図
+構造化チャート
時計
樹木状の
モジュール構造
時刻
表示
時刻
時刻
時刻を
える
時刻
表示
時刻表示
を求める
表示
する
受渡しを示す機能階層図
「構造化設計」
の全要素を含む
自己担当分内/自組織内を全て統一して効率化が図れる
Copyright Z. Koono 2004
設計作業方法の標準化
システム
・システムの目的は,意図された効果/効用の実現である
ソフト/プログラムはその為の機能の実現手段に過ぎない
・システムの作りは,この効果/効用を最小の労力(コスト)
と最短の日時で作るようにされるべきである.
・以上から
プログラムは,誰が見てもよく判り,扱い易いものに,
構造/構成は統一されたものにする
(所謂技巧的な物は一切厳禁される)
標準化
・システムは,多くの人の協力により成立つ
・狭義の作業方式,構成方式は共通基盤である
それらが多く,統一されているほど作業の効率は高まる
Copyright Z. Koono 2004
テストで虫取りは合理的か?
Copyright Z. Koono 2004
テスト前に机上チェックで80%のバグ除去 2
劣等チームのテスト工数
優良チームのテスト工数
誤りゼロ純テスト工数
Copyright Z. Koono 2004
テスト前に机上チェックで80%のバグ除去 1
先
憂
後
楽
先
手
必
勝
Copyright Z. Koono 2004
テスト前に机上チェックで80%のバグ除去 3
Copyright Z. Koono 2004
机上チェック完で設計を完了する
Jisin_Kakudo
=Jikoku_Ji*30
時針の幅を
求める
Jisin_Haba
= SaidaiHaba
Funsin_Haba
= TyukannHaba
分針の長さ
を 求める
Funsin_Nagasa
= Saityou
秒針の角度
を 求める
Byousin_Kakudo
=Jikoku_Byou*6
秒針の幅を
求める
Byousin_Haba
= SaisyouHaba
秒針の長さ
を 求める
Byousin_Nagasa
= Tyukann
チ
ェ
ッ
ク
チ
ェ
ッ
ク
展開
段数
n
秒針を 求め
る
ソ ース コ ード
分針の幅を
求める
. . . . .. . .
Funsin_Kakudo
=Jikoku_Fun*6
設計図面
分針を 求め
る
分針の角度
を 求める
r
時刻表示
を 求める
Jisin_Nagasa
= Saisyou
設計図面
時針の長さ
を 求める
知的処理
この単位毎に確率的に誤る
仕様
時針を 求め
る
時針の角度
を 求める
チ
ェ
ッ
ク
初心者は1件/10行の誤り(Bug)を作込む
十分に考えて設計し,事前に机上で除去すること
Copyright Z. Koono 2004
机上チェックの活用
・能率的
・自分の誤りは見付け難い
・自分の弱点を識る機会
同じ失敗を繰返すのは馬鹿
二度と同じ失敗をするな!
正しいルール/方法を確認せよ
腕前が急速に向上する
Copyright Z. Koono 2004
第2回 纏め
・データフロー図と構造化チャートのペアは
プログラムの論理的な仕様を表す
・構造化チャートの規約を守ると
自動的に良い構造になる
・設計は,テストとデバッグの容易性を考えて行う
・テストはバグを叩出すように,
デバッグは的確に絞れるように,
合理的/科学的に計画し,実行する
・システムでの設計/作業方式の在り方
・机上チェックの有用性
Copyright Z. Koono 2004
第1回 宿題
課題
次回
時計プログラムを作る
データ仕様書,データフロー図,
10/30
関数「時刻をえる」の構造化チャートPAD
突合せチェックをして,朱記訂正する
次次回 テスト条件書→コーディング→テスト
11/6
突合せチェックをして,朱記訂正する
次次回
11/20
誤り原因を追及し,
再発防止策を提出