[備忘録] ~プログラマー脳を読んでみて~

# はじめに
プログラミングの勉強の一環として、本を読み始めているのですが、インプットはできているのですが、アウトプットをできる場面が少なく、そのアウトプットの場として本を読んでみた備忘録として、書きまとめてみた次第です。

説明するのが苦手なこともあり至らない点ばかりですが、そちらの練習も兼ねて記事を書かせていただきます。

# コーディング中に起こる混乱
まず、一章ではコーディング中に起こる混乱として以下の3つの説明がありました。
- 知識不足
- 情報不足
- 処理能力不足

これらの備忘録も兼ねて自分なりの見解を記述していきます。

## 知識不足
知識不足というのは、自分の持っている知識が足りない上で生じる混乱です。

例えとして以下のコードはどういう意味でしょうか？

```APL
2 2 2 2 2 T n
```
ぱっと見ではなんと書いてあるかわかりませんよね...
AMLのコードらしいのですが、私にはわかりませんでした。
こういう知識がないコードに対してを知識不足による混乱と呼んでいました。
初めての言語でとりあえず、コード見てみよって見てみたらなんじゃこれってあるようなイメージです。

## 情報不足
情報不足というのは、どこから呼ばれているかわからないメソッドや、クラスなどに対して情報が不足している事で生じる混乱です。
例えば、
```Java
public class Test {
    public static void main(Integer n) {
        System.out.println(existsNumber(n));
    }
}
```

この`existsNumber()`というメソッドは名前からして、引数に入れた数字が存在するかどうかをチェックするようなメソッドに見えますが、実際にそのメソッド内でnをどのように判断してるのかなどはわかりませんよね？
このような情報が足りてないことを、情報不足と呼んでいました。

確かに、誰かが書いたコードでメソッド名から想像つかないものなんていくらでもありますよね…

## 処理能力の不足
処理能力の不足というのは、以下のように長いコードをパッと見て何がしてあるかわからない。などで生じる混乱です。

```Java
int num1;
int num2;
List<String> list;
// リストからnum1と同じ数字を取り出し、存在してたらtureを返すような処理
```
このように、変数名や処理内容をパット見てどのようなプログラムかは予想することはできると思います。
ですが、本当に処理を理解しようとすると頭の中だけでは処理できないと思います。
実際に、長いif文で最初の変数に代入した値なんて覚えられていられないと思います。
これらの状態を処理不足による混乱と呼んでいました。

ここで軽くまとめておくと、1つ目の知識不足はプログラミング言語やアルゴリズムなど自分の習得した経験や知識以外のものを指しています。
2つ目の情報不足は、コードを理解するための必要な情報全てにアクセスできない場合です。実際の開発では色々なチームが持っているライブラリ、モジュール、パッケージなどを読み込んで開発することが多いため、その全ての処理を把握しておくなんて不可能なため発生します。
3つ目の処理能力は、2つ目で紹介した膨大な量のコードを一気に頭の中だけで処理することが不可能な場合に発生します。


# 認知プロセス
ここでは、上記で説明したそれぞれのプログラムを読むときに脳内で起こる認知プロセスというものについて記述しています。
認知プロセスと聞くと少し難しく感じるかもしれませんが、本を読んでて「あ〜、確かに！」となったので感想も含めて記述させていただきます。

まず、それぞれの〇〇不足による混乱について原因となる記憶領域が以下のようにあります。

- 知識不足 = 長期記憶
- 情報不足 = 短期記憶
- 処理能力不足 = ワーキングメモリ

これらをプログラミングと結びつけて考えていきます。

ここで簡単に説明しておくと長期記憶は、記憶がすべて永続的に保持されることです。
短期記憶は、記憶したい情報を一時的に保持するような場所です。
ワーキングメモリは、一度に大量の情報を処理しなければならないときに思考を行う脳の場所です。

## 長期記憶
長期記憶は非常に長い間、記憶を保持できます。大抵の人は何年、何十年も前に起きたことでも長期記憶にあれば思い出すことができます。中学の頃の友人と話すときに、あんな事あったよね〜など思い出すときにもよく使われてそうですね。
また、日々の生活の中にも長期記憶は使われています。普段何気なくやってることはほとんど長期記憶です。靴紐を結んだり、字を読み書きするときなどです。
これらのように、特に何も考えずにできてしまうことなどは長期記憶として保持されるのだなと思いました。

プログラミングに置き換えると、私はJavaをやることが多いのでJavaのコードを読み書きするときに、intって何だっけ？なんて考えることはありません。
intとは整数データ型であるって長期記憶によって保持されているからです。
先ほど例として出したAPLのコードも長期記憶として保持されていればスラッと読めたでしょう。

## 短期記憶
短期記憶は入ってきた情報を一時的に保持します。
例えば、見たいドラマの間のCMなどで流れてきた情報は一瞬記憶には残りますがまたドラマが始まったら忘れていると思います。
短期記憶に留めておける情報の個数としてたった数個しか保存できず1ダース以上は記憶できないというのが科学者の主な見解らしいです。

プログラミングに置き換えると、変数名や利用されているデータ構造などが一時的に短期記憶に格納されます。
認知プロセスの中で最も使われるのも短期記憶です。

```Java
public static void mian(int n) {
    System.out.println(Integer.toBinaryString(n));
}
```

例えば、上記のプログラムを理解するのに短期記憶は大きな役割を果たしますが、長期記憶も関わっています。
Javaをやってる人なら`public class`や`public static void main`上記のプログラムを説明するときにはいちいち紹介しないと思います。この関数名の名前がmianになってることにも気づかないでしょう。
なぜなら、今は`toBinaryString`の方に集中していて、短期記憶として格納しようとしたため、長期記憶の方が適当になっているからです。

コンピュータに置き換えた表現として、以下のような記述もしっくり来ました。
```
長期記憶が、ハードドライブディスクとして永久的に記憶を保持できるのに対して、短期記憶はRAMやキャッシュのようなものです。
```

## ワーキングメモリ
ワーキングメモリとは、長期記憶や短期記憶のような記憶装置とは違い、バグに対しての問題の解決など思考に関するものです。

プログラムに置き換えると、非常に複雑なコードを読む場合に変数の値をコード内にコメントとして残したり、手元でメモ帳を準備したりすると思います。
これらの方法を使用しないでコードを理解しろって言われても結構難しかったりしますよね。
色々なことが起こってると、あれ？どこで何をやってるんだっけ？という状態に陥る。それがワーキングメモリの不足という認識です。

# まとめ
- コーディング中の混乱は、知識不足、情報不足、処理能力不足によって引き起こされます
- 原因として3つの認知プロセスがあり、長期記憶、短期記憶、ワーキングメモリの不足によって考えられています
- 長期記憶がなければまず、何が書いてあるかわからない。短期記憶がなければ変数に何を入れたか覚えていられない。ワーキングメモリがなければ、処理を追えない。などどれが欠けてもいけない存在です

# 感想
長期記憶は無意識のうちに、身に染み付いていることであって、私自身もJavaはまだまだだと思うところがあり、いずれ日本語を読むようにスラスラとJavaが読めるようになればいいなと思いました。
短期記憶に関しては、人間誰しも忘れることはある。という考えのもと、メモなどを定期的に取れるようになれたなと思いました。
ワーキングメモリに関しては、変数名やメソッド名などの命名を直感的にわかりやすくすることで読み手のワーキングメモリを刺激しないように読みやすいコードを改めて意識したいな、と思いました。