Masayan tech blog.

  1. ブログ記事一覧>
  2. 「プログラマー脳」の要約と読んだ感想

「プログラマー脳」の要約と読んだ感想

公開日

「プログラマー脳」

この本を読むと得られるもの

  • 認知科学の観点から、「コーディング中に脳にどんな現象が起きているのか」というメカニズムが理解できる
  • 「コードの読み書きをより効率的に実践するためのテクニック」が理解できる
  • プログラミングにとって重要なスキルとしては、「数学的な能力」ではなく「自然言語能力」であるということが理解できる

以下で、全13チャプターのうち、特に学びになったと感じた箇所を抜粋

Part1 コードをよりよく読むために

Chapter1 コーディング中の混乱を紐解く

このチャプターでは、特に複雑なプログラムのコーディング中に生じる「混乱」がいかにして発生するのか、という点について理論的に説明されている

コーディング中に影響を与える認知プロセス

設計・コーディング・コードを読む、ドキュメントを作成するなどのすべての認知的活動に関連する認知プロセス
これらは同時に相互に作用しあっている

  • 長期記憶(ハードディスク)
    • 情報を長期間保持する
  • 短期記憶(RAM)
    • 情報を一時的に保持(2つから6つ程度の内容を30秒程度)
    • 情報はすぐに長期記憶として保存されるわけではなく、一旦短期記憶に保存される
  • ワーキングメモリ(プロセッサ)
    • 思考、処理
    • 長期記憶と短期記憶から情報を取り出して、処理する
    • 問題の解決方法の形成
    • コードを読んでいて、メモしたり、書き出したりする必要があるときは、「ワーキングメモリの容量がいっぱいになってしまって処理が頭の中だけでは、整理できない」状態になっている

知識不足は、長期記憶内に十分な情報がないことにより生じる。情報不足は、容量オーバーで短期記憶に収まりきらなかった場合に生じる。ワーキングメモリの問題は、複雑すぎる、あるいは量が多すぎる情報を一度に処理しようとした場合に生じる。

Chapter2 コードを速読する

このチャプターでは、「コードを速く読むための認知プロセスの使い方のコツ」について説明されています。

チャンク化の活用

  • チャンク(新しい情報を覚える際に、分割された認識可能な塊)
  • チャンクの必要性
    • 短期記憶のサイズ制限を克服できる(サイズは最大で6つ)
  • チャンクは、長期記憶に存在する知識に由来するもの
  • 根拠
    • チェスの盤面を再現する実験
    • チェスの達人は、長期記憶を利用することで、短期記憶を節約し、より精度高く盤面を再現することができた
    • 長期記憶=チェスの定石である「オープニング」の1つ。シシリアンディフェンス

コーディングにおけるチャンク化の具体例

デザインパターンを使用する

  • チャンク化しやすいコードを作成する方法として効果的なのはデザインパターンを使用すること
  • ある研究では、「プログラマーがコードにどんなデザインパターンが適用されているかについてあらかじめ知っていた場合、コードにデザインパターンがされていることが、保守作業を行う上で有効である」ということがわかっている
  • (イメージ)例えばファクトリーパターンが出てきたら、実装詳細まで確認して短期記憶を使用する必要がない。何かのインスタンスが生成されるということがだけが把握できていればいい(実装詳細を見る分の短期記憶を節約できる)

どれだけ優秀なプログラマーでも、長期記憶にまだ保存されていないような不慣れなキーワード、ドメインの概念を扱う場合には苦労する

Chapter3 プログラミング言語の文法を素早く習得する方法

このチャプターでは、プログラミング言語の文法を素早く習得するための「長期記憶への保存と取り出す際のコツ」について説明されています。

  • 言語の文法を覚える必要はない。必要な時に調べればOKという考え方
    • これは可能な限り避けた方がいい
      • パフォーマンスには長期記憶の量がポイントになるため
        • もちろん全てを記憶しようとするのではなく、重要なものだけを限定して長期記憶に残す努力をするのがいい
      • 「調べる」という作業がコーディングを中断させることにより、作業中の文脈を思い出すまでに再度コードを読み返したりするなど、非効率な努力が行われているということが研究でわかっている

そこで、可能な限り「調べる」作業を減らすには、「長期記憶への保存と取り出す際のコツ」を押さえる必要がある

「長期記憶への保存と取り出す際のコツ」

間隔をあけて繰り返す

  • 長期記憶には一定間隔で反復することが重要(複数の研究結果)
  • この手法で記憶した内容の定着率が高いことがわかっている
  • 短期間で知識を詰め込もうとするブートキャンプでは、その後頻繁に繰り返さない限り、定着しない

前提知識

忘却曲線

  • 一時間後には読んだ本の内容の半分を忘れており、2日後には25%しか長期記憶に残らない(得た情報を再利用、反復しない場合)

階層構造とネットワーク

  • 脳の中の記憶は階層構造ではなく、ネットワーク構造になっており、事実が他の関連する事実と結びついている

