プログラマー脳 〜優れたプログラマーになるための認知科学に基づくアプローチ(Felienne Hermans)
書籍情報
- 著者:Felienne Hermans(著), 水野貴明(訳), 水野いずみ(監訳)
- 発行日:2023-02-16
- ISBN:9784798068534
- URL:https://www.shuwasystem.co.jp/book/9784798068534.html
書籍目次
- Part 1 コードをよりよく読むために
- Chapter 1 コーディング中の混乱を紐解く
- 1.1 コードにおけるさまざまな種類の混乱
- 1.1.1 混乱のタイプその1:知識不足
- 1.1.2 混乱のタイプその2:情報不足
- 1.1.3 混乱のタイプその3:処理能力の不足
- 1.2 コーディングに影響を与えるさまざまな認知プロセス
- 1.2.1 長期記憶とプログラミング
- 1.2.2 短期記憶とプログラミング
- 1.2.3 ワーキングメモリとプログラミング
- 1.3 それぞれの認知プロセスが協調的に動作する仕組み
- 1.3.1 認知プロセスの相互作用の概要
- 1.3.2 プログラミング作業に関係する認知プロセス
- 本章のまとめ
- 1.1 コードにおけるさまざまな種類の混乱
- Chapter 2 コードを速読する
- 2.1 コードの速読法
- 2.1.1 今、あなたの脳内で何が起きたのでしょうか?
- 2.1.2 再現したコードを見直しましょう
- 2.1.3 2回目のコード再現の振り返り
- 2.1.4 なぜ馴染みのないコードを読むのは難しいのか?
- 2.2 記憶のサイズ制限を克服する
- 2.2.1 チャンキングの威力
- 2.2.2 熟練プログラマーは初心者よりもコードをよりも上手に記憶できる
- 2.3 読めるコードよりも見えるコードのほうが多い
- 2.3.1 アイコニックメモリ
- 2.3.2 何を覚えているのかではなく、どのように覚えたか
- 2.3.3 チャンク化の練習
- 本章のまとめ
- 2.1 コードの速読法
- Chapter 3 プログラミング言語の文法を素早く習得する方法
- 3.1 文法を覚えるためのテクニック
- 3.1.1 割り込みがワークフローを混乱させる
- 3.2 フラッシュカードを使って文法を素早く覚える
- 3.2.1 フラッシュカードを利用するタイミング
- 3.2.2 フラッシュカードのセットを拡張する
- 3.2.3 フラッシュカードのセットについて考える
- 3.3 物忘れを防ぐには
- 3.3.1 なぜ我々の記憶は失われてしまうのか?
- 3.3.2 間隔をあけて繰り返す
- 3.4 文法を長く記憶に留めるには
- 3.4.1 情報を記憶する2つの形態
- 3.4.2 情報をただ見るだけでは不十分
- 3.4.3 情報を覚えることで記憶が強化される
- 3.4.4 能動的に考えることで、記憶を強化する
- 本章のまとめ
- 3.1 文法を覚えるためのテクニック
- Chapter 4 複雑なコードの読み方
- 4.1 複雑なコードを理解するのが難しい理由
- 4.1.1 ワーキングメモリと短期記憶の違いは何か
- 4.1.2 プログラミングに関連する認知的負荷の種類
- 4.2 認知的負荷を軽減するテクニック
- 4.2.1 リファクタリング
- 4.2.2 使い慣れない言語構造の置き換え
- 4.2.3 同義で書き方の違うコードはフラッシュカードデッキの非常によい追加要素
- 4.3 ワーキングメモリに負荷がかかっているときに使える記憶補助ツール
- 4.3.1 依存関係グラフを作成する
- 4.3.2 状態遷移表の利用
- 4.3.3 依存関係グラフと状態遷移表を組み合わせる
- 本章のまとめ
- 4.1 複雑なコードを理解するのが難しい理由
- Chapter 1 コーディング中の混乱を紐解く
- Part 2 コードについて考える
- Chapter 5 コードの深い理解に到達する
- 5.1 「変数の役割」フレームワーク
- 5.1.1 違う変数は違う目的を持つ
- 5.1.2 ほぼすべての変数をカバーできる11の役割
- 5.2 役割とパラダイム
- 5.2.1 役割を見付けることの利点
- 5.2.2 ハンガリアン記法
- 5.3 プログラムに関する知識を深める
- 5.3.1 文章の理解と計画の理解
- 5.3.2 プログラムの理解に関するさまざまな段階
- 5.4 文章を読むこととコードを読むことは似ている
- 5.4.1 コードを読む際に脳内では何が起こっているのか
- 5.4.2 もしフランス語を学べるなら、Pythonも学ぶことができる
- 5.5 コードを読む際にも適用可能な文書理解の戦略
- 5.5.1 過去の知識の活性化
- 5.5.2 監視
- 5.5.3 コード中のどの行が重要なのかを判断する
- 5.5.4 変数の名前の意味を推論する
- 5.5.5 可視化
- 5.5.6 自問自答
- 5.5.7 コードの要約
- 本章のまとめ
- 5.1 「変数の役割」フレームワーク
- Chapter 6 プログラミングに関する問題をよりうまく解決するには
- 6.1 コードについて考えるためにモデルを利用する
- 6.1.1 モデルを利用することの利点
- 6.2 メンタルモデル
- 6.2.1 メンタルモデルを詳しく検討する
- 6.2.2 新しいメンタルモデルを学ぶ
- 6.2.3 コードについて考えている際にメンタルモデルを効果的に使う方法
- 6.3 想定マシン
- 6.3.1 想定マシンとは何か
- 6.3.2 想定マシンの実例
- 6.3.3 さまざまなレベルの想定マシン
- 6.4 想定マシンと言葉
- 6.4.1 想定マシンの拡張
- 6.4.2 想定マシン同士がメンタルモデルを作り出す場合
- 6.5 想定マシンとスキーマ
- 6.5.1 なぜスキーマが重要なのか
- 6.5.2 想定マシンは意味論的なものか
- 本章のまとめ
- 6.1 コードについて考えるためにモデルを利用する
- Chapter 7 誤認識:思考に潜むバグ
- 7.1 2つ目のプログラミング言語を学ぶのは、最初の言語を学ぶよりも、なぜ簡単なのか
- 7.1.1 既知のプログラミングに関する知識を最大限活用する方法
- 7.1.2 転移の種類
- 7.1.3 すでに持っている知識は呪いか幸いか
- 7.1.4 転移の難しさ
- 7.2 誤認識:思考の中のバグ
- 7.2.1 概念変化で誤認識をデバッグする
- 7.2.2 誤認識の抑制
- 7.2.3 プログラミング言語に関する誤認識
- 7.2.4 新しいプログラミング言語を学習する際の誤認識を防ぐ
- 7.2.5 新しいコードを読む際の誤認識を診断する
- 本章のまとめ
- 7.1 2つ目のプログラミング言語を学ぶのは、最初の言語を学ぶよりも、なぜ簡単なのか
- Chapter 5 コードの深い理解に到達する
- Part 3 よりよいコードを書くために
- Chapter 8 よりよい命名を行う方法
- 8.1 なぜ名前が重要なのか
- 8.1.1 なぜ名前が重要なのか
- 8.1.2 命名に対するさまざまな考え方
- 8.1.3 初期の命名の慣習は永続的な影響を与える
- 8.2 命名の認知科学的側面
- 8.2.1 短期記憶の働きを助ける名前の形式
- 8.2.2 長期記憶の働きを助ける明快な命名
- 8.2.3 変数名には理解を助けるためのさまざまな情報が含まれている
- 8.2.4 名前の品質は、いつ評価すべきか
- 8.3 どんな名前が理解しやすいのか
- 8.3.1 略すべきか、略さざるべきか?
- 8.3.2 スネークケースか、キャメルケースか?
- 8.4 名前がバグに与える影響
- 8.4.1 よくない名前が使われているコードはバグを生みやすい
- 8.5 よりよい名前を選ぶには
- 8.5.1 名前の雛形
- 8.5.2 フェイテルソンによる、よりよい変数名のための3ステップのモデル
- 本章のまとめ
- 8.1 なぜ名前が重要なのか
- Chapter 9 汚いコードとそれによる認知的負荷を避けるための2つのフレームワーク
- 9.1 臭いのあるコードは、なぜ認知的負荷が大きいのか
- 9.1.1 コードの臭いの簡単な説明
- 9.1.2 コードの臭いは認知にどんな悪影響を及ぼすか
- 9.2 悪い名前が認知的負荷に与える影響
- 9.2.1 言語的アンチパターン
- 9.2.2 認知的負荷を測定する
- 9.2.3 言語的アンチパターンと認知的負荷
- 9.2.4 なぜ言語的アンチパターンは混乱をもたらすのか
- 本章のまとめ
- 9.1 臭いのあるコードは、なぜ認知的負荷が大きいのか
- Chapter 10 複雑な問題をより上手に解決するために
- 10.1 問題解決とは何か
- 10.1.1 問題解決を構成する要素
- 10.1.2 状態空間
- 10.2 プログラミングの問題を解決する際に長期記憶はどのような役割を果たすのか
- 10.2.1 問題解決は、それ自体が認知プロセスなのか
- 10.2.2 長期記憶に問題解決を教える方法
- 10.2.3 問題解決において重要な役割を担う2種類の記憶
- 10.3 自動化:潜在記憶の形成
- 10.3.1 時間経過と潜在記憶
- 10.3.2 自動化するとなぜプログラミングが速くなるのか
- 10.3.3 潜在記憶の改善
- 10.4 コードとその説明から学ぶ
- 10.4.1 新しいタイプの認知的負荷:学習関連負荷
- 10.4.2 実世界で範例を活用する
- 本章のまとめ
- 10.1 問題解決とは何か
- Chapter 8 よりよい命名を行う方法
- Part 4 コーディングにおける共同作業
- Chapter 11 コードを書くという行為
- 11.1 プログラミング中のさまざまな活動
- 11.1.1 検索
- 11.1.2 理解
- 11.1.3 転写
- 11.1.4 増強
- 11.1.5 探索
- 11.1.6 デバッグはどう分類するか
- 11.2 中断されるプログラマー
- 11.2.1 プログラミング作業にはウォームアップが必要
- 11.2.2 割り込みが発生すると、その後どうなるのか
- 11.2.3 割り込みに備えるためのよい方法
- 11.2.4 プログラマーに割り込みを行う場合
- 11.2.5 マルチタスクに関するいくつかの考察
- 本章のまとめ
- 11.1 プログラミング中のさまざまな活動
- Chapter 12 より大きなシステムの設計と改善
- 12.1 コードベースの特性を調べる
- 12.1.1 認知の特性
- 12.1.2 CDCBを利用してコードベースを改善する
- 12.1.3 設計上の処置とそのトレードオフ
- 12.2 特性と活動
- 12.2.1 特性がそれぞれの活動に与える影響
- 12.2.2 想定される活動のためにコードを最適化する
- 本章のまとめ
- 12.1 コードベースの特性を調べる
- Chapter 13 新しい開発者のオンボーディング
- 13.1 オンボーディングプロセスにおける問題点
- 13.2 熟達者と初心者の違い
- 13.2.1 初心者の行動をより深く理解する
- 13.2.2 概念を具体的に見るか抽象的に見るかの違い
- 13.3 オンボーディングプロセスを改善するための活動
- 13.3.1 タスクにおけるプログラミングに関する活動を1つに限定する
- 13.2.2 新人の記憶をサポートする
- 13.3.3 コードを一緒に読む
- 本章のまとめ
- Chapter 11 コードを書くという行為
- 本書を締めくくるにあたって