脳はコンピューターコードの読解を言語読解とは異なる形で処理する(2020年)
(news.mit.edu)- MITの研究は、コード理解が言語処理よりも、複雑な問題解決に使われる多重要求ネットワークにより近く依存していることを示した
- PythonとScratchJrのコードを読むfMRI実験では、ブローカ野など左半球の言語ネットワークはほとんど反応しなかった
- コード読解は数学・論理課題と同じネットワークを使うが、その中で活性化される詳細な領域は完全には一致しなかった
- ScratchJrは右側の多重要求ネットワークをやや強く活性化し、研究チームはこれを空間探索課題の右半球バイアスと比較した
- プログラミングを数学か言語のどちらかだけとして教えるのではなく、コード学習に合った固有の教授法が必要である
コード読解は言語読解とは異なる脳活動を示す
- プログラミング学習は新しい言語を学ぶ過程に似ている
- 新しい記号や用語を身につける必要がある
- コンピューターが実行することを指示できるように、コードを正しく構成しなければならない
- 他のプログラマーが読んで理解できるほど明確に書かなければならない
- しかし、コンピューターコードを読むとき、脳の言語処理領域は活性化しなかった
- その代わり、複雑な認知課題に使われる**多重要求ネットワーク(multiple demand network)**が主に活性化された
- このネットワークは、数学の問題やクロスワードパズルのような課題にも動員される
- コード読解は数学・論理問題とも完全に同じではなかった
- 多重要求ネットワークの内部でも、数学・論理課題とは異なる部分により依存する傾向が見られた
- Anna Ivanovaは、コンピューターコード理解は言語でも数学・論理でもなく、「それ自体のもの」に近いとみている
プログラミングは言語に近いのか、数学に近いのか
- Evelina Fedorenkoの研究チームは、言語と他の認知機能の関係を研究してきた
- 核心的な問いは、他の機能が脳の言語ネットワークに依存するかどうかだった
- この言語ネットワークには、ブローカ野と左半球の他の領域が含まれる
- Fedorenko研究室の以前の研究では、音楽と数学はこの言語ネットワークを活性化しないことが示されていた
- コンピュータープログラミングは比較的新しい発明であり、人間にプログラミング専用の先天的メカニズムがあるとは考えにくかった
- プログラミング学習をめぐる見方は大きく二つに分かれていた
- プログラミングが得意になるには数学が得意であるべきだという見方
- コーディングと言語の類似性から、言語能力の方がより関係している可能性があるという見方
fMRI実験: PythonとScratchJrのコード読解
- 実験対象の言語は、可読性の高いプログラミング言語として知られるPythonとScratchJrだった
- ScratchJrは、5歳以上の子どものために設計された視覚的プログラミング言語である
- 参加者は、自分がテストを受ける言語に習熟した若年成人だった
- 参加者は機能的磁気共鳴画像法(fMRI)スキャナーの中でコード断片を見た
- 課題は、そのコードがどのような動作を生み出すかを予測するものだった
結果: 言語領域より多重要求ネットワークが中心
- 脳の言語領域はコードにほとんど、あるいはまったく反応しなかった
- コード課題は主に多重要求ネットワークを活性化した
- このネットワークの活動は前頭葉と頭頂葉全体に分散している
- 複数の情報を同時に頭の中に保持しなければならない課題で通常動員される
- さまざまな精神的課題を遂行する能力と関連する
- Ivanovaは、このネットワークが認知的に挑戦的で、「一生懸命考えなければならない」ほぼあらゆることに関与すると述べている
- 既存研究では、数学と論理の問題は主に左半球の多重要求領域に依存することが示されている
- 空間探索課題は、左よりも右半球をより強く活性化することが知られている
コード言語ごとの差異と専門性の影響
- MITチームはMarina Bersとともに、コード読解が多重要求ネットワークの左右両方を活性化するという結果を得た
- ScratchJrは左よりも右をやや強く活性化した
- プログラミングのみに特化した脳領域は確認されなかった
- ただし、はるかに多くのコーディング経験を持つ人では、特化した脳活動が発達する可能性は残されている
- Fedorenkoは、特定の言語で30年または40年コーディングしてきた専門プログラマーであれば、多重要求システムの一部に専門化や固定化が見られる可能性があると述べている
- 今回の参加者のように、コーディングに慣れていて課題を効率的にこなせても、経験が比較的限られている人では、そのような専門化は見られなかった
教育的含意と関連論文
- 同じ eLife 号に掲載されたJohns Hopkins University研究チームの関連論文も、コード問題の解決が言語領域ではなく多重要求ネットワークを活性化すると報告している
- 今回の結果だけで、コーディングを数学ベースの技能として教えるべきか、言語ベースの技能として教えるべきかを決めるのは難しい
- プログラミング学習の過程では、言語システムと多重要求システムの両方が関与する可能性がある
- しかし、ひとたび習得されたあとのプログラミングは、言語領域に依存しないことが示された
- Ivanovaは、コンピューターサイエンス教育者が、コードを最も効果的に教えるための独自のアプローチを開発すべきだと考えている
- 関連論文: Comprehension of computer code relies primarily on domain-general executive brain regions
1件のコメント
Hacker News のコメント
論文へのリンクが抜けているようだが、おそらく https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7738192/pdf/eli... の可能性が高い
プログラマーが fMRI スキャナーの中でコード片を見て、そのコードがどんな動作を生むかを予測したという内容だが、コードを書く能力と他人が書いたコードを理解する能力は別のスキルのように思える
書かれている内容を理解するというより、書かれているものが何を意味するのか推論する作業に近い
Bill と Tom は靴店に行き、Bill は 23.56 ドルの黒い靴を買い、Tom は 40.30 ドルの赤い靴を買った。その後、食料品店に行き、Tom は 3.50 ドルのパンと 5.99 ドルの牛乳を買い、Bill もパンは買ったが牛乳は買わなかった。
この特定の質問に答える脳の働きは「Tom と Bill は何をしたのか?」に答えるのとは異なり、「靴店のあと Bill が床屋に立ち寄る内容を追加せよ」のように既存の話を修正するには文法を解析し、一貫性を保つ必要があるので、またまったく別物になる
大局 !== 詳細 !== 作成 !== 既存内容の編集であり、物語とコードの両方について、この4種類の理解を同等に問うていないなら、この研究は不完全に感じる
記事もコードを書くことそのものではなく、他人が理解できる必要があるという範囲でだけ、作成と結びつけている
プログラミング言語の経験がある人が、本当にこういう結果になり得ると思っていたということのほうが驚きだ
プログラミング言語を表面的に人間の言語らしくするのは、言語設計における典型的な初心者の失敗の一つだ。Perl の “do what I mean” パラダイムと、その後の混乱を見ればよい
重要な違いは、プログラミング言語がコミュニケーションというより、何かを構成することに近い点だ。数式、アルゴリズム、データ構造、複数コンポーネントのアーキテクチャのようなものを作ることに近く、そのためプログラミング中の思考の多くは、文法的な細部よりも、作られているものの暗黙的な性質により強く関わっている
人間の言語でも、レシピ、法律文書、数学的定義、ボードゲームのルール、LLM への指示文のように似たことはできるが、人間の言語はまったく別の目的のコミュニケーション方式にも使える
コードの読解と形式化された人間の言語の読解、あるいは形式化された人間の言語と非形式的な言語の読解における脳活動を比較するほうが、より興味深いと思う
プログラミング言語の学習は、ほかの特定のスキルを学ぶのと似ており、プログラマーの頭脳というより、興味があればより有利という程度だ。一方で人間の言語の学習はまったく異なり、はるかに難しく、その大半は半ば無意識に行われるため、一般的な意味での「勉強」がもたらすリターンも非常に低い
データ構造を思い浮かべるときに使う視覚化も、本の場面を視覚化するのと大きくは変わらない
リンク先の記事によると、コード読解は見慣れない問題を慎重に推論する脳領域を活性化するという
また、30年のプログラミング経験者には一般化できないかもしれないと推測しているが、学生を対象に学術研究が多く行われるのは理解できる。ただ、被験者たちが数十年の経験を持つ自然言語処理と比較すること自体が無効になるのではないか?
理論言語学の背景があり、母語とはかなり異なる複数の言語に大学レベルで触れた独学プログラマーとして、この結果は驚きではない。いくつかの階層では確かに類似性はあるが、人間の言語とコンピューターコードの類似性はしばしば誇張されており、文法に狭く焦点を当てていた、より原始的な言語学の名残のように見える
リポジトリ内に初めて見るコードがあったとしても、スタイル、慣例、そのコードがプログラム全体の中でどう組み合わさるかを知っているという親近性が、認識の仕方に大きな影響を与えると思う
プログラミングに慣れていなければ、見慣れない問題の領域がオンになるのは筋が通る。この領域が見慣れないからオンになるのか、それともコードという対象を扱うときには経験があっても常にオンになるのかを研究すると面白い
コードを読むときは、たいていそもそも知らないものを扱うので常にある程度は見慣れないものなのかもしれないし、逆にコード読解そのものに慣れて、もはやそのようには働かなくなるのかもしれない
公平に比較するには、被験者が自然言語処理とプログラミングの両方に経験を持っている必要があるだろうが、両方の領域に同じくらい慣れた人を見つけるのは難しいので、結局は「コードに十分慣れている」程度で妥協せざるを得ない可能性が高い
人々が「AI に普通の言葉で指示すれば、その通りにやってくれる」と言うとき、未来が怖くなる理由はまさにこれだ
毎日8時間ずつ普通のテキストや会話でやり取りしたくはない。あまりにも疲れそうだ。一方で、プログラミング言語を8時間扱うのは楽しい
Rust の
unsafeのように、「ここでは自分が何をしているか分かっているから邪魔しないで」と言える必要がある。そのうえで、AI にテストやその他の方法で人間が書いた部分の正しさを検証させればよいすでにある程度はやっているが、今は人間が AI 生成コードを検証する側であり、役割を入れ替えるにはまだ先が長いと思う
Lex Fridmanが最近、言語学者のEdward Gibsonにインタビューし、脳が言語を処理する仕組みについて多く語っていた
その中には、コードを読むことが言語とはまったく異なる脳領域を明らかにするという話も含まれていた
#426 https://lexfridman.com/podcast/
この論文のEvelina FedorenkoはEdwardの妻だと理解している
自分の基準では、まったく別のスキルセットだ
主にコードを読むYouTubeチャンネルを運営している: https://www.youtube.com/@ants_are_everywhere
人気のオープンソースプロジェクトのコードを初見で読んで理解しようとしていて、音楽の初見演奏に少し似ている
研究者たちが、言語領域ではコードへの反応をほとんど確認できず、代わりに前頭葉と頭頂葉にまたがるmultiple demand networkが主に活性化した、と説明しているのは自分にはもっともらしく思える。このネットワークは、複数の情報を同時に頭の中に保持しなければならない課題で動員され、さまざまな精神作業の遂行能力と関連している
もちろん言語はあるが、言語処理そのものに多くの労力を使っているわけではないので、fMRI信号として現れないのかもしれない。私は、コードが何をするのか、作者が何をしようとしているのか、作者の背景、似たソフトウェアの動作方式など、いくつものことを同時に抱えている場合が多い
数学を学んだが、これも文章を読んだり数学をしたりする感覚とはあまり同じではない
頭の中にそうしたものを「呼び出す」のに少し時間がかかり、全体が崩れないようにずっとバランスを取り続ける綱渡りのようなものだ
途中で邪魔されるとバランスを失い、すべてが散らかったように感じ、その後また拾い集めなければならないので時間と労力がかかる。これが何度も続けて起きると、ものすごくもどかしい
Paul Grahamがmaker scheduleとmanager scheduleについての記事でこれを扱っている: (2009) https://paulgraham.com/makersschedule.html
感覚がまったく同じで、複数のことを一度に頭の中に保持するパターンも同じだ
現代の神経科学と脳画像の基準で見ると、コードを読むことは基本的に昏睡中にzolpidemで意識を取り戻すことと同じ、という結論になる
子どものころと十代のころにいくつか楽器を演奏していたが、初見は得意ではなかった。音楽能力とプログラミング能力はよく相関すると聞いたことがあるが、職業音楽家にはなれなかっただろう。その代わり、プログラミングでは良いキャリアを築けた
まったく驚かない。コードを読むことは散文を読むこととも違うし、数学をすることとも違い、頭の中でパズルを組み立てる作業に近い
コードが何をするのかを理解するには、関数、シンボル、変数、文、抽象化など、膨大なものをリアルタイムで結び付け、代入し、翻訳しなければならない。だからコードを読むことは、ゼロからコードを書くことより複雑になることもある
実質的な共通点は、どちらも「言語」と呼ばれていることだけだ
コンピュータが何をするかを書いた機械命令の集合であり、言語領域におけるように別の何かのメタファーになり得るものでも、そうであるべきものでもないからだ
私にとってコードを読むことは、歯車の束の図を見て「Aの歯車は反時計回りに回るのか、時計回りに回るのか」と問われるのに似ている
感覚としては言語理解というより、メカニズムを分析する作業に近い
コードを読むとき、頭の中にナレーションの声がないことからも分かる
コードを読もうとしているとき、話し声や、慣れた言語の音楽のように言葉を聞き取れる背景音があると、気が散っていらいらする。コーディングしながら話すこともできず、そうするとタイピングが乱れる
また、Rustのように記号が多い言語や、Haskellのように略語と演算子が多い言語よりも、Rubyのような英語の文に近い言語をずっと好む。もちろん他の開発者では別の脳経路が活性化するのだろう
読みにくいコードはしばしば処理しづらいが、おそらくそのナレーションのリズムが崩れて自然に流れないからだと思う
私が何らかの動作方式を説明するときも、だいたいこのナレーションと同じリズムに沿っていて、そのため簡潔に説明し、知識を素早く伝える助けになる
ただし、小説を読むときのナレーションの声とは明らかに違う。両者のあいだの感情的な言語の有無のせいかもしれない。内的独白がある人とない人がいることや、実際に見なくても物を想像できる細かさのレベルが人によって違う現象に似ているのかもしれない
ここで同じというのは、動作方式と「聞こえ方」が同じという意味で、当然ながら文法と語彙は使用する手話に従う。実際に同じ脳領域が働く
これは、ナレーションの声が単なる「音のこだま」ではなく、理解過程そのものだということを示しているように思える。文章を読むときと同じだ
特にループの判断には、一時的にコードを修正してみる反復が必要だ
主に自宅で働いていて、コーディングするときはたいてい音楽をかけている
音楽に合わせて歌うのが好きなので、一日中机に座って歌いながらコーディングしている
でも何かを読むときは、絶対にこんなことはできない。文章を読みながら同時に別の歌を歌うのは不可能だが、コーディング中ならとても簡単にできる