#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)