じぶん対策

日々学んだことをアウトプットして備忘録にしています。

「プログラマー脳」を読んで得たエッセンス

はじめに

今回は、書籍「プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ」を読んで、職業エンジニアとして業務を行うなかで、よりいいコードを書くために意識しておくべきことのヒントをいくつか得たのでまとめておきたいと思います。

本書の概要

本書は、プログラマーとしてのスキルや、習慣を向上させるために、脳の働きを理解するというアプローチで執筆された書籍です。
大規模なソフトウェアシステムの開発や、初学者に対する教育、自身のさらなる能力の向上に役立つ知識がまとめられています。

構成としては、4つのパート、13のチャプターから構成されています。

パートは以下の通りです。

  1. コードをよりよく読むために
  2. コードについて考える
  3. よりよいコードを書くために
  4. コーディングにおける共同作業

特徴としては、具体的なプログラマーが直面する課題を挙げつつ、それらに対する認知科学的な知見や実験の結果が説明されています。
簡単な例から始まり、読み進めていくと以前の章で出てきた知見についても触れながら、新しい知見を説明していくような流れが多いため、頭から順番に読み進めることをおすすめします。

本書から得たエッセンス

ここでは、具体的な例とともに、本書から得たエッセンスを紹介していきます。
知見の詳細や、根拠についてはぜひ本書を手にとって実際に確認していただくとして、この記事では知見の概要と私自身がこれから行動を変えるためのヒントとして取り入れたものを紹介していきます。

コードのチャンク化

プログラマーがコードを読む時に利用する短期記憶には容量が存在します。
The Magical Number Seven, Plus or Minus Twoという有名な論文で、私自身もこの本を読む前から聞いたことがありました。
平均的な人間の脳の短期記憶は7±2個の情報を保持できるというものです。いわゆるミラーの法則です。
さて、書籍のなかで紹介されていた短期記憶に関する実験で、個人的にかなり強く印象に残っているものがあります。

平均的なレベルのチェスプレイヤーのグループと熟練したチェスプレイヤーのグループにチェスの盤面を記憶させるという実験です。 その後、記憶した盤面をそれぞれ再現してもらい、正答率を比べて評価します。

結果は

  • 1回目の実験では、熟練したプレイヤーは平均的なレベルのプレイヤーよりも遥かに上手に盤面を再現できた
  • ただし、2回目の実験でなるべく非現実的な盤面を記憶させると、熟練したプレイヤーも平均的なレベルのプレイヤーと同じような正答率になった

このような結果への考察として、一回目の実験では、熟練したプレイヤーはチェスの戦略的な局面に紐づけて記憶していました。たとえば「シシリアンディフェンスのオープニングだが、ナイトが2マス左にいる」のような記憶の仕方です。

つまり、シシリアンディフェンスのオープニングの局面の情報が長期記憶に記憶されており、その情報を利用することで短期記憶の容量を少ししか使わずに記憶することができたのです。

この情報を組み合わせるまとまりを「チャンク(塊)」と呼びます。

これはもちろんコードにも当てはまります。

本書では、「チャンク化」しやすいコードのために、デザインパターンの活用を推奨しています。
また、コメントを書くことで初心者のプログラマーをサポートするだけでなく、開発者がコードをチャンク化するのにも役立つということが紹介されています。

これを読んで、私自身明確に答えを持っていなかったコメントの是非についてある程度の考えを持つことができました。

プログラマーの間でたびたび話題になるコメント論争は、「コードを読めばわかるような内容はコメントを書くな」「コメントは書けば書くほどいい」のような論争です。

チャンク化の観点から考えると、チャンク化できる量が極端に少ないものは書かなくてもいいが、チャンク化できる量が多いものはコメントを書くことでチャンク化を促進できるということになります。

もちろん、大前提としてコードはユニットテスト等で動作させて確認することができるので正しさを担保できますが、コメントはそうではないのでコメント自身が誤っているということもあります。

これはプロジェクト内でコメントも合わせてメンテナンスするという最低限のルールを設ける必要があります。

コメントは、明日以降の自分に対して書くものであり、実際に担当するのが誰であれ、プロジェクトを新しく担当する不慣れな初心者に向けて書くくらいの気持ちで書くといいと思いました。

複雑なコードの読み方

どうして複雑なコードを読むのが大変なのか、ということについても本書では説明されています。

