2002年度後期 IT教育基礎論演習B

第10回: ソフトウェアの開発(1) 〜 仕様の策定と設計

■ 概要

   アプリケーションソフトウェアを企画し、 ソフトウェア工学に基づき、設計、実装、検証、評価を行なう。 この回では、先ず、自分が構築しようとするソフトウェアを企画、提案し、 その仕様を明らかにする。 次に、その仕様に基づき、具体的なプログラムを記述できるよう、 ソフトウェアの設計を行う。

■ 目標

■ 目次


■ 演習内容

□ はじめに〜ソフトウェアの開発にあたって

   本演習の残りの期間を使用し、 これまで学習したWWWやプログラミング言語、データベース利用技術等を利用して 具体的なアプリケーションソフトウェアを開発する。
   開発するソフトウェアの内容は自由とする。 自分の研究に役立つようなソフトウェアを開発すればよい。 例えば、以下のようなシステムを考えることができる (注: あくまで例であり、この限りではない)。    開発するソフトウェアは本演習期間に完成させるものとし、 過度に高機能なソフトウェアを企画する必要はない。 もし、高機能なソフトウェアを企画する場合、 本演習期間内で完成させる範囲を明確にし、 その部分のみでも利用可能なものとすること。
   開発にあたっては、本演習でこれまで学習していない技術等を利用してもよい。 できるだけ効率的に開発できるよう、既存システムを利用できるものは利用する。 ただし、単に複数のアプリケーションを組み合わせて利用するだけのものは不可。

□ 仕様定義

   ソフトウェアを開発する場合、先ず、そのソフトウェアの仕様を定義する。 ソフトウェアの仕様とは、開発しようとするソフトウェアの目的に応じて、 そのソフトウェアを誰がどのように使用し、 その結果、何ができるようになるか、 また、そのために満たすべき条件は何かを定めるものである。
   仕様定義の方法は、 利用者と開発者との関係(利用者がソフトウェアの開発を発注する場合や、 何らかの利用者を想定してソフトウェアの開発を行なう場合など)により異なるが、 一般に、要求仕様定義と、これに基づくシステム仕様定義の 2段階に分けて行なうとよい。
要求仕様定義
   要求仕様定義では、 開発しようとするソフトウェアの利用者と、 その利用者から要求される利用目的やサービス内容、利用形態等を定義する
・利用者
   どのような利用者が利用するのか、 そのソフトウェアが対象としている利用者を定義する。 単に、「一般の利用者」ではなく、 その利用者はどのような興味、関心を持っているのか、 また、どのようなスキルを持っているのか等、 利用者像(ユーザモデル)を具体的に明らかにする。
   また、複数の利用者が存在する場合、その種類を特定する。 例えば、ソフトウェアの種類によっては、 サービス提供者やサービス利用者が存在する場合があるが、 その場合、それぞれどのような利用者であるかを明らかにする。 大規模なソフトウェアの場合、システム管理者なども必要となる。 以下の利用目的、サービス内容、利用形態についても、 利用者の種類ごとにそれぞれ定義する。

・利用目的
   各利用者の利用目的を定義する。 各利用者が、そのソフトウェアを利用することで何を実現したいのか、 どのようなことができるようになれば良いのかを具体的に明らかにする。

・サービス内容
   利用者の目的の実現のために、どのようなサービスを提供するのかを定義する。 各利用者が、提供されるサービスの内容を利用することにより何が実現され、 その結果、利用者の目的の中のどの部分が実現されるのか、 利用者の目的とサービス内容との関係を具体的に示し、 その有効性を明らかにする。

・利用形態
   各利用者が、そのソフトウェアをどのような場面で どのように利用するのかを定義する。 利用場所や利用時間帯、扱うデータの種類や量、利用者の人数など、 ソフトウェアの利用環境を具体的に明らかにする。

システム仕様定義
   システム仕様定義では、要求仕様に基づき、 そのソフトウェアを実行するために必要なシステム環境や、 実現すべき機能を定義する。
