「ルーティン＝意識高い」は間違いだった｜文章題で身に付くプログラミング思考入門️（4/25）

## 規則性のもたらすメリット
### はじめに

今回は、規則性について解説していきます。
身近な規則性といえば、日常のルーティンが挙げられますね。

ルーティンって意識高いと思いませんか？高いですよね？
私もそう思ってました。
有能な人々こそ、必ずルーティンをこなしていたからです。それも大量に。

そして、たくさんの経営者や凄腕ITエンジニアと話したり、自分で試してみたりして気づいたことがあります。

### 規則性を見つけてシンプルにパターン化すれば、行動に必要なコストがグッと下がります。

有能な人々こそ、持てるリソースを戦略的に分配していたことに気づきました。
それがルーティンです。
つまり、**ルーティン=リソースの戦略的分配** でした。
そして品質の高いシステムも、同じ仕組みで動かされています。

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

今回は、規則性についてお話ししていきましょう。

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

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

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

## 概要
ところで、あなたは毎朝のルーティンはありますか？

決まったルーティンを持っている人もいれば、何となくいつもこんな感じかな、意外と毎日違うかも、なんて人もいるかもしれませんね。

ルーティンとは、規則的に繰り返す行動パターンのことですよね。
このパターンがシンプルなほど、汎用性が高まり、省力化され、情報が減ります。
そして詳細なほど、迷わずに済むし、間違いが減り、自由度が小さいです。

**要は、再利用するためにどんな粒度でパターン化するか？という観点が必要になってきます。**

これは構造化思考の話とも通じるところがあります。
前回、構造化思考とは分解すること、とお話ししました。
そして、どの自由度で・塊の大きさで・粒度で分解するか、求められる答えと合わせましょう、というお話をしました。

例えば、以下のような朝のルーティンがあったとしましょう。

```
【朝のルーティン】
朝食 → コーヒー → 歯磨き → シャワー → 着替え → メールチェック → 出発
```

今朝は何となく体調がすぐれなかったので、シャワーはやめておくことにしました。

```
【今朝の行動】
朝食 → コーヒー → 歯磨き → 着替え → メールチェック → 出発
```

2つを比べてみたら違いがあるので、今朝はルーティンを達成できなかったと言えますね。
しかし、朝のルーティンの粒度をもっと粗くしてみたらどうでしょうか？

```
【朝のルーティン（粗いver.）】
食事 → 身支度 → メールチェック → 出発

食事：朝食、コーヒー
身支度：歯磨き、シャワー、着替え
```

```
【今朝の行動（粗いver.）】
食事 → 身支度 → メールチェック → 出発

食事：朝食、コーヒー
身支度：歯磨き、着替え
```

抽象度を上げてみると、朝のルーティンを今朝も達成できたことになりますね。
そして、「身支度」というグループに含まれる要素に違いが生まれました。

**言い換えると、ルーティンを使い回し、グループの内部に自由度を持たせることで対応したわけですね。**
このルールを応用すると、明日はコーヒーの代わりに紅茶を飲んでもルーティンを達成できますね。

逆に、グループの内部に含まれる行動の具体が大事で動かせない、という場合もあるでしょう。
例えば、着替える時は必ず左足の靴下から履くと決めている場合などですね。

多くの場合、行動は入れ子構造になっています。
### どのようにパターン化して、区分けして入れたら、一番効率的なのか？ここが頭を悩ませるところです。

ちょっとややこしくなってきましたね。

足し算を例に、もう一度考えてみましょう。
つまり、足し算をパターン化して、3つの連続する数字を足し算できる構造を作ってみます。

**パッと思いつくのは、2つの数を足し合わせた答えを計算して出すことですね。**
そう考えてみると、皆さんも足し算するとき、まずは頭の中で2つずつ足していきませんか？

`1+2+3` がいくつになるか考えたとき、例えば
```
1+2+3
=(1+2)+3
=(3)+3
=6
```

みたいに、2つずつの足し算を繰り返して計算したりしませんか？
そうです。**2つの数を足し合わせる** というパターンだけで、たくさんの数の足し算を答えることができます。
非常に汎用的でシンプルです。

では次に、`3+4+5`を考えてみましょう。
同じやり方で答えを出せますね。
```
3+4+5
=(3+4)+5
=(7)+5
=12
```

