『プログラマー脳』から学ぶコード読解時の脳の混乱

# はじめに
[『プログラマー脳　〜優れたプログラマーになるための認知科学に基づくアプローチ』](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E8%84%B3-%EF%BD%9E%E5%84%AA%E3%82%8C%E3%81%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E8%AA%8D%E7%9F%A5%E7%A7%91%E5%AD%A6%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%8F%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81-Felienne-Hermans/dp/4798068535)という本を読みました。
この本は、脳の働きを理解することで、プログラマーとしてのスキルや習慣を向上させようという趣旨の本です。

コードを読んでいるとき、入ってくる多くの情報を処理しきれずに頭が混乱することがありますが、脳では何が起こっているのかを知ることで、その混乱状態を客観的に捉えて、混乱を和らげることができると感じました。

そのため、コード読解時の脳の働きついて理解したことをまとめようと思います。

# 本記事で触れる内容
本記事では、コードを読んでいる時に脳では何が起こっているのか、という点に関してまとめます。
コードを読んでいる際の脳の認知プロセスとそれに関する混乱、その混乱を和らげる方法をまとめます。





# コードを読むときの混乱
混乱には種類があります。
例えば、ビジネス領域における概念が理解できないという混乱と、複雑なアルゴリズムを少しずつ理解するときに発生する混乱は、種類が異なります。
異なる種類の混乱は、異なる種類の認知プロセスに関連して発生します。
以下にコーディングに関する具体的な混乱の種類と、認知プロセスについて説明します。

## 3種類の混乱
書籍では具体的なコードを参照しながら、コードを読む際に生じる3種類の混乱が説明されています。

### 1. 知識不足による混乱

例）APLのプログラム
演算子Tの意味を知らないことによる混乱
```
2 2 2 2 2 T n
```

### 2. 情報不足による混乱
例）Javaのプログラム
メソッド名から数値nを二進数表現に変換する機能であるという推測はできるものの、toBinaryString()の内部処理の情報が不足していることによる混乱

```java
public class BinaryCalculator {
    public static void main(Integer n) {
        System.out.println(Integer.toBinaryString(n));
    }
}
```

### 3. 処理能力の不足による混乱
例）BASICでの二進数表現
変数名と処理内容から、コードの役割を推測することができるものの、処理内容や途中の値を全て記憶しながら読み進められない（処理能力不足）ことによる混乱

```
LET N2 = ABS (INT (N) )
LET B$ = ""
FOR N1 = N2 TO 0 STEP 0
    LET N2 = INT (N1 / 2)
    LET B$ = STR$ (n1 - N2 * 2) + B$
    LET N1 = N2
NEXT N1
PRINT B$
RETURN
```



## コーディングに影響を与える認知プロセス
上記の3種類の混乱は、それぞれ別の認知プロセスの問題に関連しており、それらは全て下記の記憶に関連しています。

・知識不足：長期記憶の問題
・情報不足：短期記憶の問題
・処理能力の不足：ワーキングメモリの問題



### 長期記憶
長期記憶とは、長い間保持できる記憶のことです。
靴ひもを結ぶ時の筋肉の動かし方や、キーボードでのタイプ方法などがこれに分類されます。
プログラミングの文脈で言えば、何らかの技術を採用してうまく行った時の記憶、Javaのキーワードの意味などが記憶されているのが長期記憶になります。

例で示したAPLのプログラムでは、もしAPLのキーワードTの意味を知っていれば、その情報を長期記憶から取り出せたということです。

### 短期記憶
短期記憶は入ってきた情報を一時的に保持するために使用されます。
例えば、電話越しで電話番号を読み上げられた時に一旦短期記憶に保管するという形です。
短期記憶に記録できる情報量は限られていて、1ダース以上は記憶できないとされています。

プログラムを読んでいる時には、出現したキーワード、変数名などが一時的に短期記憶に格納されるということになりますが、**短期記憶は記憶できる時間と容量に制限がある**のです。


### ワーキングメモリ
ワーキングメモリは実際の思考を行う部分です。
ワーキングメモリにおいて、新しい考えやアイデア、問題の解決方法が形成されます。

プログラムを読んでいる際、長期記憶から記憶を取り出したり、短期記憶に情報を記憶したりするとともに、脳は処理を理解するために脳内でコードを実行しようとします。
このプロセスをトレースと言いますが、複雑なプログラムをトレースしようとした場合、途中で変数の値をメモしたくなることがあると思います。
脳が情報を外部に記録する必要を感じているということは、ワーキングメモリの情報がいっぱいになってしまったということです。

# 3つの認知プロセスの関係
コードを読んでいる際には、この3つの認知プロセスが働いていて、互いに補完しあっています。
短期記憶は一時的に情報を保持し、ワーキングメモリはその情報を操作するために長期記憶と連携します。
つまり、ワーキングメモリは 短期記憶と長期記憶を橋渡しする役割を果たします。

例えば、短期記憶がnという名前の変数を見つけたら、脳は長期記憶を検索し、過去に読んだ関連するプログラムの記憶を探します。
また、意味の曖昧な単語をコード中に見つけた際には、ワーキングメモリが活性化し、その文脈から正しい意味を汲み取ろうとします。

# コードを読んでいる際の混乱をどう解決するか
ここまで見てきたように、3種類の混乱は認知プロセスに関連して発生しています。
コードを読んでいる際の混乱を克服する方法について、書籍で以下の内容が取り上げられています。


### チャンク
情報を組み合わせるまとまりのことを「チャンク（塊）」といいます。
新しい情報を覚える際、脳は情報をチャンク（認識可能な塊）に分割しようとします。
**覚えた情報をチャンク化することで、　短期記憶の記憶する容量の制限を克服する**ことができます。

※コードを読む際だけでなく、読みやすいコードを書くための工夫も重要です。
チャンク化しやすいコードを書く方法として、以下の方法があります。

・デザインパターンを利用する
・コメントを書く
・ビーコンを残す（ビーコンとは、プログラマーがコードの内容を理解するのに役立つプログラムの部分のこと）

### アイコニックメモリ
情報が短期記憶に到達する前には、感覚記憶（アイコニックメモリ）と呼ばれる場所を通過し、一時的にここに記憶されます。
アイコニックメモリは視覚情報を一時的に保持する役割を持ち、瞬間的に見た情報を短時間保存できます。
コードをざっと眺めた後に「どのような構造だったか」を思い出せるのは、この記憶が働いているためです。
そのため、**コードをじっくり読む前にざっと眺めることで、短期間その構造を記憶し、後から思い出しやすくなります。**


# まとめ
本記事では、コードを読んでいる際の脳の認知プロセスに焦点を当てましたが書籍では、コードの書き方やコーディングに集中するための方法も、認知科学の観点から解説していました。

自分の脳が今どのような処理をしているのか普段考えることはありませんでしたが、脳の働きの観点から、勉強法を思考するというのは合理的なアプローチであると感じました。
単純なスキルの学習のみならず、スキルアップのための知識獲得にも努めていきたいです。