プログラマー脳 ⑤ Chapter 5 コードの深い理解に到達する

今日から、Part 2 「コードについて考える」らしい。

これまでの Part 1 は「コードをよりよく読むために」だったらしい。

Part 3 は「よりよいコードを書くために」、Part 4 は「コーディングにおける共同作業」とのこと。

本日は、PC を使えない時間が多かったため、まず本章を一読した。

今から読み直していく。

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

《本章の内容》

  • 変数の様々な役割を理解する

  • コードの構造を理解することと意図を理解することとは異なることを理解する

  • 自然言語の理解とコードの理解とを比較する

5.1 「変数の役割」フレームワーク

  • フィンランド大学のサヤニエミ教授によれば、プログラマが変数を理解しにくいのは、変数と関連付ける良いスキーマを長期記憶の中に持ち合わせていないからだ、とのこと。
    • なるほど、納得。まあ、薄くは意識しているだろうけれども、もっとはっきりと意識すると良さそう
    • つまり、変数用のスキーマをもつことが重要

5.1.1 違う変数は違う目的を持つ

5.1.2 ほぼすべての変数をカバーできる 11 の役割

  • 固定値
  • ステッパー
  • フラグ
  • ウォーカー
    • 配列中の要素を示すためのインデックスなどが該当
      • ChatGPT に聞いてまずまず分かった
  • 直近の値の保持者(Most recent holder)
    • 封筒マークで表される
  • 最も重要な値の保持者(Most wanted holder)
  • 収集者(Gatherer)
    • これも分かりにくい。和とか。
  • コンテナ
    • 要は配列的なもの
  • フォロワー
    • "current" に対して "previous" というような形で保持されがちなヤツ
  • オーガナイザー
    • 単なるコンテナではなく、その中の順序の管理などまで担う
  • テンポラリ

これ、前回読んだ際も有意義な感じがしたんだけど、いざとなるとなかなか意識しないんだよな…

意識的かつ積極的にやらねば

5.2 役割とパラダイム

5.2.1 役割を見つけることの利点

  • 前述の役割の一覧を認識することで、変数について議論する際の分かりやすいカテゴリーが与えられる
    • チーム内でのコミュニケーションの効率を向上させてくれる素晴らしいツールになる
    • 輪読会などで共通認識を築けていると楽なヤツ

5.2.2 ハンガリアン記法

  • strName → この "Name" の型は string だよ、というような記法

5.3 プログラムに関する知識を深める

  • これまで本書で学んできた手法は、有効ではあるが、局所的
    • コードの構造は理解しやすくなるが、そもそものコードの目的や意図を理解するための助けにはならない

5.3.1 文章の理解と計画の理解

5.3.2 プログラムの理解に関するさまざまな段階

  • コードを読む時は、多くのプログラマーが、フォーカルポイント と呼ばれる場所から読み始める
    • c でいう main() とか
    • もしくは、チェックしているコード範囲における中心的な部分

《コードへの深い理解のための段階の適用》

  • あるコードの箇所についての関連箇所を スライス という

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

本章の残りの部分では、以下のことを見ていく

  • コードを読むことと文章を読むことがいかに似ているか
  • 文章を読むためのテクニックの中で、コードリーディングにも応用可能なものにはどのようなものがあるか

5.4.1 コードを読む際に脳内では何が起こっているのか

《コードが脳内でどのように処理されるかを fMRI で分析する》

  • ある実験で出た結果
    • 「ワーキングメモリ」と「自然言語処理」とをそれぞれ担う脳の働きが重要
    • たとえ変数名が難読化されていても、参加者はコードの変数以外の要素を自然言語を読むのと同じように読んで、そこから意味を引き出そうとした

5.4.2 もしフランス語を学べるなら、Python も学ぶことができる

  • 数学の能力はあまりプログラミングの能力と連動していないような実験結果が出た

プログラマーがコードを読む時、まず全体をスキャンする》

  • まあ、文章と比べると、コードではそうせざるを得ない感があるような?
    • むしろ、自分は、文章を読むときにスキャンの作業が足りていないような気がする

5.5 コードを読む際にも適用可能な文書理解の戦略

5.5.1 過去の知識の活性化

5.5.2 監視

  • コードのどの行を理解でき、どの行がよく分からなかったのかを、印を付けることで分別する

5.5.3 コード中のどの行が重要なのかを判断する

5.5.4 変数の名前の意味を推論する

  • コード中の変数名について、次の二種類に分類する
    • ビジネス領域に関係するもの
      • startTime, endTime など
    • プログラムの概念に関係するもの
      • tree や list など
        • 純粋にこちらの要素のみというものは、自分が業務で扱っているコードでは少なそう

5.5.5 可視化

5.5.6 自問自答

5.5.7 コードの要約

本章のまとめ

  • 変数の役割を把握することで理解が捗る
  • 「構造の理解」と「計画の理解」という理解の種類がある
  • コードリーティングと文章読解は似ている

個人的には「コードリーディングと文章読解が似ている」と言われても、だから何だ、という感がある。 その後の、「文章読解でのテクニックはコードリーティングにも応用可能」というものも、無理やり感があるような気がして、眉唾というか、実践してみようと感じにくく、この箇所を読む上でも食指が動きにくかった。