21586


第一種&高度午前対策テキスト(4回目)

第4部 基本ソフトウェア
第6部 ソフトウェア工学




更新履歴
年月日 更新内容
1999.12.25 第3版をアップしました
1999.11.01 誤記の修正を行いました
1999.04.09 初版をアップしました



第4部 基本ソフトウェア

■タスク/プロセス制御

○ジョブ、タスク、プロセス、スレッド

OSの機能として、タスク管理、プロセス管理がある。どちらもほぼ同義語である。タスクはメインフレーム系、プロセスはUNIX,PC系の用語である。

タスク、プロセスはシステムから見た仕事の単位、つまりシステムの都合である。

これに対してジョブという用語がある。ジョブはUNIXやPCで言えばバッチ処理である。これはユーザから見た仕事の単位、つまりユーザの都合である。

例えばATMでお金を引き出す場合を考える。キャッシュカードをスロットに挿入して、暗証番号と必要な金額を入力する。しばらく待つとお金が引き出される。この時システム内部では暗証番号確認、残高照会、引き落としなどの処理が行われている。これらの処理を総称してジョブという。ジョブには一つ一つの処理の流れ、ストーリー性がある。これをジョブステップという。ジョブステップがタスク、プロセスに相当する。

   ┌┌─────┐
   ││本人確認 ←タスク
ジョブ││残高照会 ←タスク
   ││引き落し ←タスク
   ││お金を渡す←タスク
   └└─────┘
		
タスク、プロセスをさらに細分化したものをスレッド(軽量プロセス)という。スレッドはCPU以外の資源を他のスレッドと共用している。

○ジョブ管理

ジョブには、ジョブ投入からジョブ終了までに4つのプロセスがある。

まずリーダが動き出す。リーダはジョブ全体の環境設定を行う。ジョブステップにしたがって一つ一つのタスクをコールする。例えばレポートを100部作成する場合を考えると、ワープロを打つ要員と、イラストを描く要員と、コピーを取る要員が必要となる。リーダはこれらの要員の手配を行う。

次にイニシエータが動き出す。イニシエータはそれぞれのタスクに資源を与える。レポートの例では、ワープロを打つ要員にワープロを与えるイメージである。イニシエータは各要員に必要な機材を与える。

イニシエータが動き出せば、タスク、プロセス管理に制御が移る。

タスク、プロセスが終了すれば、ターミネータが起動する。ターミネータは資源の解放などの後処理を行う。レポートの例では、ワープロを片付け、イラスト要員に紙とペンを与える。

ここまでの処理でジョブが終了していなければ、再びイニシエータが起動し、タスク、プロセスを起動する。

ジョブがすべて終了していれば、ライタが起動する。ライタはジョブの結果を出力する。レポートの例では、上長にレポートを提出するのがこれに当たる。

ジョブ全体を管理するものをジョブスケジューラという。

         ジョブ投入
           ↓
  ┌   ┌──────┐
  │   │   リーダ   │
  │   └──────┘
  │       │
  │  ┌──→ │
  │  │    ↓
ジ│  │┌──────┐
ョ│  ││イニシエータ│
ブ│  │└──────┘
ス│  │
ケ│  │    →タスク・プロセス管理
ジ│  │
ュ│  │┌──────┐
|│  ││ターミネータ│
ラ│  │└──────┘
  │  │    │
  │  └─── │
  │       ↓
  │   ┌──────┐
  │   │   ライタ   │
  └    └──────┘
           ↓
         ジョブ終了
		
上図において、イニシエータが起動すると、タスク、プロセス管理に制御が移るという表現があった。ここからはタスク、プロセス管理について解説する。頻出分野であるタスク、プロセスの状態遷移図の解説である。

タスク、プロセス管理は、マルチタスク、マルチプロセスのために必要となった技術である。

タスクがジョブスケジューラによって生成されると、まずReady(実行可能状態)になる。実行可能状態の実体は単なる待ち行列である。

                                      タスク
                                      生成
                                       │
                                       │
                                       ↓
                          ┌───────┐
                          │ Ready │
                          │(実行可能状態)│
                          └───────┘
		
次にディスパッチャによりCPUが割り当てられる。これをCPU割当て(ディスパッチ)という。CPU割当てのアルゴリズムとして、SJFラウンドロビンがある。CPU割当てはタスクスケジューリングともいう。

              CPU割当  ┌───────┐
            (ディスパッチ)│ Ready │
                  ←───│(実行可能状態)│
                      └───────┘
		
CPU割当てが行われると、タスク、プロセスはRun(実行状態)に遷移する。ここで処理が終了すれば、タスクは消滅する。

┌───────┐        ┌───────┐
│  Run  │        │ Ready │
│ (実行状態) │←───│(実行可能状態)│
└───────┘        └───────┘
		
ここでもし入出力が発生すると、入出力の間CPUは何もしないことになる。そこでタスクをWait(待ち状態)に遷移させ、CPUを他のタスクに明け渡す。

      ┌───────┐
      │  Wait  │
      │ (待ち状態)  │
      └───────┘
         
        
       
      
     
┌───────┐    ┌───────┐
│  Run  │    │ Ready │
│ (実行状態) │←───│(実行可能状態)│
└───────┘    └───────┘
		
入出力が終わっても、実行状態に遷移せず、実行可能状態に遷移する。つまりCPU待ちの最後に並ばせる。

      ┌───────┐
      │  Wait  │
      │ (待ち状態)  │
      └───────┘
         ┐  
        /    
       /      
      /        
     /          
┌───────┐    ┌───────┐
│  Run  │    │ Ready │
│ (実行状態) │←───│(実行可能状態)│
└───────┘    └───────┘
		
タスクスケジューリング(CPU割当て)には、いくつか方法がある。まず最初に考え出された方法がFIFO(First In First Out)である。FIFOは単なる待ち行列である。

例えば職場のコピー機を考える。コピー機は1台で、そこに次々とコピーしたい人がやってくる。

┌────┐
│        │────────────
│コピー機│(A) (B)  (C)←
│        │────────────
└────┘100枚 1枚   10枚
		
FIFOでは、途中で入出力割り込みが発生したら、また待ち行列の後ろに並ばねばならない。またどんなに処理に時間がかかっても、一度実行状態になったら、終わるまで次のタスクにCPUを譲らない。コピー機に例えれば、コピーを取っている間に別の用事が入ったら、コピーはそこで中断、別の用事をこなして帰ってきたらまた列の後ろに並ばねばならない。また自分が100枚のコピーを取るとして、後ろに1枚の人が並んでいたら、通常は後ろの人に譲るであろう。FIFOには譲るという概念がないし、割り込みが入ればまた並び直しとなる。

そこで次の人が1枚のコピーだったら先に譲る方式が考え出された。それがSJF(Short Job First)(最短時間順)である。(Jobはこの場合タスクを表している)。これは処理時間の少ないタスクを先に通す方式である。

┌────┐
│        │────────────
│コピー機│(A) (B)  (C)←
│        │────────────
└────┘100枚 1枚   10枚

       ││
       \/
┌────┐
│        │────────────
│コピー機│(B) (A)  (C)←
│        │────────────
└────┘1枚  100枚  10枚
		
しかし3日後の会議の資料をコピーしたい人と、10分後の会議の資料をコピーしたい人が並んだ場合、後者が優先であろう。そこで優先度順方式が考え出された。優先度順方式は待ち行列の中にさらに複数の待ち行列がり、それぞれに優先度をつけたものである。優先度の高いタスクは優先度の高い待ち行列に、優先度の低いタスクは優先度の低い待ち行列に並ぶ方式である。コピーの例では、10分後の会議に使う資料のコピーには高い優先度の待ち行列に、3日後の会議に使う資料のコピーには低い優先度の待ち行列に並ぶイメージである。

┌────┐
│        │────────
│コピー機│(A)            今日必要なコピーの待ち行列
│        │────────
└────┘────────
            (B)            明日でよいコピーの待ち行列
            ────────
            ────────
            (C)            明後日でよいコピーの待ち行列
            ────────
		
ここまでは、一度実行状態に入ったら、タスクが終了するまでは他にCPUを明け渡すことはない。コピーの例では100枚のコピーが始まったら、次に1枚だけコピーする人が並んでいようと、絶対に譲らないイメージである。

ここまではこれは実行状態から実行可能状態への遷移(矢印)がない。

そこで実行状態から実行可能状態への遷移の概念、つまりタイマ割り込みの概念が誕生した。

それがラウンドロビン方式である。ラウンドロビン方式はFIFO+タイマ割り込みである。ラウンドロビン方式の待ち行列は1つだけである。

コピーの例では、まずタイマを「一度にコピーできる枚数は10枚まで」と決める。そこへコピーを取る人Aさん、Bさん、Cさんがやってくる。Aさんは20枚のコピー、Bさんは1枚、Cさんは15枚である。

┌────┐
│        │────────────
│コピー機│(A) (B)  (C)←
│        │────────────
└────┘ 20枚 1枚   10枚
		
