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