プログラミングでは数学的思考より言語的思考のほうが重要なのか?(2020年)
(massivesci.com)- Python学習の実験では、言語能力と問題解決能力が学習速度を最もよく予測し、コーディング入門は数学よりも言語学習に近い可能性を示した
- 研究チームは42人を募集し、CodecademyのLearn Python全10レッスンを実施、完了した36人の事前テスト・クイズ・最終課題を比較した
- 学習成果は主に問題解決能力とワーキングメモリによって分かれたが、学習速度には一般的な認知能力と言語適性がともに作用した
- 言語適性はPython学習速度の差のほぼ**20%を説明した一方、数学の事前テストは速度差の2%**しか説明せず、成果とは相関がなかった
- 安静時EEGのベータ振動も、より速い学習とより多いプログラミング知識に関連していたが、因果関係や仕組みはまだ不明である
Python学習を予測した能力
- University of Washingtonの研究チームによる研究は、Python学習では言語能力と問題解決能力が学習速度を最もよく予測するとしている
- この研究はScientific Reportsに掲載され、行動テストと脳活動の測定を通じて、参加者がどれほど速く、どれほど上手にプログラミングを学ぶかを比較した
- 出発点となったのは、PythonやJavaのようなプログラミング言語の学習が、French、Spanish、Chineseのような自然言語の学習と、考えられている以上に似ている可能性があるという仮説である
研究設計と測定方法
- 合計42人が募集され、Codecademyの「Learn Python」オンラインコーディングコースを受講した
- コースは45分のレッスン10本で構成されていた
- 研究を最後まで完了した参加者は36人だった
- オンライン授業の前に、参加者は複数の事前テストを受けた
- 数学能力
- ワーキングメモリ
- 問題解決
- 第2言語学習能力
- 授業中は、オンラインソフトウェアに組み込まれたクイズで学習速度と成績を追跡した
- 研究の最後には、全体的なコーディング知識を確認するためのクイズとコーディング課題も追加で行われた
学習速度と成果を分けた要因
- 参加者は、Pythonを学ぶ速度と最終的なプログラミング能力においてそれぞれ異なる結果を示した
- Pythonをどれだけ上手に学んだかは、主に一般的な認知能力に左右された
- 問題解決能力
- ワーキングメモリ
- Pythonをどれだけ速く学んだかは、一般的な認知能力と言語適性の両方で説明された
- 言語適性は、Python学習速度の差のほぼ**20%**を占めた
- 数学の事前テスト成績は、学習速度の差の**2%**しか説明せず、Pythonをどれだけ上手に学んだかとはまったく相関がなかった
- この結果では、コーディング学習は数理能力よりも言語能力により大きく依存していた
EEGが補強した証拠と限界
- 参加者はオンライン学習の前に、安静時EEGの測定を受けた
- EEGは、頭蓋骨を通じて記録される電気パターンによって脳活動を測定する方法である
- 安静時の電気活動には複数のパターンがあり、その一つがベータ振動と呼ばれる遅い電気活動である
- 既存研究では、安静時のベータ振動レベルの高さが第2言語学習能力と結びついていることが示されていた
- 今回の研究でも、ベータ振動レベルの高さは、より速い学習とより多いプログラミング知識に関連していた
- ただし、ベータ振動が学習結果とどのようにつながるのかは依然として明確ではなく、追加研究が必要である
プログラミング教育と先入観への影響
- 研究結果は、プログラミング、とりわけPython学習では言語能力が重要な要素であり、数学能力は学習速度や成果を強く予測しないという見方を支持している
- プログラミングはしばしば「数学集約的」な分野と見なされるが、この研究はプログラミング学習の前提条件に関する古い仮定を見直させる
- 一部の分野では数学とプログラミング能力の両方が求められるが、それが可能なプログラミング職の大半だと断定できるわけではない
- すべてのコンピュータサイエンス専攻学生に高度な数学の授業を必修とするやり方は、この研究結果に照らすと不要に見え、数学要件の柔軟化は学生募集と定着に役立つ可能性がある
- プログラミングが多くの職業の前提条件となる状況では、「数学型の人間」でなくてもコンピュータサイエンスに向いている人がいるかもしれない
多様性と教育方法に関するコメント
- 女性は「典型的なコンピュータプログラマー」のイメージと自分が一致しないと感じることが多い
- 平均的には、女の子は男の子より言語能力が高い傾向があり、言語能力がプログラミング学習能力を予測するなら、女性もプログラミングが得意だという評価をより得られるかもしれない
- プログラミングと言語能力を明示的に結びつけ、高度な数学を求めない教育オプションを提供すれば、多様性の改善に役立つ可能性がある
- 急速に人気を高めているブートキャンプ型の選択肢は、参加者に微積分を強制しなくてもプログラミングのキャリアにつながりうる
- 同僚によるコメンタリーでは、プログラミング教育はFibonacci数の計算やソートアルゴリズムの実装のような数学中心の課題に偏りがちであり、より創造的で言語志向の課題のほうが、より多くの学生の学習に役立つ可能性があるとされている
1件のコメント
Hacker News の意見
論文を実際に読んでみると、タイトルはクリックベイトに近く、研究結果もかなり誇張されている
サンプルが非常に小さく、完了者は36人だけで、数理能力は R²=.27、言語は R²=.31 程度
その後、段階的回帰で分散への寄与度を計算しているが、先の結果を事実上無視したまま、数理能力の寄与がほとんどないかのように見える。理由は、2つの変数に約10%の共有分散があり、段階的回帰は貪欲的なので、先に入った変数がそれを持っていくため
似たような言語テストをもう1つ入れても、固有の分散寄与はほとんどないという結果になり得る
測定値も人間の評価者、完了時間など、どれもノイズが大きいのに、それを処理しようとする試みがない
提示された値で「言語学習は数理能力より有意である」を Steiger test で見ると、p-value が 0.772 で、まったく有意ではない
結局、数理能力は分散の27%、言語能力は31%を説明するが、相関した変数を追加した後に数理能力の固有寄与が2%に縮んだだけ
回帰で正の傾きが出たのも外れ値の位置の影響が大きそうで、言語適性の散布図は、少なくとも2つの変数の間に右肩上がりの関係が目で見て取れる
良いコードは問題を解くだけで終わらず、読みやすくモジュール化された方法で解くものだと思う
コーディングの問題解決の部分には数学能力が必要で、構成する部分には文章を書く能力が必要。汚いコードは後で読み返したり拡張したりするのが難しくなり、問題解決そのものを妨げる
長い数学の証明にも構成力は必要だが、数学には文章力だけでは到達しにくい「大きな飛躍」や、本質的に複雑な概念がより多いように見える
一方でプログラミングには「小さなステップ」が多いので、ものすごく賢くなくても、粘り強くコンポーネントごとに作り、依存関係が多すぎなければ、印象的なプログラムを作れる
実際には、数学的な操作よりも、データベースやインターフェースのスキーマを読んで挙動を理解する時間のほうが多い
ゲームエンジンのような例外はあるものの、3Dグラフィックスでさえ線形代数の初歩以上を必要としない場合が多い
モジュール化されていないコードのほうが読みやすく高速な場合は多く、低水準言語や手動メモリ管理の言語では、最善または正しい解法が可読性から遠いことも多い
可読性は見る人によって変わり、形式的な要件より後回しになる
個人的には、最小限にだけモジュール化された、長くてよく整理された関数を好む。ファイル境界、新しい関数の文脈といったコンテキスト切り替えが、保守や拡張時の複雑さとバグの最大の源だった
モジュール化はこうした境界を増やして複雑さを隠し、組織上の問題を推論・修正しにくくすることがある。長い関数は最初は読みにくくても、より明確なメンタルモデルを作り、より良い解法につながると思う
他のものとの相互作用が複雑なものとは違い、それ自体が複雑な概念は、汎用オブジェクトというより証明の中の専用ツールに近く見える
「プログラミングには小さなステップが多い」という表現はうまい。保守可能なコードを書くプログラマーには、平均的な作業記憶のほうがむしろ役立つかもしれないとよく思う
3分前に書いたことを覚えていないなら、動くスパゲッティコードを出せないからだ。もちろん、かなり自己正当化めいた仮説ではある
コンポーネント間の不要な依存関係を避け、問題を分析して分離可能な部分を見つけることも同じ
プログラミングを教えるときに歯がゆいのは、「誰でも必ずプログラミングを学べる」という態度を常に保たなければならないという圧力
プログラミングを学ぼうとする多くの人は、動機からして混乱していたり間違っていたりし、別のスキルを伸ばすほうがはるかに効率的なこともある。エリート主義の問題ではなく、自分も他人が自然にできることをできない場合があるという意味
頭の中で長い割り算をする努力は、難解なスパゲッティコードを追う努力に似ている
暗算の割り算は速くうまくなれるが、微積分学の基本定理を永遠に理解できないこともある
ひどいコードの中をうまくかき分けて進める人はいるし、給料をもらっているので仕方なく上達するが、プログラミングのどの部分がうまくなったのかは曖昧
仕事で精神的な長い割り算のような練習ばかりしていると感じたら、いつも新しい職場を探す。取り残される代償なら、どれだけ金が多くても価値はない
Prat et al. (2020) の研究は、Python 学習において言語適性が数理能力より優れた予測因子だと示唆しているものの、安易に単純化されやすいので注意して読む必要がある。
この研究が測定したのは、日常的な数字の問題を解く機能的数理能力である。これは、形式論理、記号的抽象化、形式言語のように、プログラミングとよく結び付けられる高度な数学とはかなり異なる。
再帰、型推論、アルゴリズム設計を理解するうえで重要なのは基本的な算術ではなく、こうしたより抽象的な能力である。したがって、この研究で機能的数理能力の予測力が低いからといって、深い数学的推論がプログラミングと無関係だという意味ではない。
また、研究対象の言語は自然言語に近く、読みやすく設計された Python である。言語能力が高い人に有利かもしれないが、記号的・論理的な密度が高い C、Lisp、Haskell にまで一般化できるとは限らない。
言語と数学は対立する領域ではなく、作業記憶、実行注意、階層構造の処理といった認知基盤を共有している。重要なのはどちらが「勝つか」ではなく、異なるプログラミングの文脈でそれらがどう相互作用し、補完し合うかである。
学界は何十年もプログラミングの多くの側面を形式化しようとしてきたが、コンピュータサイエンス卒業生と革新的なプログラマーの相関が低いという事実を、いまだに理解できていないように見える。
現実で成果を出している多くの人は、別の方法で壁にぶつかったときに「なるほど、だから再帰があるのか」と気づく瞬間を通じて再帰を学ぶ。記号的抽象化、表示的意味論、型理論を勉強するからではない。
不都合な真実は、専門的なプログラミングと革新的なプログラミングのほぼすべてが、学位課程で必修とされる高度な数学を使っていないということだ。
こうした教育の過酷さは、「自分もやったのだから君もやるべきだ」という考えと、学問的な門番役によって維持されている面が大きいと思う。
プログラミングがとても得意になり、人生で最も生産的な時期に入ると、それは言語のように感じられる。話すように表現できるようになる。
この研究結果はかなり納得できる。自分は昔からとてもよく読み、読むのも速いほうで、この能力はプログラミングのキャリアで非常に役立ってきた。
SAT の数学は 710 点で悪くなかったが、1990年代後半の SAT 言語は 800 点満点だった。
無線センサーネットワークの修士プロジェクトを始めたとき、指導教員が TinyOS のソースコードを印刷して渡し、1週間勉強して十分理解したと思ったら戻ってくるようにと言った。
その経験は自分を形作るものになり、その後も新しいプロジェクトに参加するたびに、時間をかけてコードを読み、全体がどう噛み合っているのか理解しようとしてきた。
今はシニア Web 開発者で、日常生活に必要な基本的な数学以上のことは今でもあまりできない。ただし、飲食サービス業で18年働いたおかげで、百分率はかなり素早く概算できる。
一緒に働いた最高のプログラマーたちは、今でも言語的思考が強かった。必要がなくても複数の言語を扱っていたり、難しい文学を長年読んできた経歴があったりした。
少なくとも、メタ認知的でメタ言語的な独特の機知があった。
今でもそうだと思うが、学位やキャリアパスが大衆化したことで、野生では見分けにくくなった。しかも実際には、よい設計や説明能力のほうが、アルゴリズムを底から作ることよりはるかに頻繁に必要とされるにもかかわらず、LeetCode 的な最適化をすると自然に数学型の頭脳が有利になる。
しかし数学はひどく苦手で嫌いだ。たいていの数学の文章を読むと、失読症のような感覚になる。
小学校の頃はできていたが、アルゴリズムよりも方程式や抽象的なもの、何に使うのかわからない内容が中心になるにつれて、急速に挫折感を覚えるようになった。
一方でプログラミングは自然に、簡単に身についた。ポインタや再帰のような「難しい」とされる話題を学んだときも、実際には簡単すぎて、「こんなに簡単なはずがないから、自分は何か見落としているに違いない」と自分を納得させるほうに時間がかかった。
どの職場でも「難しい」問題や「低レベル」問題を任される人間だった。
数学を読まなければならないときは、すべてをステップに変換し、例の値がそのステップを通って互いに影響し合う形にしないと理解できない。全部アルゴリズムに変えなければならない。
方程式や証明で意味を表現しようとする試みは自分には合わず、すべての記号のあいだの境界を一つひとつステップに変えて歩いていって、ようやく理解できる。
プログラミングは通常、接し方や学び方がアルゴリズム中心で、他の数学的な表現方法ははるかに少ないので、自分に合っていたのだと思う。変数やルーチンが何を意味するかについての文脈も、記号の塊よりはるかに豊かだ。
Perl をラインノイズだと言うなら、数学の文章はいったい何なのかと思う。精神を病んだ Cthulhu 狂信者の純粋なたわ言に比べれば、Perl は世界で最も明快だ。
問題になるのは、数学的な構文を持つ言語だ。1文字の変数と等式宣言で物事を処理する慣用的なスタイルは読みづらく、Haskell はどうしても読めない。
同じく厄介な概念であるモナドや型クラスも、もっと普通の言語で見ると簡単なのに、Haskell で学ぼうとするとまったく進まなかった。Haskell で書かれた fizzbuzz レベルのプログラムでさえ、理解するのに時間がかかる。
言語側の点数のほうがずっと高く、誰でも知っているような大企業の大規模な専門プロジェクトで多くの言語を併用しながら、優れたソフトウェアエンジニアリングのキャリアを築いてきた。
「言語型の脳」や「数学型の脳」というものは、それらのニューロンが言語と数学にそれぞれ専任された、重なり合わない2つの領域に分かれていることが実験で示されない限り成り立たない
数学そのものも人間が作った形式言語であり、論理と集合論の定義・公理から出発するが、その定義や公理もまず人間の言語で与えられなければならない
熟練した数学者は、黒板にギリシャ文字で書かれた定理を普通の英語のように読むが、これはそれを一般的な英語のように思考していることを示唆している
もちろん望むなら、その言語と同型の視覚的表象を頭の中に思い浮かべることもできるだろう
「言語型の脳」と「数学型の脳」という言い方は有用なフィクションにすぎず、実際に別々の肉塊なのかどうかは重要ではない
それでも、問題解決、考えを言葉で表現すること、考えを数学で表現することが非常に異なるスキルである点には、ほとんどの人が同意するだろう
「詩は同じものに別の名前を付ける芸術であり、数学は別のものに同じ名前を付ける芸術である」というHenri Poincaréの言葉のように、結局のところ、特に抽象化に対してうまく名前を付ける能力に近いのだと思う
ただし私の経験では、20年前のSATは言語セクションでも類推のような抽象化を多く扱っており、数学も同様だった。一度受けた試験では言語660、数学650でほぼ同じだった
Oliver Sacksは脳外傷の奇妙な副作用について書いていた
数学者や作家の脳のさまざまな部位に外傷を起こして実験することもできるかもしれないが、脳領域への神経刺激や麻酔が何かを示してくれる可能性もある
この主張はいろいろな面で奇妙だ。「言語型の脳」や「数学型の脳」のような実体はないと思う一方で、多くの人は数学が何なのかを知らず、その証拠がむしろ「数学型の脳」を裏付けているとも見られる
数学は計算ではなくパターンに関するものだ。代数に入ると「なぜ数学に文字が出てくるのか?」と思うが、さらに進むと「なぜ数学に数字が出てくるのか?」と思うようになる
数学教育の大きな悲劇は、計算に集中しすぎている点だ。群論、組合せ論、グラフ、集合論、圏論のような有用なトピックには、子どもにも理解できる基礎があるにもかかわらず、学部の数学専攻や大学院に行ってようやく教えられる
こうしたトピックは途方もない深みを持っているが、思考様式を形式化してくれる多くの部分は子どもでも理解できる。例としてはVisual Group Theory[0]を勧める
数学は抽象化に関するものなのに、奇妙なことに私たちはそれを「ゲーム終盤」まで取っておく
こうしたことを理解すれば学習が速くなり、思考様式に深い影響を与えると確信を持って言える。ただし、その抽象化を本気で受け入れ、特定の適用先だけに使う道具だと自分で制限しないことが必要だ
多くの人は文章題を難しく感じるが、いとこのThrockmortonがスイカを500個買おうとしているという滑稽な状況であっても、結局は数学と現実をつなぐ一部である
「高等」数学が私の学習を速くした理由は、そのレベルの数学が抽象化、つまり思考様式を教えてくれるからだ。方程式を使わなくても非常に役に立つ
数学は実のところ方程式を書くことではないが、複雑になったときには方程式が大いに役立つので使うのだ
[0] https://www.youtube.com/watch?v=UwTQdOop-nU&list=PLwV-9DG53N...
たとえば、行列が線形方程式を表現するための有用な抽象化、あるいは省略表現だという話を聞いたことがなかった
虚数が特定の計算を簡単にするために発明された抽象化だということも同じだ
そうした抽象化がどのように生まれ、なぜ有用なのかという観点から学べていたらよかったと思う
「音楽の時間には五線紙を取り出し、先生が黒板に音符を書くと、私たちはそれを写したり別の調に移調したりする。音部記号と調号を正しく書かなければならず、先生は四分音符を完全に塗りつぶしているかを非常に細かく見る。あるとき半音階の問題に正解したが、符尾の向きが違うと言われて点をもらえなかった。」
https://en.m.wikipedia.org/wiki/A_Mathematician%27s_Lament
私自身も抽象代数を独学しながら、学習と推論の能力が速くなった経験がある
基本的に4つのトラックがあり、1つは高校3年で代数1を終え、1つは高校3年で三角法をやり、もう1つも三角法までだったがプレ微積分はなく、最後のトラックだけが三角法とプレ微積分まで進んだ
その最後のクラスもさらに細分化され、一部はプレ微積分だけ、一部は微積分1とAP Calculus ABまたはIB Math SLを、より小さなグループはAP Calculus BCまたはIB Math HLを受けた
私の学年でAP Calculus ABの試験を受けた生徒は、卒業生500〜600人のうち20人ほどだった
「言語能力と問題解決能力」という表現からして最初の警告サイン。タイトルはそれを言語だけの問題にすり替えている
問題解決能力が関係しているのはかなり明白だが、言語についてはそれほど明確ではない
人生の大半をプログラミングしてきたが、自分では話がうまいとは思っていない。言語能力もそこそこで、新しい自然言語の学習は期待できない
だから懐疑的な立場で研究を見ると、まず「数学」が数量的リテラシーに置き換わっている。プログラミングは代数により近いと思うが、それでさえ厳密さは低く、デバッグもしやすい
研究における数量的リテラシーの測定は、複数の尺度から18個の数量的リテラシー項目を評価したうえで、最も予測力の高い8個を選んだRaschベースの尺度だった
しかもこの研究は、今では5年前のデータである
問題を解くことはできても、何が問題なのか、なぜその解法で問題が解決するのかを説明できないなら、優れた問題解決者とは呼びにくい
問題をうまく説明できるが解法を思いつけない人は、すでに世の多くのプログラマーより優れているし、「解法の過程」なしに答えだけを投げてくる人より一緒に働きたい
実際、そうした表現能力なしに、問題解決とは何かを原初的な意味で把握することさえ難しい
この文脈での創造性とは、問題をより取り組みやすい形に再構成する能力なのかもしれない。多くの場合、そのようなフレーミングは、明白な解法や、明確なトレードオフを持つ解法群を示唆する
プログラミングをうまく学ぶ人と、英語のスペリング・ビーが得意な人との間に、かなり興味深い相関を見たことがある
アルゴリズム的な過程を実行しつつ、多くの逸話や難解な規則の例外を頭に入れておく点が似ているようだ
私の脳はこの種のデータを保存して取り出すのに向いているようで、これはCLIインターフェースや独特なコマンド構造のようなものとも高い相関がある
「言語型の脳」と「数学型の脳」を定義するのは偽の二分法であり、でたらめな神経科学だと強く思う
数学はそれ自体、概念を表現するために作られた記号の集合、つまり言語である
この研究は、関心、意欲、機会があれば誰でも優れたプログラマーにも数学者にも何にでもなれるという、すでに大半の人が知っていることを言おうとしているように感じる
数学者、さらにはコンピューターサイエンティストに対する社会的認識の変化を示す興味深い本として「Duel at Dawn」がある
現代の比較的最近のイメージは、数字と情報を処理する、異質で超人的かつ先天的な能力を持つ隠遁した天才で、ときには自閉症をほのめかす要素まで付く人物だ。テレビ番組「the big bang theory」の「Sheldon Cooper」のような典型である
しかしこれは誤りだ
誰も、何かを超人的にうまくこなす能力を生まれ持ってはいない。あることを非常にうまくできる人は、認識されているかどうかにかかわらず、それをうまくできるよう非常に懸命に努力した人である
最初は記事だけを見て研究を批判したが、実際に引用論文をざっと読んだ後、具体的な批判は修正した。それでも論文自体は、心理学と統計の用語で包んだ弱い優生学的な議論以上のものには見えない
記事は極度に誤解を招くもので、ほとんど悪意があるとまで言いたい
研究自体では、流動性推論と作業記憶容量が34%、言語適性が17%、安静時EEGのベータ帯域および低ガンマ帯域のパワーが10%、数量的リテラシーが2%を説明するとしている
ところがここで数学能力を数量的リテラシーと同一視している。研究自体もそう示唆しているが、私は根本的に同意しない
数学能力は数量的リテラシーよりも、流動性推論にはるかに近いと思う