Transcript jlect11

Disciplined Software
Engineering
Lecture #11
Software Engineering Institute
Carnegie Mellon University
Pittsburgh, PA 15213
Sponsored by the U.S. Department of Defense
Copyright © 1994 Carnegie Mellon University1
Lecture #11 概要
個人的ソフトウエアプロセスの拡張
•拡張性の原則
•ソフトウエアの複雑さの取り扱い
•開発戦略
循環的PSP
ソフトウエアインスペクション(現在はPSP2)
Copyright © 1994 Carnegie Mellon University2
拡張性とは何か?
製品開発プロセスは使用される方法と技法が、より大
規模なプロジェクトに対しても同様にうまく働く時、拡張
可能である。
拡張性は典型的には以下である。
•製品規模の狭い範囲を越えて適用される
•類似のアプリケーション領域に限定される
•先例のないシステムには適用しない
•管理が貧弱なプロジェクトには働かない
•技術作業に規範がないところで適用される事はあり
そうにない。
Copyright © 1994 Carnegie Mellon University3
拡張性の原則
拡張性が可能であるためには、より大きなプロジェクトの
要素は小さなプロジェクトと同じ様に振る舞う事が必要で
ある。
したがって製品設計はそのプロジェクトをそれぞれ分割開
発される要素に分けなければならない。
これは開発プロセスは個人が効率的に開発できるプロジェ
クトのスケール(規模)を考慮に入れることを要求する。
Copyright © 1994 Carnegie Mellon University4
拡張性のステージ
我々はソフトウエアシステムを5つの拡張性ステージに分類され
るものとして見る事が出来る。
これらの拡張性ステージは以下のようになる:
•ステージ 0 - 単純ルーチン
•ステージ 1 - プログラム
•ステージ 2 - コンポーネント
•ステージ 3 - システム
•ステージ 4 - 複合システム
Copyright © 1994 Carnegie Mellon University5
拡張性ステージ 0
ステージ 0 は基本的な構成物レベルである。これはルー
プ、case文、などの構築に関係する。
ステージ 0 はプログラミング入門コースの主要な焦点である
。
ステージ 0では, 各プログラミング構成物を意識して設計する
。
あなたの思考がこれらの詳細に没頭している時には、
より大きな構成物を思い浮かべる事は難しい。
Copyright © 1994 Carnegie Mellon University6
拡張性ステージ 1
ステージ1は数百LOCまでの小規模プログラムに関係が
ある。
ステージ0からステージ1への移行は言語に習熟してくれば
自然に起こる。あなたは今や小規模プログラムをその詳
細な構成物を意識的に設計することなしに一つの実体
として考える。
あなたがステージ1で経験を得るのにしたがって、あなた
が理解し、自信を持って使う事が出来る小規模プログ
ラム機能を表す語嚢を増やしていく。
Copyright © 1994 Carnegie Mellon University7
拡張性ステージ 2
ステージ2はコンポーネントレベルである。ここで、複数のプロク
゙ラムが結合され高度な機能を提供する。ステージ2のコンポ
ーネントは典型的には数千LOCである。
ステージ1からステージ2への移行は経験の増加に伴って
起こる。今や一人で多分作成できるプログラムよりも大規
模なプログラムについて考えることが出来る。
ステージ2では, システム問題:すなわち品質、性能、使
用性、などが出始める。
(図11.1参照:知識の自覚)
Copyright © 1994 Carnegie Mellon University8
拡張性ステージ 3
ステージ3のシステムは数百万LOCくらいの大きさになる
かもしれない。ここで、システム問題が目立ってくる。
•コンポーネントは協調して働かなければならない。
•コンポーネント部品はすべて高品質でなければならない。
ステージ2からステージ3への移行は次のことを含む。
•プログラムの複雑さの取り扱い
•システムとアプリケーション問題を理解すること
•チーム環境で働くこと
ステージ3では、主要な力点をプログラムの品質に置かね
ばならない。
Copyright © 1994 Carnegie Mellon University9
拡張性ステージ 4
ステージ4の複合システムは数千万LOCを含むかもしれ
ない。
•複数の半独立システムが協調して働かねばならない
•品質は最高に重要である。
ステージ3からステージ4への移行では集中制御について
の問題のみならず大規模かつ分散したシステムの問
題が起こる。
ステージ4は半自主的な開発グループと自己管理するチ
ームを要求する。
Copyright © 1994 Carnegie Mellon University10
拡張性条件 - 1
拡張可能であるためには
•プロセスは管理されなければならない。
•プロジェクトは管理されなければならない。
•製品は管理されなければならない。
管理されたプロセスは
•定義されるべきである
•その仕事を分離可能な要素に分解するべきである
•これらの要素を最終システムに効果的に統合する
べきである。
Copyright © 1994 Carnegie Mellon University11
拡張性条件 - 2
管理されたプロジェクトに対して
•仕事は計画されねばならない
•仕事はその計画に対して管理されねばならない
•要求の変更は制御されねばならない
•システム設計とシステムアーキテクチャはプロジェク
トを通して一貫して継続しなければならない。
•構成管理が使用されなければならない。
Copyright © 1994 Carnegie Mellon University12
拡張性条件 - 3
管理された製品に対しては
•欠陥は追跡され制御されなければならない
•統合とシステムテストを行わねばならない
•縮退テストは首尾一貫して使用される
製品品質は高くなければならない
•モジュール欠陥は統合とシステムテストの前に除去
すべきである
•モジュール品質の目的は統合とシステムテストの前
に全ての欠陥を発見することであるべきである。 (す
なわち、百万LOCあたり100未満の欠陥を見逃す)
→1KLOCあたり0.1未満
Copyright © 1994 Carnegie Mellon University13
拡張性の目的
拡張性の目的は大規模製品を小規模製品と同様な品
質と生産性で開発することである。
拡張性は小規模プロジェクトにおいて行われたタスクにだ
け適用される。
より大規模なプロジェクトにより要求される新しいタスクは
追加の作業を要求するので、生産性は一般的にジョブ
の規模が増加するのに伴って下降する。
Copyright © 1994 Carnegie Mellon University14
拡張性の範囲 - 1
製品 Z
大規模
プロジェクト
コンポーネント X
コンポーネント Y
中規模
プロジェクト
モジュールA
モジュールB
モジュールC
モジュールD
モジュールE
モジュールF
モジュールG
モジュールH
モジュールI
モジュールJ
モジュールK
モジュールL
モジュールM
モジュールN
モジュールO
小規模
プロジェクト
Copyright © 1994 Carnegie Mellon University15
拡張性の範囲 - 2
モジュールレベルからコンポーネントレベルへの拡張において
•モジュールレベルの作業の品質と生産性の維持を求める
•コンポーネントレベルの作業は新しいので拡張が出来ない
製品レベルへの拡張において
•コンポーネントレベル作業の品質と生産性の維持を求める
•製品レベルの作業は新しいので拡張が出来ない
Copyright © 1994 Carnegie Mellon University16
複雑さの管理 - 1
規模と複雑さは密接に関係している。
小規模プログラムは程々に複雑であり得るが、極めて重
要な問題は大規模プログラムを扱う事である。
プログラムが大規模になると一般にプログラムは非常に
複雑になる。
Copyright © 1994 Carnegie Mellon University17
複雑さの管理 - 2
ソフトウエア開発は主として個人によって行われる。
•個人は小規模プログラムを一人だけで書く。
•大規模プログラムは普通複数の小規模プログラムか
ら構成される
以下を実施するための方法に関連した3つの問題があ
る。
•高品質の小規模プログラムを開発する
•より大きなそしてより複雑なプログラムを個人が取り
扱えるようにする
•これらの個人的に開発されたプログラムをより大きな
システムに組み合わせる
Copyright © 1994 Carnegie Mellon University18
複雑さの管理 - 3
ソフトウェアの複雑さについての主要な問題は人間が
次に関してかぎられた能力しかもっていないと言う事で
ある。
•詳細を記憶すること
•複雑な関係を視覚化すること
したがって我々は次第に複雑になるプログラムを個人
が開発するのに役立つ方法を探し求める。
•抽象化
•アーキテクチャ
•再利用
Copyright © 1994 Carnegie Mellon University19
抽象化の力 - 1
人間は概念的なチャンク(塊)で考える
•積極的に使えるのは7+/-2個のチャンクの範囲であ
る。
•チャンクが豊かであれば我々の思考が強力になる。
このことはアマチュアのチェスプレイヤーにゲーム中の
チェスの駒の位置を記憶することを求めることで示され
た。
•彼等は僅か5~6駒しか覚えられなかった.
•エキスパートは盤全体を記憶することが出来た。
•ランダムに置かれた駒に対しては,エキスパートもア
マチュアもほとんど同程度の結果になった。
Copyright © 1994 Carnegie Mellon University20
抽象化の力 - 2
以下のことが成り立てば、ソフトウエアの抽象化はこの
様なチャンク(塊)を形作ることが出来る
•抽象化が精密である
•我々が完全に理解している
•考えたとおりに正しく実行する
いくつかの可能性のある抽象化は以下である
•ルーチン
•標準手続きと再利用可能なプログラム
•完全なサブシステム
Copyright © 1994 Carnegie Mellon University21
抽象化の力 - 3
概念的な複雑さを減らすため, これらの抽象化は次で
なければならない
•仕様化されたとおりに精密に実行する
•仕様化された以外の相互関連を持っていない
•首尾一貫しかつ自己完結的なシステム機能を
概念的に表現する
Copyright © 1994 Carnegie Mellon University22
抽象化の力 - 4
これらのより大きな言葉で考えるとき, 我々のシステム
を精密に定義できる。
そうするとそれらから構成される抽象化を構築すること
が出来る。
これらの抽象化がシステムに結合されるとき、期待さ
れたように働く可能性がより大きくなる。
Copyright © 1994 Carnegie Mellon University23
抽象化の力 - 5
抽象化において主要な制約になることは以下である。
•開発者(人間)は仕様化において誤りをする
•抽象化はしばしば欠陥を含む
•多くの抽象化は特殊であり汎用性がない
このことは他人の仕事を活用することが滅多に出来な
いことを意味している。
したがって複雑なソフトウエアシステムを知覚する我々の
知的能力は、われわれ自身が開発してきた抽象化に
よって制約される。
Copyright © 1994 Carnegie Mellon University24
アーキテクチャと再利用 - 1
システムアーキテクチャ設計は以下の理由から複雑さを減少さ
せることが出来る
•首尾一貫した構造的な枠組みを与える
•概念的に類似な機能を識別する
•サブシステムを明確に分離する
よく構造化されたアーキテクチャは標準設計の利用を促進
する
•アプリケーションの固有事項は一番下のレベルまで
決定が延ばされる
•可能なところでは、調整可能なパラメータが定義され
る。
Copyright © 1994 Carnegie Mellon University25
アーキテクチャと再利用 - 2
このことは標準化されたコンポーネントの使用を通して再利
用可能性を増加させる。
これらの精密に定義された標準コンポーネントがそのとき
概要設計の抽象化として使用できる
もしこれらのコンポーネントが高品質なら, 拡張性が達成で
きる可能性はより大である。
Copyright © 1994 Carnegie Mellon University26
フィーチャオリエンテッドなドメイン分析 - 1
フィーチャオリエンテッドなドメイン分析はSEIによって開発され
た。それはアーキテクチャの設計手法の1つで
•概念的に類似な機能を識別する
•これらの機能をクラスにカテゴリ分けする
•各クラスに対する共通の抽象化を定義する
•可能なところではパラメータを使用する
•アプリケーションに特有な機能は後に回す
•プログラム部品の最大限の共有を可能にする
Copyright © 1994 Carnegie Mellon University27
フィーチャオリエンテッドなドメイン分析 - 2
フィーチャオリエンテッドなドメイン分析の例は
•システム出力機能を定義する
•最高レベルはメッセージを作成し送る
•次に低いレベルはプリンタやディスプレイなどを定義する
•次のレベルはプリンタフォーマッティングを取り扱う
•次のレベルは特定のプリンタタイプをサポートする
Copyright © 1994 Carnegie Mellon University28
開発戦略 - 1
開発戦略はシステムがあまり大きすぎて1つの製品に作
り込めない時要求される
•その時システムを要素に分割しなければならない
•それからこれらの要素を開発しなければならない
•それから開発された要素は最終システムに統合される
Copyright © 1994 Carnegie Mellon University29
開発戦略 - 2
戦略は
•より小規模な要素を定義する
•それらの要素が開発される順序を確立する
•要素が統合される方法を確立する
もし戦略が適切で、要素が適切に開発されるならば
•開発プロセスは拡張できるであろう
•開発全体は部品の和にシステム設計及び統合を加えた
ものである。
Copyright © 1994 Carnegie Mellon University30
いくつかの開発戦略
多くの開発戦略がありうる
目的はプロセスの最も早い時点で主要な問題を識別する
ように、そのシステムを逐次的に構築していく事である。
いくつかの戦略例は以下である:
•段階的戦略
•機能拡張戦略
•高速パス拡張戦略
•ダミー戦略
Copyright © 1994 Carnegie Mellon University31
段階的戦略
サイクル 1
In
1st
モジュール
Out
サイクル 2
In
1st
モジュール
1st
拡張
サイクル 3
In
1st
モジュール
1st
拡張
Out
2nd
拡張
Out
段階的戦略においては, 機能はそれらが実行される順序で
開発される。このやり方は比較的単純なテストで済み、足場や
特別なテスト機能はほとんど要らない。
Copyright © 1994 Carnegie Mellon University32
機能拡張戦略
Ist
機能拡張
3rd
機能拡張
コアシステム
4th
機能拡張
2nd
機能拡張
機能拡張においては、ベースシステムを最初に構築し、それ
から拡張しなければならない. ベースシステムが大規模になる
としばしばその開発に対して別の戦略が必要になる.
Copyright © 1994 Carnegie Mellon University33
高速パス拡張戦略
1st
拡張
4th
拡張
c
b
a
その性能が適切であれば機能
拡張が行われる。
d
3rd
拡張
h
e
f
高速パス拡張では,高性能ループ
が最初に構築され、デバッグさ
れ計測される。
性能がまだ仕様の範囲内にあ
ることを保証するために各々の
拡張を計測する。
g
2nd
拡張
Copyright © 1994 Carnegie Mellon University34
ダミー戦略
コア
システム
A
B
コア
システム
C
B
機能
A
コア
システム
C
コア
システム
C
機能
A
機能
A
機能
B
機能
B
機能
C
ダミー戦略においては, システムの機能の全部また
は大部分をダミーコードで置き換えたコアシステムが
最初に作られる。
これらのダミーは、その後開発が進むのにしたがって
完全な機能に次第に置き換えられる。
Copyright © 1994 Carnegie Mellon University35
循環的PSP - 1
循環的PSPは中規模のプログラムを開発するために
循環的開発戦略を使用する枠組みを与える。
複数のPSP2.1のような循環的要素を含むより大規模
なプロセスである。
PSPの要求、計画立案、および事後分析ステップはプ
ログラム全体に対し一度実行される。
Copyright © 1994 Carnegie Mellon University36
循環的 PSP フロー
仕様
製品
要求 & 計画立案
サイクルの明確化
概要設計
詳細設計 &
設計レビュー
概要設計レビュー
テスト開発と
レビュー
循環的開発
実装とコードレビュー
事後分析
コンパイル
統合とシステムテスト
テスト
再評価と再循環
Copyright © 1994 Carnegie Mellon University37
循環的PSP - 2
概要設計はプログラムを小規模要素に分解して 開発
戦略を確立する。
そのプロセスは統合、システムテストおよびそれに続く
事後分析によって終了する。
開発戦略は以下のような循環的ステップを決定する。
•要素の選択
•テスト戦略
•最終統合を不要にするかもしれない。
Copyright © 1994 Carnegie Mellon University38
チームソフトウェアプロセス - 1
プロジェクト規模をさらに大きくするために、典型的に
はチーム開発プロセスが要求される。
これは主要なプロジェクトタスクを識別する。
•これらのタスクを相互に関係づける
•開始と終了の条件を確立する
•チームメンバーの役割を割当てる
•チーム尺度を確立する
•チームの目標と品質評価基準を確立する
Copyright © 1994 Carnegie Mellon University39
チームソフトウェアプロセス - 2
チームプロセスはまた個々のPSPがチームの中で関係
をもつ事が出来る枠組みを与える, それは
•チーム--PSPインタフェースを定義する
•標準と尺度を確立する
•何処でインスペクションされるべきか規定する
•計画立案と報告のガイドラインを確立する
たとえPSPをもっていたとしても,インスペクションではチーム
サポートを得るように試みたほうがよい
PSPの欠陥摘出率を改善するために設計のインスペクション
を使用する事を最初に考えなさい.
Copyright © 1994 Carnegie Mellon University40
インスペクション - 1(現在はPSP2)
インスペクションはソフトウエア品質の改善と開発時間
およびコストを減少させるためにもっともコスト効率のよ
いテクニックとして知られている。
インスペクションは次のことに役立つ
•よりよい仕事をするよう動機づける
•効果的なチームコミュニケーションを保証する
•優れたものへのこだわりを維持する
(個人的なベンチマークの設定)
Copyright © 1994 Carnegie Mellon University41
インスペクション - 2
インスペクションの目的は
•出来るだけ早期の時点でエラーを発見すること
•全パーティーが仕事に合意している事を保証すること
•その仕事が定義された判断基準に適合している事を
検証すること
•公式に仕事を完了すること
•データを提供すること
インスペクションは任意のソフトウエア製品の要素に使用
できる、例えば
•要求、仕様、設計、コード
•テスト資料
•文書
Copyright © 1994 Carnegie Mellon University42
インスペクションプロセス - 1
インスペクションは公式に構造化されたプロセスに従う
チェックリストと標準がインスペクションの各タイプに対して
開発される。
インスペクションは技術者のために技術者によって
運営される。管理者は出席しない。
Copyright © 1994 Carnegie Mellon University43
インスペクションプロセス - 2
計画立案
管理者
開発者
司会者
説明会議
司会者
開発者
レビュー者
準備
レビュー者
インスペクション
会議
司会者
記録者
開発者
レビュー者
フォローアップ
司会者
開発者
Copyright © 1994 Carnegie Mellon University44
インスペクションプロセス - 3
レビュー者は前もって準備する.
インスペクション会議は焦点を問題の識別に置き、問
題の解決には置かない.
インスペクションデータを収集して追跡と分析のためにイ
ンスペクションデータベースに入力する.
Copyright © 1994 Carnegie Mellon University45
インスペクションにおける役割 - 1
司会者
•インスペクションプロセスをリードする
•焦点を問題解決よりもむしろ問題識別に置き続ける
•識別された問題が解決される事を保証する
•インスペクション報告書を提出する
開発者(その仕事をした開発者)
•レビュー資料を作成する
•質問に答える
•識別された問題を解決する
Copyright © 1994 Carnegie Mellon University46
インスペクションにおける役割 - 2
レビュー者
•インスペクションキックオフ会議に出席する
•前もってレビュー資料をレビューする
•インスペクション会議に出席する
•識別された欠陥または他の関心のある事について問
題を提起し質問する
記録者
•識別された問題点を文書化しそれらの解決に責任を
もつ人を記録する
•全ての関連するデータを記録する
Copyright © 1994 Carnegie Mellon University47
演習課題#11
テキストの第11章を読みなさい
PSP3を使用して、あるデータセットから説明変数が3つの
重回帰パラメータと予測区間を計算するためのプログラム
10Aを書きなさい。t分布を計算するためにプログラム5A
を使用しなさい。 この宿題のために3つの期間が許さ
れる。
付録Dにあるプログラム仕様と付録Cにあるプロセス説明と
報告書仕様を読んでそのとおりやりなさい。
Copyright © 1994 Carnegie Mellon University48
重回帰 - 1
あなたは6プロジェクトについて以下のようなデータをもつと
仮定しよう
•要求される開発時間
•新規LOC、再利用LOC、および修正LOC
あなたが新規コード650LOC、再利用コード3,000LOC、
および修正コード155LOCをもつだろうと判断した新規プ
ロジェクトにかかる時間を見積もりたいと仮定しよう。
開発時間と予測区間をどのように見積もるだろうか?
Copyright © 1994 Carnegie Mellon University49
重回帰 - 2
プログラム#
1
2
3
4
5
6
合計
見積り値
新規 再利用
w
x
1,142 1,060
863
995
1,065 3,205
554
120
983 2,896
256
485
修正
y
325
98
23
0
120
88
時間
z
201
98
162
54
138
61
4,863
650
654
155
714
???
8,761
3,000
Copyright © 1994 Carnegie Mellon University50
重回帰 - 3
重回帰はあなたが各変数に対して別々の効果データを
持たない時に多変量の効果を見積もるための1つの方
法を与える。
1. 見積もり値を計算するため次のような
重回帰公式を使用するだろう。
zk  0  wk1  x k 2  yk3
Copyright © 1994 Carnegie Mellon University51
重回帰 - 4
2. 次のような連立1次方程式を解くことによって
あなたはBetaパラメータを求めることが出来る
n
n
n
n
i 1
i 1
i 1
i 1
0 n  1  wi  2  x i  3  yi   zi
n
n
n
n
n
i1
i 1
i 1
i 1
i1
n
n
n
n
i1
i 1
0  wi  1  wi2  2  wi x i  3  wi yi   wi zi
n
0  xi  1  wi x i  2  x  3  xi y i   x izi
i1
i 1
i 1
n
n
n
2
i
n
n
 0  yi   1  wi yi   2  x i yi   3  y   yi zi