コピーは最初に並んだAさんから取り始める。Aさんが20枚のうち、10枚コピーを取ると、コピー機から強制的に引き離されて、後ろに並ばされる。次にBさんがコピーを始める。Bさんは1枚なのですぐ終了する。次にCさんがコピーを始める。CさんもAさん同様15枚中10枚のコピーが終了した時点でコピー機から引き離され、Aさんの後ろに並ばされる。Aさんは残りのコピーを取り、次いでBさんも残りのコピーを取る。

┌────┐
│        │────────────
│コピー機│(A) (B)  (C)←
│        │────────────
└────┘ 20枚 1枚   10枚

       ││10枚コピー終了
       \/
┌────┐
│        │────────────
│コピー機│(B) (C) (A)←列の後ろに並ぶ
│        │────────────
└────┘1枚  10枚 10枚
		
ラウンドロビン方式はタスクが平等に行われるが、優先度を考慮していない。そこで多段待ち行列方式が考え出された。多段待ち行列方式も一本の待ち行列の中に、さらに優先度ごとの待ち行列がある方式である。

タスクは最初は一番優先度の高い待ち行列に並ぶ。もしそれよりも優先度の高いタスクが到着したら、最初のタスクはそのタスクに順番を譲り、次の優先度の待ち行列に並ぶ。高い優先度の待ち行列が空になった時点で、次の優先度に並んでいるタスクが高い優先度に移る。

コピーの例では、コピー待ちの行列に役員専用の列、部長専用の列、課長専用の列があるようなものである。優先度は役員専用の列が一番高く、以下部長専用、課長専用と続く。最初に到着した人が課長の場合、課長はまず役員専用の列に並ぶ。次に部長が到着した場合、課長は部長に順番を譲り、自分は部長専用の列に並ぶ。次に到着したのが役員なら、部長は役員に順番を譲り、自分は部長専用の列に並ぶ。部長専用の列に並んでいた課長は係長専用の列に並ぶ。ただしこれでは新人がいつまでたってもコピーできないので、同情した上の者が一時的に部長権限や役員権限を与えて、役員の列に並ばせたりもする。

多段待ち行列方式は、ラウンドロビン+優先度順である。

┌────┐
│        │────────
│コピー機│(A)            役員専用待ち行列
│        │────────
└────┘────────
            (B)            部長専用待ち行列
            ────────
            ────────
            (C)            課長以下の待ち行列
            ────────
		
今あるほとんどのパソコンは、タスク、プロセス管理としてラウンドロビン方式、もしくは多段待ち行列方式を採用している。ラウンドロビン方式と多段待ち行列方式はフィードバック待ち行列方式ともいう。

タスクの切り替え方式には、自分の仕事が終わるまでCPUを独占し、仕事が終わったら明け渡すノンプリエンプション方式と、たとえ作業中でもあらかじめ決められてタイマ(時間)を使い切ったらCPUを明け渡すプリエンプション方式の2種類の方式がある。

身近な例では、プリエンプション方式はWindows95、ノンプリエンプション方式はWindows3.1。Windows3.1では、プロセスが作業を始めたらマウスカーソルが砂時計に変わり、その間は何もできないが、Windows95ではマウスカーソルの右上に砂時計が表示され、別の作業中でも他のアイコンをクリックできる場合がある。

○セマフォ

共用ドライブ上にあるWordファイルを開く場合を考える。別の人が同じファイルを開こうとすると「このファイルは○○さんによって編集中です。」という警告が表示され、参照専用で開く事はできるが、更新はできない。これはWordどうしが連絡を取り合い、使用中のファイルを更新させないようにしているためである。

┌────┐                ┌────┐
│パソコン│──┐    ┌→×│パソコン│
│  A   │    ↓    │    │  B   │
├────┤  ┌────┐  ├────┤
└────┘  │Word│  └────┘
              │ 文書  │
              └────┘
		
ここで、スレッドAと、スレッドBを考える。スレッドは軽量プロセスとも呼ばれ、タスクをさらに細分化した実行単位である。スレッドはCPU以外の資源は共有する。したがって同じ資源(ファイルなど)にアクセスする場合は排他というしくみが必要である。排他を実現する方式がセマフォである。セマフォとは線路に他の列車が入ってこないようにさせる腕木のことである。(セマフォはオランダ語の腕木である)。

┌────プロセス────┐
│            │
│┌タスクA┐┌タスクB┐│
││CPU  ││CPU  ││
││メモリ  ││メモリ  ││
││ファイル││ファイル││
│└┼───┘└───┼┘│
└─┼────────┼─┘
    │                │
    │  ┌ファイル┐  │
    │  │        │  │
    └→│        │×┘
  ロック│        │使用不可
        └────┘
		
セマフォのキーワードはP操作V操作である。P操作はその資源を使用中とする。V操作はその資源を空き状態とする。

■主記憶管理とプログラム制御

OSの機能として、タスク管理、プロセス管理、ジョブ管理の他に、メモリ管理がある。(Windows95で言えば、マイコンピュータのプロパティで「パフォーマンス」タブを選択すると、搭載しているメモリのサイズが確認できる)。

メモリには実メモリ仮想メモリの2種類があり、実メモリは主記憶装置(つまりDRAM)、仮想メモリは補助記憶装置(つまりハードディスク)である。実メモリに収まりきれないデータを収めようとしたり、プログラムを実行しようとした場合、データやプログラムをいくつかの部分に分割して仮想メモリに待避する。仮想メモリに待避した部分が必要になれば、実メモリに読み込む。この時の方式として固定区画方式可変区画方式の2種類がある。

┌────┐ ┐
│        │ │
│ メモリ │ │実メモリ
│ (DRAM) │ │
│        │ │
├────┤ ┤
│        │ │
│        │ │
│        │ │
│ 仮想 │ │仮想メモリ
│ メモリ │ │
│  (HD)  │ │
│        │ │
│        │ │
└────┘ ┘
		
○可変区画方式

可変区画方式は、メモリ確保の要求があればそのまま割り当てる方式である。メモリに飛び飛びの空き領域(フラグメンテーション)が発生した場合は、飛び飛びの領域を詰めて、まとまった大きさのメモリ領域を確保する。

例えば16MB(メガバイト)のメモリがあり、そこに3MBを消費するExcelと、5MBを消費するWordと、6MBを消費するインターネットエクスプローラを読み込む。(メモリの消費量は説明の都合上設定した値である)。メモリの残りは2MBである。

┌────┐  ┌────┐        ┌────┐
│ メモリ │←│ Excel  │        │ Excel  │
│16MB│  └────┘        ├────┤
│        │  ┌────┐        │ Word   │
│        │←│ Word   │        │        │
│        │  │        │  ─\  ├────┤
│        │  └────┘  ─/  │Internet│
│        │  ┌────┐        │Exproler│
│        │  │Internet│        │        │
│        │←│Exproler│        ├────┤
│        │  │        │        │        │
└────┘  └────┘        └────┘
		
そこでWordを終了させ、5MBの領域を開放した。残りのメモリは合計7MBである。

まだメモリに余裕があるので、7MBを消費するPowerPointを起動した。しかしまとまった7MBの領域が確保できないので、メモリ不足となり起動に失敗する。

┌────┐
│ Excel  │
├────┤    ┌────┐
│        │    │Power   │
│        │×←│  Point │
├────┤    │        │
│Internet│    │        │
│Exproler│    └────┘
│        │
├────┤
│        │
└────┘
		
このような飛び飛びの領域の事をフラグメンテーションという。フラグメンテーションのため、トータルでは起動するのに十分なメモリ量でも、メモリ不足となるり、メモリ確保に失敗する。

この問題を解決するために、飛び飛びの領域を詰めて、まとまった大きさの領域を確保する。この操作をメモリコンパクションという。

┌────┐                      ┌────┐
│ Excel  │                      │ Excel  │
├────┤                      ├────┤
│Internet│                      │Internet│
│Exproler│                      │Exproler│
│        │                ─\  │        │
├────┤  ┌────┐  ─/  ├────┤
│   ↑   │  │Power   │        │Power   │
│        │←│  Point │        │  Point │
│        │  │        │        │        │
│        │  │        │        │        │
└────┘  └────┘        └────┘
		
○固定区画方式

固定区画方式は、メモリを一定の大きさの領域に区切り、それぞれにデータやプログラムを格納する方式である。データやプログラムが区切った領域よりも大きい場合、データやプログラムを分割して複数の領域に格納する。

この一定の大きさに区切る単位をページという。

先ほどの例で考える。ページの単位を2MBとすると、3MBを消費するExcelは2ページ、5MBを消費するWordは3ページ、6MBを消費するインターネットエクスプローラは3ページを使用する。残りは0ページである。

┌────┐
│ Excel  │
├────┤
│ Excel  │
├────┤
│ Word   │
├────┤
│ Word   │
├────┤
│ Word   │
├────┤
│ IE     │
├────┤
│ IE     │
├────┤
│ IE     │
└────┘
		
そこでExcelとインターネットエクスプローラを終了させると、5ページ分の領域が開放さる。

┌────┐
│        │
├────┤
│        │
├────┤
│ Word   │
├────┤
│ Word   │
├────┤
│ Word   │
├────┤
│        │
├────┤
│        │
├────┤
│        │
└────┘
		
ここで8MBを消費するAccessを起動すると、4ページを必要とするが、この場合ページが飛び飛びであってもメモリに読み込む事は可能である。

