プログラマー脳
README
認知科学的な側面からプログラミングする際の思考プロセスなどを解き明かした本らしい。
Reactのコードの設計とかと絡めていくと面白そうな記事が書けそう
↓概要
目次
Part 1 コードをよりよく読むために
Chapter 1 コーディング中の混乱を紐解く
Chapter 2 コードを速読する
Chapter 3 プログラミング言語の文法を素早く習得する方法
Chapter 4 複雑なコードの読み方
Part 2 コードについて考える
Chapter 5 コードの深い理解に到達する
Chapter 6 プログラミングに関する問題をよりうまく解決するには
Chapter 7 誤認識:思考に潜むバグ
Part 3 よりよいコードを書くために
Chapter 8 よりよい命名を行う方法
Chapter 9 汚いコードとそれによる認知的負荷を避けるための2つのフレームワーク
Chapter 10 複雑な問題をより上手に解決するために
Part 4 コーディングにおける共同作業
Chapter 11 コードを書くという行為
Chapter 12 より大きなシステムの設計と改善
Chapter 13 新しい開発者のオンボーディング
Part1 コードをより良く読むために
「コードの読み方」は体系化されていない。
→読むことが難しい理由や、読み方の改善にできることを中心に説明
Chapter1 コーディング中の混乱を紐解く
混乱が生じている状態を認識し、それを紐解く方法について
混乱は3種類存在しているらしい(ビジネス領域における概念が理解できないという混乱や複雑なアルゴリズムを少しずつ理解していく際に生じる混乱は違う)
→そしてこれらの混乱は異なる種類の認知プロセスから生じている
混乱の種類
- 知識不足
- 情報不足
- 処理能力の不足
1つ目はだいたいビジネス領域とか言語特有・使ったことのないライブラリの処理などかな。2つ目はなにやってんだこの関数、ライブラリ...みたいに掘っていったときに全体像忘れてしまい起こりがち
個人的には3つ目はあんまなくて、1つ目と2つ目が多い気がする
これらの混乱はそれぞれ異なる認知プロセスのバグから生じるもの
→この認知プロセスは、すべて「記憶」に関連している
知識不足→長期記憶に関連する情報が不足しているor存在しない
情報不足→短期記憶に関連する問題
処理能力→ワーキングメモリー
コード読む以外にも仕様書を読む、ドキュメンを読む(これはめっちゃあると思う)、コードを書く...などすべての認知が必要な活動で関係してくる
長期記憶はすべての行動に関係している。
短期記憶は、例えばプログラムを読んでいるときに出現したキーワードや変数名、利用されているデータ構造などが一時的に格納される
→基本的に脳は2つの認知プロセスを同時に使って作業をしている
ワーキングメモリは新しい考えやアイデア、問題の解決法が形成される場所
→BASICのような手続き型の処理でいろんな変数が出てくる場合、それらを読む間に脳内でトレースを行っている。情報過多だとメモ取りたくなる
これらの認知プロセスはお互いに強く関連しあっている
Part1 コードをより良く読むために
「コードの読み方」は体系化されていない。
→読むことが難しい理由や、読み方の改善にできることを中心に説明
Chapter1 コーディング中の混乱を紐解く
混乱が生じている状態を認識し、それを紐解く方法について
混乱は3種類存在しているらしい(ビジネス領域における概念が理解できないという混乱や複雑なアルゴリズムを少しずつ理解していく際に生じる混乱は違う)
→そしてこれらの混乱は異なる種類の認知プロセスから生じている
混乱の種類
- 知識不足
- 情報不足
- 処理能力の不足
1つ目はだいたいビジネス領域とか言語特有・使ったことのないライブラリの処理などかな。2つ目はなにやってんだこの関数、ライブラリ...みたいに掘っていったときに全体像忘れてしまい起こりがち
個人的には3つ目はあんまなくて、1つ目と2つ目が多い気がする
これらの混乱はそれぞれ異なる認知プロセスのバグから生じるもの
→この認知プロセスは、すべて「記憶」に関連している
知識不足→長期記憶に関連する情報が不足しているor存在しない
情報不足→短期記憶に関連する問題
処理能力→ワーキングメモリー
コード読む以外にも仕様書を読む、ドキュメンを読む(これはめっちゃあると思う)、コードを書く...などすべての認知が必要な活動で関係してくる
長期記憶はすべての行動に関係している。
短期記憶は、例えばプログラムを読んでいるときに出現したキーワードや変数名、利用されているデータ構造などが一時的に格納される
→基本的に脳は2つの認知プロセスを同時に使って作業をしている
ワーキングメモリは新しい考えやアイデア、問題の解決法が形成される場所
→BASICのような手続き型の処理でいろんな変数が出てくる場合、それらを読む間に脳内でトレースを行っている。情報過多だとメモ取りたくなる
これらの認知プロセスはお互いに強く関連しあっている
Chapter2 コードを速読する
コードを読む時間はプログラマーの時間の60%を占める。
→コードを書くことよりも理解することに時間は費やされる
- コードにかかれているたくさんの情報を処理するのがなぜ難しいのか?
- コードをざっと読んでいるときに脳内で何が起こっているのか?を知る
- コードスニペットを速読する練習をするなどのコーディングスキルを改善するための方法を紹介
関連する情報を素早くみつける能力を高めることでコードに立ち戻る回数を減らすことが可能
→コードを読むスキルが高ければ追加情報を探すためにコード内の場所に移動する頻度も減らせる
→コードの検索にかかる時間を短くできれば、バグ修正や新機能追加に時間を費やせて、より効率的な仕事をするエンジニアになれる
コードを記憶するのが難しい理由=短期記憶の容量・保持時間が限られているから
情報を組み合わせるまとまり=「チャンク」
このチャンク=塊が短期記憶のスロットに収まる(長期記憶の中にあるリポジトリを利用して大きなまとまりに整理する)
コードにおけるチャンク化
→様々なプログラミング言語や文脈でうまくプログラムを書くことができる頭の良いプログラマーでも、長期記憶にまだほぞんされていないような不慣れなキーワード、構造、ドメインの概念を扱う際には苦労する
情報が短期記憶に到達する前に「感覚記憶」を通過する
→プログラミングの文脈で議論するために必要なのは、視覚に関する感覚記憶に限定(アイコニックメモリ)
→アイコニックメモリに記憶されたものすべてが短期記憶で処理されるわけではない
→そのためコードを読み進めていく際には、何を処理する必要があるのかを選択する必要がある
ただこの選択は意識的に行われることではなく、コードの特定の部分を意図せず見逃してしまうこともある
→つまり理論的には短期記憶で処理できる以上のコードに関する情報を我々は記憶していてそれを用いることで、コードをより効率的に読むことが可能になる
チャンク化しやすいコードを書くことで、より短期記憶に負担がかからずに記憶可能
→例えばデザパタ
コードを書くことはチャンク化へとつながるのか?
→コメントにもやっぱり大きく依存している
コードのチャンク化を容易にするためにリヨウできる最後の方法=ビーコンを含めること
→ビーコン=コードを眺めたときに目に止まり、「あぁなるほど」と思わせるようなコードの行。行の一部
→だいたい特定のデータ構造やアルゴリズム、アプローチを含んでいることが多い
変数名やクラス名、メソッド名などの識別子もビーコンになりうる
Chapter3
文法を覚える必要はないが、何を記憶しているのか?ということはコードをどれだけ効率的に処理できるのか?ということに影響を与える
→本章はプログラミングの概念をより簡単に記憶するための4つの重要なテクニックの紹介
→これらのテクニックを利用することで、プログラミングの概念をしっかりと長期記憶に留めることができるようになり、うまくチャンク化を使い、コードを上手く読み進められるようになる
調べれば良いだけというのはあまり良くない
・記憶している知識がいかに効率よくコードを読み、理解できるかに大きく影響する=多くのコードを簡単にチャンク化できる
・割り込みによる作業中断が思った以上に作業の妨げになる=Twitter徘徊など。。
記憶が完璧になるまでに、どれくらいの頻度で知識を再確認する必要があるのか?
↑
長期記憶は、特別な練習をしない限り、長期間にわたって物事を保持することができない点が問題
=なにかを読んだり、聞いたり、見たりしたあとその情報は短期記憶から長期記憶に転送されるが、長期記憶に永久に保存されるわけではない(エビングハウスの忘却曲線)
長期記憶の仕組みについて
脳内はハードディスクのような階層構造ではなく、ネットワークのように記憶を形成している
=異なる事実や記憶のつながりを意識することは大事
→要するに定期的な繰り返し学習が最も重要。これをすることで、忘却を防げる!
記憶を強化するためのテクニック
- 想起練習
- 推敲
貯蔵強度と検索強度
→貯蔵強度=特定の何かが長期記憶にどれだけきちんと保持されているかを示している
→検索強度=特定の何かを思い出すのがいかに簡単か?を示している
ある情報を繰り返し学習することで貯蔵強度は↑
自分が知っている事実を繰り返し思い出そうとすると、検索強度は増す
知らない文法を毎回しらべるというのは、よくある作業と脳がみなしてしまうため覚える必要がないものと勘違いしてしまい、検索強度が上がらない
何かを検索するときはそれを覚えようとするとよい!
精緻化=積極的に情報を考え、振り返ること。複雑なプログラミング概念を学習する際に特に効果的。
→具体的には覚えたいことを考えて、それを既存の記憶と関連付け、新しい記憶を長期記憶にすでに保存されているスキーマに適合させること
スキーマ
=思考とその関係が頭の中で整理されたもの
ワーキングメモリが情報を処理するとき、関連する事実や記憶を長期記憶で検索する
→記憶が互いに結びついていると、記憶を見つけることも容易になる。検索強度は他の記憶と関連する記憶に対して強くなる