思考力ってなんですか？

## はじめに

「採用では思考力をみています」
「AIの時代、思考力が問われます」
「思考力を伸ばしたい」

こんな言葉を聞いたことありませんか？
本記事では「思考力」について書いていきます。
「思考力」はプログラミング、設計、そして他の様々な行動の土台になります。
この文章がなにか参考になれば幸いです。

## 思考力って？

「思考力を伸ばしたい」

この場合、「思考力」がどのようなものか認識できなければ、「思考力」に対して行動が起こせません。

記事を進める前に一度、「思考力」がどのようなものか自身の言葉で定義してみてください。
すこしスペースをあけます。

//
//
//
//
//
//

みなさん、定義されましたか？

私は「思考力」を下記のように定義しました。

```
"引き出し（知識、経験）の量" に対して "組み立てる技術" が合わさったもの
```

また、伊沢 拓司著「勉強大全」では「思考力」について下記のように書かれてました。

```
1. ルールを確認し
2. 手持ちのカードを広げ
3. 適切なものを選び出し
4. 順序立てて使っていく能力
```

私と伊沢さんでは「1.ルールを確認し」の部分が違います。
スタート地点が決まらないとゴールまでの道筋が決まらないので、とても大事な視点ですね。
みなさんの「思考力」とではどうでしょうか？

## 思考力を図にしてみる
<img width="646" alt="スクリーンショット 2020-07-30 19.43.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154186/554017fe-aa71-063f-c5fe-accf3298dfdf.png">

このような図になりました。
図にのっとれば、三角形が大きいほど「思考力」が高いということになります。

「思考力を伸ばしたい」

この問いには三角形を大きくすることでこたえることができそうです。

## 思考力を伸ばす方法

1. 手持ちのカードを増やすこと(インプット)
2. 手持ちのカードを組み合わせること（アウトプット）

3. 1. と 2. を並行して実践することで伸ばす

## アンチパターン 1 横軸偏重

「資格試験の勉強をしたが、実務ではつかえそうにない」

こんな言葉を聞いたことはありませんか？

この場合、手持ちカード（横軸）が増えていても、それを組み合わせること（縦軸）をしていないのではないでしょうか。
最悪、三角ではなくつぶれた横軸があるだけになってしまいます。

## アンチパターン 2 縦軸偏重

「実装にとりかかったが、何をしたら良いかわからない」

この場合は、組み合わせを実施しようにも手持ちのカードがないので、行き詰まる、または強引な組み合わせになり綺麗な三角形にはなりません。
（中級者のエンジニアが無理やりでも作れるのはある程度の横軸があるから。またある程度の横軸で留まっていることは上級者への壁でもある）
（強引な組み合わせから横軸、パターンを増やしてくのは大いにあり）

## ベストプラクティス

上記のアンチパターンを踏まえると、ベストプラクティスとは
1. 手持ちのカードを増やすこと(インプット)
2. 手持ちのカードを組み合わせること（アウトプット）
をバランスよく行っていくことになる。

バランスよくとは大きな三角形ではなく、小さな三角形を積み上げていくことです。
つまり、スタート地点とゴール地点を確認し、マイルストーンを設けることです。
マイルストーンまでの手札を広げ、適切なものを選び、順序立てて使っていくのです。

具体例を挙げれば、下記の繰り返しによって、思考力が伸びていくと考えます。

```
プログラミング言語の試験をうける、知識を増やす（インプット）
→ そのプログラミング言語を使ってなにかつくる（アウトプット）
→ 新たに知識を増やして（インプット）
→ 機能を追加する（アウトプット）
```

## 自走

実務未経験で働きはじめた頃、下記のような経験はないでしょうか？

- 技術書に載っていること以外ができない
- エラーになってそのままスタック
- とりあえず動く実装できたが、拡張性がない
- なぜ動いているかわからない
- エラーを見落としていた、なぜエラーなのかわからない
- レビューで指摘の嵐
- 指摘されてもそれがなんのことかわからない
- 同じミスを繰り返す
- 一度できたことしかできない
- とりあえず過去のコードをそのままもってくる（コピペ）
- 実装を人に説明することができない

大事なのは、自分の三角形がどんな形になっているのか、マイルストーンのどこにいるのか認識することです。
横軸がなければ手札を増やすアクション、手札が十分にあればそれをどのように組み合わせるかに注力することが必要です。
最初は先輩が教えてくれることで横軸と縦軸を伸ばすことができます。
しかし、いつまでの先輩がいるわけではないです。
技術者になるには、その場その場で最善の手、最適解を探していく必要があります。
つまりそれが自走につながっていくのです。

## 問題解決のプロセス

問題解決のプロセスと「思考力」を下記ならべてみました。

```
- 問題解決のプロセス
1. 原因の可能性を洗い出す
2. 仮説を立てる
3. 仮説の検証（情報を集めて分析する）
4. 解決の選択肢を洗い出す
5. 実行
```

```
- 思考力
1. ルールを確認し
2. 手持ちのカードを広げ
3. 適切なものを選び出し
4. 順序立てて使っていく
```

見比べると、問題解決のプロセスも「思考力」の手順にのっとているのがわかります。
つまり、思考力を伸ばすことは問題解決の技能向上につながるのです。
そして、実装や問題解決だけでなく日々の様々な行動の土台になっているのです。

## 例えばこんなお題があって

Qiitaなのでプログラムに応用したものを書いておきます。
例えば下記のような問題があります。（JavaScriptで書いてますが、お好きな言語でどうぞ）

```javascript
//与えられた文字の母音(a i u e o)の数をかえしてください。
//*ここで与えられる文字はスペースを含むアルファベットを指します。

getCount = (str)=> {
  //write your code

}
getCount('abcidsge');//3
```
横軸の手持ちのカードとして、下記のようなものが浮かびます。

- 繰り返し処理
- if文
- 正規表現
- split
- reduce
- filter

これらを組み合わせれば、下記パターンが浮かびます。

```javascript
getCount = (str)=> {
  let vowelsCount = 0;
  str.toLowerCase().split('').forEach((e,i)=>{
    if(e == "a"||e == "e"||e == "i"||e == "o"||e == "u")vowelsCount++
  });
  return vowelsCount;
}
getCount('abcidsgE');
```

```javascript
function getCount(str) {
 return str.split('').filter(c => "aeiouAEIOU".includes(c)).length;
}
```

```javascript
function getCount(str) {
  return (str.match(/[aeiou]/ig)||[]).length;
}
```
カードがあれば、問題を解くことができる
さらにfilterのカードがあることでより簡潔に解くことができる。正規表現でも書くことができます。
繰り返しになりますが、大事なのは手持ちのカードから状況に応じた最適解を選んでいくことです。

## まとめ

```
思考力とは、
手持ちのカードから最適なものを選び、組みあわせて使っていく能力のことである。
```

```
思考力を伸ばすためには、
1. 手持ちのカードを増やすこと
2. 手持ちのカードから最適なものを組み合わせること
上記を並行して繰り返していくこと
```

## さいごに
「思考力」を伸ばすためにはどうすればよいですか？

その疑問に対して、まず「思考力」を認識、定義する必要があると思い、本記事を書きました。

この記事が読んでくださった方のなにか参考になれば幸いです。
また、横軸と縦軸を伸ばすことにつながるため、コメントがあればいただけると嬉しいです。