【ミライトデザイン社内勉強会#25】Clean Architecture 輪読会 「第1部：イントロダクション」「第2部：プログラミングパラダイム」

[Clean Architecture 達人に学ぶソフトウェアの構造と設計 | Robert C.Martin, 角 征典, 高木 正弘 |本 | 通販 | Amazon](https://www.amazon.co.jp/Clean-Architecture-%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E8%A8%AD%E8%A8%88-Robert-C-Martin/dp/4048930656/ref=sr_1_1?adgrpid=121488233441&dchild=1&gclid=CjwKCAjwqIiFBhAHEiwANg9szoMKClJ8EAOZQYmJnaKQNiBAmHcmMwV4MyM3tMwvG83-ffR58lyKqRoCHVwQAvD_BwE&hvadid=499050245467&hvdev=c&hvlocphy=1009280&hvnetw=g&hvqmt=e&hvrand=2339268642175852705&hvtargid=kwd-1208075260070&hydadcr=21538_10997845&jp-ad-ap=0&keywords=%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3+%E6%9C%AC&qid=1621248524&sr=8-1)

## 第1部 イントロダクション
`第1章 設計とアーキテクチャ`
`第2章 2つの価値のお話`

#### 生産性を可視化するにはどういった手法があるのか知りたい

- 一日あたりの一人当たりのデプロイ数を調べたりできるツールがある
    - → ツールがあるというか、指標があるので GitHub PR とかから簡単に作れるよ
        - ( D / D / D )
    - [DevOpsパフォーマンス改善開発合宿 \| Money Forward Kessai TECH BLOG](https://tech.mfkessai.co.jp/2019/06/ikioi/)
    - [https://twitter.com/hiroki_daichi/status/1100381137929625600](https://twitter.com/hiroki_daichi/status/1100381137929625600)


#### そもそもアーキテクチャってどういう意味？
https://wa3.i-3-i.info/word16015.html

- 「構造」とか「構成」みたいなこと

#### アイゼンハワーのマトリックスがよくわからなかった。「緊急」と「重要」の違いってなに？
- [タスクの優先順位を4つに分けて管理する「アイゼンハワー・マトリクス」とは？ \- GIGAZINE](https://gigazine.net/news/20201123-eisenhower-matrix/)

> **「緊急」と「重要」の違い**
「緊急」は、タスクに早急な対応が必要であることを意味します。これらは「今」やるべきこと。緊急のタスクは何よりも優先して処理される必要があります。
一方で「重要」は、長期的に見て達成した方がよい目標・使命などのことを指します。通常、「重要」タスクはゆっくり時間をかけてこなすもので、達成すれば新たな可能性が広がるようなものもあります。

- 緊急のものだけを進めていると、重要な作業が進まなくなってしまうので、緊急と重要なものを分けて優先順位をつけたほうがいい




#### 開発者もステークホルダーであるって考え方と、僕らが声を上げて守るものがあるって話が好き p.45
- 機能よりも構造にフォーカスするという話


## 第2部 構成要素からはじめよ：プログラミングパラダイム

`第3章 パラダイムの概要`
`第4章 構造化プログラミング`
`第5章 オブジェクト指向プログラミング`
`第6章 関数型プログラミング`

#### 構造化プログラミングが考えられるまではif文とかfor文みたいなものはなかったの？
- Goto文でいろんなことができてたけど、「順次」「選択」「反復」で十分実現できる
- プログラミングは「順次」「選択」「反復」で構成されてるってことがこの段階で分類できた。
- Gotoが悪いわけではなく、良いGotoと悪いGotoがある

> [https://ja.wikipedia.org/wiki/Goto文#ダイクストラの主張](https://ja.wikipedia.org/wiki/Goto%E6%96%87#%E3%83%80%E3%82%A4%E3%82%AF%E3%82%B9%E3%83%88%E3%83%A9%E3%81%AE%E4%B8%BB%E5%BC%B5)

#### Javaとかのオブジェクト指向言語はオブジェクト指向兼、構造化プログラミングなマルチパラダイム（？）な言語が多いイメージだけど、関数型言語でも構造化プログラミングのパラダイムは使われていたりするの？
- 「順次」「選択」「反復」は全ての言語で実現されているんだと思う
    - 関数型だとモナドとか言う謎の技を使うと実現できたりする
        - ちなみに `if` は普通の感覚で使えないし `for` はない
- 今使われている言語のほとんどは構造化プログラミング
- 上から順番に実行されるとか、ifで分岐するとか現在では当たり前になっているものが構造化プログラミング
- 構造化プログラミングではない言語の例
    - [https://ja.wikipedia.org/wiki/Brainfuck](https://ja.wikipedia.org/wiki/Brainfuck)
    - [https://www.narupi.net/2018/12/05/brainfuck/](https://www.narupi.net/2018/12/05/brainfuck/)


### 関数型とオブジェクト指向どちらもいけるハイブリットな言語みたいなものはあるの？

- んなら scala やるべや

- 最近では基本どの言語もほぼハイブリッドみたいなもん。
- ただ、一概にハイブリッドで色々できる方がいいとは限らない
    - やり方が複数ある場合などチームで方針を決めたりする必要が出てくる

### オブジェクト指向プログラミングと関数型プログラムの使い分けは？

- 個人的な感覚だと、関数型プログラみん は domain layer とかはすごい向いている点があるけど、その外のレイヤー作るのが大変そう
    - haskell には yesod というでかい web フレームワークがあって db から template engine まで関数で書くこともできるけど

- 数学とか定理証明とか計算機とか、純粋な計算がプロダクトの中心になる様な領域だと、OOP より向いているのかなと思う

### 抽象データ型とメッセージングのオブジェクト指向どっちが良いの？

- 調べてみたら、オブジェクト指向には「抽象データ型」と「メッセージング」の2つの手法があるらしい。どっちが良いとかあるの？
    - [二つのオブジェクト指向とそれぞれのメリット \- Smalltalkのtは小文字です](https://sumim.hatenablog.com/entry/20081029/p1)

- ほとんどは抽象データ型の思想で設計している
    - オブジェクト指向の話をしている時は基本的には抽象データ型が前提になっていること多い
    - 一旦メッセージングについては忘れても良い気がする
    - メッセージングが時代遅れという意味ではないよ


### 宣伝 → [副作用と参照透過性と冪等性を理解して、テストでドメインを磨く - Qiita](https://qiita.com/suzuki-hoge/items/893605555cae2014641a)
- 副作用がある関数: 何かの状態を変更するか
- 参照等価性がある関数: 必ずアウトパラが同じになる
- 冪等性のある関数: 何度実行しても同じ状態になる ( アウトパラが同じとは限らない )

## 次回
[【ミライトデザイン社内勉強会#26】Clean Architecture 輪読会 「第3部：設計の原則」 - Qiita](https://qiita.com/tkek321/items/58f35dc64f5a87b5c955)