理由としては短期記憶領域の不足、ワーキングメモリの不足、というものが挙げられています。

複雑なコードの読み方として、「(逆)リファクタリング」が紹介されています。

全体として保守性が高いコードが、必ずしも読みやすいとは限りません。多くのメソッド呼び出しがあり、多くのファイルが関連しているようなコードの場合、保守性は高くなっていても、読み進めるためにはあちこちに定義された関数をスクロールや検索で探す必要があります。

ここでは、読みやすさのためにメソッドをインライン化することで余計な認知的負荷を減らし、読みやすくすることを「認知的リファクタリング」と呼んでいます。

2つ目のプログラミング言語を学ぶのは最初の言語を学ぶよりも、なぜ簡単なのか

本書では、2つ目のプログラミング言語を学ぶのは最初の言語を学ぶよりも、なぜ簡単なのかということについても説明されています。

何かを学習した時、その知識が別の領域でも役にたつことがあります。本書ではこれを「転移」と呼んでいます。

例として、チェッカーを知っていればチェスを学ぶのが簡単になる、というようにJavaを知っていれば変数、ループ、クラス、メソッドなどの基本的な概念をすでに知っているので新しくPythonを学ぶのが簡単になります。

ただし、この転移には2つのタイプがあります。

一つ目は「正の転移」と呼ばれるもので、すでに学習した知識が、新たなタスクを実行する際の学習に対して良い影響を与えるものです。

脳はこの時、長期記憶がすでに持っている他の領域のために作られたメンタルモデルを元にして新しい領域に対するメンタルモデルを構築できるため、何について調べればいいかをすぐに理解できます。

一方で、もう一つのタイプは「負の転移」と呼ばれるもので、すでに学習した知識が、新たなタスクを実行する際の学習に対して悪い影響を与えるものです。

たとえば、Javaは変数を初期化しないと使えません。初期化していない場合はコンパイラが警告を出してくれますが、Pythonの場合は初期化しなくても使えてしまいます。このため、Javaを学んだ後にPythonを学ぶと、正しくないコードを書いてしまい、バグに繋がる可能性があります。

バグは、基本的にこのような負の転移から生まれる「誤認識」によって生まれます。

プログラマーが行うことのできる対策は多くないですが、できることもあります。

  • 自分が正しいと確信していることでも、間違っている可能性があることを認識すること
  • 自分がいつ間違った思い込みをしているのか、どう考えるのが正しいのか常に誤認識を意識をして勉強する

個人的な経験からは特に二つ目の対策に対して重要視しています。

プログラマーは、自分の誤認識が正しいものに修正されたとき、スッキリすると同時に、正しいものを知った途端になぜ間違えていたのかを忘れてしまいます。
どうしてこんな簡単なことがわからなかったのか、むしろ正しい方法以外あり得ないとさえ思えてしまいます。
この書籍を読んでから、少しでも悩んでいることはメモを残すようにしています。
大袈裟ではなく、解決したその瞬間に、何を悩んでいたのかを完全に忘れてしまうことがよく発生していることに気づくことができたからです。
この気づきは、自分自身の考え方の癖や、新しいことを学習する際に正の転移のために利用しがちな長期記憶の領域についても考えることができるようになりました。
たとえば、私の場合はOOPユニットテスト、DDD周りについて深く学んでいることもあって、無意識に当て嵌めながら学習していることが多いようで、これはReactを学習する時にかなり大きなメンタルモデルの転換が必要になったことで気づきました。
プログラマーとして、これから先も既存の知識をベースに学習していくことは変わらないので、自分自身の癖を把握しておくことはとても重要だと感じました。

まとめ

今回は、書籍「プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ」から得られた知見や、私自身がこれから行動を変えるためのヒントとして取り入れたものを紹介しました。

今回紹介した内容はほんの一部で、より一般的な命名の重要性や作業の割り込みが与える悪影響など、さまざまなトピックについても認知科学的なアプローチで解説されています。
また、具体的なアプローチの方法として、コードへの印付けやドキュメントやテストによるアプローチなども紹介されています。

私自身がエンジニアになって、経験的になんとなく感じていることを、認知科学的なアプローチで実験結果を交えて説明されているので、とても納得感がありました。

もちろん実験結果が必ず正しいわけではないとは思いますが、経験則への裏付けとしてある程度まとまった知見が一冊にまとまっている点が評価でき、とても参考になりました。