買い物かごへ

実際の設計選書
設計者に必要なソフトウェアの基礎知識

定価(税込)  3,672円

監修
著者
サイズ A5判
ページ数 512頁
ISBNコード 978-4-526-06772-3
コード C3053
発行月 2011年11月
ジャンル 機械

内容

本書は、機械設計者を対象にソフトウェアの基礎を教える入門書。ハードウェアの設計プロセスとソフトウェアのそれは意外に似ている部分が多く、ソフトウェアの各機能をハードウェアのそれに置き換えて分かりやすく解説している。また逆にソフトウェア技術者がハードウェアの基礎を学習するさいにも参考になる。

藤田和彦  著者プロフィール

(ふじた かずひこ)
1965年生まれ.
1988年,京都大学工学部資源工学科卒業,同年,富士通(株)入社.オンライントランザクション処理システム,データベースシステム等のミドルウェアの企画・開発に従事した後,クラウドコンピューティング,ビッグデータ処理等の基盤ソフトウェアの企画・開発を担当.現在,プロダクト部門の企画に従事.2002年,社内での畑村塾の受講を契機に,創造学・失敗学に基づく企画・開発手法を構築,普及活動も行っている.
2005年より「実際の設計研究会」会員.ソフトウェア,システム開発の立場から議論に参画.
2007年より畑村洋太郎氏主宰の「危険学プロジェクト」で,ソフトウェアシステムグループのグループ長を務める.2009年より失敗学会理事.
著書に,「実際の設計第5巻―こう企画した―」「実際の設計第6巻―技術を伝える―」「実際の設計第7巻―成功の視点―」(いずれも共著・日刊工業新聞社)

目次

監修者のことば 
はじめに 

第1章 ソフトウェアと設計 
1.1 ソフトウェア設計の意義 
1.2 ソフトウェア設計の特徴 
1.3 設計者に求められる基本視点 
1.3.1 システムの捉え方と基本視点 
1.3.2 データの流れと情報伝達 
1.3.3 構成要素 
1.3.4 インターフェイス 
1.3.5 プログラム 
1.3.6 状 態 
1.3.7 動特性 
1.3.8 安 全 
1.3.9 環 境 
1.4 設計から製作までの流れ 
1.4.1 設計の過程 
1.4.2 製作の過程 
1.4.3 組立の過程 
1.4.4 試験の過程 
1.5 設計から見たソフトウェアの分類 
1.5.1 設計情報の記述を機械語に変換するもの(言語処理) 
1.5.2 何かを管理して制御するもの(制御プログラム) 
1.5.3 モデル化された対象を再現するもの(シミュレーション) 
1.5.4 ‌人間に理解できる表現を作るもの(ヒューマンインターフェイス) 
1.6 ソフトウェアの構成 
1.6.1 新たに作るソフトウェア(製作部品) 
1.6.2 有償で購入するソフトウェア(購入部品) 
1.6.3 無償で利用するソフトウェア(無償部品) 

第2章 設計のプロセス 
2.1 設計における思考過程 
2.1.1 動機と背景 
2.1.2 目 的 
2.1.3 仕 様 
2.1.4 機能と構成要素 
2.1.5 機 構 
2.1.6 構 造 
2.1.7 制約条件 
2.1.8 インターフェイス 
2.1.9 プログラムとプログラミング言語 
2.1.10 製作モデル図の作成 
2.2 設計作業のプロセス 
2.2.1 第1段階 設計企画 
2.2.2 第2段階 設計モデル図 
2.2.3 第3段階 製作モデル図 
2.2.4 機械設計との対比 

第3章 機能と制約条件 
3.1 機 能 
3.1.1 ソフトウェアにおける基本的な機能 
3.1.2 データを入出力する機能 
3.1.3 データを演算する機能 
3.1.4 データを管理する機能 
3.1.5 データ領域を管理する機能 
3.1.6 データ処理の流れを制御する機能 
3.1.7 その他の機能 
3.2 制約条件 
3.2.1 制約条件 
3.2.2 堅牢性(強さに相当) 
3.2.3 メモリ空間と実行命令数(空間と重量に相当)
3.2.4 プログラミング(加工に相当) 
3.2.5 統合・保守(組立・分解に相当) 
3.2.6 操作性 
3.2.7 可用性・安全性 
3.2.8 標準・法規・規則 