i1
i 1
i 1
i 1
2
i
i 1
Copyright © 1994 Carnegie Mellon University52
重回帰 - 5
3. あなたが項の値を計算するとき,
次のような連立1次方程式が得られる。
6 0  4, 8631  8, 7612  6543  714
4, 863 0  4, 521, 8991  8, 519, 9382  620, 707 3  667, 832
8, 761 0  8, 519, 9381  21, 022, 0912  905, 925 3  1, 265, 493
654 0  620, 7071  905, 9252  137, 902 3  100, 583
Copyright © 1994 Carnegie Mellon University53
重回帰 - 6
4. 次に、Gaussの方法を使用して対角化する。
この方法は以下の式を与えるために継続的に掛け
算と引き算を行って方程式から1回に1パラメータずつ
消去して行く。
6 0  4 , 8631  8, 761 2  654 3  714
0 0  580, 437. 51  1, 419 ,148 2  90, 640 3  89, 135
0 0  01  4 , 759 , 809 2  270, 635 3  5, 002. 332
0 0  01  0 2  37, 073. 93 3  9 , 122. 275
Copyright © 1994 Carnegie Mellon University54
重回帰 - 7
5. このようにしてBeta項が得られる
 0  6. 7013
1  0. 0784
 2  0. 0150
 3  0. 2461
