本質を捉えるトレーニング｜文章題で身に付くプログラミング思考入門️（5/25）

## 抽象化って何だろう？
### はじめに

今回は、抽象化について解説していきます。

ところで、「抽象化って何？」と聞かれたとき、何と答えますか？
共通する要素を抜き出すこと、大きく捉えること、一般化すること、ザックリさせること、抽象的にすること、、
調べてみてもたくさん定義がありますし、きっとあなたの頭に浮かんだ「抽象化とは」も抽象化の定義のひとつです。

その上で、おそらくほとんどの人が反論しないであろうと思われる定義は、

**抽象化とは、「具体化の反対」である。**

ですね。

考えが詰まったとき、反対側から攻めてみると上手く行ったりすることが結構あります。

『文章題で身に付くプログラミング思考入門️』は、日常や文章問題からプログラミング思考を身に付けていく、簡単で身近で、あなたをちょっと輝かせてくれるシリーズです。

今回は、抽象化についてお話ししていきましょう。

## 前回のまとめ
- 規則性を見つけてシンプルにパターン化すれば、行動に必要なコストがグッと下がります。
- どのようにパターン化して、区分けして入れたら、一番効率的なのか？ここが頭を悩ませるところです。
- これからの時代は、いかに早く検証と法則化を繰り返すかのスピード勝負です。