┌────┐                      ┌────┐
│        │                      │ Access │
├────┤                      ├────┤
│        │                      │ Access │
├────┤                      ├────┤
│ Word   │                      │ Word   │
├────┤                      ├────┤
│ Word   │                ─\  │ Word   │
├────┤  ┌────┐  ─/  ├────┤
│ Word   │  │ Access │        │ Word   │
├────┤  │        │        ├────┤
│        │  │        │        │ Access │
├────┤  │        │        ├────┤
│        │←│        │        │ Access │
├────┤  │        │        ├────┤
│        │  │        │        │        │
└────┘  └────┘        └────┘
		
メモリコンパクションを行うと、プログラムが格納された領域も移動する必要がある。このとき移動可能なプログラムと、移動不可能なプログラムがある。移動可能なプログラムを再配置可能なプログラムという。

再配置可能なプログラムでも、実行中に再配置できるものと、実行中は再配置できないものがある。実行中に再配置できるプログラムを動的再配置可能なプログラムといい、実行中に再配置できない(再配置するには再度起動せねばならない)プログラムを静的再配置可能なプログラムという。

再配置可能や、再利用可能、再帰的など、頭に「再」がつく言葉がいくつかある。以下に整理する。

プログラム┬再入可能(リエントラント)──┬再帰(リカーシブ)
     │               └非再帰(非リカーシブ)
     └非再入可能(非リエントラント)┬逐次再使用可能
                     └逐次再使用不可能
		
○再入可能(リエントラント)

再入可能とは、複数のプロセスからコールされても、並行して実行可能であり、並行で実行しても矛盾が生じない構造のプログラム。Excelを複数起動して、タスクバーにいくつものExcelが並んでも、メモリ不足になることはない。これは起動しているExcelは一つだけだからである。

┌────┐
│        │
│        │
│        │
│        │
├────┤
│        │
│ Excel  │←Excelそのものは
│        │ メモリ上に一つ
├────┤
│        │
└────┘
		
○再帰的(リカーシブ)

再帰とは、自分自身を呼び出すこと。Wordのウィンドゥの中でさらに複数の文書ウィンドゥが開いているのが再帰のイメージである。再帰は再入可能プログラムでもある。

┌─┬─────────┬─┬─┬─┐
│◇│=========│_│□│×│
├─┴─────────┴─┴─┴─┤
│        ┌─┬───┬─┬─┬─┐│
│        │◇│===│_│□│×││
│    ┌─┼─┴─┬─┼─┼─┼─┤│
│    │◇│===│_│□│×│  ││
│    ├─┴───┴─┴─┴─┤  ││
│    │                      │  ││
│    │                      │  ││
│    │                      │  ││
│    │                      ├─┘│
│    │                      │    │
│    └───────────┘    │
└─────────────────┘
		
○非再入可能(非リエントラント)

非再入可能とは、複数のプロセスからコールされても、並行して実行することが不可能なプログラムのことである。非再入可能なプログラムには、逐次再使用可能なプログラムと、逐次再使用不可能なプログラムに分かれる。

○逐次再使用可能

逐次再使用可能とは、複数のプロセスからコールされても、同時には使用できないが、メモリ上のプログラムは排他的に共有しているプログラムのことである。Windows95のダイアルアップネットワークはアイコンを何度クリックしても起動するプログラムは一つである。これは逐次再使用可能なプログラムである。



6章 ソフトウェア工学とシステム開発能力

■システム開発のプロセスモデル

1960年代、IBMはソフトウェア危機を唱えた。当時のハードウェアは億単位の金額であったが、ソフトウェアはあくまでおまけであり、ユーザはソフトウェアに対してお金を支払うという意識がなかった。プログラマは職人であり、いかに処理効率を上げるか、いかにメモリを節約するかなどの職人技を磨いていた。しかし職人技であるため、プログラマの育成に10年近い年月を必要とした。

そこでソフトウェア開発に要するコストをユーザに負担してもらうため、いくらかかって、その根拠はこうだと言えるためのコストモデルが考え出された。

また経験の浅い人でもベテランと同じ品質でソフトウェアが作れるような方法論としてプロセスモデルが考え出された。

┌───┐    ┌───┐    ┌───┐
│      │    │      │    │      │
│  コ  │    │  ソ  │    │  プ  │
│  ス  │    │  フ  │    │  ロ  │
│  ト  │─\│  ト  │/─│  セ  │
│  モ  │─/│  ウ  │\─│  ス  │
│  デ  │    │  ェ  │    │  モ  │
│  ル  │    │  ア  │    │  デ  │
│      │    │      │    │  ル  │
└───┘    └───┘    └───┘
└────────┬────────┘
      ソフトウェア工学
		
○コストモデル

第一種としては、コストモデルとしてCOCOMO、ファンクションポイント法、ハルステッドモデルの3つを押さえておけばよい。

COCOMO

COCOMO(Constructive Cost Model)はソースコードのステップ換算でコストを求めるモデルである。したがってコメントが多ければコストも高い。またベテランほどステップ数が少ないためコストが低い。どちらもコンパイルすれば同じステップ数であるが、方法や経験によってコストに誤差が生じるモデルである。

ファンクションポイント法

ファンクションポイント法は機能ごとにポイントをつけるモデルである。例えば入力画面1枚につき30万円、出力画面1枚につき40万円などである。

ハルステッドモデル

ハルステッドモデルはアセンブラ換算した場合のコストを見積もる方法である。つまり実行形式にしたときのステップ数で見積もるということである。ハルステッドモデルは「脳みそのかいた汗に比例する」と言われている。

○プロセスモデル

第一種としては、プロセスモデルとしてウオーターフォールモデル、プロトタイピング、スパイラルモデルの3つを押さえておけばよい。

ウオーターフォールモデル

水が上流から流れてくるように、後戻りすることのないプロセスモデル。

プロトタイピング

見本。試供品を作ってユーザに見せ、イメージをつかんでもらう。

スパイラルモデル

スパイラルとは渦巻き、らせんのこと。分析、設計、製造、テストの工程を繰り返す。作ってみて、足りない部分を新たに作り込む。

テ      ┃──┐分
ス┌──╂─┐│析
ト│┌─╂┐││
  ││┌┃│││
━┿┿┿╋┿┿┿━
  ││└╂┘││
製│└─╂─┘│設
造└──╂──┘計
		
ウオーターフォールモデルを手本にした設計技法が構造化技法、スパイラルモデルを手本にした設計技法がオブジェクト指向技法である。

以下にそれぞれについて解説する。

○構造化技法

構造化技法は、分析、設計、プログラミングの順で行われる。しかし構造化技法が発展してきた手順は全く逆で、プログラミング、設計、分析の順番である。

まず始めにあったのはプログラミングである。1950年代のプログラムはGOTO分が多用された、いわゆるスパゲッティプログラムであった。それを見たダイクストラは・順次・反復・繰返しの3つでプログラミングができると提唱した。これが構造化プログラミングである。

                                    ┌────┐
                                    │ 構造化 │
                                    │プログラ│
                                    │ミング  │
                                    │        │
                                    └────┘
		
次に構造化設計が登場した。すなわちモジュール分割技法の登場である。

                  ┌────┐      ┌────┐
                  │        │      │ 構造化 │
                  │ 構造化 │      │プログラ│
                  │  設計  │      │ミング  │
                  │        │      │        │
                  └────┘      └────┘
		
最後に構造化分析が登場した。すなわちDFD(データフローダイアグラム)の登場である。

┌────┐      ┌────┐      ┌────┐
│        │      │        │      │ 構造化 │
│ 構造化 │      │ 構造化 │      │プログラ│
│  分析  │      │  設計  │      │ミング  │
│        │      │        │      │        │
└────┘      └────┘      └────┘
		
工程としては分析、設計、プログラミングの順であるが、概念としては逆の順番で成立してきた。

構造化技法はウオーターフォールモデルであるから、前の工程に戻ることはできない。矢印は一方向である。したがって次の工程に進めるかどうかの見極めのために、各工程の区切りでレビューを行う。

┌────┐      ┌────┐      ┌────┐
│        │      │        │      │ 構造化 │
│ 構造化 │ ─\ │ 構造化 │ ─\ │プログラ│
│  分析  │ ─/ │  設計  │ ─/ │ミング  │
│        │┌─┐│        │┌─┐│        │
└────┘│レ│└────┘│レ│└────┘
            │ビ│            │ビ│
            │ュ│            │ュ│
            │|│            │|│
            └─┘            └─┘
		
構造化技法に基づいたDBがRDBである。RDBではデータとプログラムが明確に独立している。

┌────┐      ┌────┐      ┌────┐ │ ┌────┐
│        │      │        │      │ 構造化 │ │ │        │
│ 構造化 │ ─\ │ 構造化 │ ─\ │プログラ│ │ │ RDB │
│  分析  │ ─/ │  設計  │ ─/ │ミング  │ │ │        │
│        │      │        │      │        │ │ │        │
└────┘      └────┘      └────┘ │ └────┘
                                             データ独立
		
○オブジェクト指向技法

オブジェクト指向技法も構造化技法と同様に、プログラミング、設計、分析の順で発達してきた。

