この記事はラクス Advent Calendar 2022の17日目の記事です。
昨日は@R9rT9tさんの新卒エンジニアがコードレビューから学んだ二つの学び(Strategyパターン編)でした。
ここ最近、認知バイアス1とか面白いな〜と、脳科学系の読み物を読んでいました。そこにプログラマにどんぴしゃな↓を見つけ、脳の働きとか知っているとプログラミングに(主に学習)に活かせそうだな、と思ったので紹介したいと思います。
はじめに
プログラミングでもなんでも、初学時に行う学習方法は人それぞれあるかと思います。僕はとりあえずやってみる派で、いじりつつ理解していくのを好んでいます。本は好きで、技術本も読みますがそこれだけで学習した気にはなりません。
と、自分のスタイルを書きましたが、ここでは学習法の内容や良し悪しについては触れません。習熟者の脳(記憶)がどう働き使われているのかを考察し、初学者が学習の末に目標となる姿を探ります。その題材として、コードリーディング時の脳を見ていきたいと思います。
記憶のしくみ
まずは記憶について説明していきます。僕がざっくりしか理解していないので、こんな感じなんだくらいで見ていただけると🙇♂️
科学的に記憶には以下の3つの種類があるとしているようです。
- working memory(日本語: ワーキングメモリ、感覚記憶など)
- 瞬間瞬間に人が影響を受ける物全てが書き込まれ、瞬間的に処理(フィルター含め)される - short-trem memory(日本語: 短期記憶)
- 直前に処理されたモノが書き込まれる
- 揮発性で長時間覚えておくことはできず5、6個程度のモノしか保持できない - long-term memory(日本語: 長期記憶)
- 大量(無限)のモノを書き込むことができる
- 読み出すのが遅い(思い出せない)
- 自分の名前のように何度も参照するモノ、重要なモノなどすばやく読み出せるモノもある
コードリーディングを例にどのように記憶が使われるのかを見ると↓のようになり、だいたいPCと同じような感じかと。ワーキングメモリはCPU
、短期記憶はメモリ
、長期記憶はHDD(SSD)
と僕はざっくり認識しています。
- 開いたファイルから文字、単語を追っていくときまずはワーキングメモリに格納され、それが何を表すのか処理(理解)しようとします
- ワーキングメモリ上に情報が足りないとき、短期記憶→長期記憶の順で記憶を探しワーキングメモリに読み出し、処理します
- 処理された情報は短期記憶に移動されます
- 短期記憶から長期記憶に移動されます
記憶の単位
ここでモノ
としているのは記憶の単位が決まっていないためです。人により同じコードを見てもそれを文字の集まりと認識するか、単語の集まりと認識するか、1枚の画像として扱うか違ってきます。
例として、以下のコードで考えます。
public static void main(String[] args) {
System.out.println("Hello, world!");
}
このコードを、p
,u
,b
,l
,i
,c
と語として扱ったとしたら、短期記憶の容量は5,6個です。それだけで溢れることになります。
public
,static
,void
,main
のように単語で扱え流ことができれば短期記憶は溢れませんし、長期記憶と併用できればもっと長いプログラムも読み進めることができるでしょう。
さらに以下のようにmainブロックと、中で実行されるコードをそれぞれモノとして扱うことができれば容量を2つしか消費しません。
// 1
public static void main(String[] args) {
}
// 2
System.out.println("Hello, world!");
習熟者を目指すには
記憶の観点から見たとき、初学者と習熟者の違いとしては単純な知識量と、長期記憶として書き込む単位(ここでは質と言った方が適切かもしれません)があります。知識量は学習を進めていく上で得られていくと思いますが、それをどう使える単位として記憶できるかがカギになるように思います。
使えるとはどういうことか。例えばデザインパターンを知っていて記憶していても、読んでいるコードがそれを使用しているかどうかに気付けなければ使えるとは言えません。使用に気付き、理解し、読み飛ばせるようになって使えると言えそうです。
そのためにはどうするのか。なるべく大きな塊でパターン化して記憶すること、それを読み出せるようにすること。例えば、// TODO
さいごに
はじめに勉強方について触れましたが、どんな勉強法をしても全ては自分の記憶に書き込まれます。脳の仕組みを知ることで、効率的に学習できるといいですね。