長期記憶から情報を取り出す際の2つのメカニズムと検索強度の強化

  • 貯蔵強度
    • 長期記憶にどれだけ正確に保存されているか
  • 検索強度
    • 長期記憶からの取り出しやすさ、見つけやすさ
  • 近年の研究では、人は決して記憶を完全に忘れることはないとされている(脳のどこかには保存されている)が、月日が経つとともに、検索強度が低下するため、「脳に保存されているが、うまく記憶から取り出せない」状態になる(=忘れる)
  • 検索強度を高めるには
    • 「忘れても積極的に思い出そうとすること」(思い出そうとするプロセスを無視して、調べてしまうと負のループ)
    • 既存の長期記憶の構成「ネットワーク構造」(=スキーマ)に適合しやすい形で覚えようとすると検索強度が高まり、思い出しやすくなる

Chapter4 複雑なコードの読み方

このチャプターでは、これまでの短期記憶、長期記憶の内容に続き、「ワーキングメモリに関する内容」について説明されています。

  • 細かくデバッグして値をメモしたり、図に書き起こしたりして整理しているのは、ワーキングメモリを超えた複雑な内容である証拠
  • ワーキングメモリは、「問題処理専用の短期記憶」
  • 短期記憶と同様、2-6程度の要素しか保持できない
  • リファクタリングや、使い慣れない言語構造を置き換える(ラムダ→通常の関数、リスト内包表記を通常のfor文に置き換える)などが効果的

Part2 コードについて考える

Chapter5 コードの深い理解に到達する

このチャプターでは、「自然言語能力とプログラミングスキルの関係性」について説明されています。

コードの理解とは

コードの理解は、以下の2つに分けられる

  • テキスト構造の理解
    • 局所的な変数の意味、一部分の処理
  • 計画の理解
    • そのプログラムを作る時に何を目指して意なのか、目的に対する理解、構成

テキスト構造の理解を深めるためのポイントは、個々の変数の役割を理解することが重要

  • ほぼ全ての変数をカバーできる11の役割
    • 固定値
    • ステッパー
    • フラグ
    • ウオーカー
    • 直近の値の保持者
    • 最も重要な値の保持者
    • 収集者
    • コンテナ
    • フォロワー
    • オーガナイザー
    • テンポラリ

役割を決定づけるフローチャート

  • 役割はプログラミングパラダイムに関係なく必ず共通で存在する
  • 役割の利点
    • コードに関する理解とコミュニケーションの効率を向上させることが可能

計画の理解を深めるためのポイントは、フォーカルポイント(プログラムのエントリーポイント)を探し、そこから変数や関数の定義にジャンプしつつ、理解を拡張していくという手順が重要

文章を読むこととコードを読むことは似ている

  • ある認知機能を作用させるために、脳のどの部分を使用しているのかについては、fMRIによって正確に把握できる
  • ある研究では、プログラミング時に「ワーキングメモリ」の他「自然言語処理」に関連する脳の領域を使用していることがわかっている
  • その後の発展的な研究において、プログラミングにおいて、どのような認知能力が重要な役割を果たすのかという研究が行われており、意外にも「数値計算能力」はわずかな相関しかなく、一方で「言語処理能力」はプログラミングスキルとの間により高い相関を示している

Part3 より良いコードを書くために

Chapter8 より良い命名を行う方法

このチャプターでは、「変数や関数の命名の重要性とより良い命名を行う用法」について説明されています。

なぜ名前が重要なのか

  • コードレビューにおける名前の役割
    • プログラマーは名前についてよく議論する。ある研究では、コードレビューの際に1000以上の発言を含む170以上のレビューを分析した結果、コードレビューの1/4が命名に関する私的であっることがわかっている。
  • 良い命名を定義するための文法
    • 「多すぎる単語」、などの命名規則に関する12個のルールが紹介されている
  • 名前はコード内で一貫していなければならない
    • 一貫性。コードベース全体で同じ意味を表す変数、関数は同じ変数名で書かれていないと、長期記憶に保存されている関連情報を見つけにくくなり、非効率になる。

Part4 コーディングにおける共同作業

Chapter11 コードを書くという行為

このチャプターでは、「プログラミングを行う際の、活動の種類や割り込みによる生産性の低下」について説明されています。

割り込みが発生すると、その後どうなるのか

  • 割り込みによる中断は、生産性を著しく低下させることがある研究でわかっている
    • 作業が中断された後、コードの編集を再開できるようになるまでに25分もかかる
  • コードを再開するまでの時間をできるだけ短縮するには、「中断前にどこまで、何をしていたか」というメモを残すこと

まとめ

いかがでしたでしょうか。本記事では「プログラマー脳」の要約と読んだ感想について紹介させていただきました。脳の働きを理解することで、日々の開発業務を効率化することができるポイントについて学習できる一冊になりますので、ぜひ皆さんも書籍を購入して学習してみてください。