まず初めにあったのが、オブジェクト指向プログラミングである。オブジェクト指向プログラミングは1972年に登場したSmalltalkが有名である。

                                    ┌────┐
                                    │オブジェ│
                                    │クト指向│
                                    │プログラ│
                                    │ミング  │
                                    └────┘
		
次いでオブジェクト設計が登場した。

                  ┌────┐      ┌────┐
                  │オブジェ│      │オブジェ│
                  │クト指向│      │クト指向│
                  │  設計  │      │プログラ│
                  │        │      │ミング  │
                  └────┘      └────┘
		
次いでオブジェクト分析が登場した。

┌────┐      ┌────┐      ┌────┐
│オブジェ│      │オブジェ│      │オブジェ│
│クト指向│      │クト指向│      │クト指向│
│  分析  │      │  設計  │      │プログラ│
│        │      │        │      │ミング  │
└────┘      └────┘      └────┘
		
オブジェクト指向技法はスパイラル技法であるから、後戻りも可能である。したがって、矢印も両方向に出ている。

┌────┐      ┌────┐      ┌────┐
│オブジェ│      │オブジェ│      │オブジェ│
│クト指向│/─\│クト指向│/─\│クト指向│
│  分析  │\─/│  設計  │\─/│プログラ│
│        │      │        │      │ミング  │
└────┘      └────┘      └────┘
		
次いでオブジェクト指向データベース(OODB)が登場した。オブジェクト技法はデータとプログラム(データの操作)を一まとめにして扱う。(カプセル化)。

                                  ┌──────────────┐
┌────┐      ┌────┐    │┌────┐    ┌────┐│
│オブジェ│      │オブジェ│    ││オブジェ│    │        ││
│クト指向│/─\│クト指向│/─\│クト指向│    │OODB││
│  分析  │\─/│  設計  │\─/│プログラ│    │        ││
│        │      │        │    ││ミング  │    │        ││
└────┘      └────┘    │└────┘    └────┘│
                                  └──────────────┘
                                             カプセル化
		
構造化技法とオブジェクト指向技法をまとめて表すと、以下のようになる。

┌────┐      ┌────┐      ┌────┐ │ ┌────┐
│        │      │        │      │ 構造化 │ │ │        │
│ 構造化 │ ─\ │ 構造化 │ ─\ │プログラ│ │ │ RDB │
│  分析  │ ─/ │  設計  │ ─/ │ミング  │ │ │        │
│        │      │        │      │        │ │ │        │
└────┘      └────┘      └────┘ │ └────┘
                                             データ独立

                                  ┌──────────────┐
┌────┐      ┌────┐    │┌────┐    ┌────┐│
│オブジェ│      │オブジェ│    ││オブジェ│    │        ││
│クト指向│/─\│クト指向│/─\│クト指向│    │OODB││
│  分析  │\─/│  設計  │\─/│プログラ│    │        ││
│        │      │        │    ││ミング  │    │        ││
└────┘      └────┘    │└────┘    └────┘│
                                  └──────────────┘
                                             カプセル化
		
両者を二日酔いの会社員に例えると、構造化技法の場合まず医者に行く。そして診断(分析)してもらう。診断が終わったら処方箋(設計)を書いてもらう。処方箋が出来たら、それを薬局に持っていい、薬を調合(プログラミング)してもらう。調合してもらった薬はビンや袋に詰めて(RDB)渡される。

オブジェクト指向技法の場合、まず自分で症状を分析する。頭痛なら薬箱(OODB)から薬を取出して飲む。薬がなければ作る。薬を飲んだ結果、頭痛が直れば目的達成。しかしまだ吐き気があるなら再び薬箱から薬を取出す。オブジェクト指向はすなわち目的指向である。

○ウオーターフォールモデルにおけるシステム開発のライフサイクル

ウオーターフォールモデルは、設計からプログラミングまでを段階的に詳細化して行い、単体テストから総合テストまでを段階的に統合化していく方式である。水が上流から下流に流れるようなイメージで設計を行うため、この名前がついた。

ウオーターフォールモデルは以下の手順で作業を行う。

(1)分析・要求定義
(2)外部設計
(3)内部設計
(4)プログラム設計
(5)プログラミング
(6)単体テスト
(7)結合テスト
(8)システムテスト
(9)総合テスト

以下、各手順について説明する。

(1)分析・要求定義

顧客の要求するシステムについて、要求事項を分析する。ここでは構造化分析が行われる。

分析・要求定義を行うのがシステムアナリストである。

┌───────┐
│分析・要求定義│
└───────┘
		
(2)外部設計

システムをサブシステムに分解し、サブシステムの入出力を設計する。

外部設計を行うのがアプリケーションエンジニアである。

┌───────┐  
│分析・要求定義│  
└───────┘  
       ││         
       \/         
  ┌───────┐
  │   外部設計   │
  └───────┘
		
ここでシステム、サブシステム、プログラム、モジュールの関係を以下に整理する。

                  ┌───────┐
                  │   システム   │
                  └───┬───┘
        ┌────────┼────────┐
┌───┴───┐┌───┴───┐┌───┴───┐
│ サブシステム ││ サブシステム ││ サブシステム │
└───────┘└───┬───┘└───────┘
            ┌──────┼──────┐
      ┌──┴──┐┌──┴──┐┌──┴──┐
      │プログラム││プログラム││プログラム│
      └─────┘└──┬──┘└─────┘
            ┌──────┼──────┐
      ┌──┴──┐┌──┴──┐┌──┴──┐
      │モジュール││モジュール││モジュール│
      └─────┘└─────┘└─────┘
		
(3)内部設計

サブシステムをさらにプログラム単位(機能単位、コンパイル単位)に分割し、物理的な設計を行う。

外部設計と内部設計を合わせて構造化設計という。構造化設計はすなわちモジュール分割である。

┌───────┐    
│分析・要求定義│    
└───────┘    
       ││           
       \/           
  ┌───────┐  
  │   外部設計   │  
  └───────┘  
         ││         
         \/         
    ┌───────┐
    │   内部設計   │
    └───────┘
		
(4)プログラム設計

プログラム単位をさらにモジュール単位に分割し、詳細設計を行う。プログラム設計のことを構造化プログラミングという。

┌───────┐      
│分析・要求定義│      
└───────┘      
       ││             
       \/             
  ┌───────┐    
  │   外部設計   │    
  └───────┘    
         ││           
         \/           
    ┌───────┐  
    │   内部設計   │  
    └───────┘  
           ││         
           \/         
      ┌───────┐
      │プログラム設計│
      └───────┘
		
(5)プログラミング

CやCOBOLなどのプログラミング言語を用いてプログラミングを行う。いわゆるコーディングである。

プログラミング以降の工程は、プロダクションエンジニアの担当する範囲である。

┌───────┐      
│分析・要求定義│      
└───────┘      
       ││             
       \/             
  ┌───────┐    
  │   外部設計   │    
  └───────┘    
         ││           
         \/           
    ┌───────┐  
    │   内部設計   │  
    └───────┘  
           ││         
           \/         
      ┌───────┐
      │プログラム設計│
      └───────┘
                  ││  
                  \/  
                ┌───────┐
                │プログラミング│
                └───────┘
		
これまでの各工程で、テスト項目を作成しておく。テスト項目は以下に述べるテスト工程にて消化する。

(6)単体テスト

モジュールごとに、プログラム設計通りに出来ているかを確認する。

┌───────┐    
│分析・要求定義│    
└───────┘    
       ││           
       \/           
  ┌───────┐  
  │   外部設計   │  
  └───────┘  
         ││         
         \/         
    ┌───────┐
    │   内部設計   │
    └───────┘
           ││       
           \/       
      ┌───────┐  ┌───────┐
      │プログラム設計│  │  単体テスト  │
      └───────┘  └───────┘
                  ││      /\
                  \/      ││
                ┌───────┐
                │プログラミング│
                └───────┘
		
(7)結合テスト

単体テストが終了したモジュールを結合し、プログラム単位でテストを行う。結合テストは内部設計通りに出来ているかの確認である。

┌───────┐  
│分析・要求定義│  
└───────┘  
       ││         
       \/         
  ┌───────┐
  │   外部設計   │
  └───────┘
         ││       
         \/       
    ┌───────┐      ┌───────┐
    │   内部設計   │      │  結合テスト  │
    └───────┘      └───────┘
           ││                    /\
           \/                    ││
      ┌───────┐  ┌───────┐
      │プログラム設計│  │  単体テスト  │
      └───────┘  └───────┘
                  ││      /\
                  \/      ││
                ┌───────┐
                │プログラミング│
                └───────┘
		
(8)システムテスト

結合テストが終了したプログラムをさらに結合して、サブシステム単位でテストを行う。システムテストは外部設計通りに出来ているかの確認である。

┌───────┐
│分析・要求定義│
└───────┘
       ││       
       \/       
  ┌───────┐          ┌───────┐
  │   外部設計   │          │システムテスト│
  └───────┘          └───────┘
         ││                        /\
         \/                        ││
    ┌───────┐      ┌───────┐
    │   内部設計   │      │  結合テスト  │
    └───────┘      └───────┘
           ││                    /\
           \/                    ││
      ┌───────┐  ┌───────┐
      │プログラム設計│  │  単体テスト  │
      └───────┘  └───────┘
                  ││      /\
                  \/      ││
                ┌───────┐
                │プログラミング│
                └───────┘
		
