料理を作る場合、食材を包丁で切る前に誰もが「どう切るか」「どう包丁を使うか」という「作戦を考える」(考えなしに包丁を使っても作りたい料理を上手に作れないし、刃物なのでケガする恐れもある)。
モノ作りを成功させる上で「作戦を考える」行為は重要で、この行為を「設計(Design)」と呼ぶ。
作るモノを、本稿のテーマの「ソフトウエア」に当てはめると、ソフトウエアを作る際は、「何を」「どう」組み立てるか考えてプログラムを作るから、実は次のシンプルな式で表せる。
| ソフトウエア = 設計 + プログラム |
|---|
本シリーズでは、大規模なソフトウエアを開発する際に、設計した人の考え(設計の結果)を他の人と共有するために、伝わりやすい・理解しやすい『文書』に表現する技術を整理する(伝える相手は、たとえば上述した式の「プログラム」を作るプログラマなど)。
| ソフトウエア設計シリーズ「序」 |
ソフトウエアの設計とは | 松浦公政 | 2023年 | |
| 対象読者 |
ソフトウエアの設計とは何かを知りたい方 | |||
| ソフトウエアを設計する際の「考え方」に興味があるIT技術者・システムエンジニア |
||||
| ソフトウエア設計結果の「言語化」「文書化」に興味があるIT技術者・システムエンジニア | ||||
記事の音声解説付き(下のプレイボタンで解説開始)
設計が抱える課題
| 設計という用語が表す活動は範囲が広い。 | モノ作りのある一面を捉えて「設計がバグってる」とかの議論が開発現場などで平然と行われる。 | |
| えてして ⇩ | ||
| 設計という用語はバラバラな「意味」で、それぞれの状況で皆が自分に都合よく利用する。 | ||
モノ作りの過程は、大まかには「要件」(≒「要求」)⇒「設計」⇒「実装」に区分でき、区分した単位を「工程」と呼ぶ。
| 工程 |
出力 | |||
|---|---|---|---|---|
| イメージ | 要旨 | |||
| 要件 | 「こんなモノが欲しい」という「作るべきモノ」への期待を示した情報 | 期待 | 欲しいモノ | |
| 例 | 胴体の厚さが25センチあるマグロでも簡単に捌ける包丁が欲しい。![]() |
|||
| 設計 | 要件に応えて「こんな風に作る」という作り方を示した情報 | 仕様 | 作るモノの有様と作り方 | |
| 例 | 白ハガネ鋼材を刃渡り45センチにプレス加工し、自動研磨機で最大刃厚1.8センチに研磨した刃に、ケヤキ材から切り出した柄をつける。![]() |
|||
| 実装 | 設計に沿って(不足の情報は補完して)作り出す成果物 | 成果 |
作り上げたモノ | |
| 例 | 刃渡り45センチの包丁。 |
|||
⇩
| 設計はモノ作りの中間に位置し、「欲しい気持ち」と「手に入るモノ」を結び付ける重要な工程 |
|
実は「何」が設計の開始地点で、「どこ」が設計の終了地点か、一般的な合意(や定義)は存在しない。 |
入口境界と出口境界の定義は人や組織ごとに違う。 | |||||
| 専門知識を持つ顧客が「マグロ捌き用の『最大刃厚1.2センチの』包丁が欲しい」のように要件に設計内容を含めるケースは珍しくない。 | ||||||
| 要件定義で何を決め、どこから設計で決めるかの境界は不明確で、「設計」という用語が示す概念はあいまい。 | 小規模な製品だと、設計工程と実装工程を区別しない(同一人物が担当する)ことも珍しくない。 |
|||||
| 組織ごとに設計の方法論や標準化手法がある。 | 企業ごと(あるいは内部の各組織)で、設計行為で使う用語、設計行為が示す範囲もバラバラ。 | |||||
組織ごとに設計にまつわる用語が示す内容(意味)が違う。![]() |
||||||
ソフトウエア開発特有の困難さ
| ハードウエア開発の特徴 | ソフトウエア開発の特徴 | |
|---|---|---|
| 開発過程で「プレス加工機」「研磨機」「ケヤキ材」などの具体的物体が登場する。 | ⇔ | プログラムは大量の命令の羅列という形態のため、プログラムの視覚化が困難で具体化しにくい。 |
| 区分 | 設計した結果の成果物 | |||
|---|---|---|---|---|
| 特性 | 表現方法 | 表現形式 | ||
| ハードウエア | 有形 | 成果の「物理形状・構造」などを視覚的に掴みやすいため、設計成果の有様を図形的に表現する。![]() |
設計図 | |
| ソフトウエア(プログラム) | 無形 | 成果の視覚での情報共有が難しく、設計成果の有様を「目に見えないモノの概念や構成」といった抽象情報の定義で表現する。![]() |
設計文書 | |
| ソフトウエアの「無形」という特性は、視覚での情報共有が難しく ⇩ | ||||
|
ソフトウエア開発では、あいまいな設計境界が促進されやすい。 |
||||
ソフトウエア設計シリーズの狙い
| ソフトウエア開発における「設計」の範囲を明確化するガイドライン作り |
| ソフトウエア開発での「設計活動」を細分化 |
| 細分化した「設計活動」ごとに「目的」「入力」「出力」を定義して「なすべき設計作業」を具体化 |

これらを通して「抽象的なモノ」を作る技術の道標を明らかにしたい。







コメント