Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

プログラマー脳

プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチ
いつ頃からか、日常の一般的な話題に、脳や認知が取り上げられるようになった。鬱病ADHDのような精神疾患発達障害が広く知られるようになった社会的背景を反映しているのか、あるいはスティーブ・ジョブズが毎日同じ服装をしていたような、ライフハック的な要素に関連した精神的リソースに関することも関連しているかもしれない。

多く語られるのは、先日投稿した『Mind Hacks』*1ような、脳の機能や、それに基づいた認知の仕組みを説明したものと、認知の仕組みを下敷きにした応用に大別される。後者の場合、典型的なのが学習論や勉強法への適用であったり、多忙や貧困が精神的リソースの窮乏に通じる社会的な話題だ。書籍『プログラマー脳』は、後者に分類される。

プログラミングという専門領域ではなく、一般的な類書に目を通した経験もあり、本書を通じて得られる知見に新鮮さはなかったのだが、いくつか収穫があった。

最も激しい認知活動としてのプログラミング

本書で語られることは、その他の類書同様、

  • 長期記憶、短期記憶
  • リハーサルと想起
  • チャンク化、有意味化、構造化
  • 認知的負荷

といった要素を下敷きにしている。独特なのは、それをプログラミングという行為、プログラムの読解や情報共有に適用していることだ。

本書では、プログラミングを最も激しい認知活動の一つに位置付けている。具体的には、

  1. 抽象的な方法による問題解決であり、
  2. 意識的な集中を要する活動であるため、
  3. 認知上の問題が、誤りを大いに招く。

ということだ。その誤りを回避、軽減するための考察をまとめているのが本書だ。

注意したいのは、いわゆるノウハウ本ではないことだ。認知上の特性を下敷きにして、検討すべき事柄を知ることはできるのだが、対処法を具体的に指し示すような内容ではない。
このことは、筆者がITの専門家ではあるものの、この領域の専門家では無いことが影響しているのかもしれない。

誤認識「させない」こと

過去に、いくつかの類書に目を通した経験もあり、プログラミングを題材にしていること以外には、何も目新しいことはなかった。唯一の例外は、Chapter 7だ。バグを回避するテクニックを考察しており、その下敷きとして誤認識を取り上げている。出色なのは、誤認識を正すのではなく、誤認識「させない」ことにフォーカスしていることだ。

一般論として、認識を変化させること、果ては行動を変化させることは難しい。考え方を変えるには、まず新旧の考え方が併存したうえで、新しい考え方を受容できるような概念上の変化を伴うからだ。単純に新旧の考え方を置換するように変えられるものではなく、概念変化には時間も要する。だから、まずは誤認識「させない」ことが重要だ。

そこで紹介されているのが、論文『Visual Program Simulation in Introductory Programming Education』*2だ。この論文に収録されている「Novice misconceptions about introductory programming content」は、本書から得られた最大の収穫だった。ありがちな162の誤りが紹介されている。”Novice”と書かれているものの、実際には誰にでもあり得るものだろう。例えば、

Assigning to an object causes it to become equal to the assigned object.

値が等しいのか、同一のオブジェクトを参照しているのかという、ありがちな典型例だ。

実害があったとしても影響は小さいだろうが、これも典型例の一つだろう。

Limited understanding of expressions which lacks the concept of evaluation.

例えば「a = b = True」だとしよう。「(a or b) = True」は成り立つのだが、反射的に「(a or b) = False」と答えたくなるかもしれない。おそらく「(a xor b) = False」と混同しているのだ。

誤認識「させない」対策として、勘違いされがちなことを予め把握しておくことは、前提として重要なことだろう。

プログラム以外の認知的負荷

自身の専門領域を超えた範囲の事柄を学び、それを専門領域で応用することは有意義だ。本書はプログラミングに注目しているため、その作業を超えた範囲には踏み込んでいない。ただ周辺環境に目を向けていないことには、片手落ちな印象を抱かせると同時に、懸念も感じさせられた。

多忙や貧困が作業精度や業務パフォーマンスに影響する、という話題がある。多忙や貧困に伴う諸事情は、当事者にとっては常在の懸念事項であり、常にある程度の精神的なリソースを消費し続けているからだ。本書に倣って表現するならば、彼らは常に認知的負荷が高い状況に置かれながら、目前の業務に対応している。もし彼らがミスしがちだとすれば、それは無能さ故ではなく、置かれた環境に起因する問題ということなのだ。

本書の対象読者のようなプログラマー貧困状態というケースは例外的かもしれないが、多忙ではあるだろう。プログラム以外の負荷要因はスコープ外ということなのだろうが、そのような要因を就労環境、作業環境から取り除くことについて触れていないのは、片手落ちな印象だった。
鶏卵論争ではあるが、プログラミングの問題は、環境によって生じる余裕の無さの反映であるかもしれないのだ。

心理的安全」という言葉が流行し、はじめてそれに目を向けて取り組み始めたように、当たり前のことであっても、流行するまで気づかない、あるいは気づかない振りをしている節が、日本のIT業界の人たちには感じられる。本書でいうところの認知的負荷に対する配慮にも、同じような空気を感じるのだ。
果たして読者は、認知的負荷を生じさせているプログラム以外の要因にも目を向けるようになるだろうか。私は、疑わしい、と思っている。

余談:勉強法の科学

主題は学習論、勉強法なのだが、脳内の情報処理の仕組みを反映した方法であるところに面白味がある。長期記憶、短期記憶、概念理解などなど、『プログラマー脳』でお馴染みの知見を反映して、一般論としての学習、つまり知識、技能の獲得について説明している。

高校生を対象にした書籍だが、大人が読んでも十分に通じる内容だ。