(9)総合テスト

システムテストが終了したサブシステムを結合して、システム全体でテストを行う。総合テストは顧客の要求通りに出来ているかの確認である。総合テストは本番テスト(または移行テスト)ともいう。

┌───────┐              ┌───────┐
│分析・要求定義│              │  総合テスト  │
└───────┘              └───────┘
       ││                            /\
       \/                            ││
  ┌───────┐          ┌───────┐
  │   外部設計   │          │システムテスト│
  └───────┘          └───────┘
         ││                        /\
         \/                        ││
    ┌───────┐      ┌───────┐
    │   内部設計   │      │  結合テスト  │
    └───────┘      └───────┘
           ││                    /\
           \/                    ││
      ┌───────┐  ┌───────┐
      │プログラム設計│  │  単体テスト  │
      └───────┘  └───────┘
                  ││      /\
                  \/      ││
                ┌───────┐
                │プログラミング│
                └───────┘
		
ウオーターフォールモデルは、工程が進むに従ってシステムをモジュールまで分割していく。これを段階的詳細化という。テスト工程では分割した単位を次々につなげてテストを実施する。これを段階的統合化という。

高度情報処理技術者試験の各試験の担当範囲を、以下に整理する。

・プログラミング〜総合テスト
  →プロダクションエンジニア
  →第一種情報処理技術者
  →第二種情報処理技術者

・外部設計
  →アプリケーションエンジニア

・要求分析・定義
  →システムアナリスト

・システムの運用
  →システム運用管理エンジニア

・システム構築全体の管理
  →プロジェクトマネージャ

       運用管理=システム運用管理エンジニア

システムアナリスト
        ↓
┌───────┐              ┌───────┐
│分析・要求定義│              │  総合テスト  │←┐
└───────┘              └───────┘  │
       ││                            /\         │
       \/アプリケーションエンジニア  ││         │
  ┌───────┐  │      ┌───────┐    │
  │   外部設計   │←┘      │システムテスト│←─┤
  └───────┘          └───────┘    │
         ││                        /\           │
         \/                        ││           │
    ┌───────┐      ┌───────┐      │
    │   内部設計   │      │  結合テスト  │←──┤
    └───────┘      └───────┘      │
           ││                    /\             │
           \/                    ││             │
      ┌───────┐  ┌───────┐        │
      │プログラム設計│  │  単体テスト  │←───┤
      └───────┘  └───────┘        │
          ↑      ││       /\                   │
          │      \/       ││                   │
          │     ┌───────┐                 │
          │     │プログラミング│ ←───────┤
          │     └───────┘                 │
          └───────────────┬────┘
                                          │
                              プロダクションエンジニア
                              第一種情報処理技術者
                              第二種情報処理技術者

└─────────────────────────┘
プロジェクト全体のとりまとめ=プロジェクトマネージャ
		
■ソフトウェア要求定義

要求定義の手法として、DFD(Data Flow Diagram:データフローダイアグラム)がある。DFDはデータの流れを図に表したもので、以下の4つの記号を使用する。

────→  データの流れ
   __
 /    \
│      │  プロセス(処理)
 \    /
    ̄ ̄
┌────
│          データストア(ファイル等)
└────
┌───┐
│      │  データの発生源、吸収先
└───┘
		
要求定義の工程は、システムをサブシステムに分解することである。例えば問屋の注文システムを考える。注文システムは注文受付業務、在庫確認業務、出庫業務などで構成される。それらの業務がサブシステムである。

                     注文システム
                          │
      ┌──────┬──┴───┬─────┐
      │            │            │          │
┌──┴──┐┌──┴──┐┌──┴──┐┌─┴─┐
│ 注文受付 ││ 在庫確認 ││ 出庫処理 ││・・・│サブシステム
└─────┘└─────┘└─────┘└───┘
		
サブシステムをさらに突き詰めると、注文電文受付、注文電文解析、注文データ保存など、データの流れと処理だけで構成される図になる。つまりバブルチャートである。バブルチャートはDFDの一種である。

要求定義では、開発の対象となるシステムを5〜7のサブシステムに分割する。

DFDは、現物理モデル、現論理モデル、新論理モデル、新物理モデルの4種類を作成する。

現物理モデルは、今の業務をありのままに記述する。例えば伝票に手書きする、請求書を書くなどである。

現論理モデルは、現物理モデルから人間的な部分を排除したものである。例えば入力する、出力するなど、機能に注目して作成する。

新論理モデルは、システム化する部分について、現論理モデルの問題点の解決や、新たな業務処理の追加を行う。

ここまでは要求定義の工程である。次の新物理モデルは外部設計の工程となる。

新物理モデルは、システム化した部分を使って新たな業務の流れを記述したものである。新システムが導入された後の仕事の流れを記述したものである。

これを図に表すと、以下のような流れになる。

        ┌現物理モデル
要求定義│    ↓
  ・分析│現行論理モデル
        │    ↓
        └新規論理モデル
        ┌    ↓
外部設計│新規物理モデル
        └
		
これで要求定義の終了である。次は設計に入る。

■ソフトウェア設計

構造化設計とは、すなわちモジュール分割である。モジュール分割にはデータの流れに基づく分割法と、データの構造に基づく分割法がある。

○データの流れに基づく分割法

データの流れに基づく分割法にはSTS分割法、トランザクション分割法、共通機能分割法の3つがある。

STS分割法

STS分割法とはSource(源泉)、Transfer(変換)、Synk(吸収)の略である。源泉が入力、変換が処理、吸収が出力である。業務でモジュールを前処理、主処理、後処理に分ける場合はSTS分割を行っている。

  入力      処理     出力
    ○  ┃        ┃ ○
        ┃   ○   ┃
  ○○  ┃        ┃    ○
━━━━┻━━━━┻━━━>
        ↑        ↑
           抽象点
		
例えば数字の月を入力すると英語名を表示するプログラムを作ったとする。もし"14月"とか"AB月"が入力されたら変換せず、エラーを表示せねばならない。STS分割法では、変換部分は安心して変換できるように入力の段階で不正なデータは弾く。したがってSTS分割は入力部分が大きい。

トランザクション分割法

トランザクション分割法は、複数の変換処理があるときに使用する。

    ┌─╂─→○─╂─┐
    │  ┃        ┃  │
○─┼─╂─→○─╂─┼→○
    │  ┃        ┃  │
    └─╂─→○─╂─┘
━━━━┻━━━━┻━━━→
		
共通機能分割法

共通機能分割法は、処理が共通している部分をくくり出す分割法である。例えばエラーメッセージ表示はどの処理でも必要とするので、エラーメッセージ表示専用のモジュールを作成し、各処理がこの関数を使用する。

○データの構造に基づく分割法

データの構造に基づく分割法としてジャクソン法ワーニエ法の2つの方法がある。ジャクソン法は入力データと出力データの両方の構造に着目して分割していく。ワーニエ法は入力データのループに着目して分割していく。主処理がループという場合は、ワーニエ法により分割されたと言える。

モジュール分割がうまくできたかどうかの判断基準として、モジュール強度とモジュール結合度がある。モジュール強度は強いほどよく、モジュール結合度は弱いほどよい。

モジュール強度とモジュール結合度についてはhttp://itac.gr.jp/pe/goro.htmlを参照のこと。

■ソフトウェアの品質特性

テストは品質を高めるための工程である。テストの観点として、以下に示すベームの品質特性を観点として行う。

 ・機能性
 ・信頼性
 ・使用性
 ・効率性
 ・保守性
 ・移植性

憶えにくい場合は「昨日紳士候補と一緒だった」と憶えればよい。

なお、ベームの品質特性には、経済性がない。ソフトウェアそのもののコストは考慮しないのである。

レビューもまた、品質を高めるためのものである。ウオーターフォールモデルでは次の工程に進む前にレビューを行うが、その観点としてもベームの品質特性が使用される。

レビューにはインスペクションウオークスルーの2種類がある。

インスペクションは公式なレビューであり、司会者が主体でレビューを進める。結果は記録され、現場にフィードバックされる。

ウオークスルーは非公式なレビューであり、開発者が主体となって説明しながらレビューを進める。結果は記録されず、現場へのフィードバックもない。インスペクションに備えての「根回し」といえる。

■プログラムのテスト

プログラミングが終了したら、モジュール単位に単体テスト、プログラム単位(コンパイル単位)に結合テスト、サブシステム単位にシステムテスト、最後に全システムをつなげた総合テストを行う。

○単体テスト

単体テストは主にホワイトボックステストでテストを行う。ホワイトボックステストはプログラムの内部構造に注目したテストである。

ホワイトボックステストの方法としては命令網羅判定条件網羅条件網羅判定条件/条件網羅複数条件網羅の5種類の方法がある。以下のフローチャートを元に解説する。

    │
   /\
 /A>0 \ No
<  and   >───┐
 \ B>0/       │
   \/     ┌─┴─┐
    │Yes   │      │
    │      └─┬─┘
    │          │
    │←────┘
    │
		

・命令網羅

命令(四角)に注目する。すべての命令(すべてのステップ)を通過すればよい。したがって与える条件としてはA=−3もしくはB=−6のどちらかでよい。

    │
   /\
 /A>0 \ No