第4章 機構・構造 
4.1 機構の動作とデータの流れ 
4.1.1 機構線図 
4.1.2 データ線図 
4.2 機構から構造へ 
4.3 データの入出力機構 
4.3.1 データの入出力に共通する機構(ストリーム) 
4.3.2 入出力の速度差を緩和する機構(バッファ) 
4.3.3 画面にデータを入出力する機構(標準入出力) 
4.3.4 二次記憶装置に高速にアクセスする機構(キャシュ) 
4.3.5 ネットワークへ入出力する機構(ソケット) 
4.3.6 プロセス間でデータを入出力する機構 
4.4 データの演算機構 
4.4.1 代入演算の機構 
4.4.2 論理演算の機構
4.4.3 算術演算の機構 
4.4.4 比較演算の機構 
4.5 データの管理機構 
4.5.1 データの構造化 
4.5.2 構造化データを記述する方法 
4.5.3 データの管理機構
4.6 データ領域を管理する機構(ブロック) 
4.6.1 同じサイズで管理する機構(固定長ブロック) 
4.6.2 任意のサイズで管理する機構(可変長ブロック) 
4.7 データ処理の流れの制御機構 
4.7.1 流れの制御を理解するための視点 
4.7.2 流れを制御するためのハードウェア機構 
4.7.3 条件によって流れを変える機構 
4.7.4 流れを渡す・戻す機構 
4.7.5 流れを繰り返す機構 
4.7.6 流れを起動する機構 
4.7.7 流れを終了する機構 
4.7.8 流れを打ち切る機構 
4.7.9 流れを停止・再開する機構 
4.7.10 流れを並列化・合流する機構 
4.7.11 複数の流れを同期化する機構 
4.7.12 複数の流れを直列化する機構 
4.8 データを入出力する構造 
4.8.1 画面表示データの独立性を確保する構造(スタイルシート) 
4.8.2 ストレージの性能と耐故障性を向上する構造(RAID) 
4.8.3 ネットワークへ入出力する構造(メッセージング)  
4.8.4 データを集信・配信する構造(ファイル転送) 
4.9 データを演算する構造 
4.9.1 大規模データを演算・変換する構造(並列分散処理) 
4.9.2 再帰的に演算する構造(再帰呼出し) 
4.9.3 数値式を計算する構造(逆ポーランド記法とスタック) 
4.9.4 テキストを解析する構造(字句解析) 
4.10 データを管理する構造 
4.10.1 複数の視点で管理する構造(3層スキーマ) 
4.11 データ領域を管理する構造 
4.11.1 ‌データブロックの位置を管理する構造(ファイル割当て表) 
4.11.2 少ないメモリを大きく見せる構造(仮想記憶) 
4.12 データ処理の流れを制御する構造 
4.12.1 要求に即時応答する(オンライン処理) 
4.12.2 蓄積したデータを一括して処理する(バッチ処理) 
4.12.3 要求どうしが連携して処理する(ディレイド連携処理) 
4.12.4 時分割で処理する(タイムシェアリングシステム) 
4.12.5 複数の流れを同時に制御する構造(並列処理) 
4.12.6 all‒or‒nothingを実現する構造(トランザクション処理) 

第5章 インターフェイス(形状に相当) 
5.1 インターフェイスを決める意義 
5.2 インターフェイス要素 
5.2.1 基本データ型 
5.2.2 配列・構造体 
5.2.3 抽象データ型 
5.3 機能とインターフェイス 
5.3.1 インターフェイスに共通した考え方 
5.3.2 データを入出力する機能 
5.3.3 データを演算する機能 
5.3.4 データを管理する機能 
5.3.5 データ領域を管理する機能 
5.3.6 データ処理の流れを制御する機能 
5.4 堅牢性とインターフェイス 
5.4.1 データ処理の流れとインターフェイス 
5.4.2 インターフェイスと例外 
5.4.3 インターフェイスとシステム資源の使用量 
5.5 制約条件とインターフェイス 
5.5.1 メモリ空間と実行命令数 
5.5.2 プログラミング 
5.5.3 統合・保守 

