『プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ』と言う本を読んだ時のメモです。
積み本そっちのけで読む pic.twitter.com/6XuNOV4aXs
— れ (@reiichii01) February 27, 2023
きっかけ
Goを勉強している時や仕事の中で、なんとなくコーディングに苦手意識がありました。そんな折にたまたまこの本を知って、息抜きがてら読んでみました。
ざっくりとした感想
自分の場合、脳への負荷が高くなると思考が停止してしまうことが多いのですが、そんな時に今の作業や状態をなるべく小さい単位で把握できると、どこが課題なのかどう対処できそうか考えを進めることができるので、それを実践していきたいと改めて思いました。本の各章に様々な課題に役に立ちそうなtipsが残っていたので、そういった状況に直面したタイミングで、使えそうだなと思ったものをちゃんと思い出せるようにしたいです。
本に出てくる「チャンク化」や「メンタルモデル」のなどは、コーディング以外のところではやっている自覚はあって、ただ自分ではそういうことをしているという自覚はなかったので、無意識だったものを言語化して把握することができました。
他にもオンボーディングの話や、初学者と熟練者の取り組み方の比較など書いてあったので、自分よりも若手の人に教えたりする機会にも役に立ちそうな内容が多く含まれていました。
複数人に対してどんな風に変数の命名をするか課題を出して結果を比較するなど、プログラミング関連の研究事例が多数紹介されていたのも面白かったです。世の中にこんな研究している人たちがいることを知って目から鱗でした。
内容
とりわけ印象に残っているところを中心に、自分が思い出す用途のものです。ただ内容をしっかり説明できるほど理解はできていないので、一旦そう言うものがあるのかも程度に留め、必要に応じて該当箇所を読み返したいです。
第1章 コードをよりよく理解するために
この章ではコーディング時に発生する認知負荷についてどんなものがあるのか、またそれらがどう影響し合っているのか、それらを踏まえてコードを読みやすくするためにできる工夫などが書かれていた。
- コードを読む時の認知負荷
- 知識不足
- 情報不足
- 処理能力の不足
- 記憶のチャンク化
- ビーコンなど、記憶を容易にする工夫をすると良い
負荷が高いと感じる時に、何によるものなのか自分が把握できると良いのかもと思った。
第2章 コードについて考える
この章では第1章の認知負荷の話を踏まえて、コードをより理解するためのアプローチ方法について書かれていた。
- 変数の役割11パターン
- 固定値
- ステッパー:ループ処理の際に使われるiのようなもの
- フラグ
- ウォーカー:ステッパーと同様にデータを走査する際に使用されるが、ステッパーのように何が入るか予測しにくいもの。配列のインデックスだったり、ポインタだったり
- 直近の値の保持者:例えばファイルから読み込んだ行など
- 最も重要な値の保持者:反復処理の中などで目的の値を保持するもの
- 収集者:データを一つの変数に集約させている時に使うもの
- コンテナ:リストや配列など、複数要素を保持するもの
- フォロワー:アルゴリズムなどで、前や次の値を保持して、他の変数とセットで利用されるもの
- オーガナイザー:値を並べ替えたり、異なる形式で保存するためだけに使われるもの
- テンポラリ:短期間だけ使われるもの
- コードを読む際にも適用可能な文書理解の戦略
- 活性化:関連する事柄を積極的に考え、過去の知識を活性化させる
- 監視:理解度を把握し続ける
- 重要性の判断
- 推論
- 可視化
- 自問自答
- 要約
- メンタルモデル
- より良い変数名のための3ステップ
- 命名に含める概念を選択する
- 概念を表す単語を選択する
- 単語を使って命名を行う
変数の役割11パターンは自分考えたことなかったけど、言われてみれば役割は何パターンかに集約されそう。
第3章 より良いコードを書くために
この章では理解しやすいコードを書くにはどうするか、またその逆として理解しにくいコードにはどういう特徴があるか、といった内容が書かれていた。
- コードの臭い
- 「巨大なクラス」や「長過ぎるメソッド」など、リファクタリング本で取り上げられているものが紹介されていた
- 範例(work example)。問題解決能力を養うには、公式だけではなく、公式を使ってどうやって解いたかも合わせて教えてもらったグループの方が点数が高くなる傾向にあると言う教育系の研究事例がある。
リファクタリング本は読もうと思っていて積んでいたので、内容を少し知れて参考になった。
今までの章を読んでこの章を読むと、分かりやすい命名によって受けられる恩恵の大きさを再認識できた気がする。
第4章 コーディングにおける共同作業
この章では開発者個人からさらに視野を広げて、チームで開発する際に新しい人が参画しやすくする方法などについて書かれていた。
プログラミングの中の様々な活動
- 転写
- 探索
- 理解
- 検索
- 増強:検索・理解・転写を組み合わせて新しい機能を作ること
コードの理解のしやすさの指標
- エラーの発生しやすさ
- 一貫性
- 拡張性
- 隠された依存関係
- 暫定性
- 粘性
- 段階的評価
- 役割表現力
- マッピングの近接度
- ハードな心的操作
- 副次的表記
- 抽象化
- 視認性
表記法の認知特性(cognitive dimentions of notation)と言うものを、コードを対象に拡張したもの。ただしこれらは全部を満たせれば良いと言うものではなく、トレードオフの関係になるものもある。
新人のオンボーディングにあたって、認知負荷が高いことを覚えておく必要がある。熟練者は習得にかかった負荷を忘れてしまうもの
エンジニア1年目の自分は熟練のプログラマーは頭の中で全てコーディングを完結させているものだと思っていたので、1年目の自分にこれを教えてあげたかった。