Copyright © 1994 Carnegie Mellon University55
重回帰 - 8
6. 次のような方程式を解くことによって範囲に対する
予測区間を決定する。
xk  xavg
yk  yavg


1 wk  wavg
Range t  / 2, n  4  1  
2 
2 
2
n  wi  wavg   xi  xavg   yi  yavg
2
2
2
7 - 分散を次のように計算する
2
 1  n
  
z  0  1wi  2 xi  3yi 

i 1 i

n 4
2
Copyright © 1994 Carnegie Mellon University56
重回帰 - 9
8. 分散は次のように計算する
    513.058  22.651
2
9. 平方根の中の項は
Newk  Newav g   wk  wav g  650 810.52  25,760.25
2
2
Re usek  Re useav g   x k  x av g   3,000 1,460.17  2,371,076.43
2
2
2
Modifyk  Modifyav g   yk  yav g   155109  2,116
2
2
2
Copyright © 1994 Carnegie Mellon University57
重回帰 - 10
10. n=6, p=4 のときの70%予測区間に対するt分布
の値は, 表A2 における85%の列で自由度2 の
ところで見つかる。その値は 1.386である.
11. 平方根はそのとき次のように計算される
Range 1.386*22.651 1 1 / 6  
25,760.25 2,371,076.43 2,116


 38.846
580,437.5
8,229,571
66,616
Copyright © 1994 Carnegie Mellon University58
重回帰 - 11
12. 最終見積もり値はそのとき
z = 6.71+0.0784*650+0.0150*3,000+0.2461*155
= 140.902 時間
13. 38.846 時間の予測区間は見積もりが
102.1 から 179.7時間であることを意味している。
Copyright © 1994 Carnegie Mellon University59
講義11で覚えておくべきメッセージ - 1
1.ソフトウエアプロセスが拡張可能であれば生産性向上と
計画立案に非常に役立つ。
2. 拡張性のためにはプロセスが定義され、良く管理され、
そして高い品質をもつことが必要である。
Copyright © 1994 Carnegie Mellon University60
講義11で覚えておくべきメッセージ - 2
3. 欠陥摘出管理に焦点を当てたPSPは拡張性を達
成するために役に立つ。(→インスペクション)
4. 抽象化、アーキテクチャ、および再利用を利用すること
はまたプロセスを拡張可能にすることにも役に立
つであろう。
Copyright © 1994 Carnegie Mellon University61