ソフトウエアの設計とは ーソフトウエア設計シリーズ「序」

ソフトウエア設計入門-導入タイトル画像 技の和
この記事は約4分で読めます。

料理を作る場合、食材を包丁で切る前に誰もが「どう切るか」「どう包丁を使うか」という「作戦を考える(考えなしに包丁を使っても作りたい料理を上手に作れないし、刃物なのでケガする恐れもある)。
モノ作りを成功させる上で「作戦を考える」行為は
重要で、この行為を「設計(Design)」と呼ぶ。
作るモノを、本稿のテーマの「ソフトウエア」に当てはめると、ソフトウエアを作る際は、「何を」「どう」組み立てるか考えてプログラムを作るから、実は次のシンプルな式で表せる。

ソフトウエア = 設計 + プログラム 

本シリーズでは、大規模なソフトウエアを開発する際に、設計した人の考え(設計の結果)を他の人と共有するために、伝わりやすい・理解しやすい『文書』に表現する技術を整理する(伝える相手は、たとえば上述した式の「プログラム」を作るプログラマなど)。

ソフトウエア設計シリーズ「序」
ソフトウエアの設計とは 松浦公政 2023年
対象読者
ソフトウエアの設計とは何かを知りたい方
ソフトウエアを設計する際の「考え方」に興味があるIT技術者・システムエンジニア
ソフトウエア設計結果の「言語化」「文書化」に興味があるIT技術者・システムエンジニア

記事の音声解説付き(下のプレイボタンで解説開始)

設計が抱える課題

設計という用語が表す活動は範囲が広い。 このため
モノ作りのある一面を捉えて「設計がバグってる」とかの議論が開発現場などで平然と行われる。
えてして ⇩
設計という用語はバラバラな「意味」で、それぞれの状況で皆が自分に都合よく利用する。

モノ作りの過程は、大まかには「要件」(≒「要求」)⇒「設計」⇒「実装」に区分でき、区分した単位を「工程」と呼ぶ。

工程
出力
イメージ 要旨
要件 「こんなモノが欲しい」という「作るべきモノ」への期待を示した情報 期待 欲しいモノ
  胴体の厚さが25センチあるマグロでも簡単にさばける包丁が欲しい。
マグロの解体
設計 要件に応えて「こんな風に作る」という作り方を示した情報 仕様 作るモノの有様ありさまと作り方
  白ハガネ鋼材を刃渡り45センチにプレス加工し、自動研磨けんま機で最大刃厚1.8センチに研磨した刃に、ケヤキ材から切り出したをつける。
包丁部品加工
実装 設計に沿って(不足の情報は補完して)作り出す成果物 成果
作り上げたモノ
  刃渡り45センチの包丁。
包丁

設計はモノ作りの中間に位置し、「欲しい気持ち」と「手に入るモノ」を結び付ける重要な工程

実は「何」が設計の開始地点で、「どこ」が設計の終了地点か、一般的な合意(や定義)は存在しない。

この結果
入口境界と出口境界の定義は人や組織ごとに違う。
たとえば前述の包丁の要件で ⇩   下向き矢印     下向き矢印
専門知識を持つ顧客が「マグロ捌き用の『最大刃厚1.2センチの』包丁が欲しい」のように要件に設計内容を含めるケースは珍しくない。 現場で起きていることは  
つまり ⇩    
要件定義で何を決め、どこから設計で決めるかの境界は不明確で、「設計」という用語が示す概念はあいまい。 小規模な製品だと、設計工程と実装工程を区別しない(同一人物が担当する)ことも珍しくない。
だから ⇩    
組織ごとに設計の方法論や標準化手法がある。 企業ごと(あるいは内部の各組織)で、設計行為で使う用語、設計行為が示す範囲もバラバラ。
その結果 ⇩   その結果 ⇩
組織ごとに設計にまつわる用語が示す内容(意味)が違う。
「設計」が表す概念の共通認識は怪しい

【参考】高安厚思『システム設計の謎を解く』

ソフトウエア開発特有の困難さ

ハードウエア開発の特徴   ソフトウエア開発の特徴
開発過程で「プレス加工機」「研磨機」「ケヤキ材」などの具体的物体が登場する。 プログラムは大量の命令の羅列という形態のため、プログラムの視覚化が困難で具体化しにくい。
区分 設計した結果の成果物
特性 表現方法 表現形式
ハードウエア 有形 成果の「物理形状・構造」などを視覚的につかみやすいため、設計成果の有様ありさまを図形的に表現する。
サイコロ実寸図
設計図
ソフトウエア(プログラム) 無形 成果の視覚での情報共有が難しく、設計成果の有様ありさまを「目に見えないモノの概念や構成」といった抽象情報の定義で表現する。
サイコロ設計図
設計文書
  ソフトウエアの「無形」という特性は、視覚での情報共有が難しく ⇩  

ソフトウエア開発では、あいまいな設計境界が促進されやすい。

ソフトウエア設計シリーズの狙い

ソフトウエア開発における「設計」の範囲を明確化するガイドライン作り
ソフトウエア開発での「設計活動」を細分化
細分化した「設計活動」ごとに「目的」「入力」「出力」を定義して「なすべき設計作業」を具体化

SW設計シリーズの全体像
これらを通して「抽象的なモノ」を作る技術の道標みちしるべを明らかにしたい。

次回は、ソフトウエア設計の基盤となる考え方の「トップダウン思考」を解説します
ソフトウエア設計シリーズの目次はこちら

この記事を書いた人
公政

ヒトの行動原理を、書籍や番組で得た「知恵」「知見」を基に言語化します。
ヒトの行動原理に、ソフトウエア開発畑での設計の仕事で蓄積した知見を組み合わせ、独自視点で編成し言語化した『知恵』を発信しています。
ご興味あれば他の記事もご覧ください。

公政をフォローする
技の和

コメント