・システム環境
   開発するソフトウェアを実行するために必要な、もしくは用意できる ハードウェアやオペレーティングシステムの仕様を定義する。 汎用的なPCやワークステーション、PDA等の上に実装するソフトウェアであれば、 CPUの種類や処理能力、主記憶(メモリ)容量、外部記憶装置容量、 ネットワークの通信容量、表示装置(解像度、発色数など)や、 搭載されるオペレーティングシステムの種類等を明らかにする。 また、無線回線やペン入力装置など、特殊なデバイスを必要とするばあい、 どのようなデバイスが必要であるかを明らかにする。
   ただし、システム環境は、 実際にはソフトウェアを開発してからでないと判らない部分も多いので、 今回は想定される環境を定義すればよい。

・機能
   開発するソフトウェアが提供する具体的な各機能を定義する。 どの利用者が利用する機能であるか、 その機能はサービス内容の中のどの部分を実現するものであるのか、 また、各機能をどのように実行することにより、 提供するサービスが実現されるのかを明らかにする。

・その他
   そのほかに必要となる事項を定義する。 例えば、大規模なシステムの場合、保守、運用体制が必要であり、 この場合、どのような体制が必要であるかを明らかにする。

□ 設計

   一般に、ソフトウェアの設計は外部設計と内部設計の2段階に分けて行なう。
基本設計
   基本設計は外部設計とも呼ばれ、 開発するソフトウェアのシステム形態やユーザインタフェースなどの 全体像を設計するものである。
・システム形態
   webアプリケーションのようなクライアント・サーバシステムや P2Pシステムの場合や、 データベースを利用したソフトウェアなど、 複数のシステムからなるシステムを実現するソフトウェアを開発する場合、 どのシステムがどのシステムと接続しているか、 そのシステム形態を図示し、設計する。

・通信プロトコル(概要)
   複数のシステムからなるシステムを実現するソフトウェアを開発する場合、 システム間の通信プロトコル、およびこれに伴う機能の実行方法を設計する。
   具体的には、例えばIPプロトコルを利用する場合、 TCPを利用するのか、UDPを利用するのか、 ポートは何番を使用するのかを定義し、 その上でどのようなセッションを行なうのかを設計する。 また、ORBを利用する場合には、メッセージの形式と、 その実行結果などを設計する。

・ユーザインタフェース
   利用者に対し、どのようなユーザインタフェースを提供するかを設計する。
   ユーザインタフェースとしては、コマンドラインからのコマンドの実行や、 グラフィカルユーザインタフェースによる操作、 特殊なデバイスを利用したユーザインタフェースなどを考えることができるが、 どのような方法によるユーザインタフェースを提供するかを決め、 それぞれの方法に応じて設計する。
   例えばコマンドラインによるユーザインタフェースの場合、 コマンド名と引数(オプション)の形式、 コマンド実行後の入出力方法、およびこれに伴う機能の実行方法を設計する。 また、グラフィカルユーザインタフェースの場合、 画面デザイン、入出力に対する機能の実行方法を設計する。 画面デザインは、画面のモックアップなどを作成することも必要である。

・データの種類
   そのソフトウェアで、どのようなデータを扱うかを設計する。 例えば、数値やテキスト、画像、音声など、 どのような種類のデータを何に使用するかを明らかにする。

・使用言語と実装環境
   ソフトウェアの開発にあたって、 どのようなプログラミング言語を利用してもよいが、 開発するソフトウェアの目的や内容に応じて、 適切なプログラミングを選択する。
   例えば、PC上で実行するための簡単なアプリケーションの開発であれば、 Visual Basic等を利用し、 大規模なアプリケーションの開発を行なうのであれば、 C言語やC++、Java言語等を利用するとよい。 数値計算等を行なうのであれば、C言語やC++、 より高速な数値計算を行なうのであれば、 スーパーコンピュータなどのベクトル演算が可能な コンピュータで実行するために、 FORTRAN等を利用するとよい。 Webアプリケーションを開発する場合、 PHPやJavascriptを利用するとよい。 目的に応じて、複数のプログラミング言語を使用することも考えられる。
   また、ソフトウェアの実装のためには、 ミドルウェアやライブラリ、データベース管理システムなど、 他のシステムが必要になる場合もある。 この場合、必要な実装環境を明らかにする。

