📝

技術書ログ「プログラマ脳」

2023/03/06に公開

個人的に重要だと思ったところ

サマリー

プログラムを読み書きする際、脳では大きく3つのことが行われる

  1. 「長期記憶」から情報を取得
  2. 読み書きするプログラムの情報を「短期記憶」に保存・取得
  3. 長期記憶と短期記憶を使って、「ワーキングメモリー」で処理する
    • 新しいアイディアを思いつく、問題解決、コードの理解、など

この脳の働きを最大化するための方法は次の2つ。

  • 長期記憶に知識を蓄えて短期記憶を効率よく使う
  • コードを読み書きする際のワーキングメモリの負荷対策をする

プログラミング時の脳の働き

コンピュータで例えると長期記憶はハードディスクで、短期記憶はRAMやキャッシュ、そしてワーキングメモリはプロセッサ。

プログラムを読んだり書いたりする際は、長期記憶にあるビジネスやプログラミングの情報・知識を使い、目の前の問題については短期記憶に出し入れして、ワーキングメモリで処理することで、コードを理解したり、新しいアイディアを思いついたり、問題解決をする。

長期記憶と短期記憶

長期記憶に知識を蓄えて短期記憶を効率よく使う

長期記憶に情報がないプログラムを読み書きする場合、1単語や1つの文法ごとに短期記憶を使うため、少しずつ調べながら作業を行わなければならいため時間が掛かるし脳への負荷も大きい。

反対に長期記憶に十分なビジネスやプログラミングの情報や知識があれば、プログラムをもっと大きい単位の抽象的な概念で短期記憶に保存することができ、脳への負荷も下がり、処理スピードも上がる。

長期記憶に知識を蓄える有効な方法

  • 調べる前に、頭の中で思い出そうとする
  • 長期的なスパンで、定期的に練習する
    • プログラミングの文法やコードスニペットのフラッシュカード(単語帳)を作って、定期的に見返す

コードを読む際のワーキングメモリの負荷対策

コードを読む際の負荷のを軽減させるテクニックとしては、「認知的リファクタリング」などがある

認知的リファクタリング

自分や特定の誰かにとって、その時点での読みやすい(理解しやすい)コードにリファクタリングすること。

長期的に保守性を高めるの通常のリファクタリングとは目的が異なるので、通常のリファクタリングとは逆のことをすることもある。(例えば、ラムダや無名関数の知識が少ない場合に、それを使わないコードに書き換える等)。認知的リファクタリングをした後はロールバックすればいい。

理解用のブランチを作成して、そこで認知的リファクタリングをやっていくのも良い方法。

その他のコードを読む際の負荷を下げる方法

  • 依存関係グラフや状態遷移表などの記憶補助ツールを使う
  • 変数を役割別に区別して見る
    • 固定値、ステッパー、フラグ、ウォーカー、直近の値の保持者、最も重要な値の保持者、収集者、コンテナ、フォロワー、オーガナイザー、テンポラリ
  • 文章を読むときのテクニックを用いる
    • 活性化、監視、重要性の判断、推論、可視化、自問自答、要約

コードを書く際のワーキングメモリの負荷対策

命名

脳科学の視点から見ても命名は重要なものであり、同時に命名にワーキングメモリをフル稼働させる非常に難しい作業もある。そしてプログラミング自体もワーキングメモリをフル稼働させる作業。

プログラミング中に良い名前を思いつかないことはよくあることなので。一旦仮の名前をつけて、コーディングがひと段落したタイミング(コードレビュー時など)で命名について再考・評価するといい。

フェイテルソンによる「開発者がよりよい変数名を選択するための3ステップ」を適用させることで、品質の高い名付けができるようになる。

  1. 名前に含めるべき概念を選択する
  2. 1の各概念を表す単語を選ぶ
  3. 2の単語を使って命名を行う

割り込み対策

プログラミング中に割り込みは生産性を著しく低下させるもの。というのも、割り込みが入るとプログラミング中の情報が短期記憶やワーキングメモリから消えてしまうため、再度プログラミングしていた状態に戻るまで時間が掛かってしまうから。なので割り込みに備えておくことは重要。

主な割り込み対策

  1. コーディング中の思考をメモやドキュメント、コード内のコメントに残す
  2. 完了できなかったタスクを、今後の予定として文章に書き出しておく
  3. そもそも割り込みを最小限にする (プログラミング中はslackやメールを見ない等)

感想

あまり他の技術書では掘り下げないポイントで、どうすればもっと効率よくプログラムを読んだり、プログラミングすることができるのかを書いてある本だった。聞き慣れない単語も多くて少し難しいなと感じたけど、活かせそうな内容も多くて読んで良かったと思える本だった。

長期記憶と短期記憶を関係性は一番興味深かったところ。確かに検索しながらプログラミングするのは効率悪いなと感じていた。そしてGitHub Copilotみたいなサービスが長期記憶の補助ツールになっていて、脳科学的にも効率を上げてくれるんだなと思った。

個人的なアクションプランとしては、「長期記憶化のために思い出す努力をする」と「命名のタイミングと3ステップ」、「割り込み対策」を仕事でやっていきたい。

Discussion