第6章 プログラム(寸法に相当) 
6.1 プログラムを決める意義 
6.2 プログラムの常識 
6.2.1 プログラムの単位 
6.2.2 プログラムの構築段階 
6.2.3 プログラムの属性 
6.2.4 プログラムの内部構造 
6.2.5 プログラム内部のデータ構造 
6.3 アルゴリズム 
6.3.1 アルゴリズムの種類 
6.3.2 アルゴリズムの決め方 
6.3.3 分かり易いアルゴリズム 
6.4 プログラムの決め方 
6.4.1 仕 様 
6.4.2 購入部品との結合 
6.4.3 機 能 
6.4.4 データの状態 
6.4.5 部品相互間のメモリ空間の取り合い 
6.4.6 規 格 
6.4.7 プログラミングとプログラミング言語 
6.4.8 統合・使い勝手 
6.4.9 バランス感覚 
6.5 プログラムの差異(寸法公差に相当) 
6.5.1 プログラミングによる差異 
6.5.2 プログラミング言語による差異 
6.5.3 設計と製造の境界線 
6.6 プログラム呼出し(はめあいに相当) 
6.7 例外と例外処理(角と隅に相当) 

第7章 データ処理と堅牢性(力と強さに相当) 
7.1 データ処理と堅牢性の考え 
7.1.1 例外強度(静的強度に相当) 
7.1.2 反復強度(疲労強度に相当) 
7.1.3 システム資源の使用量(たわみに相当) 
7.1.4 システム資源の取り合い(振動に相当) 
7.2 データ処理の流れとプログラムの状態遷移 
7.2.1 制御の流れと状態遷移 
7.2.2 プログラムの状態遷移 
7.2.3 プログラムの状態と設計 
7.2.4 プログラムの状態と異常時の調査 
7.3 プログラムの状態(応力に相当)と堅牢性 
7.3.1 状態の種類(応力の種類に相当) 
7.3.2 状態遷移の網羅性(応力解析に相当)
7.3.3 状態遷移の繰り返し(応力集中に相当) 

第8章 プログラミング言語(材料に相当) 
8.1 ソフトウェア構築に用いる言語とその捉え方 
8.1.1 手続き型プログラミング 
8.1.2 オブジェクト指向プログラミング 
8.2 低水準言語(低級言語) 
8.3 高水準言語(高級言語) 
8.3.1 手続き型言語 
8.3.2 オブジェクト指向言語 
8.3.3 スクリプト言語 
8.4 プログラミング言語の選定法 

第9章 プログラミング技法(加工法に相当) 
9.1 プログラミングに共通する知識 
9.1.1 文の連接 
9.1.2 条件文 
9.1.3 繰り返し文 
9.1.4 コメント文 
9.2 様式(スタイル) 
9.2.1 全体構成 
9.2.2 字下げ(インデント) 
9.2.3 改 行  
9.2.4 命名規則 
9.3 論理の記述 
9.3.1 文の従属性と独立性 
9.3.2 初期化 
9.3.3 条件分岐 
9.3.4 繰り返し 
9.3.5 無条件分岐(goto文) 
9.3.6 プログラム呼出し 
9.3.7 定石のあるアルゴリズム 
9.4 プログラミング力を向上させる方法 
9.4.1 定石を知る 
9.4.2 他人のプログラムを読む 
9.4.3 機構を利用した小さなプログラムを作る 

第10章 基本オブジェクト(機械の基本要素に相当) 
10.1 論理値 
10.2 数 値 
10.2.1 整 数 
10.2.2 小 数 
10.3 文 字 
10.3.1 文字とコード系 
10.4 列 挙 
10.5 ポインタ 

