📖 テーマ設定
🔊 音声設定
1.2
1.0
1.0
▶️ 再生コントロール
🎵 BGM設定
0.3
🔔 効果音設定
0.3

設計思想と設計アプローチ

概要

  • 日程: Day 3 / セッション 1
  • 時間: [9:00-9:30]
  • 形式: 座学
  • ゴール: UNIX哲学の要点を一言で言える。POA/DOA/MDA/SOA/ROA/OOADの着眼点の違いを、自分の開発テーマを例にして(条件)、それぞれ一言ずつ説明できる(行動・基準)
  • 学習形式: 対話型解説

導入(5分)

Day 2 では、情報モデルの状態遷移から「機能」と「プレゼンテーション」を分離して抽出しました。
実はあの分離は、ソフトウェア業界が何十年もかけてたどり着いた「設計思想」の実践そのものです。

今日は、その設計思想を「自分で選べる」ようになる日です。

ここで少し考えてみてください。同じ家計簿システムでも、「処理の流れ」から設計を始める人と、「支出データの形」から設計を始める人がいたら、できあがるシステムは同じになるでしょうか?

おそらく違うものになります。どこを中心に据えて設計を始めるか——それが「設計アプローチ」の違いです。
このセッションでは、設計思想の原点であるUNIX哲学から出発し、6つの設計アプローチを「中心に据えるもの」という一つの軸で整理します。

本編(20分)

1. UNIX哲学 設計思想とは何か

「設計思想」とは、設計するときに従う価値観・信念のことです。
これは料理人の「素材の味を活かす」という信念のようなものです。信念が決まれば、レシピ(設計)も調理(実装)も自然と方向が定まります。

設計思想の代表例が UNIX哲学 です。1970年代にUNIXというOSを作った人たちが実践した価値観で、要点は一言で言えます。

「一つのことをうまくやる小さな部品を作り、それらを組み合わせる」

箇条書きにすると次の3点です。

  • 一つのプログラムには一つの仕事だけさせる(Do One Thing Well)
  • プログラム同士が連携できるように作る(出力が次の入力になる)
  • 早く試作し、ダメなら作り直すことをためらわない

コード例・実例

UNIXのコマンドはこの哲学の生きた実例です。

# 支出ログから「食費」の行を抜き出し、並べ替え、件数を数える
cat expenses.txt | grep "食費" | sort | wc -l

grep は検索だけ、sort は並べ替えだけ、wc は数えるだけ。
どれも単機能ですが、パイプ(|)でつなぐと複雑な処理ができます。

「1つのアプリで検索も並べ替えも集計も全部やる巨大プログラム」はUNIX哲学に該当しません。一方、「小さなコマンドの組み合わせ」は該当します。なぜなら、前者は一部を直すと全体に影響しますが、後者は部品ごとに交換・再利用できるからです。

ここがポイント

  • 設計思想は「正解」ではなく「価値観」。だから複数あり、選ぶ必要がある
  • Day 2 でやった「機能とプレゼンテーションの分離」も、「関心ごとに部品を分ける」というUNIX哲学と同じ価値観の延長線上にある
  • 「小さく作って組み合わせる」は、この研修の約束事「PDCAを小さく沢山回す」とも通じる

コラム

UNIXを生んだケン・トンプソンは、1969年の夏、家族が旅行で留守にしたわずか3週間でUNIXの原型を書き上げたと言われています。OS・シェル・エディタ・アセンブラを1週間ずつ、というペース配分だったとか。「小さく作る」哲学は、締め切り(家族の帰宅)から生まれたのかもしれません。ちなみに相棒のデニス・リッチーはこの後、UNIXを書き直すためにC言語を作ります。言語ごと作るあたり、豪快です。

2. 6つの設計アプローチ 「どこを中心に据えるか」

設計アプローチとは、システム設計の出発点(中心に据えるもの)を何にするかの選択です。
歴史の流れで見ると、中心は「プロセス → データ → オブジェクト → サービス/リソース/モデル」と移り変わってきました。

アプローチ 中心に据えるもの 一言でいうと 家計簿システムなら
POA(プロセス中心アプローチ) 処理の流れ 業務の手順どおりにプログラムを作る 「入力→集計→出力」の流れが主役
DOA(データ中心アプローチ) データ データ構造を先に固め、処理は後から 「支出レコード」の形が主役
OOAD(オブジェクト指向分析設計) オブジェクト データと振る舞いをまとめた「モノ」で捉える 「支出」オブジェクトが自分で合計を計算
SOA(サービス指向アーキテクチャ) サービス 業務機能を独立サービスに分けて連携 「集計サービス」「通知サービス」の連携
ROA(リソース指向アーキテクチャ) リソース 情報資源にURIを与えHTTPで操作 /expenses/123 をGET/POSTする
MDA(モデル駆動型アーキテクチャ) モデル モデルを書けばコードは生成する 情報モデル図からコードを自動生成

系譜を図にすると次のようになります。

