プログラマー脳
『プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ』
プログラミング教育、プログラミング言語研究者のFelienne Hermansによる本
2023年2月日本語版が発売
優れたプログラマー、本書の言葉でいえば"熟達者"になるための本
コードにおける混乱の種類は3つに分けられる
知識不足
関連する情報が長期記憶に十分に存在しない
長期記憶は永遠に情報を保持するわけではない
脳の中の記憶は階層構造ではなくネットワーク構造になっている
情報不足
関連する情報が短期記憶に保持しきれない
処理能力の不足
一度の多くの情報を処理するワーキングメモリに負荷がかかる
コードを読む時だけでなくアーキテクチャ設計やドキュメンテーションといったすべての認知的活動に関係している
入ってくる情報(感覚記憶)をフィルタして短期記憶へ
長期記憶から必要な情報を取り出し、短期記憶の情報とセットでワーキングメモリで処理する
コードの速読
プログラムは人間が読むために書かれ、機械が実行するのは、そのついででなければならない
The Magical Number Seven, Plus or Minus Two
少ないスロットを有効活用するにはチャンク化が必要
熟練プログラマーは長期記憶にパターンが保存されているため、一般的なプログラムであれば短期記憶により多くの情報を蓄えられる
短期記憶に到達する前には感覚記憶(アイコニックメモリ)が存在する
I/Oバッファのようなもの
チャンク化しやすいコードを書く & 読むには
デザインパターン
コードコメント
ビーコン
コードを眺めたときに目に止まり、なるほどと思わせるようなコードの行、あるいは一部のこと
root, left, right のような語彙があれば木構造を想像する
研究においてはチャンクよりも小さいコードの部分とみなされる
複雑なコードの読み方
3つの認知負荷に対処する必要がある
リファクタリングが必要なこともある
記憶補助ツール
依存関係グラフ
状態遷移表
変数
変数の役割は11種類
ハンガリアン記法
Relating Natural Language Aptitude to Individual Differences in Learning Programming Languages
自然言語の能力がプログラミング能力の予測につながる
文章を読むこととコードを読むことは認知活動として類似しているので、同じアプローチが有効である可能性
メンタルモデル
メンタルモデルを適切に運用する
複数同時に利用する
誤ったメンタルモデルを使用していることに気づく
長期記憶とワーキングメモリの両方に存在する
フラッシュカード
プログラミングの知識を長期記憶に定着させるにはフラッシュカードが有効
割り込み
完璧に覚えなくてもインターネットで調べればいいというのはあまりよい解決策ではない
記憶している知識がコードリーディングの効率性と理解に大きな影響を与えるから
割り込みによる作業の中断が想像以上に作業の妨げになるから
Webブラウザを開いてメールを見たり、チャットツールを見たり、関連する別のページを見てしまったり
割り込みに関する研究Resumption Strategies for Interrupted Programming Tasks
マイクロソフトの調査によると62%の開発者が中断と割り込みの問題を深刻だと考えている
なぜ割り込みが悪いか
プログラミング作業にはウォームアップ、困難な作業、クールダウンの段階がある
いわゆるゾーンに入るというのはウォームアップを終えること
再開時にはコードに関するコンテクストを再構築するために意識的な努力を必要とする
あとで戻ってくるためにロードブロックリマインダと呼ばれるメモや目印を残すこともある
回復を助ける方法
メンタルモデルの保存
展望記憶を補助する
サブゴールのラベル付け
マルチタスクは自律的段階に達していない作業をしている限り不可能
記憶の強化
貯蔵強度と検索強度
学んだ直後に、積極的に情報を与えて振り返ることで記憶を強化できる
このプロセスを精緻化という
スキーマ
思考のバグ
転移のおかげで2つ目のプログラミング言語の習得は容易
ただし負の転移が起きることもある
BASICを教えるのは禁止すべき、なぜならそれは心を不自由にしてしまうから
誤認識をデバグするために概念変化を使う
メンタルモデルの置き換え、既存の考え方の根本的な変更
アンラーニング
名前重要
名前重要
名前はコードの大部分を占める
コードレビューの4件に1件は命名に関する指摘であり、識別子名に関する指摘は9%
名前は最もアクセスしやすいドキュメントである
名前はビーコンとして機能する
良い名前とは
文法を定義できる
コード内で一貫している
プロジェクト初期の命名は永続的な影響を与える
短期記憶の働きを助ける命名
バトラーのアプローチ
文法的に一貫していれば、チャンク化を助けることになる
アラニマスのアプローチ
コードベースを通して一貫していれば、名前を処理するときに認知負荷が下がる
フェイテルソンによる命名
3つのステップ
名前に含めるべき概念を選択する
それらの各概念を表す単語を選ぶ
それらの単語を使って命名を行う
この説明を聞いたのちに命名をしてもらう実験をした
学習なしに選ばれた名前よりも2:1の割合で優れていた
プログラミングの問題解決
問題解決は一般的なスキルであり、脳の中に専用のプロセスがあるという考え方があるが、汎用的なスキルでも認知プロセスでもないことが研究によりわかってきた
理由は2つある
長期記憶を活用できない場合、情報にアクセスする手段がないときに計画を立てられず、実行が難しい
問題解決という一般的な領域から他の領域への転移は非常に起こりづらい
速さ
プログラミングのための潜在記憶を増やすための段階
認知的段階
連合的段階
自律的段階
専門家になるには、専門的なことをすればいいというものではない
範例をうけとってから問題を考えたグループのほうが成績が良くなった
学習関連負荷によるワーキングメモリがいっぱいになり適切に思考ができなくなっている
良いプログラマーになりたいならとにかくたくさんプログラミングをせよ、サイドプロジェクトをいろいろ試せ、というが真実ではない
プログラミングにおける範例とは
同僚と共同作業する
GitHubを探検する
ソースコードに関する本やブログ記事を読む
オンボーディング
認知科学からみるオンボーディング
シニア開発者は専門知識の呪いにかかっており、新人に多くの新情報を投げてしまう
行動や思考が大きく異なる
新ピアジェ主義
幼児の発達段階に注目したピアジェの研究
熟達者は何らかの概念について語るときに一般的で抽象的な用語を使う
意味波
初心者の理解のプロセス
一般的で抽象度の高い概念を知る
何のために使われるか、なぜ知る必要があるのか
具体的な事例を見て理解を深める(アンパッキング)
異なる文脈や言語に適用するために抽象化する(リパッキング)
アンチパターン
ハイフラットライン: 抽象的な概念のみで理解や説明を止めてしまう
ローフラットライン: 具体的で詳細な情報だけをインプットしてしまう
下降専用エレベーター: 最後に抽象化せずに終わってしまい、長期記憶に統合するチャンスを失う
オンボーディング改善
長期記憶のサポート
関連情報のドキュメント化、インプット
ビジネス領域の学習とコードの探索を別々に行う
短期記憶のサポート
小さくて1つのことだけに特化したタスクを用意する
理解は開発よりも歓迎すべきタスクである
特定の部分を理解させたいとき、実装のタスクを与えるよりも理解するだけのタスクを割り当てる
機能の実行にかかわるタスクを書き出すとか、理解に集中してドキュメントを書くタスクなど
ワーキングメモリのサポート
ダイアグラムなどでサポート
関連推薦図書
脳について
2013 ダニエル・カーネマン Thinking Fast and Slow (邦訳: ファストアンドスロー)
広く脳について理解するための本
2015 ベネディクト・キャリー How We Learn (邦訳: 脳が認める勉強法)
間隔をおいた反復と記憶に関するトピックに深く踏み込んだ本
2014 デイビット・スーザ How the Brain Learns Mathematics
数学と抽象化の学習に関する研究を詰め込んだ本
本書に関連する科学論文
2010 Why Minimal Guidance During Instruction Does Not Work
なぜ指導中の最小限のガイダンスではうまくいかないのか
教師としての常識を覆す
2010 Toward a Developmental Epistemology of Computer Programming
コンピュータ・プログラミングの発達論的認識論に向けて
どうすればもっとうまく教えられるのか
感想記事
「プログラマー脳」の本の感想と賛辞 〜 意味波と具象と抽象と
「プログラマー脳」を読んで感覚的な部分が言語化された
『プログラマー脳』を読んだ