全体の感想
副題に「認知科学に基づくアプローチ」とあって、絶対面白そう!と思いつつも、本当に役に立つことが書いてあるのかな…と懐疑的でなかなか購入には至りませんでした。図書館にあることがわかったので、予約をしていてようやく読めました。
結果、すごく面白かった!これは手元に持っておきたいので購入しましたし、人にも勧めていきたい。
タイトルは「プログラマー脳」ですが、副題の「優れたプログラマーになるための認知科学に基づくアプローチ」というのが本の内容をよく表していると思いました。人間の認知のしくみについて、文献や研究を示しながら説明し、それをもとにどうやったらプログラミングスキルが向上するかについてわかりやすく書かれています。翻訳も良くて読みやすかったです。
プログラミングをしていると、コードを書くことと同じかそれ以上にコードを読むことが重要だと思います。この本ではまずコードを読むことについて、認知科学をもとにコツを説明してくれます。この「認知科学的にコードを速読するポイント」は、「認知科学的に読みやすいコードを書くポイント」と表裏の関係にあるので、前半の「読む」パートが理解できていると、後半の「書く」パートの内容がどんどん頭に入ってくると思います。
また、文法を効率的に覚える方法として、「フラッシュカード(単語帳)」を薦めています。
ここで、「知らない単語を都度検索するのはよくない!」ということが書かれていて目から鱗でした。調べるという行為は脳にとっては良くある作業なので、文法を覚える必要がないと感じてしまい、その情報の検索強度が弱いままになってしまうということです。そのため、単語帳にして、間隔を空けて繰り返し何度も学習し、知っている事実を繰り返し思い出そうとすることが、覚えるポイントとのことです。
プログラミングに関するアプローチについての本ですが、普通に勉強一般についても役立つことがたくさん書かれていて、本当に読んでいてためになったし、なにより楽しかったです。
全くプログラミング初心者の人が読んでもあんまりピンとこないかもしれませんが、ある程度仕事に慣れてきて、コードを書いたり読んだりする経験を詰んだあとで読むと、「なるほど〜!」と思えることが多いと思います。
とってもおすすめ!
面白かった章の感想
Chapter2 コードを速読する
プログラマーはコードを読むことに60%の時間を使っているという研究もあります。コードをすらすら読めるようになると、他のことにもっと時間を割くことができるようになります。
コードを速読するコツの一つとして、情報を「チャンク」と呼ばれる意味の塊にまとめるということがあります。短期記憶では一度に7つほどしか記憶できないため、意味のない文字列saleoutjagjaを覚えるのは難しいですが、cat loves cakeのように3つの「チャンク」にまとめることができれば、多くの情報を短期記憶で記憶することができます。
チャンク化するためには、長期記憶に知識があることが必要です。要するに文法を知っている必要があるということですね。
また、速読のためには「ビーコン」と呼ばれる、コードを眺めた時に「これはこういうことを表しているのだろう」と気づかせてくれるような文字のかたまりに着目することも重要です。
たとえば、コードの中にroot ,tree, left, rightのような文字列があり、コメントにも「木」などと書いてあった場合、「これは二分探索木に関するコードなんだな」と理解することが速くなります。このようなチャンクやビーコンに注目することで、コードの理解がすすみますし、逆に、分かりやすいコードを書くためにもこれらを利用することが重要です。
Chapter3 プログラミング言語の文法を素早く習得する方法
プログラミング言語の文法を素早く習得する方法、それは「単語帳を書いて、繰り返し何度も覚えること」です。あれ…普通に語学の勉強と一緒ですね。
記憶を強化するためには、積極的に何かを思い出そうとすること(想起練習)と、新しい知識を既存の記憶と積極的に結びつける(推敲)ことが有効です。
具体的には、1ヶ月に一回カードを見直すということを、長期(たとえば1年)にわたって繰り返すことが効果的であると書かれています。
学校教育で学んだ知識はその後も繰り返さなければ定着しない…
うーん薄々わかっていたことですが、実行するのはなかなか難しい。
資格試験で覚えたことも、使わないとすっかり忘れてしまっています。定期的に見直すということが重要なんですね。
覚えてにくいカードは頻繁に復習し、簡単に記憶できたカードは時間を空けて記憶を確認してくれる単語カードアプリ「anki」というのがあるらしく、気になっています。
公式サイト https://apps.ankiweb.net/
は英語ですが、日本語のわかりやすい解説が書かれているサイトもありました。https://rs.luminousspice.com/how-to-anki/
気合い入れて文法を再学習してみよう!
Chapter4 複雑なコードの読み方
ラムダ式やリスト内包表記などの複雑なコードの書き方についても、単語カードを利用すると効率的に覚えられます。片面に複雑な書き方、もう片面には同等のわかりやすい書き方を書いておけば覚えられるとのことです。
また、複雑なコードを読む時に、コードを紙に印刷して、「依存関係グラフ」を作成することを薦めています。具体的には、すべての変数を丸で囲む、同じ、あるいは関連した変数を線でなどの処理をして、コードを理解します。
たしかにこの方法なら複雑でも理解できそう。わたしもここまで厳密ではないですが、複雑なコードを読むときはエクセルに変数やメソッドの流れを整理することにしています。
Chapter6 プログラミングに関する問題をよりうまく解決するには
コードを理解するとき明示的なモデルを利用することで、プログラムに対する説明がしやすくなりますし、モデルを使うことで認知的負荷を下げることができます。ここでは「メンタルモデル」といって、概念を抽象化したモデルを紹介しています。
具体例を挙げると、データの「木構造」は実際には木ではありませんが、メモリ上に値が保持されていて、それが木のような構造であるとみなしています。このメンタルモデルを使うことで、コードの意味を理解しやすくなります。もう一つ例を挙げると、ファイルやフォルダについても、実際にはデータは0と1でしかありませんが、フォルダのなかにファイルが格納されているというメンタルモデルを使うことで、頭の中を整理することができます。
Chapter8 よりよい命名を行う方法
よい命名をするための指針が提示されます。本の前半の「コードを読む」ところでも明らかにしたように、命名はわかりやすいコードのためにとても重要です。最近はChatGPTに名前をつけてもらったり、命名を助けるサイトがあったりしますが、いくつか方針を知っておくと悩まないと思いました。
Chapter9 汚いコードとそれによる認知的負荷を避けるための2つのフレームワーク
汚いコードのポイントについて列挙してあります。
Chapter10 複雑な問題をより上手に解決するために
なにも考えなくても自転車に乗れるように、プログラミングも自動でできるようにすることが、より複雑な問題を解決できるようにするためのポイントです。自転車の乗り方のような記憶は、潜在記憶と呼ばれ、繰り返しによって作られます。このためには、意図的な訓練…たとえばforループを100回書くような、そういう訓練が有効です。全く同じものを繰り返し書くのは退屈ですが、少しずつ違った似たプログラムを書いてみることはいい訓練になります。
また、自分で書くだけでなく、人が書いたものを読むのもいい練習になります。GitHubに公開されているコードを読んだり、誰かと共同作業することがお勧めされています。
Chapter13 新しい開発者のオンボーディング
初心者が新しい物事を学ぶとき、一般的な概念を学び、具体的な内容に進み、そのあと抽象的な理解に戻るという流れを経ます。ここで、熟達者が、抽象的な概念しか説明しないとか、具体的な話しかしないとか、抽象的な理解まで促さないとか、そういうことをしてしまうと、初心者がその物事を完全に腹落ちするレベルで理解することができません。熟達者が初心者に教える時に注意するポイントです。
そうか、たしかに自分を振り返ってみても、最初はできる人の説明が抽象的すぎて理解できないのですが、具体例をみて自分で動かしているうちにだんだん抽象的なことの意味も理解できて、そうすると自分で使えるようになりますね。
おわりに
すごくおもしろかったので、また折に触れて読みたいなと思っています。周りの人にも薦めます。このMANNING社の出している本は、『Good Code, Bad Code』や『プログラミングのための数学』など、なかなか面白そうなものがあるんですよね。でも表紙は謎の人物の絵で、どういう意味なのか謎です…
他の本も読んでみたいと思いました。
コメント