システム設計とは?基本情報技術者試験の重要用語解説!
更新日:2021年4月26日
システム設計とは、要件定義工程の次に行う工程であり、システムの画面や帳票、データベースなどの機能を具体化する作業を行います。設計段階でシステムの内容はほぼ確定しますので、優れたシステムを作るためには、システム設計を丁寧に行うことが大切です。
この記事では、基本情報技術者試験で問われるシステム設計のポイントについて解説します。
システム設計とは
要件定義にて発注者・受注者間でシステムの概要を合意したら、次はシステム設計を実施します。システム設計工程では、要件定義書に記載した内容を、システムを作れるレベルまで詳細化していきます。
具体的には、ユーザが利用する画面イメージや、画面に設置するボタンやアイコン、システムが出力する帳票の項目や内容、システムに持たせるデータ内容などを設計していきます。特に画面設計については、ユーザの利便性に直結する内容であるため、発注者・受注者間でレビューを重点的に行うことが大切となります。
システム設計で行うこと
システム設計では、外部設計、内部設計・詳細設計、システム方式設計を実施します。大きく、システムの機能を大まかに具体化するのが外部設計、システムをプログラムレベルまで設計するのが内部設計・詳細設計、ハードウェアやソフトウェア、ネットワークなどの設計を行うのがシステム方式設計となります。
それぞれの作業で実施すべき内容について、以下で具体的に解説していきます。
外部設計(基本設計・ソフトウェア要件定義)
外部設計は要件定義で決定した内容を具体化するための工程で、画面設計や帳票設計、データベース設計、処理設計などを実施します。外部設計は、企業によって「基本設計」または「ソフトウェア要件定義」と呼ばれることもあります。
各社で呼び方は異なるものの、これらの設計工程で実施すべき内容は同一となります。
画面設計
画面設計では、要件定義内容に基づきユーザが利用する画面のイメージや画面上で処理する内容について整理します。画面イメージを作成し、画面内に設置するボタンやテキストボックスなどのコントロールについて設計します。
また、各コントロールを操作したときにどのようなアクションを取るかについても決定します。例えば、ボタンを押したら画面が切り替わったり、テキストボックスを選択したら文字入力ができるように定義します。
画面設計は、ユーザの操作性を高めるために重要となる設計工程です。操作性はユーザーインターフェースやヒューマンインターフェースなどとも呼ばれ、近年特に重視されている要素です。
基本情報技術者試験でも、コントロールの一つであるラジオボタンの用途を問う問題などが出題されています。
帳票設計
多くのシステムでは帳票を出力するという要件が盛り込まれます。帳票設計では、システムから出力する帳票についてどのようなレイアウトで、どのような内容を記載するかを設計します。
例えば、請求書であれば宛名や件名、金額、入金先の口座情報、支払期日などを記載する必要があります。これらの情報をどのように配置するか、そして各情報はシステム上どこから取得し、どのように算出するかなどを帳票設計では決定します。
データベース設計
データベース設計では、システムで保持するデータをテーブル・項目単位で整理します。テーブルとは、データのまとまりのことです。例えば、「顧客テーブル」を作るのであれば、名前や住所、生年月日などを項目として持たせることになります。
データベース設計では、各データの形式や桁数などについても併せて整理します。生年月日であれば8桁の数字ですし、名前であれば10数桁の文字列となります。
処理設計
処理設計では、システムが実施する処理内容について整理します。処理設計はバッチ処理設計と呼ばれることもあり、主にユーザが画面から操作しない、裏側で動作する処理について定義します。
例えば、夜間に実施する商品の棚卸処理や、請求書の一括作成、システム間連携処理などが主に処理設計で定義すべき内容です。
内部設計・詳細設計(ソフトウェア方式設計・ソフトウェア詳細設計)
外部設計の次に実施するのが内部設計および詳細設計の工程です。これらの工程では、外部設計レベルより詳細な、プログラムレベルの設計を行います。
内部設計・詳細設計は、企業によっては「ソフトウェア方式設計」および「ソフトウェア詳細設計」と呼ぶこともあります。
プログラム構造化設計
システムを構築する際には、一般的にプログラムをモジュールというひとまとまりの単位ごとに開発します。プログラムをモジュール化することで、共通的な機能の再利用がしやすくなります。
また、プログラムを修正する際にも、モジュール単位で修正およびテストができるために、作業コストを減らすことができます。
プログラム構造化設計では、作成する各機能をモジュール単位に整理します。
モジュールの独立性
それでは、どのように機能をモジュールとして整理すればよいのでしょうか。基本情報技術者試験でよく問われるのが、モジュールの独立性についてです。プログラムの品質を向上させ、変更容易性を高めるためには、モジュールの独立性を高めることが重要です。
一般的に、モジュールの独立性を高くすることは、良い設計とみなされます。モジュールの独立性は、モジュール強度とモジュール結合度によって示されます。これらは、各モジュール同士がどの程度独立しているかを示す指標です。
モジュール強度は、モジュール内の関連の強さを示す指標です。具体的には下表のようなレベルで示されます。
単一の機能を一つのモジュールで設計するほうが、モジュールの独立性は高まります。例えば、ATMの入金機能を一つのモジュールで設計すると、入金機能に修正が必要となった場合はそのモジュールのみを修正すれば良いことになります。
独立性 | 強度 | 名称 | 概要 |
---|---|---|---|
低い | 弱い | 暗号的強度 | 複数の機能を一つにまとめたモジュール |
論理的強度 | 論理的に関連する機能を一つにまとめたモジュール | ||
↑ | ↑ | 時間的強度 | 時間順で実行される機能をまとめたモジュール |
手順的強度 | 順番で実行される機能をまとめたモジュール | ||
↓ | ↓ | 連絡的強度 | データを共有する機能を集めたモジュール |
情報的強度 | データの共有機能をまとめたモジュール | ||
高い | 強い | 機能的強度 | 一つの機能を一つのモジュールとする |
また、モジュール結合度はモジュールの内容変更時に他のモジュールに与える影響を示す指標です。具体的には下表のようなレベルで示されます。
モジュール結合度が高いと、一つの機能を修正する際に、他の機能にまで影響が及んでしまいます。例えば、ATMにおいて顧客の預金残高情報を共通領域に設定して各モジュールで共用すると、預金残高情報に修正が入った際にすべてのモジュールに影響が及んでしまいます。
このようなことを避けるために、できるだけモジュール結合度を下げる設計、いわゆる疎結合を目指すことが良い設計であるとみなされます。
独立性 | 結合度 | 名称 | 概要 |
---|---|---|---|
低い | 強い | 内容結合 | あるモジュールが他のモジュールを参照し、データを利用する |
↑ | ↑ | 共通結合 | 共通領域に設定した構造を持つデータをモジュール間で共有する |
外部結合 | 共通領域に設定した構造を持たないデータをモジュール間で共有する | ||
制御結合 | 制御を行う内容を指定したデータをモジュール間で受け渡す | ||
↓ | ↓ | スタンプ結合 | モジュール間で構造を持つデータを受け渡す |
高い | 弱い | データ結合 | モジュール間で構造を持たないデータを受け渡す |
デザインパターン
デザインパターンは、過去の経験から優れたプログラム設計の実例をまとめたベストプラクティス集のことです。たいていのシステムには前例があり、システムを作り上げる上での理想的な設計パターンは決まっているものです。関連するデザインパターンを知ったうえで設計を行うことが大切です。
基本情報技術者試験で取り上げられたデザインパターンとしては、オブジェクト指向開発のためのパターンとして作られたGoFのデザインパターンなどがあります。また、デザインパターンの概要について問う問題も出題されているため、デザインパターンという用語そのものについても押さえておくとよいでしょう。
システム方式設計
これまでは主にシステムの機能面についての設計を取り上げました。一方で、システムを構成するハードウェアやソフトウェア、ネットワークについても設計が必要です。
システム方式設計では、要件定義内容に基づきシステムを作り上げる上で必要となるハードウェア等のシステム構成について整理します。
ハードウェア構成設計
ハードウェア構成設計では、システムを作り上げる上で採用するサーバー等のハードウェアと、その必要スペックについて整理を行います。要件定義で整理した想定ユーザ数や保管データ量、想定利用環境などをもとに、ハードウェアとして必要な記憶容量やCPUスペック、メモリ量などを決定します。
また、耐障害性の観点から、機器が故障した際にも継続稼働できるように冗長化を検討したり、処理速度を向上させるために分散処理を検討したりします。
ソフトウェア構成設計
ソフトウェア構成設計では、システムを作り上げる上で採用するソフトウェアについて整理を行います。今回のシステムに適したOSやアプリケーションサーバー、Webサーバー、データベースシステムについて検討します。
また、システムの実運用を見据えて、必要な運用監視ソフトやバックアップソフトについても検討します。
想定ユーザ数に応じて、購入するライセンス数などについても整理します。また、必要であればウイルス対策ソフトや端末制御ソフトなどのセキュリティ面で必要なソフトウェアについても検討します。
ネットワーク構成設計
ネットワーク構成設計では、システムを作り上げる上で採用するネットワーク構成とそのスペックについて整理します。
複数の拠点間で利用されるシステムは、ネットワークにより拠点間を接続する必要があります。その場合は、想定ユーザ数やデータ転送量に応じて、回線のスペックを検討します。
また、システムをデータセンタにて運用する場合は、データセンタからオフィスなどの利用場所までの通信方法についても検討が必要です。
アプリケーションアーキテクチャ設計
アプリケーションアーキテクチャ設計では、今回のシステム開発においてどのプログラミング言語やフレームワークを採用するかについて整理を行います。システムの特徴や現場で確保できる人員のスキルセットに応じて、JAVAやC#、PHP、Ruby等の開発言語の中から、最適なものを選択します。
また、開発規約としてコーディングルールやレビューの実施ルールなども定め、プログラムの品質にばらつきが生じないようにします。
外部IF設計
外部IF設計では、他のシステムとの連携方法や失敗時のリカバリ方法などについて整理を行います。他システムは別のベンダーが開発するケースも多いため、認識齟齬がないように丁寧な調整とドキュメント化を行うことが大切です。
外部IF設計で定義する内容としては、連携の頻度(日時・月次等)や、連携時間、連携データ項目や連携プロトコルなどについてです。
まとめ
この記事では、基本情報技術者試験を受けようとされている方に向けて、システム設計についての解説を行いました。システム設計方法の理解は、基本情報技術者の試験対策になるのはもちろん、特にエンジニアとして仕事をする方にとっては実務においても必ず必要となります。
良いシステムを作れるように、システム設計のポイントを理解することが大切です。