「プログラマー脳」という本を読んだ!風変わりで面白かったのでメモ!
「プログラマー脳」という本を読みました。
技術本としては風変わりで面白かったので、せっかくなのでメモしておきます。
(雑な解釈なので「それ違うんじゃね?」があるかもです。その場合は指摘してくれるとうれしいです)
📖どういう本か
ザックリ言うと
科学的にいうとプログラマはこういう感じでコードを書いたりしてるので、こういうことを意識すると効率が上がるかもね!
みたいな内容を書いてる本です。
🧠人がコードを読むときの脳内
人がコードを読んでいるとき、どのようなことが脳内で起こっているのでしょう?
・・・という感じの説明からはじまります。
▲こういう流れらしい
まずコードを読むと、目を通して「感覚記憶」というところに情報が入るらしいです。(1の部分)
「感覚記憶」って何?という話ですが、たとえば写真をパッと一瞬だけ見せられたとしても、脳裏に残像が少しだけ残ってる感があったりしますよね?このとき記憶されている領域のことを「感覚記憶」と呼ぶらしいです。
「感覚記憶」に情報が入ったら、次は「感覚記憶」の中から「これは必要そうだな」と思った情報を「短期記憶」として脳にロードします。(2の部分)
それから今までストックしてきた脳の「長期記憶」も参考にしつつ、「ワーキングメモリ」と言われる脳の作業スペースみたいなところで「あーでもない、こーでもない」とコードをヒモ解いていく。(3と4の部分)
・・・みたいな流れで人はコードを読んでいるらしいです。
👀用語
いろいろな用語が出てきたので整理します。
短期記憶
脳で「えーと・・・」と考える間に覚えておける記憶のこと。
パソコンで言うとメモリみたいな感じ。
感覚記憶から「これは必要そうだ」と思った情報を取り込む場所らしい。
短期記憶の上限は2~6個で、考え終わったら忘れるらしい。
長期記憶
ずっと覚えておける記憶のこと。
パソコンで言うとHDD(SSD)みたいな感じ。
ワーキングメモリ
短期記憶と長期記憶をもとに「あーでもない、こーでもない」みたいに考えて処理する部分こと。
パソコンで言うとCPUみたいな感じ。
「メモリって名前が付いてるのにCPU?」と思うかもですが、CPUにも超高速に動作するレジスタという記憶領域があるので、あながち間違ってないかもです。
「ワーキング→CPU」「メモリ→レジスタ」みたいに分けて考えると良いかも。
感覚記憶
人間の感覚器官(目/鼻/皮膚など)から得られる記憶のこと。
一気にいっぱい記憶できるけど一瞬で忘れるらしい。
パソコンで言うと何だろ。マイクみたいな入力デバイスかな。
🤔長期記憶 →1番大事
さきほどの用語の中で、プログラマの能力として1番大事なのが「長期記憶」。
たとえば、「for文をしってる」「SQLをしってる」とかそういう話です。そりゃ1番大事だよねっていう。
つぎに大事なのが「ワーキングメモリ」。
これは、いろいろな情報をもとに「あーでもない、こーでもない」と考えて「これだ!」と答えを導き出す能力のこと。
これも「そりゃそうだよね」って感じです。
ここで重要なのは「ワーキングメモリ」は持って生まれたものなのであまり伸ばすことができないのに対し、「長期記憶」は努力次第で誰でも増やすことができる・・・という点です。
そんなわけで、コードを効率的に読み解いていくには、いかに「長期記憶を増やすか」が重要らしい。
📁情報をチャンク(塊)としてまとめれるようにする
コードを効率的に読み解くには「情報をいかにチャンクとしてまとめるか」という考えも重要らしい。
たとえば、藤井聡太vs羽生善治が戦ったあとの将棋の盤があるとします。
その盤に並んでいるコマを見せられて「この状態を記憶してください」と言われたとします。
すると、大抵の一般人は「◯番目のマスに飛車があって、△番目のマスに~」みたいな感じで記憶します。
ですが、将棋のプロはこういう風に記憶はしません。
将棋のプロの場合、「このコマの配置は◯◯年の◯月に戦ったときの形に似てるな。あのときと違うのはこの部分か」みたいな感じで記憶するらしいです。
このとき重要なのは、「コマを覚える」という同じタスクのはずなのに、一般人のほうは覚える情報が多いのに対し、プロのほうは少しの情報を覚えるだけでいい点です。
要するに、プロのような考え方だと短期記憶をほとんど使わずに済むということ。
これをプログラミングにも応用してみます。
たとえば膨大なコードなあって「うわー全然わかんねー」な状況だったとします。
この状況でも、長期記憶をもとに「これってオブザーバーパターンじゃね?」みたいに気づくことができれば「この部分のコードはこういう役割だな!」という感じで、少し情報を記憶するだけでよくなります。
結果、短期記憶を少ししか使わずに済みます。
なので、「長期記憶をもとにいかにチャンクとなる情報を作り出せるか」というのが重要ということです。言い換えると「短期記憶をいかに節約できるか」が重要とも言えます。
ちなみに「将棋のプロはそんな風に記憶はしない」と言いましたが、将棋のプロでも完全ランダムにコマを置かれている場合は、一般人と同じような方法で記憶するしかないそうです。
🌊長期記憶の2つの性質
長期記憶には以下の2つの性質があるらしい。
- 貯蔵強度:長期記憶にどれだけきちんと保存されているか
- 検索強度:思い出すのがいかに簡単か
たとえば、正規表現の.
とか+
って、一度調べると「あーなるほどね」とすぐに理解できますが
次に使おうとすると「なんだっけ?」となって、調べ直すと「あーはいはいそうだった」ってなりますよね。
こういう情報は「貯蔵強度は強いけど、検索強度は低い」と言えるらしい。
どちらの性質も、ひたすら情報にふれることで強度が増すらしい。
そして、情報に触れる頻度は「短期間だけど毎日」より、「たまにしかやらないけど長期間」の方が良いらしい。
あと、検索強度については「思い出そうとする行為そのもの」によっても強度をあげれるらしい。
なので、「分からないからすぐにググる」をやると検索強度は上がりにくいらしい。
ちなみに貯蔵強度は上がることはあっても下がることはなくて、検索強度はどんどん落ちていく一方らしい。
📦記憶する前に情報を精緻化(せいちか)する
「Aは◯◯です」というのをそのまま覚えようとすると、長期記憶には記憶されにくい。
「Aは◯◯です」を調べた後は、以下をすると記憶されやすいらしい。
- 長期記憶にある情報と結びつける
- たとえば、もともとBを知っていたとしたら「Bって実はAの一瞬なんじゃね?」みたいに脳内で関連付ける
- 深ぼる
- たとえば、「Aは◯◯らしいけどAは△△でもあるんじゃね?てことはこれらはこういう関係ってことか!」みたいに深掘って自分の中で関連付ける
要するに、情報をより正確に詳細で理解しやすい形に変えること。
これをすると記憶されやすいらしい。
脳はネットワークみたいな感じで色々な情報を繋げてるらしいので、つながりを無理やり作ってやると覚えやすいんだとか。
👨💻プログラマとして才能があるかどうか
プログラマの能力として大事なのは「長期記憶」と「ワーキングメモリ」でした
それに対して「プログラマとしての"才能"があるかどうか」は、以下の2つが大きく影響しているらしいです。
- ワーキングメモリ
- 言語能力
ワーキングメモリは、どちらにせよ重要らしいです🤔
言語能力については、言葉を理解する能力みたいな感じです。
たとえば文章を読み解く能力が高かったりとかそういうのです。
強いエンジニアほど公式ドキュメントを隅々まで読んで「それドキュメントに書いてたよ」みたいなムーブをしがちだと思いますが、言語能力が高いゆえの行動かもですね。
ちなみに、プログラマとして"才能"に数学的能力はほとんど関係ないらしいです。
📚続きは本で
他にもいろいろ書いてたのですが、特に「おもしろいなー」と思ったところはこんなところです。
気になった人は読んでみてください。
\ PR /
プラハではエンジニアやデザイナーをとても募集しています。
すごくいい会社です。興味がある人はとても応募してください。
「この本の輪読会やろうよ」なノリもあります。たのしいです。本は会社のお金で買えます。
きて。
Discussion