<  and   >───┐
 \ B>0/       
   \/     ┌─┴─┐
    │Yes   │      │←ここを通ればよい
    │      └─┬─┘←────┘
・判定条件網羅

判定(ひし形)に注目する。すべての判定の出口を通ればよい。

    │
   /\
 /A>0 \ No
<  and   >─→
 \ B>0/
   \/
    
    
		
すべての判定の出口を通過する条件として以下の2つを挙げればよい。
 ・A=4 ,B=2
 ・A=−3,B=−6

    │
   /\
 /A>0 \ No
<  and   >───┐
 \ B>0/       
   \/     ┌─┴─┐
    │Yes   │      │
    │      └─┬─┘
    │          │
    │←────┘
    
		
・条件網羅

条件式に注目する。すべての条件式が、真と偽を満たせばよい。

A>0B>0

したがって条件として以下の2つを与えればよい。

 ・A=5 ,B=4
 ・A=−2,B=−3

または以下のような組み合わせでもよい。

 ・A=5 ,B=−4
 ・A=−2,B=3

しかしこの条件の場合、通らない判定の出口が存在するため、判定条件網羅を満たさない。そこで判定条件/条件網羅が考え出された。

・判定条件/条件網羅

判定条件/条件網羅は、条件網羅では通らない判定の出口があるという問題点の解決のために必要となった。条件網羅で解説した条件に、先程の問題点を解決する条件を追加すればよい。

 ・A=5 ,B=−4
 ・A=−2,B=3
 ・A=5 ,B=3

・複数条件網羅

複数条件網羅は条件網羅の上位に位置し、すべての真、偽の組み合わせをテストする。

A>0B>0

したがって必要な条件は4通りとなる。しかし条件式が3つなら条件は8通り、条件式が4つなら条件は16通りとなり、条件式が多いほど必要な条件が増えるので、非現実的である。

○結合テスト

結合テスト工程以降はブラックボックステストでテストを行う。ブラックボックステストは内部構造には注目せず、外部仕様にのみ注目してテストを行う。

モジュールを結合してテストする方法としては、作成した上位モジュールに仮の下位モジュールを結合してテストするトップダウンテストと、作成した下位モジュールに仮の上位モジュールを結合してテストするボトムアップテスト、すべてのモジュールを一斉に結合するビッグバンテストがある。

トップダウンテストで使用する仮の下位モジュールをスタブ、ボトムアップテストで使用する仮の上位モジュールをドライバという。どちらがスタブで、どちらがドライバか混乱する場合は「戸田の酢豚」と憶えればよい。(戸田(トップダウン)の酢豚(スタブ))

        ┏━━━━━┓
        ┃┌───┐┃←トップダウンテスト
        ┃│      │┃   S1、S2:仮の下位モジュール(スタブ)
    ┏━┛└─┬─┘┃
    ┃  ┌──┼──╂──┐
    ┃  │    │    ┃┏━┿━┓
    ┃┌┴┐┌┴┐┏┛┃┌┴┐┃←ボトムアップテスト
    ┃│S1││S2│┃  ┃│D1│┃   D1:仮の上位モジュール(ドライバ)
    ┃└┬┘└─┘┃  ┃└┬┘┃
    ┗━┿━━━━┛┏┛  │  ┃
  ┌──┼──┐  ┏┛┌─┴┐┗┓
┌┴┐┌┴┐┌┴┐┃┌┴┐┌┴┐┃
│  ││  ││  │┃│  ││  │┃
└─┘└─┘└─┘┃└─┘└─┘┃
                  ┗━━━━━━┛
		
ブラックボックステストとしては、同値分割限界値分析原因・結果グラフという手法がある。例として数字で月を入力したら英語の月を返すプログラムを考える。もし値が不正なら「値が不正です」というエラーメッセージを表示する。

┌─┬─────┬─┬─┬─┐
│◇│=====│_│□│×│
├─┴─────┴─┴─┴─┤
│                          │
│        ┌───┐        │
│        │    │月      │
│        └───┘        │
│    __________________    │
└──────↑──────┘
出力エリア(正常の時は英語の月、
異常時はメッセージを表示)
		
・同値分割

結果としてじになるの集合を考える。

テストデータの集合としては、正常に終了するグループ(1〜12)と異常終了するグループ(0以下の数字や数字以外の文字)に分けて、それぞれの代表を選んでテストを行う。

「処理続行」    「値が不正です」
  グループ          グループ
   ___            ___
 /      \        /      \
│        │      │ 0  -5  │
│  1〜12 │      │   14   │
│        │      │  A  B  │
 \      /        \      /
    ̄ ̄ ̄             ̄ ̄ ̄
     ↓                ↓
   代表"3"          代表"16"
		
上記より、同値分割で必要となるテストケースは2つとなる。

・限界値分析

「バグは境界値で発生する」とよく言われる。月で言えば12月は存在するが13月は存在しない。もし値として13が与えられたらエラーメッセージを表示する必要があるが、ループカウンタの終了条件が誤まっているなどで13月でエラーが出ない場合も考えられるので、限界値分析を行う。

ここでメッセージにバリエーションを持たせる。今までは「値が不正です」のみであったが、0以下を指定した場合は「値が小さいです」、13以上を指定した場合は「値が大きいです」、数字以外の文字が指定された場合は「数字ではありません」と表示することとする。

「値が小さいです」  「値が大きいです」
     グループ            グループ  
      ___              ___   
    /      \          /      \ 
   │ -2     │        │  15    │
   │  -3  -5│        │   13   │
   │        │        │     20 │
    \      /          \      / 
       ̄ ̄ ̄               ̄ ̄ ̄   
        ↓                  ↓     
      代表"-3"            代表"14"

「数字ではありません」 「処理続行」
     グループ            グループ  
      ___              ___   
    /      \          /      \ 
   │  A     │        │        │
   │  B     │        │  1〜12 │
   │     Z  │        │        │
    \      /          \      / 
       ̄ ̄ ̄               ̄ ̄ ̄   
        ↓                  ↓     
      代表"C"             代表"3"  
		

この場合処理を続行するグループは1〜12の値だが、限界値としては1と12を代表として選ぶ。

「値が小さいです」と表示するグループは0以下の値だが、限界値としては0を代表として選ぶ。

「値が大きいです」と表示するグループは13以上の値だが、限界値としては13を代表として選ぶ。

したがってこの場合のテストデータは0、1、12、13となる。

・原因・結果グラフ

条件と、その結果をマトリクスで表したチェックリストである。原因・結果グラフの例を以下に示す。

条件入力データ0以下    
    
12    
13以上    
数字以外    
結果英語の月を表示する   
「値が小さいです」    
「値が大きいです」    
「数字ではありません」    

○システムテスト、総合テスト

システムテスト、総合テストは主に機能、性能のチェックである。

単体テスト、結合テストで発見された問題点はバグとして扱われ、そのバグを解消する事をデバッグというが、システムテスト、総合テストではチューニングという。

■オブジェクト指向パラダイム

オブジェクト指向には、普段聞きなれない用語が多く出題されるので、整理して憶えて欲しい。

過去に出題された用語としては、クラス、メソッド、継承、スーパクラス、サブクラス、隠蔽、汎化−特化構造、分解−集約構造などがある。

○クラス、メソッド、隠蔽

オブジェクト指向では、クラスを定義していくことでプログラミングを行う。クラスとは、データとデータ操作の関数をひとまとめにして定義したものである。データ操作の関数をメソッドという。データの操作はメソッドを介して行われるので、外部からの不正な操作はできない。これを隠蔽という。

○継承(インヘリタンス)、スーパクラス、サブクラス

例えばラジカセを考える。ラジカセはラジオにカセットテープの録音・再生機能をつけたものといえる。ラジカセはもともとあったラジオの性質を受け継ぎつつ、新しい機能をつけてラジカセとしている。このように元からあったものの性質を受け継ぐ事を継承(インヘリタンス)という。このときラジオはスーパクラス、ラジカセはサブクラスという。オブジェクト指向による開発はこのように、もとのクラスにない機能を追加するという形で行われる。

○汎化−特化構造

例えばDOS/VとMacがあるとする。その2つのパソコンを一般化するといわゆるパソコンになる。DOS/VとMacはパソコンを特化したものである。このような関係を汎化−特化構造という。汎化−特化構造はis aの関係ともいう。

        ┌─────┐
        │ パソコン │
        └──┬──┘
      ┌───┴───┐
┌──┴──┐  ┌──┴──┐
│DOS/V│  │  Mac  │
└─────┘  └─────┘
		
○分解−集約構造

例えばパソコンを考える。パソコンを分解すると、CPUとメモリに分解できる。このような関係を分解−集約構造という。分解−集約構造はpart ofの関係ともいう。

        ┌─────┐
        │ パソコン │
        └──┬──┘
      ┌───┴───┐
┌──┴──┐  ┌──┴──┐
│  CPU  │  │  メモリ  │
└─────┘  └─────┘
		
CASEツール

CASEツールとは、Computer Aided Software Engineeringの略で、コンピュータ支援によるソフトウェア工学のことである。

CASEツールには上流CASEツールと下流CASEツール、統合CASEツールの3種類があり、ウオーターフォールモデルのどの工程を支援するかによって分かれている。