詳細設計
   詳細設計ともは内部設計呼ばれ、 基本設計に基づき、具体的なコード(プログラム)を記述するために必要な、 ソフトウェア内部の詳細な設計を行なう。
・システムアーキテクチャ
   先ず、プログラムを記述するために、 1つのソフトウェアがどのような機能モジュールから構成するか、 システムアーキテクチャを設計する。 各モジュールがどのような機能を実現し、 また、モジュール間でどのようなデータの受け渡しが行なわれるかを UMLなどを使用して図示するなどし、明らかにする。

・モジュール
   各モジュールをどのように実装するかを設計する。
   各モジュールごとに、そのモジュールをどのように実現するか、 例えば関数とそして実装するのか、 もしくはオブジェクトとして実装するのか等を決定し、 関数として実装するのであれば、 関数名、戻り値の型、引数の型、名前、 その引数に代入されるデータの内容、およびその関数の機能などを明らかにし、 表などにまとめる。 各モジュールの中で変数を使用している場合、 その変数の型、名称、および代入される値の内容も一覧にまとめる。
   また、複雑な機能を実行するモジュールであれば、 そのモジュールをさらに複数のモジュールから構成する。

・アルゴリズム
関数やオブジェクトにより、複雑なデータ処理を行なう場合、 そのアルゴリズムをフローチャート等により設計する。   

・データ構造
   複数種類のデータをまとめて扱う場合や、 大量のデータを処理する場合、そのデータ構造を設計する。
   例えば、複数種類のデータをまとめて構造体(structure)を利用して扱う場合、 その構造体の構造を明らかにする。 また、大量のデータを扱う場合に配列やリストを利用する場合、 その配列やリストの構造や大きさを明らかにする。

・ファイル形式
   データの保存を行なうソフトウェアを開発する場合、 ファイルシステムやデータベースに保存するデータの形式、 および保存されているデータの管理方法を設計する。

・通信プロトコル(詳細)
   複数のシステムからなるシステムを実現するソフトウェアを開発する場合、 システム間の通信プロトコル、およびこれに伴う機能の実行方法を設計する。
   具体的には、例えばIPプロトコルを利用する場合、 TCPを利用するのか、UDPを利用するのか、 ポートは何番を使用するのかを定義し、 その上でどのようなセッションを行なうのかを設計する。 また、ORBを利用する場合には、メッセージの形式と、 その実行結果などを設計する。

□ 開発計画

   開発するソフトウェアの仕様や設計がほぼ明らかになったら、 その開発計画を立て、線表等にまとめる。
   開発計画では、設計に基づき、どのモジュールをいつまでに実装するか、 実装したモジュールを組み合わせてどのような試験を行なうか等を 個別に明らかにする。 もし、この時点で仕様や設計で明らかになっていない箇所があれば、 これをいつまでに明らかにするかも決める。 また、ソフトウェア全体の試験を行なう日程や、 試験結果として確認された部分の修正(デバッグ)のための日程、 さらに、大規模なシステムであれば、保守期間なども明らかにする。

■ 演習課題(要提出)

□ 演習課題1

   企画のプレゼンテーションの結果得られた意見を参考にして、 ソフトウェアの要求仕様定義、システム仕様定義、 基本設計、詳細設計、開発計画の5つを作成し、 12月24日午前10:00までに提出すること。
   ただし、仕様書や設計書は、開発しようとするソフトウェアによって その記述方法が異なるため、 各自、自分が開発するソフトウェアにあわせて工夫すること。

□ 演習課題2

   基本設計ならびに詳細設計に基づき、 第11回(1月7日)までにプログラムを実装すること。 ただし第11回は、各自からの質問を受け付ける時間とするので、 必ずしも完成していなくともよいが、 ほぼ完成していないと、その後間に合わないと思われる。 また、このときまでに質問事項をまとめておくこと。
Last modified: Sat Dec 28 10:17:54 JST 2002