#note #presentation
[https://www.youtube.com/watch?v=SxdOUGdseq4](https://www.youtube.com/watch?v=SxdOUGdseq4)
## TL;DR
- "Simple" と "Easy" は違う
- "Simple" は **客観的** で物事が絡み合っていない状態
- "Easy" は **主観的** である人にとっては慣れているという状態
- 目先の "Easy" さに注目してしまうが、システムは "Simple" さを追求すべきである
- 結局 "Simple" さが "Easy" にもつながる
## 詳細
### "Simple" と "Easy" の定義
Rich Hickey さんは、ソフトウェアにおける意味を以下のように定義している
なので simple/complex だし easy/hard で似てるかもしれないが異なる軸
#### Simple
- **特徴**:
- **客観的**: 複数のものが互いに絡み合っているか、そうでないかという客観的な性質を指します。
- **焦点を絞る**: 一つの役割、一つのタスク、一つの目的、一つのコンセプト(例:セキュリティ)に焦点を当てている状態です。
- **結合がないこと**: 複数のものが混ざり合ったり、絡み合ったりしていない状態が重要であり、単に「一つしかないこと」を意味するわけではありません。
- **ソフトウェアにおける意味**: ソフトウェアを「編み合わされているか否か」という観点で考えることが、本トークの中心的なポイントです。
対義語は complex (複雑)
#### Easy
- **特徴**:
- **主観的・相対的**: 「誰にとってイージーか」という、人によって異なる相対的な概念です。
- **「近さ」の3つの側面**:
1. **物理的な近さ**: すぐに入手できる、インストールが容易であるなど。
2. **理解の近さ/慣れ**: 既に知っていること、既存のスキルセットに近いこと、慣れていること。
3. **能力の近さ**: 自分の現在の能力範囲内であること。この側面については、自尊心や不安からあまり議論されませんが、概念的な作業においては重要です。
- **ソフトウェアにおける問題点**:
- 私たちは、ソフトウェアが「すぐに手に入るか」や「慣れているか」というイージーさに執着しすぎており、これが大きな損害を与えています。
- 「慣れていること」ばかりを求めると、新しいことを学ぶ機会を失います。
- 雇用主もまた、プログラマーの「交代可能性」を高めるために、この「イージーさ」(コードが慣れていて、既存のツールキットを使えること)を重視しがちです。しかし、これはコードの「理解しやすさ」(真の能力の近さ)を無視することにつながります。
対義語は hard
### なぜ Simple?
シンプルさの追求は、システムの長期的な健全性、信頼性、保守性にとって不可欠
- 理解が容易
- 変更が容易
- デバッグが容易
- 柔軟性が向上する
- コンポジションが促進される
| 複雑な構造 (Complex) | シンプルな代替案 (Simple) | なぜ複雑か (Why Complex) |
| :--------------------------------------- | :------------------------------------------- | :-------------------------------------- |
| **State (状態)** | **Values (値)** | 同一の入力でも異なる結果を返す可能性がある。 |
| **Objects (オブジェクト)** | **Values (値)** | 状態、アイデンティティ、値を絡ませる。 |
| **Methods (メソッド)** | **Functions (関数), Namespaces (名前空間)** | 関数と状態を絡ませる。名前空間を絡ませる場合もある。 |
| **Vars / Variables (変数)** | **Managed References (管理された参照)** | 値と時間を絡ませる。 |
| **Inheritance (継承)** | **Polymorphism a la carte** | 型を絡ませる。 |
| **Switch Statements / Pattern Matching** | **Polymorphism a la carte** | 「誰が何をするか」という複数のペアを1箇所に絡ませる。 |
| **Syntax (構文)** | **Data (データ)** | 意味と順序を絡ませる。 |
| **Imperative Loops (命令型ループ), Fold** | **Set Functions (集合関数)** | 「何をすべきか」と「どのように行うか」を絡ませる。Foldは順序の含意がある。 |
| **Actors (アクター)** | **Queues (キュー)** | 「何をすべきか」と「誰が行うか」を絡ませる。 |
| **ORM (Object-Relational Mapping)** | **Declarative Data Manipulation (宣言的データ操作)** | 概念的に非常に多くのものを絡ませる。 |
| **Conditionals (条件分岐)** | **Rules (ルール)** | プログラムの構造と組織に絡ませる。 |
| **Inconsistency (不整合)** | **Consistency (一貫性)** | 定義上、複数のものがバラバラに存在している状態。 |
## 参考
- [Simple Made Easy](https://www.youtube.com/watch?v=SxdOUGdseq4)
- ["simple"と"easy"はどう違う? Simple Made Easyを解説 Part1](https://logmi.jp/main/technology/321962)
- https://www.slideshare.net/slideshow/simple-made-easy-made-easy/158807167
- [Clojureと「Simple Made Easy」](https://boxofpapers.hatenablog.com/entry/simple_made_easy)
- [有志による文字起こし](https://github.com/matthiasn/talk-transcripts/blob/master/Hickey_Rich/SimpleMadeEasy.md)