第11章 モデルの表記法(製図法に相当) 
11.1 統一モデリング言語(UML) 
11.2 構造を記述する 
11.2.1 構成要素の関係(クラス図) 
11.2.2 動作するときの構成要素の関係(オブジェクト図) 
11.2.3 粒度の大きい構成要素とその関係(コンポーネント図) 
11.2.4 構成要素の内部構造(コンポジット構造図) 
11.2.5 物理的な計算機への成果物の配置(配置図) 
11.2.6 図のグループ化(パッケージ図) 
11.3 振舞いを記述する 
11.3.1 機能を利用する場面(ユースケース図) 
11.3.2 機能とデータの流れ(アクティビティ図) 
11.3.3 構成要素の相互作用(相互作用図) 
11.3.4 システムまたは構成要素の状態遷移(状態マシン図) 
11.4 設計過程とUMLの適用方法 

第12章 設計評価の視点 
12.1 美しさ 
12.1.1 対称性 
12.1.2 階層性 
12.1.3 統一性 
12.1.4 単純性 
12.1.5 コンパクト性 
12.2 抽象性 
12.2.1 汎用性 
12.2.2 論理化 
12.2.3 仮想化 
12.3 独立性 
12.3.1 再利用性 
12.3.2 並列性 
12.3.3 冪等(べきとう)性 
12.3.4 可変性 
12.4 効率性 
12.4.1 時間的効率性 
12.4.2 空間的効率性 
12.5 継続性 
12.5.1 耐故障性 
12.5.2 復旧容易性 
12.6 分かり易さ 
12.6.1 可読性  
12.6.2 伝達性 

おわりに 
索 引 

よもやま話
機械式計算機と設計概念  
データの種類と範囲 
オブジェクト指向の来歴 
タグ付き文書の来歴 
仕事の仕方から見たシステムの変遷 
goto論争 
ブートローダの意味 
逆ポーランド記法と日本語 
プログラムの弾性変形・塑性変形 

はじめに