前回の記事は[こちら](https://qiita.com/yuki-TheWaggle/items/c9c01baa8e23497e264c)
第一回は[こちら](https://qiita.com/yuki-TheWaggle/items/a6845c85a464c3c46ab2)

## 対象者
- プログラミングを学びたい人
- プログラミングに挫折したことのある人
- 論理的思考を鍛えたい人
- 文系の人
- エンジニアの思考を理解したい人

## 概要
さて、抽象化するメリットは何でしょうか？

考えてみるとたくさんありますが、日常に役立つ観点から言えば「反論されにくくなる」と言う点が挙げられます。
ただし、「反論されない」わけではありません。
「確かにそう言えるかもしれないな...」くらいには余白を生むことができます。

では、なぜ反論されにくくなるのでしょうか？それは、

### 抽象化することで、当てはまるケースが増えるからです。

であれば、何でも抽象化してしまえば楽チンな気がしてきますが、そうとも限りません。

抽象化すると当てはまるケースに自由度が生まれるので、「具体的にはどういうこと？」が掴みにくくなります。
「フワッとした話ばかりで具体性がない」とか「話はわかったけど使えない」とか、困った側面も出てきます。

これがシステム開発の現場だったら一大事です。
「フワッとした説明ばかりで何のデータをどこに入力したらいいかわからない」「機能は良いけど使えない」システムだったら？
ちょっと背筋が凍ってきました。

かと言って、行動やプロセスの全てを具体的にルール化してしまったら状況に応じて使い分けができないので、それはそれで不便ですね。
- 「必ず左足の靴下から履きなさい。その次に右の靴下を履き、その後にTシャツを着なさい。」
- 「パスワードは必ず半角12文字ぴったりで設定してください。最初の1文字目は大文字のアルファベット、次は`.`か`?`か`-`のどれかから一つを選んでください。」

どちらも、本質的ではありません。

では、どのくらいの具合で抽象化・具体化するのが良いか？

### 使う人に聞くのが一番いいです。使い勝手は、使ってくれる人に合わせましょう。

かと言って、使ってくれる人がいつも自分にとってのちょうど良さを把握しているとは限りません。
なので、「このくらいですか？」「こんな使い方はどうですか？」と提案できる力が必要になります。
つまり、**縦横を自由に行き来する思考力が必要になります。**

脳みそも筋肉のようにトレーニングすることができますから、毎日コツコツ繰り返せば思考力を鍛えることができます。

**ポイントは、正しいやり方で続けることです。**

これから、私が調べ、学び、試したトレーニング方法を共有します。
あなたにとっても正しいやり方だとは限りません。もっといい方法があるかもしれません。
それでも一度、騙されたと思って試してみてください。

では、抽象化のトレーニングです。
**言葉を「要は」と繋げていきます。**
コツは、一番大事だと思うポイントを見つけて、その1点について「要は」で大きくしていくことです。

試しにやってみましょう。お題は`バナナ`です。
あなたも、手元にメモしながらやってみてください。

```
バナナ
→ 要は、果物
→ 要は、食べ物
→ 要は、エネルギー源
→ 要は、生き物の活動資源
→ 要は、自然の循環に必要なもの
→ 要は、地球にある存在
→ 要は、太陽が必要な存在
→ 要は、宇宙にある存在
```

このような感じですね。
他にもいろんな広げ方が考えられると思います。
チェックポイントが一つあります。
**全ての抽象化が、「バナナとは〇〇」で意味が通るようにしましょう。**

```
バナナ
→ バナナとは、果物
→ バナナとは、食べ物
→ バナナとは、エネルギー源
→ バナナとは、生き物の活動資源
→ バナナとは、自然の循環に必要なもの
→ バナナとは、地球にある存在
→ バナナとは、太陽が必要な存在
→ バナナとは、宇宙にある存在
```
どれも、意味が通じると言えばまあそれなりに通じますから、抽象化の成功です。

以下は、ChatGPTに出力させた例ですが
```
バナナ
→ 要は、果物
→ 要は、食べ物
→ 要は、エネルギー源
→ 要は、生物の活動資源
→ 要は、物質の循環
→ 要は、自然のプロセス
→ 要は、存在のシステム
→ 要は、宇宙の仕組み
→ 要は、無限の可能性
```
例えば、「バナナとは、存在のシステム」と言われたら少し疑問に思いませんか？
「確かに私もそう思います」とは、私は答えにくいです。

なぜこのようなことが起きるかというと、**抽象化の過程で水平な観点が加わったからです。**

ちょっと横にずれているんですね。
これを、**ラテラルシンキング（水平思考）** と言います。

もう一度。以下は、ChatGPTに抽象化思考に限定して出力させた結果です。
```
バナナ → 果物 → 食べ物 → エネルギー源 → 生命活動 → 資源 → 自然 → 宇宙的循環

- バナナとは、果物
- バナナとは、食べ物
- バナナとは、エネルギー源
- バナナとは、生命活動
- バナナとは、資源
- バナナとは、自然
- バナナとは、宇宙的循環
```
今度は、「確かに反論しにくいな…」くらいになりましたね。成功です。

ついでに、水平思考についても解説しましょう。
水平思考とは、簡単に言ったらマジカルバ○ナです。
### 何らかの要素を頼りに、自由に連想を広げていく思考のことです。

言葉を「と言ったら」で繋げていきます。
発想を横にずらしてなるべく遠くまで思考を広げます。
やってみましょう。

```
バナナ
→ と言ったら、黄色
→ と言ったら、卵
→ と言ったら、ヘビ
→ と言ったら、飲み込む
→ と言ったら、錠剤
→ と言ったら、発明
→ と言ったら、光
→ と言ったら、星
→ と言ったら、宇宙
```

私も思考力のトレーニング中です。
もっと自由な発想ができるようになりたいと思っています。

ちなみに、具体化する力を鍛えたいなら、抽象化の逆を試してみてください。
「具体的には」で繋げると、元素くらいまでは小さくできるのではないでしょうか。

さて、思考力は継続してトレーニングすることが大事です。
1日のうち、たった数分で構いません。できたら3日くらい続けてみましょう。
その結果、効果を感じられなければ、別の方法を調べて試してみてください。
人生は試行錯誤の連続です。
あなたのトライ&エラーの役に立てたなら、私も幸いです。

次回は、[アルゴリズム](https://qiita.com/yuki-TheWaggle/items/a888329520af970025b5)について解説していきます。


## まとめ
- 抽象化することで、当てはまるケースが増えます。
- どのくらいの具合で抽象化・具体化するのが良いかは、使う人に聞くのが一番いいです。使い勝手は、使ってくれる人に合わせましょう。
- ラテラルシンキング（水平思考）とは、何らかの要素を頼りに、自由に連想を広げていく思考のことです。

## 最後に
ここまで読んでくださってありがとうございます！
少しでも役に立ったら「いいね」をください。続ける励みになります。
「こんなのできた」と共有してもらえるなら、コメントで教えてください。
ぜひ楽しみながら、一緒にトレーニングしましょう。効果を最大化してくれると思います。