上流CASEツール

要求定義・分析〜設計までの工程を支援する。データフローダイアグラムの作成など。

下流CASEツール

製造〜テストまでの工程を支援する。ソースコードの自動生成、テストデータの作成支援など。

統合CASEツール

上流CASEツールと下流CASEツールのどちらの機能も持ち、全行程を支援するもの。

CASEツールの機能として、工程に沿った支援を行う機能をフォワードエンジニアリング、工程をさかのぼって支援する機能をリバースエンジニアリングという。今では大規模システムを1から作ることはなく、ほとんどがリニューアルである。リニューアルの際には、既存システムに対してリバースエンジニアリングを行い、システム構築のノウハウをDBに蓄積し、それを活用してフォワードエンジニアリングを行う。その際に使用するDBをリポジトリ、リポジトリを活用してフォワードエンジニアリングを行うことをリエンジニアリングという。

              リバース
              エンジニアリング
              ┌
    ──┐  \  \
    分析│    \  \
 ┌     └─┐  \  \
   \   設計│    \  \
 上流\     └─┐  \  \
 CASE  \/ 製造│    \  \
       /\     └─┐  \  \
           \ テスト│    \  \
         下流\             ┘
         CASE  ┘        フォワード
                         エンジニアリング
		
■分散処理の構成

最近では水平・垂直分散の区分けは失われてきた。変わって登場したのが3層クライアント・サーバ構成(3層CS)である。

3層CS構成は、データベースマネジメントブロック(DMB)アプリケーションレイヤロジック(ALL)プレゼンテーションレイヤロジック(PLL)の3つがある。

DMBはデータそのもののことである。ALLはDMBにアクセスするアプリケーション、すなわちDBMSを指している。PLLはDBMSを使用するクライアントのことである。ALLはOSI7階層のアプリケーション層、PLLはプレゼンテーション層に相当している。

┌─────┐
│  DMB  │データベースマネジメントブロック
├─────┤
│  ALL  │アプリケーションレイヤロジック
├─────┤
│  PLL  │プレゼンテーションレイヤロジック
└─────┘
		

DMB,ALL,PLLをどこに置くかによって、リモートプレゼンテーション、リモートアクセス、ストアドプロシージャ、分散データベースの4種類に分類できる。

リモートプレゼンテーション

データとDBMSをサーバ側に置いたもの。これが一般的なC/Sシステムである。日本航空はブラウザでチケットの予約ができるが、この構成がまさにリモートプレゼンテーションである。

┌─────┐
│  DMB  │
├─────┤
│  ALL  │
└──┬──┘
      │      
      │      
      │      
┌──┴──┐
│  PLL  │
└─────┘
		
リモートアクセス

すべてのクライアントにDBMSを入れた構成。回線を流れるデータ量が多い。

┌─────┐
│  DMB  │
└──┬──┘
      │      
      │      
      │      
┌──┴──┐
│  ALL  │
├─────┤
│  PLL  │
└─────┘
		
ストアドプロシージャ

サーバ側とクライアント側の両方にDBMSを置いた構成。リモートアクセスでは回線を流れるデータ量が多かったが、この方式とすることで必要なデータのみをやり取りできるので、回線を流れるデータ量は少ない。OLTPもこの方式に分類される。

┌─────┐
│  DMB  │
├─────┤
│  ALL  │
└──┬──┘
      │      
┌──┴──┐
│  ALL  │
├─────┤
│  PLL  │
└─────┘
		
分散データベース

データをサーバ側とクライアント側の両方に置いた構成。この構成のみが分散データベースという。

┌─────┐
│  DMB  │
└──┬──┘
      │      
┌──┴──┐
│  DMB  │
├─────┤
│  ALL  │
├─────┤
│  PLL  │
└─────┘
		
■キャパシティプランニング

キャパシティプランニングとは、性能設計のことであり、つまり待ち行列のことである。

待ち行列では、マクドナルドとか、銀行の窓口などのモデルを作る。M/M/1もモデルの一つであるが、第一種ではM/M/1のみが出題される。

M/M/1は、到着/サービス/窓口数を表す。M/M/1モデルの場合、到着はポアソン分布に従い、サービスは指数分布に従う。どちらも一定ではなくランダムという意味であるが、意味が少し異なる。

コンビニの例で考えると、ポアソン分布はお客さんが店に入ってくる頻度である。お客さんはある時は集団で入ってきたり、まったく来なかったりする。ポアソン分布は0にもなりうる。(高速道路を走る車もポアソン分布と言える)。

指数分布はレジがお客さんをさばく頻度である。レジではお弁当を温めたり、領収証を要求するお客さんに対しては時間がかかるが、缶コーヒーを買うお客さんに対しては時間はかからない。しかし時間が0ということはない。これが指数分布である。

どちらがポアソン分布で、どちらが指数分布か分からなくなったら「ポアソンとーちゃん、シースルーでサービス」と憶えよう。

窓口数は、レジが一つかどうかを表す。2つあればM/M/2,3つあればM/M/3となるが、第一種での窓口数は1つである。

サービス時間が一定であるM/D/1モデルというのもある。イメージとしては観覧車のイメージであるが、これも第一種の範囲外である。

銀行のATM装置を例に考える。ATMにおいては残高照会、振込、引出などのサービスを提供しており、それぞれのサービス時間は異なるが平均で3分とする。またこのATMは1時間当たり16人が利用するものとする。

まず、窓口利用率ρ("ろー"と読む)を求める。

   λ(到着率)
ρ=───────
  μ(サービス率)
("λ"は"らむだ"、"μ"は"みゅー"と読む)
		
まずλとμの単位を決める。単位の分子は処理単位(この場合は「人」)、分母は時間の単位(この場合は「時間」)とする。

   λ(到着率) (人/時間)
ρ=────────────
  μ(サービス率)(人/時間)
		
分子には到着の頻度、分母には処理能力を入れる。(窓口利用率は、情報処理技術者試験的には1より小さい値となる。従って単位をそろえたならば、分子に小さい値、分母に大きい値を入れればよい。)

   λ(到着率)  到着の頻度 16(人/時間)
ρ=───────=─────=───────=0.8
  μ(サービス率)  処理能力  20(人/時間)
		
窓口利用率ρを求めたら、並んでいる人数と、平均待ち時間平均応答時間を求める。

並んでいる人数は、以下の式で求める。

         ρ   0.8
並んでいる人数=───=─────=4(人)
        1−ρ 1−0.8
		
平均待ち時間は、ATM装置の行列に並び始めてから、自分の番が来るまでの時間である。したがって、4人のお客さんにそれぞれ3分かかるので、平均待ち時間は以下の式となる。

平均待ち時間=並んでいる人数×処理能力(分)=4(人)×3(分)=12(分)
		
このATM装置は、12分は並んで待たねばならないということである。

平均応答時間は、ATM装置の行列に並び始めてから、自分の処理が終了するまでの時間である。したがって、先に求めた平均待ち時間12分に、自分の処理にかかる時間を加えればよい。平均応答時間の式は以下のようになる。

平均応答時間=平均待ち時間(分)+自分の処理に要する時間(分)=12(分)+3(分)=15(分)
		
平均応答時間は以下の式でも求めることができる。上記手順で求めるのもいいが、試験では時間との戦いになるので、式を覚えられるのなら覚えてしまったほうがよい。

             1         1   1
平均応答時間=─────────────=─────=─(時間)=15(分)
       μ(人/時間)−λ(人/時間) 20−16 4
		

以下に待ち行列についてのiTAC掲示板の議論を引用する。

マクドナルドに行きました 投稿者:宮ちゃん  投稿日:8/29 23:48:07
先生の講義で、待ち行列でマクドナルドを例に出されていましたので
実際に行ってみました。(別に意図して行ったわけではないのですが)
4分36秒(276秒)並んで、バリューセット500円いや買うのに1分50秒(110秒)
でした。サービス(買い物)中を含む待ち時間は、276+110=386秒でした。
30分ねばって、何人入ってきたか数えました。30分で46人でした。
カウンタ数は4で、やはりカウンタごとに行列ができていました。
ということはM/M/1モデルが4つですね。
サービス率(μ)は、1人110秒なので、1時間当たり32.72人[3600/110]
到着率(λ)は、30分で56人だったので、1時間当たり23.00人[46*2/4]
よって利用率(ρ)は、0.70
サービス中を含む待ち時間は、1/(μ−λ)なので
1/(32.72-23.00)=0.1028(時間)=370.37(秒)
理論上の計算と実際がほぼぴったり、納得した1日でした
しかし時計を何度も見ていたので店員から変に思われたかな
今度は銀行のATMコーナでウォッチングしてみよう(怪しまれるかな)

待ち行列 投稿者:水岡祥二  投稿日:8/31 18:33:55
マクドナルドでのウォッチング、素晴らしい実践ですね。
待ち行列の公式を導き出したアーランも、毎朝、パン屋さんの行列に並んで
暇だったので、人数、時間をウォッチングして、公式を導き出したのです。
でも、計算上の答えはあくまでも、「平均」の待ち時間です。
宮ちゃんの場合、たまたま、計算上の値と、実際の値があっていたのですが、
元々ランダムなので多少誤差があるはずです。
それにしても今日は月末だったので、銀行混んでいましたね。7分並んで
3分。心理的には、並ぶ時間のほうがはるかに長いですね