足す数や足される数が変わっていますが、プロセスは全く同じだということがわかります。
つまり、**足す数や足される数に自由度を持たせれば、使い回せるということですね。**

自由度を持たせるために、変数を使って書いてみましょう。
```
a+b+c
=(a+b)+c
```

おや、変数にしてみたら2行で終わりましたね。
うーん、、あまり上手くなさそうです。
なぜなら、1行目と2行目を見比べてみると`()`が増えただけですから、何なら余計なことをしてしまったように見えます。

別の規則性を見つけてみましょう。

`1+2+3`も、`3+4+5`も、連続する3つの数を足していますね。
ということは？
そうです、**足す数が1ずつ増えている**という規則性を発見できます。

それなら、変数を1つにしても表現できるのではないでしょうか？
```
a+(a+1)+(a+2)
=a+a+1+a+2
=3a+3
=3(a+1)
```

悪くないですね。
でももう一歩試してみましょう。

一番最初の数字を基準にするのではなく、**隣の（真ん中の）数字を基準にしてみましょう。**
```
(a-1)+a+(a+1)
=a-1+a+a+1
=a+a+a-1+1
=3a
```

だいぶシンプルになりました。
ここからわかったことは、**3つの連続する整数の足し算は、真ん中の数字の3倍と同じ**という法則です。

本当かどうか、試してみましょう。

```
aが2のとき、つまり1+2+3のとき
(a-1)+a+(a+1)
=3a
=3x2
=6

aが4のとき、つまり3+4+5のとき
(a-1)+a+(a+1)
=3a
=3x4
=12
```

合ってますね。どうやら、簡単で楽チンな法則を見つけることができたようです。

ただし、3つの連続する整数の足し算のときに、再利用可能ですね。
`1+10+20`だったら成り立ちません。汎用性は低いですね。

でも、`1+3+5`だったらどうでしょう？
試してみてください。
新たな法則を見つけられるかもしれません。

さて、流れを振り返って分解してみましょう。

1. 2つの数を足し合わせるというパターンを繰り返した
2. 使い回すために、変数（`a`,`b`,`c`）を使って抽象化した
3. 結果あまり上手くなかったので、新たな規則性がないか模索した
4. 別の規則性（`足す数が1ずつ増えている`）が見つかったので、新たな法則（`変数を1つにして表現する`）を作った
5. もっと上手い方法はないかと視点をずらした（`隣の（真ん中の）数字を基準にする`）
6. もっとシンプルな法則になった
7. その法則が本当かどうか確認した

**検証して、法則化して、検証して、…と繰り返していたことがわかります。**

> 1. 2つの数を足し合わせるというパターンを繰り返した　：**検証して**
> 2. 使い回すために、変数（`a`,`b`,`c`）を使って抽象化した　：**法則化して**
> 3. 結果あまり上手くなかったので、新たな規則性がないか模索した　：**検証して**
> 4. 別の規則性（`足す数が1ずつ増えている`）が見つかったので、新たな法則（`変数を1つにして表現する`）を作った　：**法則化して**
> 5. もっと上手い方法はないかと視点をずらした（`隣の（真ん中の）数字を基準にする`）　：**検証して**
> 6. もっとシンプルな法則になった　：**法則化して**
> 7. その法則が本当かどうか確認した　：**検証して**

**こういった検証と法則化の繰り返しを、人は 試行錯誤 とか 仮説検証 とか トライ&エラー などと呼びます。**
たまに、「失敗した」と言う人もいますが、それは間違いです。
全ては過程であり、単なるフィードバックに過ぎません。

全ての挑戦は、ステップの一つです。
自分の目指したい形まで、検証と法則化を繰り返しましょう。

現在のテクノロジーは、まだ見ぬ技術を実現するために、無数のエンジニアたちが積み上げた試行錯誤のお陰で今も進化しているのです。

### これからの時代は、いかに早く検証と法則化を繰り返すかのスピード勝負です。

トライした結果エラーが出るなら、それはとても幸せなことです。

次回は、[抽象化](https://qiita.com/yuki-TheWaggle/items/810b6379598e64c47e5a)について解説していきます。


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

## 最後に
ここまで読んでくださってありがとうございます！
少しでも役に立ったら「いいね」をください。続ける励みになります。
「ちょっと難しいな」「ちょっと簡単だな」と思ったらコメントで教えてください。
この世から、「失敗は悪いこと」という概念がなくなったらいいなと思っています。