プログラマーに必要なラテラルシンキングとは

## はじめに
プログラマーとして働き始めて、<font color="Blue">技術の勉強は順調</font>。
でも、上司から<font color="Red">「もうちょっと案件の仕様を把握しようか。」</font>と言われることが多い...そんな悩みありませんか？

もしかしたら、その悩みは<font color="Red">技術の習得では解決できないかもしれません！</font>
プログラミングスキルとは別に「思考法のスキル」が必要かもです。

この記事ではプログラマーに必要な思考フレームワーク3つのうち、**ラテラルシンキング**について解説します。

【関連記事】
[プログラマーに必要な思考フレームワーク3つ](https://qiita.com/YutaManaka/items/5f0c38f1b3a29d1f028e)
[プログラマーに必要なロジカルシンキングとは](https://qiita.com/YutaManaka/items/26b6ad868c0779db55b9)
[プログラマーに必要なラテラルシンキングとは](https://qiita.com/YutaManaka/items/33cb905eb89f846daca2)
[プログラマーに必要なクリティカルシンキングとは](https://qiita.com/YutaManaka/items/e11a89b9fc2cc939d10a)

## 対象者
この記事は下記のような人を対象にしています。

- 駆け出しエンジニア
- プログラミング初学者
- 上司に「もうちょっと考えてみようか」と言われがち
- 複雑な問題にぶち当たると頭痛がする

## 結論
:::note
- ラテラルシンキングとは、様々なやり方を考え、効率の良い解決策を採用する思考法。
- 主に設計や障害対応で活躍する思考法。
- アプローチの方法は「類推思考」「仮説思考」の2つ。
:::

## ラテラルシンキング(水平思考)とは
ラテラルシンキングとは、**さまざまなやり方を考え、その中からより効率の良い解決策を採用する思考法**です。
課題を解決できそうなアイデアをたくさん出して、比較検討することになります。

ざっくり言うと<font color="Blue">「プランAはどうかな、プランBもあるし、プランCもよさそう...よしプランCで行こう」</font>というやり方です。
プログラマーで言うと、**設計や障害対応で活躍する思考法**です。

ラテラルシンキングでは、膨大な事象から共通点を見つける力が必要になります。
<font color="Red">専門的な課題であればあるほど、素人だけでは共通点を見つけづらくなる</font>点には注意が必要でしょう。

アプローチの方法は「類推思考」「仮説思考」の2つです。

### 類推思考とは
類推思考は**似ていることに着目して解決策に導く方法**です。
過去のデータを並べて、共通点を見つけるため、未知の課題に対応できるのが強みの思考法です。

実際にプログラマーが遭遇しそうな場面で解説しましょう。

【前提条件】
- **楽天やYahooショッピングのようなECサイトの期間限定商品のページ**を制作している。
- <font color="Red">「発売終了日時を表示しているが、想定と違う時間が表示されてしまう」</font>という不具合が発生。

【解説】
データを集めてみると、下記のような状態でした。
```
(現状)                (正解)
2022/04/10 20:04:00 → 2022/04/10 20:00:00
2022/04/20 12:04:00 → 2022/04/20 12:30:00
2022/04/30 23:04:59 → 2022/04/30 23:59:59
```
このデータを見たときに、類推思考を使えば、<font color="Blue">「あれ、分の表示が全部04になってるのがおかしいな」</font>と気づくはずです。

これはPHPでCarbonのフォーマットで間違えるあるあるなのですが、下記のようにフォーマットの指定を間違えると起きる現象です。

```php
$carbon = new Carbon('2022-04-10 20:00:00');
$time   = $carbon->format('Y/m/d H:m:s'); // mは分ではなく月
$time2  = $carbon->format('Y/m/d H:i:s'); // こちらが正しい
print($time."\n");
print($time2);

// 結果
2022-04-10 20:04:00
2022-04-10 20:00:00
```

類推思考は非常に強力な思考法ですが、<font color="Red">間違った項目をもとに類推すると間違った結論に辿り着いてしまう</font>場合があります。
上記の例では、<font color="Red">「2022年のデータが全部おかしい。年度に原因があるのでは？」</font>と考えてしまうと、間違えてしまいますね。

### 仮説思考とは
仮説思考とは、**課題に対して仮説を立て検証し、正解に辿り着くまで繰り返す思考法**です。
最初に立てた仮説が間違っていても、軌道修正できるので、柔軟に対応できるのが強みです。

実際にプログラマーが遭遇しそうな場面で解説しましょう。

【前提条件】
- **楽天やYahooショッピングのようなECサイトの商品ページ**を制作している。
- <font color="Red">「税込価格が表示されるべき場所に税抜価格が表示されてしまう」</font>という不具合が発生。

ここで、仮説思考を使って課題を解決してみます。

:::note
- 仮説1：店舗特有の問題か？
- 検証1：<font color="Red">不正解。</font>他の店舗でも同じ不具合が起きている。
　　　↓
- 仮説2：カテゴリ特有の問題か？
- 検証2：<font color="Red">不正解。</font>全てのカテゴリで不具合が起きてる。
　　　↓
- 仮説3：商品特有の問題か？
- 検証3：<font color="Blue">正解！</font>セール対象品だけ、別ロジックで表示し不具合が発生することが判明。
:::

上記のように、仮説と検証を重ねることで、解決に導くことができます。

柔軟に課題を解決できる仮説思考ですが、注意点もあります。
今回のように、ECサイトが「店舗>カテゴリ>商品」の階層構造になっていることがわかっていれば、上記のような仮説を立てることができます。
しかし、プロジェクトに入って間もないと構造を理解できておらず、どこから手をつけて良いかわからないでしょう。
このように、<font color="Red">出せる仮説の精度は、習熟度によって異なるので、時には自分より詳しい人に相談する必要がある</font>点に気をつけましょう。

## おわりに
「プログラマーに必要なラテラルシンキングとは」についてまとめました。
類推思考と仮説思考を使い分けて、駆け出しエンジニアを卒業しましょう！

## 関連記事
[プログラマーに必要な思考フレームワーク3つ](https://qiita.com/YutaManaka/items/5f0c38f1b3a29d1f028e)
[プログラマーに必要なロジカルシンキングとは](https://qiita.com/YutaManaka/items/26b6ad868c0779db55b9)
[プログラマーに必要なラテラルシンキングとは](https://qiita.com/YutaManaka/items/33cb905eb89f846daca2)
[プログラマーに必要なクリティカルシンキングとは](https://qiita.com/YutaManaka/items/e11a89b9fc2cc939d10a)

## 参考文献
[ビジネス思考法使いこなしブック](https://www.amazon.co.jp/dp/B00ZZ4JGGU/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)