構造化思考と論理的思考｜文章題で身に付くプログラミング思考入門️（3/25）

## エンジニアと普通の人のすれ違いは定義にあり
### はじめに

今回は、分解する力と紐付ける力について解説していきます。

### どの粒度で分解するか、分解した要素がどう紐付くか。これを制するものはプログラミング思考を制します。

ちなみに、今回の内容を自分のものにできたら、ついでに難関大学の現代国語試験で合格できるくらいの読解力が身につくと思います。


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

今回は、構造化思考と論理的思考についてお話ししていきましょう。

## 前回のまとめ
- 答えが明確でなければ、質問も明確になりません。
- 人間の思考や問題解決を手順化したものがプログラミングです。
- 実はあなたは日常の会話の中でプログラミングしています。

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

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

## 概要
さて、前回の渋谷の会話を思い出してみてください。

>「明日渋谷に行くんだよね」：`初期値`
「何で渋谷まで行くの？」：`定義`・`変数`
「電車で行く」
「そうなんだ、電車で行くんだね。渋谷に行く理由は？」：`条件分岐`
「買い物に行くんだ」：`代入`・`返り値`

会話を通じて、あなたはすでにプログラミングを理解しているという話をしました。
**言い換えると、構造化思考と論理的思考を日常的にしている、ということです。**

ピンときましたか？

ピンときたあなたは、次は会話とプログラミングを結びつけることができればプログラミング思考が自分のものになります。

ピンとこなくても、問題ありません。
構造化思考と論理的思考を難しく捉えすぎているか、そもそもその概念を知らなかっただけです。

先に、構造化思考と論理的思考を説明しましょう。

### 構造化思考とは、分解することです。
### 論理的思考とは、分解した要素を紐づけることです。

理解を深めるために、もう一度『吾輩は猫である』から文章を借りてきましょう。

> 薄暗いじめじめした所でニャーニャー泣いていた

これを、分解して（構造化思考）、紐づけてみましょう（論理的思考）。

まずは **分解（構造化思考）** です。
文章の間に `/` を入れてみてください。

次に **紐付け（論理的思考）** です。
区切られた塊が、どこに掛かっているか `矢印` を引いてみましょう。
ポイントは、**塊から出る矢印を一本だけにすることです。**

---

例えば、このようになります。

`薄暗い/じめじめした/所で/ニャーニャー/泣いていた`

```
薄暗い → 所で
じめじめした → 所で
ニャーニャー → 泣いていた
```

矢印が繋がっている言葉を、それぞれよく見てみましょう。

```
薄暗い所で
じめじめした所で
ニャーニャー泣いていた
```

単独でも意味が通じることがわかりますね。
**正しく分解できれば、正しく繋げることができて、そこから意味が生まれるのです。**

例えば、「薄暗い」が「ニャーニャー」に繋がっていたら？
「薄暗いニャーニャー」。
意味が通じませんから、これは紐付かない。論理的ではありません。

気をつけて欲しいのは、**私の答えが唯一の正解ではない**ということです。
どのくらいの細かさで分解するかを、私は指定しませんでしたね。
つまり、質問が明確ではありませんでしたから、答えには自由度が生まれているはずです。
違う言い方をすると、**私は答えの自由度を許容して質問しました。**
正解でないものがあるとするなら、矢印で繋がった言葉の意味が通じないものです。

どうでしょうか？
あなたの答えを見返してみてください。
もし意味が通じないものがあれば、どこに繋げれば意味が通じるか、試してみてください。

できましたか？素晴らしい。
これで、あなたの構造化思考と論理的思考を証明することができました。

更に思考力を伸ばしたいなら、次は、もっと複雑な文章で試してみることです。
おすすめは、国語の文章問題のプリントです。
検索すれば良い問題がたくさんありますから、ちょうど良さそうなレベル感のものを試してみてください。
ちょうど良さそうなものがわからなければ、小学校1年生向けのプリントから始めたら良いのです。
簡単すぎたとしても無駄ではありません。あなたの実力が証明されたということです。
どんどんレベルアップしてください。
大学入試レベルまで無料でWeb検索できます。
何となく理解していた日本語を、明確に分析できるようになります。
ついでに、難関大学に十分合格できる読解力が身に付きます。