はじめに

 この本は,設計者に必要なソフトウェアに関する基礎知識について述べています.機械分野の初級設計者を想定していますが,中・上級設計者,または他分野の設計者であっても,ソフトウェア設計を学んでみよう,見直してみようと考えている人も対象にしています.
 これまで設計といえば,建築,機械,電気,プラントなど各分野での設計を指すことが一般的でした.しかし,様々なセンサー,アクチュエータ,ディスプレイ装置などが利用できるようになって,どの分野でも電気・電子的な仕掛けを組み込むことが当たり前になってきました.特に,マイクロプロセッサの普及によって,ソフトウェアを組み込んで様々なものを制御する傾向は拡大し続けています.
 一方,各分野では上級設計者になればなるほど,全体を俯瞰して見ることを求められます.例えば,機械の分野では,かつてのように全てを機械的な部品だけで構成することはほとんどなく,必ずといっていいほど,各種センサーなどを使った制御系が組み込まれます.いわゆるメカトロニクスです.また,今日では製造者の責任として,人間や環境への配慮も欠かすことができません.こうなってくると機械の設計者は,機械部分の設計知識だけでなく,このような電子的な制御系の知識,それを実現するためのソフトウェアの知識,人間・環境に関する知識を総動員して,それらをシステムとして捉えて設計を進めていく必要があります.このような状況は機械分野に限ったことではありません.
 こういう状況下で,ソフトウェアの果たす役割は益々拡大しています.ところが,ハードウェアとソフトウェアの特徴の違いから,ソフトウェアの本質的な考え方がなかなか理解できず,ハードウェアとソフトウェアをどのように総合的に考えていけばよいのかという問題が,各方面から聞こえてくるようになりました.
 本書は,筆者の提案がきっかけとなった1本の論文[1]が元になっています.その主旨は「機械設計とソフトウェア設計は抽象化された設計概念(上位概念)を通じて見ると同じである」というものです.設計者は,要求機能を満足するためにいくつかの機能を組み合わせ,それを実現するために,様々な制約条件を加味して,機構・構造を選択・決定していきます.この設計の思考過程の共通性は各分野の設計者が集まると容易に認識を同じくすることができます.
 その思考の共通性は,思考過程だけでなく設計に使用する各分野の概念にも言えると筆者は考えています.各分野の設計には必ず核となる概念があり,それが「流れている」と考えます.機械分野では力です.ソフトウェア分野はデータです.この出発点を揃えてやると,力の伝達特性の決め手となる形状と寸法は,データの伝達特性の決め手となるインターフェイスとプログラムに相当することになります.形状は「対象物の概観」という上位概念に登ることができ,つなぎ目の整合性を司るという性質があります.インターフェイスはソフトウェアモジュールの外部からのアクセス方法を示しており,まさに利用者から見た概観であり,モジュールとモジュールのつなぎ目を司っています.寸法は,「最終的に対象物の特性を決めるもの」という上位概念に登ることができます.ソフトウェアでは,プログラムという概念はまさにこの意味に相応しいものです.このような対応関係が見られるのは,何も形状と寸法だけではありません.至る所に上位概念の共通性を見出すことができます.
 設計概念は設計者の思考を制約する一方で,全体構造を要求機能に合わせるための視点を提供しています.そのため,どの分野であっても,要求機能に合わせて全体構造を作っていこうという思考の働きがある以上,たとえ,分野によって個々の設計概念が異なるように見えたとしても,上位概念の構成は同じものであると筆者は考えています.個々の分野の設計概念は個別に発達してきたものと考えられますが,要求機能に対して全体を漏れなく考えるという観点では一揃いの上位概念が必要なのだということです.
 このような考え方で,機械設計とソフトウェア設計を見直してみて,本書はできあがりました.そのため,ソフトウェアの概念的な説明を,上位概念を使って平易に行うこと,例として機械の概念とソフトウェアの概念を対比すること,そして,それらの背後にあるものの見方・考え方を説明することに注力しました.機械の用語については日常的に使用する範囲なので専門知識がなくても理解することができます.したがって,本書は広く普及しているソフトウェアのアルゴリズムの定石や,単なるプログラミングの仕方を述べるものではありません.
 本書は,初級設計者が現場での経験を元に理解を深められるように配慮しました.そのため,ソフトウェア設計の全体像を把握できる一方で,個々の機能,機構,構造なども探して読めるようにしました.ソフトウェア開発の全体の流れと設計者の持つべき視点,機械設計との対比を知りたい場合には,第1章,第2章を通読することをお勧めします.第3章から第9章までは,設計で考えなくてはならないことを上位概念で捉え,実際の設計研究会で提唱している機械設計とまったく同じ順序とし,思考過程に沿って章を配置してあります.章単位で通読する他,設計現場で困ったときに,個々の機能,機構,構造,インターフェイス設計などについての考え方を基本に立ち返って知ることができます.中でも,とにかくプログラミングをする必要があるなら,第9章だけは先に読むことをお勧めします.また,第10章,第11章は,ソフトウェア設計をする上での基本の中の基本ですが,以外と曖昧なまま理解していたり,とかく時間が経つと忘れてしまったりする事柄をまとめてあります.はじめてソフトウェア設計を学ぶ人や初級設計者には是非,知っておいてほしい事柄です.最後の第12章は,設計をするときの心構えや設計者のこだわりとして,また,設計レビューをするときの観点として活用していただくことを想定しています.中・上級設計者の読者は,目次を一瞥して,興味のある章・節から読み進めてもらうのも良いのではないかと思います.
 これからの設計者は,先に述べたように全体をシステムとして俯瞰するために,設計対象の本質を見抜く力が要求されます.そのとき,自分の専門分野の設計の考え方とソフトウェア設計の考え方が統合され,全体をシステムとして見る・わかる・作る・伝えるということができれば,人や環境に適合し,調和のとれたシステムができるのではないかと考えています.本書がその一助となればと思っています.
 本書の内容は,実際の設計研究会の畑村洋太郎会長をはじめ,メンバーの皆様との議論によってできあがったものです.この研究会で,機械設計者と筆者のようなソフトウェア設計者が出会わなければ本書はできなかったであろうと思います.ここに深く感謝申し上げる次第です.