### その他の議論 ###


ここでは、iTACの掲示板で実際に行われた議論のうち、講義中には取り上げなかった範囲について掲載します。



■フェイル〜、フォールト〜に関する議論


フェイルセーフとフェイルソフト 投稿者:Chary Two 投稿日:11/8 00:03:06
あ、Chary Twoです。誰もが訳わからなくなるフェイルセーフとフェ
イルソフトなのですが、私は以下の方法で回避しています。

一台が故障してももう一台でぜったい安心安全(セーフ)
  −−−フェイルセーフ

一台が故障したら本処理機を切り離しても、なんとか待機系で維持
する、つまり、ソフトランディングしてなんとかがんばる
  −−−フェイルソフト

このような認識方法でやっています。他の方法があったらぜひぜひ
教えてください。

また、
デュアルシステムはDUALだから2台で片方だめでも
もう一台でぜったい安心安全なのでフェイルセーフで、
デュプレックスシステムはデュアルシステムよりも複雑(Comp
lex)なのでなんとかセーフランディングするシステムなのでフェ
イルソフトと認識します。

ではでは。


Re:フェイルセーフとフェイルソフト 投稿者:NI 投稿日:11/8 09:52:24
この掲示板では、はじめまして。NIです。旧一種ホルダー(10年前
)です。

>一台が故障してももう一台でぜったい安心安全(セーフ)−−−フ
>ェイルセーフ

この部分はちょっと違いますね。

フェールセーフ:故障して停止するときは安全側になるよう(安全な
        状態で停止するよう)にし、事故の拡大を防止する
        方式

たとえば、車が故障して停止するときに、道の真ん中で止めないで
なんとか端に寄せて停止させる、という考え方です。

原子力発電所では、(ある程度以上の)重大な異常がみつかったら、
無理に運転を継続せず、自動的に原子炉を停止する(スクラムと言う
)ような設計になっていますが、これもフェールセーフの例です。

フェイルセーフとフェイルソフト 投稿者:Umya 投稿日:11/9 00:42:10
フェールセーフ、フェールプルーフについて僕はこう考えます。

フェールセーフ 危険回避 システムの安全性の観点からのシステ
ム設計をする。
僕の覚え方として、信号機に異常が発生したとき必ず赤信号点灯で
停止するよう信号機を設計。
事故の発生を未然に防ぐ。全体として安全状態になるようにする。 

フェールソフト 部分回復 システムの信頼性の観点からのシステ
ム設計をする。
信号機に異常が発生したとき、信号機は赤信号点滅、あるいは警官
が交通整理。
もう一つの考えとして、矢印のある信号機(分かります?)、例え
ば「青、黄、赤、↑、→」の信号機で異常が発生したとき矢印部分
の信号機のみ機能して、「青、黄、赤」の信号機は機能を赤信号で
停止している。
直進車と右折車は交差点に進入することはできるが、左折車は交差
点に進入することができない。
信号機の処理能力を落としてでもなんとか機能させるか、それとも
ある部分で機能を完全に放棄信号機全体で機能を停止させるのでは
なく残った機能で出来るとこまで処理をする。

フールプルーフ 異常そのものを極力発生させないようにシステム
を設計する。赤信号の時に交差点直前に壁がせりあがり、赤信号の
時はどんなことがあっても絶対交差点に進入できない。

フールプルーフは蛇足でしたね。
文章が汚いですが分かります?

RE:フェイルセーフとフェイルソフト 投稿者:力波604 投稿日:11/9 02:41:37
>フェールセーフ、フェールプルーフについて僕はこう考えます。

私の覚えているポイントは(『』でくくりました)、
フェイルセーフ・・・・システムは常に『安全側』に働くです。
つまり、異常があっても2次災害などを引き起こさないように中途
半端に停止させないで、できる限り安全な状態へ移行してから停止
するような設計、または突然の停止状態がすでに安全な状態を確保
している設計のこと。

フェールセーフ・・・・『一部の故障がシステム全体を停止させて
しまう致命傷にならない』ような設計。できる限り運転を続けよう
とする指針があります。たとえば故障が発生した部分を切り離し、
機能や性能を落としてでも運転を続けるシステムなどです。またこ
のような切り離す機能退行動作をフォールバックと言います。

フォールトトレラント・・・・システムを2重化するなどして『冗
長度をもたせ、障害が発生しても障害前と同等の機能、性能を提供
し続ける』ことができるような設計のこと。あとですね、フォール
トトレラントにはもうひとつ意味があって、誤動作や故障などの異
常時に働く自己診断や自己修正の機能を指すこともあるはずなんで
す。これについては少し自信がないのでどなたかフォロー下さい。

フールプルーフ・・・・直訳すると『バカ防止』(笑) 要はうっか
りを防ぐような設計のことで、主に人為的なミスがあっても受け付
けないようにしたりすることですから、ヒューマンインタフェース
と考えても良いのではないでしょうか。

私はUmyaさんの
>フールプルーフ 異常そのものを極力発生させないようにシステム
>を設計する。赤信号の時に交差点直前に壁がせりあがり、赤信号の
>時はどんなことがあっても絶対交差点に進入できない。
はフォールトアボイダンスのような気がします。

ちゃんと調べてみました。 投稿者:Umya 投稿日:11/9 16:07:29
フェイルセーフ、フェイルソフト、フールプルーフ
こなへん、私も知識があいまいですので、手元にある本で調べてみ
ました。

フォールトアボイダンス技術
    障害を出さないための技術。品質管理技術、各種テスト技
    術、技法、品質向上のための設計技法。

フォールトトレランス技術
    障害は避けられないとして、その対策技術。運用、保守段
    階での信頼性を向上させるアプローチ。ソフトウェア、ハ
    ードウェアの冗長性を利用して高信頼性を図るアプローチ。
    フォールトトレランス技術の概念として、フェイルセーフ、
    フェイルソフト、フールプルーフがある。
    その他にも、運用方式技術として、ホットスタンバイ、コ
    ールドスタンバイ等。
    システム構成技術にデュプレックスシステム、やデュアル
    システム等がある。障害の検出技術や自動修復技術もこれ
    に含まれる。

セキュリティ技術
    コンピュータをとりまくさまざまな脅威からシステムを保
    護する技術。
      外的セキュリティ
        自然災害、人的偶発事故などの外的、物理的脅威
        からコンピュータシステムを護る。
      内的セキュリティ
        主にソフトウェア、データに対するセキュリティ
        技術。データの改ざん、不正アクセスからシステ
        ムを保護する。
いかがでしょうか?

>私はUmyaさんの
> >フールプルーフ 異常そのものを極力発生させないようにシステムを設計する。
> >赤信号の時に交差点直前に壁がせりあがり、赤信号の時はどんなことがあっても絶対交差点に進入できない。
> はフォールトアボイダンスのような気がします。
失礼、わたしが間違っておりました。ここの部分は忘れてください。

クイズ?フェールソフト? 投稿者:ゆきお 投稿日:11/11 01:04:45
H10NSP午前54問のおさらいです

システムの信頼性を保証する設計に関する記述のうち、
フェールソフトの説明はどれか。



システムの一部に故障や異常が発生した時、
データの消失、装置への障害、及び運転員への危害を
減じる方向に作動すること。


システムを運用しながら故障部分の修復を可能とし、
24時間365日の連続運転をすること。


装置の一部が故障しても、システムの全面的なサービス停止になら
ないようにすること。


ユーザの入力に対して確認のメッセージを出力したり、
決められた順序で入力しなければ動作しないようにしたりして、
単純なミスが起こらないようにすること。

正解者にはCafeBar iTACでワンショット!プレゼント
だだしマスターのおごりで

PS・ふゆうさん
私も大阪、但し30半ばの元大学生 うぅぅぅ



re:H10NSP午前54問のおさらい 投稿者:力波604 投稿日:11/11 01:38:04
×ア 危害を減じる方向、つまり『安全側』です。フェイルセーフ。
×イ 故障後もサービスを継続させようとしているからフォールト
   トレラント、としていいのかな?
○ウ 後述参照。フェイルソフト。
×エ 単純なミス、つまり『うっかり』です。フールプルーフ。


なお、今さらですが、先日の私の発言に誤りがありました。
>フェールセーフ・・・・『一部の故障がシステム全体を停止させて
>しまう致命傷にならない』
>ような設計。できる限り運転を続けようとする指針があります。た
>とえば故障が発生した
もうおわかりですね。混乱させる内容で申しわけありませんでした。

ANS H10NSP午前54問 投稿者:ゆきお 投稿日:11/11 23:05:43
ピンポーん
マスター力波さんに、バーボン、ワンショット

おっと、すばやいレス、ありがとうございます。

>×イ 故障後もサービスを継続させようとしているから
>フォールトトレラント、としていいのかな?
フォールトトレラントでしょうね、
詳しく言うとフォールトトレラント技術のうち、
システムの二重化およびホットスワップ
(電源入れたまま、ユニットの交換が可能)
を取り入れた、ノンストップコンピュータ
の事が言いたいとだと思います。
(講義録ここまで)