コツは、先に問題を読むことです。
**問題に合わせて分解の塊の大きさを決めて、矢印で紐付けてみてください。**

ところで、日常的な会話では、どのくらいの自由度が許されているかがある程度決まっています。
### この自由度が揃っているから会話が成り立ち、自由度が大きく違っているから「何を言っているかわからない」という状況が起きるのです。

会話では、自由度が揃っていなくても、相手の反応によって柔軟に返答を変えることができます。
プログラミングはと言うと、そうではありません。
コンピューターは素直で、有能で、間違えないが、頭が堅いです。
そのコンピューターに仕事をさせるためには、私たちが柔軟になって、コンピューターが正しい答えを導ける自由度で指示する必要があります。
逆に、正しく指示をしてあげることができれば、コンピューターはイキイキといい仕事をしてくれます。
**質問と答えの明確さを揃えることの本質は、ここにあります。**

もう一問、『吾輩は猫である』の一節から借りてやってみましょう。

> 書生というのは時々我々を捕えて煮て食うという話である。

私の欲しい答えは、「書生」が「我々」を「食う」際に使う **調理法** です。
文章中の言葉を、そのまま抜き出してください。

ではやってみましょう。
文章を `/` で区切って塊に分解し、`矢印` で紐付けた上で、調理法を答えてください。
ポイントは、**構造化して論理的な繋がりを理解した上で、私が求めている答えの自由度で（私が求めている細かさの塊で、と捉えた方がわかりやすいかもしれません）答えることです。**

それではやってみましょう。

> 書生というのは時々我々を捕えて煮て食うという話である。

`書生というのは/時々/我々を/捕えて/煮て/食う/という話である。`

```
書生というのは → 食う
時々 → 食う
我々を → 食う
捕えて → 食う
煮て → 食う
```

答え：煮て

解説します。
私が求めていたのは、「食う」に掛かる調理法ですね。
「食う」に掛かる塊はいくつかありましたが、そのうち調理法は？と聞かれたら「煮て」しかありませんね。
もしかしたらあなたは、わざわざ分解して紐付けなくても答えられたかもしれません。
**でも、わざわざ分解して紐付けることを、明らかに意識することが大事なのです。**

なぜでしょうか？
それは、コンピューターの求める自由度を理解し、コントロールするためです。
先ほども言った通り、コンピューターは頭が堅いです。
言い換えると、コンピューターが受け取る情報は厳格にルール化されています。
人間が、コンピューターの細かさに合わせてやる必要があるのです。
これが、プログラミングで言う「定義」です。

**定義を間違うと、出すべき答えを間違います。**
出すべき答えを間違えば、全てのプロセスも見直しが必要になります。
エンジニアはそのことを身に染みて知っています。

だから、エンジニアは普段から言葉の定義をすごく気にするんですね。
例えば普通の人が「システムエラーで動かない」と一言相談したら、エンジニアは怒涛の質問を返してきたりしますよね。
「動かないとは？エラーとは？メッセージは出たか？内容は？何の操作をしていた？OSは？バージョンは？...」

プログラムでは大小様々な情報を扱うので、発生したトラブルと関連しそうな、あるいは関連しなさそうなプログラムがどのあたりか、まずは特定する必要があるのです。
そして、特定に役立つ情報が細かければ細かいほど、正確な対応ができるのです。

エンジニアがやたら定義したがるのには、こういう理由があります。
普通の人の目線から、エンジニアを理解してやってください。
そして同時にエンジニアの目線から、普通の人にとったらどんなに面倒くさいかを理解してやってください。

自由度（または情報の定義の細かさ）を揃えるお互いの意識が、会話をスムーズにしてくれます。

次回は、[規則性](https://qiita.com/yuki-TheWaggle/items/c9c01baa8e23497e264c)について解説していきます。


## まとめ
- どの粒度で分解するか、分解した要素がどう紐付くか。これを制するものはプログラミング思考を制します。
- 構造化思考とは、分解することです。
- 論理的思考とは、分解した要素を紐づけることです。

## 最後に
ここまで読んでくださってありがとうございます！
少しでも役に立ったら「いいね」をください。続ける励みになります。
「ちょっとわかったな」「ちょっとわからないな」と思ったらコメントで教えてください。
愛すべきエンジニアの思考とテクノロジーが、たくさんの人に届いたらいいなと思っています。