ソフトウェア・エンジニアリング入門

ソフトウェア・エンジニアリング入門
セッション 2: ソフトウェア・プロセス
chart 2-1
このセッションの目標
• ソフトウェアはどのようにして作られるのかを理解する
– おぼろげな要求や期待からソフトウェアを作って運用す
るまでの一連のプロセス
– 各フェーズ、タスクでは何を行うのか
• ソフトウェア・プロセスの問題点について論じる
• 良いソフトウェアを作るための望ましいソフトウェア・プ
ロセスとは何かを考える
chart 2-2
ソフトウェア・プロセスとは何か?
ソフトウェアのプロセス・モデルは、ソフトウェア・
プロジェクトの以下の事柄を規定するものである:
– 作業活動
– 作業成果
– 作業活動間での作業成果の流れ
– レビュー・ポイントとマイルストーン
chart 2-3
ウォーターフォール・モデルの例
システム要件
の分析と定義
一般の工業製品の製造工程を模したもの
ソフトウェア要件
の分析と定義
長所:
基本設計
詳細設計
1. 進捗の管理が容易。
2. 仕様が明確で、類似システムの
開発経験があるときには、
効率・品質面で優れる。
短所:
1. 定義した要件に合致したシステムができたか、
プログラミング
定義した要件自体が正しかったかどうかは、
運用するまでは判明しない。
2. 作業工程の柔軟性に欠けるので、
テスト
途中で前提条件の変化や問題に気づいても
対応できない。
運用
※箱の数や、各箱の中の名前(呼び名)は、場合によって変わることがあります。
chart 2-4
Vモデルの例
業務要件
ユーザテスト
システムテスト
システム要件
基本設計
詳細設計
統合テスト
サブシステムテスト
実装
(プログラミング、単体テスト)
chart 2-5
スパイラル・モデル
• 企業内で経営環境の変化に応じた業務改善を行う場合
に用いられる PDCA (Plan-Do-Check-Action) サイクル
の考え方をシステム開発にも適用し、仕様の変更も積極
的に取り入れられるよう考案されたもの
• 次ページを参照のこと
chart 2-6
主要な作業活動: コアタスク
• 分析 … 対象領域の理解、開発対象の要件定義
– 何がどうなっているのか、何をしたい(する)のかを明確にする。
• 設計 … 要件から実装への橋渡し
– 要件を満たすためにどうするのかを明確にする。
– 複数ある実現方法の中から、状況に合わせて取捨選択する。
• 実装 … 実際にコンピュータ上で動作するものを作る
– 設計に基づいてプログラムを作成し、単体での動作を確認する。
• テスト … 作ったものが仕様に合致しているか検査する
• 運用と保守
chart 2-7
コアタスク
分 析
• おぼろげな要求から、解くべき課題を明らかにする。
– 解くべき課題を明らかにしなければ、解くことはできない。
• 課題のコンテキスト(前提、背景)を明らかにする。
– 「システム」(作るべきもの)と「適用領域」(与えられるもの)との
関係。
• 適用領域を明らかにする: 領域(ドメイン)分析。
– 適用領域の特性、領域間の相互作用
• システムあるいはソフトウェアの要件を明らかにする。
– この段階までには、システムの運用要件・方針も明らかにする。
– 提供すべきサービス、要求される特性、時期、コスト等
chart 2-8
コアタスク
領域分析(ドメイン分析)
• 扱うべき主題や適用領域を明らかにする
– ここでの「領域(ドメイン)」とは、ひとまとまりのものとして考えると
都合が良かったり、ある程度、世界の他の部分から分離して考
えることができるもの。
– 課題の定義や課題の文脈から、主題と適用領域を洗い出す。
• 異なる主題の複数の領域に適用領域を分割していく。
• 領域の適切さに関する原則:
– 要求に関連するすべての事項が適用領域のどこかに現れなけ
ればならない。
• 領域分割の基準:
– それぞれの領域の内部属性と振る舞いが大部分お互いから独
立していること。
※このページの内容は、マイケル・ジャクソン著『ソフトウェア博物誌』ISBN4-8101-8098, p.231-237を参考にしました。
chart 2-9
コアタスク
領域分析(ドメイン分析) 続き
• 領域特性を明らかにする。
– 領域特性が異なれば、それを扱う問題の適切な解き方も異なる。
– 領域特性の例:
• 静的/動的、1次元/多次元、有形/無形
– 動的領域では時間軸(事象、状態)を考慮しなければならない。
– 動的領域を区別する特性として、不活性(inert)、反応的(reactive)、能
動的(active)というのもある。
» たとえば、気象を扱うプログラムでは、大気は能動的領域とみな
す。(気圧、湿度、温度、風速などはすべて自発的に変化する要
素だから)
– 能動的領域のなかにはさらに、自律的、指示可能、プログラム可能と
いった重要な区分がある。
• 領域間の相互作用を明らかにする。
chart 2-10
コアタスク
システム要件の分析と定義
• システムが何をすべきか明らかにする。
– システムが提供すべきサービスは何か。
– ものとしてのシステムが持つべき特性は何か。
– 実現可能な要件を「仕様」として定義する。
• 留意点: 「願望」の記載と「事実」の記載は明確に分ける
• 要件には次のような観点がある
–
–
–
–
特徴/機能
性能要件、品質特性
時期的要件、コスト要件、設計上の制約条件、
運用(操作)に関する要件、優先順位 等
chart 2-11
コアタスク
ソフトウェア要件の分析と定義
• システム要件のうち、ソフトウェアで実現すべき部分につ
いて、分析を行い要件を定義する。
• 少なくとも以下の事柄は明らかにする:
– 対象ソフトウェアの外部とのインタフェース
– 提供すべき機能、サービス
– 扱うべき情報の種類、構造、関係
– 振る舞い(動作)に関する要件
– 性能要件、品質要件
– その他設計に影響を及ぼすような制約条件
chart 2-12
コアタスク
設 計
• 要件を実現するための方策を検討し、決定する。
– 「何を(What)」から「如何に(How)」へ。
– 技術的課題とその方策、リスクを明らかにする。
– 考えられる方策を比較検討し、妥当な設計を探る。
– リスクの大きい部分ほど細かく検討する。
• リスクの大きい部分は、先行開発したり、プロトタイピングしても良い。
– 設計結果だけでなく、なぜその設計にしたのかの決定理由があとで
分かるように、将来再検討できるように、理由も文書化しておく。
– ドメインごとに分担して並行に設計をすることも考えられる。
• なぜなら、ドメインごとに異なる知識が要求されるから。
– ここでは、基本設計と詳細設計に分けて考える。
chart 2-13
コアタスク
基本設計
• データベース、ネットワーク、分散化、信頼性確保対策等、
システムの基盤となる設計を行う。
– 要件(機能だけでなく信頼性などの品質要件を含む)を満たすた
めには、どのような方式、規模が良いか。
• 利用できるもの(フレームワーク、パターン、基本ソフト、
DBMS、ERP、TPモニタ、ビジネスオブジェクト、ライブラ
リ等)は極力利用し、新規開発部分を削減する。
–
–
–
–
考えなくてすむなら考えない。
作らなくてすむなら作らない。
利用するものの特性やライフサイクルも考慮して設計する。
既存システムと接続する場合には、インタフェース設計も重要。
chart 2-14
コアタスク
基本設計
続き
• システムを適度な大きさのコンポーネントに分割する。
– 分割の仕方が基本設計の重要なポイント。
– 適切な分割は、システムの複雑さを低減してくれる。
• コンポーネント間の関係(動的関係、静的関係)、インタ
フェース、各コンポーネントがやるべきことを明確にする。
• よく知られているパターンや構成、フレームワーク等をうま
く利用する。
– レイヤ、ブローカ、Model-View-Controller、3層クライアント/
サーバ型等
– OMG (Object Management Grop) では、ドメイン共通やドメイン
別のフレームワークの標準化を進めている。
• http://www.omg.org/techprocess/meetings/schedule/index.html
chart 2-15
コアタスク
良い設計のための根底技術(基礎原理)
•
•
•
•
•
•
•
•
•
•
抽象化
カプセル化
情報隠蔽
モジュール化
関心の分離
結合度と凝集度
充足性、完全性、プリミティブ性
ポリシーと実装の分離
参照の一点性
分割統治
参考: POSA本(邦訳:ソフトウェアアーキテクチャ)の6.3節
chart 2-16
コアタスク
詳細設計
• ユーザインタフェース設計
– 画面、帳票のレイアウト、ユーザイベントに対する動作等
• データベース設計
– 基本設計の段階で設計したDBスキーマを正規化
– テーブル定義、ビュー定義、アクセス権定義等
• コンポーネント設計
–
–
–
–
コンポーネント間インタフェースの確認
アルゴリズムの検討
プログラミング言語の特性を考慮した設計
デザインパターンの活用
chart 2-17
コアタスク
プログラミング
• 必要に応じて更に細かくモジュール分割する
• コーディング
– 記述言語、ライブラリ、ツール等を適切に使用する。
– 表明 (assertion) 等のよく知られたテクニックを適切に使用する。
– よく知られたイディオム(プログラミング・パターン)を活用する。
• コンパイル
• 単体テスト、デバッグ
–
–
–
–
コンポーネント(プログラム)単体での動作を確認する。
単体テストが終わるまではプログラムができたとは言えない。
この段階では、通常、ホワイトボックステストが行われる。
ホワイトボックステストとは、プログラムの内部構造(条件分岐
等)に従ってテストケースを設定して行うテストのことである。
chart 2-18
コアタスク
設計・実装上の技術的課題
(順不同)
• 複雑さへの対処
• 計算モデルと言語
• データ構造とアルゴリズム
– データ量、計算量
• メモリ管理、ゴミ集め
• トランザクション管理
– データの一貫性の保証等
• エラー処理、例外処理
•
プラットフォーム、基盤ソフト等の
絶え間ないバージョンアップ、それ
らとの組合せ・相性
•
•
•
•
•
•
•
•
•
•
•
情報量、通信量
負荷増大・負荷集中への対処
並列、分散
同期/非同期
実時間(リアルタイム)
リソースの競合、デッドロック
セキュリティ、認証、アクセス権
計算精度、誤差
(種々の)依存関係
(種々の)トレードオフ
etc.
chart 2-19
コアタスク
テスト
• テストとは、ソフトウェアが品質要件を満たしているかどう
か確認すること。
• 品質要件に基づいてテストするので、ブラックボックステストとな
るが、その前にはコードレビューやホワイトボックステストを行い、
単体の機能レベルでの欠陥をなくしておくのが前提。
• 機能性を満たした後で、その他の品質要件のテストを行う。
• 統合テスト
– 単体テスト済みのコンポーネントを統合して行うテスト
• 顧客テスト(ユーザテスト)
– 本番の運用(と同等の)環境下で顧客(ユーザ)が行うテスト
• 品質特性に応じた特別なテスト
– 耐久テスト(ストレステスト、ラッシュテスト)、性能テスト、ウィルス予
防テスト、セキュリティテスト、プラットフォームテスト
chart 2-20
コアタスク
テストの基本
• いつでも同じテストを再現できるように準備する。
• テストで欠陥が見つかったら、必ず記録を残す。
– 何をもって欠陥とみなすか、欠陥の数え方、記録の仕方...
• 欠陥を分析し、担当者に割り当て、行方を管理する。
– 基本設計に起因するような深い欠陥だったら…
– 単体レベルの欠陥が統合レベルで出るようなら...
• 欠陥を修正したら、必ず、(単体テストから)テストをやり直す。
– 欠陥を一つ直しても、新たな欠陥を埋め込むことはよくある。
– 欠陥を一つ直すと、別の欠陥が発見されることもよくある。
• テストは、用意したテスト環境(基盤、テストケース、テストデータ)
での実施において、欠陥が見つからなかったことを保証するだけ
である。欠陥が存在しないことを保証するわけではない。
chart 2-21
コアタスク
運 用
• (早期に決まっているはずの)運用方針に基づいて、運用
設計、運用準備を行い、運用する。
– 運用方針は、システム設計に影響を与える。
– 大規模システムの場合には運用は特に大切であり、システム開
発と並行して入念に準備されるのが普通。
• 主な考慮事項
–
–
–
–
運用の主体、期間および時間、形態、手順
既存システムとの連携、移行方法等
開発チームや保守チームとの連携
運用準備としては: 機器類の調達、開発したシステムおよび運用
ツール群の調整、運用上の各種パラメータの調整、マニュアル
chart 2-22
支援作業活動: サポートタスク
• コアタスクの進行を横から支援
するため:
– コアタスクを行うメンバに行わ
せるには負荷がかかりすぎ、
本来の作業ができなくなって
しまうような作業
– プロジェクト全体として統一を
取るべき事柄
• 例:
–
–
–
–
–
–
–
–
–
プロジェクト管理
標準化
開発環境の整備と運用
品質保証・品質管理
構成管理、欠陥管理、リリー
ス管理
文書化
要員の教育・トレーニング
法務
その他
chart 2-23
サポートタスク
プロジェクト管理
• プロジェクトの運営に伴う管理業務。
• プロジェクト管理者が一人で行うのでは作業負荷がかか
るので、チームでプロジェクト管理サポートを行う。
• 配員、リソースの手配に伴う雑務。
– プロジェクトによっては、頻繁に座席変更や引っ越しが必要なこ
ともある。開発メンバにかかる負担は極力減らすようにサポート。
• リスクの管理。
• その他。
• 詳しくは、3日間のプロジェクト管理セミナーで扱います。
chart 2-24
サポートタスク
標準化
• 何を標準化するか
– 開発手法、手順、文書、図表の表記(notation) 、エラーや障害の
取扱い、命名基準、コーディング・スタイル 等
– 形式の標準化も大切だが、記述すべき内容の標準化も大切。
• どのように標準化するか
– 守りやすく、守って良かったと思えるような標準にする。
– 対象ソフトウェアにとって大切な部分については特に明確に。
– うまくいっている標準があるならそれに合わせるのも良い。
• 標準をどのように守らせるか
– 標準を決めるだけでなく、サンプルの提示、ツール類やテンプ
レート類の提供で支援する。
chart 2-25
サポートタスク
開発環境や支援ツールの選定・整備・運用
• 開発には開発に便利な環境とその運用が必要。
• たとえば:
– 開発に使用する基本ソフトやミドルソフトの載った環境,
• 確認のため、最終的には運用環境と同等の環境も必要。
– 文書化やコミュニケーションのための Windows PC,
• プロジェクト内だけでなく、全社的なネットワークも
– 成果物の一元管理に便利な UNIX Server,
– 作業内容や目的に合わせた支援ツール
– ツール類のバージョンアップや成果物のバックアップも組織的に
– 広い机、空調の効いた部屋、ホワイトボード、適度なミーティング
スペース等も必要
chart 2-26
サポートタスク
構成管理、欠陥管理、リリース管理
• 構成管理とは、システムの構成を追跡できるように管理
すること。成果物の一元管理、バージョン管理を含む。
• 欠陥が発見されたら必ず記録に残るようにし、その欠陥
の症状、原因、修正状況等の情報がいつでも参照できる
ようにしておくこと。
• どのリリースではどういう構成なのか、確実に把握できる
ようにしておくこと。
• どのリリースでどの欠陥が修正されたのか、顧客に確実
にリリースされたのか、追跡できるようにしておくこと。
• これは、ソフトウェアに限った話ではない。
chart 2-27
サポートタスク
構成管理 (Configuration Management)
• 一つのパッケージ(リリース)は通常複数のファイルから構成さ
れる。パッケージによっては、スタンダード版、デラックス版な
どファイル構成を変える場合がある。
• 各ファイルは変更を明確に管理するためバージョンを付ける。
変更は仕様変更か欠陥修正のために行われるのが普通なの
で、それらとの関係や変更理由も合わせて明確に管理する。
• 全体としてのパッケージにもバージョンを付け、個々のファイル
のバージョンとの対応を明確にする。
• 複数名での開発においても矛盾が生じないようにする。
• 簡単にいうと、以上のようなことを、うまくできるようにするのが
構成管理。構成管理ツールと適切な運用が必要。
– ClearCase(http://www.rational.com/)やCVS(http://www.cyclic.com/)が有名。
chart 2-28
サポートタスク
プロジェクト情報の共有支援
• プロジェクトが同じ方向を向くように
• 担当者が休むと何もわからないということがないように
• 皆が直接担当者に聞いて、担当者が忙しすぎるというこ
とがないように
• 既に解決していることを知らずに悩んだりしないように
• 知識データベース等を活用して情報を共有する:
– プロジェクトがどこへ向かっているのか、どういう状態にあ
るのか、
– ある事柄に関する窓口は誰か、
– 解決すべき課題は何か、解決できた課題は何か、
– プロジェクトへの新規参入者が知るべき情報等
chart 2-29
現状のソフトウェアプロセスの問題点
• どんな問題点があるでしょうか?
• 現場は混乱していませんか?
– 途中で誰かが問題点に気づいたとき適切に対応できるよう
になっているでしょうか?
– どの時点で何をしているべきなのか、関係者皆が把握してい
るでしょうか?
• 工程が進んでいるようにみえて、課題を先送りしているだ
けだったということはありませんか?
– 予定の時期がくれば仕事が終わってなくても工程は終わ
る?
• すなわち、ソフトウェアプロセスの定義自体や、管理方法に
問題がないでしょうか?
chart 2-30
ソフトウェアプロセスの特徴づけ
• 並行性と分散性
– 空間的、時間的に分散したタスクと相互作用し、並列なも
のも含む。
• 不確定性と非決定性
– 選択肢となるパスは進行中に作られる。予測できない。
• エラー、やり直し、および他の突発事項
• 進化と変化
– ソフトウェアと同様、ソフトウェアプロセスにもフェーズから
なるライフサイクルが存在する。
※参考:Alfonso Fuggetta, Alexander L. Wolf 編,岸田孝一監修「ソフトウェアプロセスのトレンド」,
海文堂,1997,ISBN4-303-72850-0, p.3-7
chart 2-31
良いソフトウェアを作るためには:
• 欠陥のないソフトウェアはない。
• 良いソフトウェアとは?
• 望ましいソフトウェア・プロセスとは何でしょうか?
– プロダクトの特徴とプロセスの特徴
• 要求される品質特性を計画的に作り込むには?
• 問題点の早期発見、対処、フィードバック
• 短いサイクルを何度も回しながら、良くない部分を排除し
て、次第に良くしていくアプローチ
• リスク管理
chart 2-32
問題点を早期発見するための方法の例:
•
•
•
•
•
•
関係者間でコミュニケーションを良くする。
各自の成果物はプロジェクト内で(早めに)オープンにする。
早めにプロトタイピングやデモンストレーションを実施する。
ウォークスルーを実施する。
ソースコードレビューを実施する。
なるべく早い段階からテストシナリオやテスト項目を明らか
にし、test-suites (テストスクリプトやデータと期待される結果
のセット)を準備する。
• コンパイルが通る程度のソースコードができたら、毎日自
動コンパイル(ビルド)、自動テストを行う。
• 完璧を待たず、ある程度できたら使って評価してもらう。
chart 2-33
セッション2 まとめ
• ソフトウェアプロセスモデル
– ウォーターフォール、スパイラル
• ソフトウェアプロセスにおけるタスク
– コアタスク
– サポートタスク
• ソフトウェアプロセスの特徴
• 良いソフトウェアを作るためのプロセス
chart 2-34