flowchart LR POA["POA
プロセス中心
(1960s-70s)"] -->|処理は変わりやすい。
安定したデータを中心に| DOA["DOA
データ中心
(1980s)"] DOA -->|データと振る舞いを
一体で扱いたい| OOAD["OOAD
オブジェクト指向
(1990s)"] OOAD -->|業務機能単位で
疎結合にしたい| SOA["SOA
サービス指向
(2000s)"] OOAD -->|Webの仕組みに
そのまま乗りたい| ROA["ROA
リソース指向
(2000s)"] OOAD -->|モデルから実装を
自動生成したい| MDA["MDA
モデル駆動
(2000s)"]

なぜプロセス中心からデータ中心へ移ったのでしょうか。ここで少し考えてみてください。業務の「手順」と業務で扱う「データ」、10年後も変わっていないのはどちらでしょうか?

答えはデータです。家計簿でいえば、集計の手順や画面は流行で変わりますが、「支出には日付・金額・費目がある」という構造は何十年も変わりません。変わりにくいものを中心に据えるほど、システムは長持ちする——これが歴史から得られた教訓です。

なお、OOADでは分析・設計の結果を UML(統一モデリング言語)という図法で表現します。Day 2 で描いた情報モデル図や状態遷移図は、UMLのクラス図・ステートマシン図の親戚です。皆さんはすでにUML的な活動をしています。

注意点をひとつ。SOAとROAはどちらも「分離して連携する」発想ですが、SOAは「業務機能(サービス)」単位、ROAは「情報資源(リソース)」単位です。「残高を計算する」はサービスに該当しますが、リソースには該当しません。なぜなら、リソースはURIで指し示せる「名詞(モノ)」であり、「計算する」は動詞(処理)だからです。

コード例・実例

同じ「支出の一覧を見る」を、ROAとSOAで表現し比べてみます。

ROA流(リソース=名詞が主役)
  GET /expenses           ← 支出一覧というリソースを取得
  GET /expenses/123       ← 支出123というリソースを取得

SOA流(サービス=業務機能が主役)
  呼び出し: ExpenseService.getExpenseList(userId)
  呼び出し: ReportService.calcMonthlySummary(userId, month)

ROAはURLの形にWebの思想がそのまま現れます。SOAは業務機能の呼び出しとして現れます。

ここがポイント

  • 6つを暗記するのではなく、「中心に据えるものが違うだけ」という一つの軸で覚える
  • 新しいアプローチが古いものを「置き換えた」のではない。現代のシステムはDOA+OOAD+ROAのように組み合わせて使うのが普通
  • 皆さんがDay 1-2でやってきた「情報を先に定義する」進め方は、DOAの考え方に近い。自覚してみましょう

分からない用語があれば、この時点でAIに質問してみましょう。「POAとDOAの違いを家計簿システムで説明して」のように、自分のテーマに引きつけて聞くのがコツです。

コラム

「データ中心アプローチ」が日本で広まった1980年代、多くの企業システムはCOBOLでプロセス中心に書かれていました。業務手順が変わるたびにプログラムを大改修する羽目になり、「処理は水物、データは資産」という標語が生まれます。日本ではDOAを独自に発展させた「三要素分析法」や「T字形ER法」などの流派も誕生しました。設計アプローチに「流派」があるあたり、武道のようですね。

3. デザインパターン 先人の定石集

設計アプローチが「どこから考え始めるか」だとすれば、デザインパターンは「よくある問題への定石」です。
これは将棋の定跡集のようなものです。ゼロから考えなくても、先人が検証済みの手を再利用できます。

代表が GoF(Gang of Four)のデザインパターン です。1994年の書籍で、オブジェクト指向設計の定石23個をカタログ化しました。

  • 生成に関するパターン(例: Singleton=インスタンスを1つに保つ)
  • 構造に関するパターン(例: Facade=複雑な内部に窓口を1つ設ける)
  • 振る舞いに関するパターン(例: Observer=変化を関係者に自動通知する)

もう一つ、ジェネレーションギャップパターンも紹介します。これは「自動生成されたコード(親クラス)と、人が手で書くコード(子クラス)を分離する」パターンです。ツールがコードを再生成しても、手書き部分が上書きされずに済みます。MDA(モデルから自動生成)と相性が良いパターンです。

「if文を減らす自分だけの工夫」はデザインパターンには該当しません。一方「Observerパターン」は該当します。なぜなら、パターンとは名前がつき、共有され、繰り返し使われる解決策だからです。名前がつくことで「ここはObserverで」と一言で会話できるようになります。これはIAで学んだ「見出し」の効果と同じです。

コード例・実例

Observerパターンの雰囲気をJavaScriptで示します。家計簿で「支出が登録されたら残高表示を自動更新する」場面です。

class ExpenseBook {
  constructor() { this.observers = []; }
  subscribe(fn) { this.observers.push(fn); }
  add(expense) {
    // 支出を登録し、購読者全員に通知する
    this.observers.forEach(fn => fn(expense));
  }
}

const book = new ExpenseBook();
book.subscribe(e => console.log(`残高表示を更新: -${e.amount}円`));
book.subscribe(e => console.log(`グラフを更新: ${e.category}`));
book.add({ amount: 500, category: "食費" });

登録処理は「誰が画面を更新するか」を知りません。関心の分離がここでも効いています。

ここがポイント

  • 思想(UNIX哲学)→ アプローチ(POA〜MDA)→ パターン(GoF)は、抽象度の階段になっている
  • パターンの価値は「名前で会話できること」。IAの「見出し」と同じ効果
  • 23個を覚える必要はない。「困ったら定石集がある」と知っていれば、AIに「この問題に合うデザインパターンは?」と聞ける

コラム

GoFとは「Gang of Four(4人組)」の略で、著者4人(ガンマ、ヘルム、ジョンソン、ブリシディーズ)を指します。もともとは中国の政治史に登場する「四人組」をもじった冗談めいた呼び名でしたが、いまや世界中の技術面接で飛び交う正式用語のようになりました。本の正式名は『オブジェクト指向における再利用のためのデザインパターン』と長いので、誰も正式名で呼ばず「GoF本」で通じます。名前重要、を地で行く話です。

💬 AIに聞いてみよう

  • 「私の開発テーマは◯◯です。POA/DOA/MDA/SOA/ROA/OOADのそれぞれで設計を始めると、最初に描く図はどう変わりますか?」
  • 「UNIX哲学の『一つのことをうまくやる』に反している有名なソフトウェアの例と、その反省から生まれた設計を教えてください」
  • 「GoFのデザインパターンのうち、家計簿システムのようなCRUD中心のアプリでよく使われるものを3つ、理由付きで教えてください」

まとめ(5分)

今回学んだことを一言でまとめると「設計アプローチとは『どこを中心に据えるか』の選択であり、変わりにくいものを中心に据えるほどシステムは長持ちする」です。

  • 設計思想(UNIX哲学): 小さく作って組み合わせるという価値観
  • 設計アプローチ: 中心が プロセス→データ→オブジェクト→サービス/リソース/モデル と発展してきた
  • デザインパターン: 名前のついた定石集。名前で会話できる

次のセッションは演習です。いよいよ、自分の開発テーマに合う設計アプローチを自分で選び、根拠を言葉にします。AIに反対の立場でディベートを挑んでもらい、選択の根拠を鍛えましょう。

🔄 振り返りチェック

  • UNIX哲学の要点を一言で言えますか?
  • POAとDOAの違いを、自分の開発テーマを例に説明できますか?
  • SOAとROAの「単位」の違い(サービス=動詞的、リソース=名詞的)を説明できますか?

補足資料

  • 参考リンク:
    • 『UNIXという考え方』(Mike Gancarz): UNIX哲学を9つの定理で解説した定番書
    • 『オブジェクト指向における再利用のためのデザインパターン』(GoF本)
    • IPA「共通フレーム」: 日本のシステム開発工程の標準的な整理
  • 発展課題:
    • 自分のスマホに入っているアプリを1つ選び、「このアプリはどのアプローチで設計されていそうか」をAIと議論してみましょう
    • ls | grep txt | wc -l のようなパイプ処理を自分で1本組み立て、UNIX哲学を手で確かめてみましょう

学習ガイド

想定される質問と回答例

質問 ヒント
6つのアプローチはどれか1つを選ぶものですか? 排他的ではない。現代の開発はDOAで永続化を考えつつOOADで実装し、ROAでAPIを公開する、のような組み合わせが普通。「主軸をどれにするか」を選ぶ
POAは古いから使ってはいけない? 使ってはいけないわけではない。バッチ処理や帳票出力など「手順が主役」の領域では今も有効。ただし手順は変わりやすいので、システム全体の主軸には向きにくい
UMLは全部の図を描かないといけない? 不要。UMLは14種類の図の「語彙集」で、必要な図だけ使う。この研修ではクラス図(情報モデル)と状態遷移図に相当するものを既に描いている
MDAは実務で使われているのですか? 純粋なMDA(モデルから全コード生成)は限定的だが、ORMのスキーマ生成やOpenAPIからのコード生成など「モデル駆動の部分適用」は広く使われている

つまずきやすいポイント

つまずきポイント ヒント
略語が6つ一気に出てきて混乱する 暗記しない。「中心に据えるもの(プロセス/データ/オブジェクト/サービス/リソース/モデル)」だけ覚えれば、名前は後からついてくる
SOAとROAの違いが分からない 単位が違う。SOAは「〜する」(動詞・業務機能)単位、ROAは「〜というモノ」(名詞・情報資源)単位。URLに名詞を並べたくなったらROA寄り
設計思想・アプローチ・パターンの区別がつかない 抽象度の階段で覚える。思想=価値観(最上位)、アプローチ=どこから考えるか、パターン=個別問題の定石(最下位)。Day3セッション4でこの用語整理を演習する
デザインパターンを全部覚えなければと焦る 23個の暗記は不要。「定石集が存在する」と知っていて、AIに「この場面に合うパターンは?」と聞ければ実務では十分
読み上げを開始します...

AIに質問する