2011年11月
藤田和彦 

参考文献
[1]Fujita,K., Yoneyama,T.,Hatamura,Y., 2006, Application of Design Process in Mechanics to Software Design, Proceedings of the International Conference on Axiomatic Design 2006, Cambridge, MA.


【監修者のことば 】

 本書は,機械の設計者に限らず,全ての設計者にソフトウェアの基礎知識を伝えようとするものである.本書は,元々,「機械技術者のためのソフトウェア設計の基礎知識」と題する本のアイデアから始まり,いくつかの題名の変遷を経て,最終的に本書の題名となったものである.世の中では,ソフトウェアの必要性がとみに増しており,多くの工業製品の中に組込みソフトが組み込まれ,例えば,日本で作られているソフトウェアの大半が,組込みソフトとして使われているのが現状である.
 組込みソフトとは,ある働きをする機械やシステムを作るときに,その働きを決めるソフトウェアのことである.多くの人は,何かの働きをする機械やシステムを作るとき,初めにハードを作り,その後で,そのコントローラの中に必要なソフトを組み込むというふうに,ハードが主体でソフトがそれに従う,と考えている.しかし,そのような考え方では,世の中が求めている働きをするのに最適な機械やシステムを作ることはできない.なぜなら,それらを別々のものと考え,別々に作ったものを後から組み合わせて一体のものにする,と考えているからである.
 機械を形のあるモノとして見るのではなく,働きのあるモノ,と見る必要がある.このように,形にこだわるのではなく,働きに着目して機械やシステムを見ると,ある働きのあるモノを作るのに,ハードとソフトを別々に考えるのではなく,同時に,しかも一体のものとして考える必要性があることに気づく.筆者や監修者たちが行っている実際の設計研究会では,思考展開図を用いた“思考展開法”というものを提唱している.この考え方を簡単に言うと,設計とは要求機能があり,機能→機構→構造と考えをすすめ,制約条件の下で要求機能を実現する具体的な内容を構築するというものである.このような考え方は,機械の設計を詳細に検討することから監修者らによって生み出されたものであるが,この考えはハードウェアの設計だけなく,ソフトウェアの設計にもそのまま当てはまることに気がついた.思考展開の考え方は,ハードの設計にもソフトの設計にも両方に当てはまるのである.別の言い方をすれば,設計を作業としての段階から,一段上位の概念,すなわち要求機能を実現するための思考決定過程と捉えてみれば,ハードの設計もソフトの設計もまったく同じものである,という考え方である.本書はこのような考え方から,ソフトウェア設計の真髄を広く,すべての分野の設計者に理解してもらおうとして作ったものである.
 本書は,ソフトウェア作りが専門である筆者が,監修者の行っている“畑村塾”で約十年前に監修者と知り合い,議論したことが元になっている.議論の中で機械設計とソフトウェア設計がまったく同じ構造を持っていることに気がついたことに始まる.そして,気付いた内容をMITの設計グループが主宰するICADという国際会議で2006年に発表したことが端緒である.その後,筆者は監修者らの行う実際の設計研究会に参加し,2カ月に1回の割合で開催される集会で数年間議論を行った.筆者は自分の考えが進むに従い,それを図で示しながら十数人のメンバにその内容を紹介し,議論をした.メンバの多くは監修者と同じく機械が専門分野であったが,筆者の紹介する考えをほぼ完全に理解することができた.そして,これらの経験から,ソフトウェア設計を全てのモノの設計に携わる人に紹介する必要性を強く感じ取った.そして,本書が実現したのである.このようにして出来た本書がすべての分野の設計者に受け入れられ,活用されることを願って止まない.
 
 2011年11月
 実際の設計研究会 
 代表 畑村 洋太郎 

買い物かごへ