UNIX哲学から学ぶ設計
概要
- 日程: Day 3 / セッション 02
- 時間: [9:30-10:00]
- 形式: ディスカッション
- ゴール: UNIX哲学の主要原則(小さく作る、1つのことを上手にやる、テキストで連携する等)を3つ以上挙げ、自チームの開発に1つ以上適用できる
- 学習形式: AIディスカッション
導入(5分)
前のセッションで「設計思想は複数ある」と学びました。では、複数ある設計思想に共通する「土台」のような原則はあるのでしょうか?
答えはYesです。1970年代に生まれた「UNIX哲学」は、半世紀たった今もすべての設計思想の根っこに流れています。Linux、macOS、iOS、Androidも、Webアーキテクチャも、マイクロサービスも、DockerもKubernetesも、すべてUNIX哲学の影響下にあります。
ちょうど料理で言えば「だしの取り方」のようなものです。和食でも中華でも、ベースのだしが効いていれば味がまとまります。設計におけるUNIX哲学は、そのだしです。
本編(20分)
1. UNIX哲学の主要原則
UNIX哲学は1人の発明ではなく、ベル研究所のケン・トンプソン、デニス・リッチー、ダグラス・マキルロイらが少しずつ言語化してきたものです。代表的な原則を整理すると、次のようになります。
| 原則 | 一言で | たとえ話 |
|---|---|---|
| Small is beautiful | 小さく作る | 万能ナイフより専用包丁 |
| Do one thing well | 1つのことを上手にやる | 寿司職人は寿司だけ握る |
| Build a prototype as soon as possible | まず動くものを作る | レシピを読むより味見をする |
| Choose portability over efficiency | 移植性を優先する | どの国のコンセントにも刺さるアダプター |
| Store data in flat text files | データはテキストで保存 | 紙のレシピは100年残る、磁気テープは10年で消える |
| Use software leverage to your advantage | 既存ソフトウェアを再利用する | 全部自作するな |
| Use shell scripts to increase leverage | スクリプトで自動化 | 同じ作業を3回やったら自動化 |
| Avoid captive user interfaces | 対話型UIに依存しない | 機械が読める形を優先 |
| Make every program a filter | フィルタとして作る | 入力 → 加工 → 出力 |
これらを現代風に圧縮した3つの頭文字語がよく登場します。
- KISS(Keep It Simple, Stupid): 単純であれ
- DRY(Don't Repeat Yourself): 繰り返すな
- YAGNI(You Aren't Gonna Need It): それ、たぶん要らない
コード例・実例
UNIXのコマンドラインは、UNIX哲学の生きた標本です。たとえば「ログファイルからエラーだけを抜き出して件数を数える」処理は、3つの小さなコマンドの組み合わせで書けます。
cat access.log | grep "ERROR" | wc -l
cat: ファイルを表示するだけgrep: 検索するだけwc: 数えるだけ
それぞれは1つのことしかしません。しかし、パイプ(|)でつなぐと、強力な処理になります。これがUNIX哲学の「小さな部品をテキストで連携する」思想です。
ここがポイント
UNIX哲学の核心は「組み合わせやすい小さな部品を作る」ことにあります。「1つの巨大な機能」より「10個の小さな機能の組み合わせ」のほうが、変更にも再利用にも強いのです。
コラム
UNIXの生みの親、ケン・トンプソンは1969年、ベル研究所で「妻が実家に帰っている3週間」で初代UNIXを書き上げました。3週間で書けた理由は、「やることを最小限に絞った」からです。逆説的ですが、機能を削れば削るほど、ソフトウェアは速く完成し、長く生き残るのです。
2. KISS / DRY / YAGNIをコードで体感
KISS、DRY、YAGNIは抽象的に見えますが、現場ではこんなふうに現れます。
KISS(単純であれ)
// NG: 凝りすぎ
const isEven = n => !!(n & 1 ^ 1);
// OK: シンプル
const isEven = n => n % 2 === 0;
DRY(繰り返すな)
// NG: 同じ計算が3回登場
const tax1 = price1 * 1.1;
const tax2 = price2 * 1.1;
const tax3 = price3 * 1.1;
// OK: 関数化
const withTax = price => price * 1.1;
YAGNI(要らない機能は作るな)
// NG: 「いつか使うかも」で未使用の引数
function send(to, subject, body, cc, bcc, attachments, schedule, priority) { ... }
// OK: 今必要なものだけ
function send(to, subject, body) { ... }
ここがポイント
DRYとYAGNIはときに対立します。「同じコードが2回出てきたら共通化(DRY)」vs「将来使わないかもしれない抽象化はしない(YAGNI)」。この判断はチームで議論する価値があります。
コラム
「銀の弾丸はない」で有名なフレデリック・ブルックスは、「セカンドシステム症候群」を警告しています。1作目を成功させたエンジニアは、2作目で「あれもこれも盛り込もう」として失敗しがちだ、というものです。YAGNIはこの罠を避けるための合言葉です。
💬 AIに聞いてみよう
ここまでの内容で疑問があれば、AIに質問してみましょう。たとえば:
- 「UNIX哲学を現代のWeb開発(React、Next.js等)に当てはめるとどうなる?」
- 「DRYとYAGNIが対立する具体例と、判断基準を教えて」
- 「マイクロサービスはUNIX哲学の現代版と言えるのはなぜ?」
ディスカッション(5分)
課題
チームで5分間、次のテーマを話し合ってください。
「自分たちの開発テーマに、UNIX哲学の原則を1つ適用するとしたら、どれを選ぶ? なぜ?」
たとえば家計簿アプリなら「Do one thing well → 1機能ごとにモジュール分割」、レシピアプリなら「Store data in flat text → JSONでレシピを保存」など。
成果物
チームで選んだUNIX哲学の原則1つと、適用方法のメモ。AIに「この適用は妥当か?」を相談すること。
ヒント
「全部適用しなければ」と気負わない。1つでも「これだけは守る」と決められれば、設計の軸ができます。
まとめ(5分)
UNIX哲学は50年前の知恵ですが、現代のすべての設計思想に流れる「だし」のようなものです。KISS、DRY、YAGNIの3つは現場で頻繁に登場します。「小さく作る」「1つのことを上手にやる」「組み合わせで強力にする」を、自チームの開発でも意識しましょう。
次のセッションでは、UNIX哲学を土台にして発展してきた具体的な「設計アプローチ」(DOA、MDA、SOA等)を見ていきます。
🔄 振り返りチェック
- UNIX哲学の原則を3つ以上挙げられますか?
- KISS、DRY、YAGNIをそれぞれ自分の言葉で説明できますか?
- 自チームの開発に適用するUNIX哲学を1つ選び、理由を述べられますか?
補足資料
- 参考リンク: マイク・ガンカーズ『UNIXという考え方』、エリック・レイモンド『The Art of Unix Programming』
- 発展課題: 自分が普段使うCLIコマンドを3つ挙げ、それぞれUNIX哲学のどの原則に従っているかを分析する
学習ガイド
想定される質問と回答例
| 質問 | ヒント |
|---|---|
| UNIX哲学とオブジェクト指向はどっちが偉い? | 偉さに優劣はない。UNIX哲学は「組み合わせの思想」、OOは「責務分割の思想」で観点が違う |
| 現代のフレームワーク(Reactなど)はUNIX哲学に従ってる? | コンポーネント分割=Small is beautiful、フック=Do one thing well、JSXによる宣言的UIなど共通点多数 |
| DRYは絶対? | 絶対ではない。「重複に見えても意味が違う重複」は分けたほうが安全。AHA(Avoid Hasty Abstraction)という対抗原則もある |
つまずきやすいポイント
| つまずきポイント | ヒント |
|---|---|
| 「小さく作る」の「小さい」がどの粒度か分からない | 「1関数で1スクロールに収まる」「1クラスで1責務」が目安 |
| YAGNIで省きすぎて後から困る | 「今のスプリントで使うか」が基準。それを超える先読みはYAGNIで切る |
| UNIX哲学が抽象的すぎて掴めない | 自分が使ったコマンド(lsとかgitとか)で「これって1つのことしかしてないな」と1つずつ気づくのが早道 |