2012-05-17

60%の人間はプログラミングの素質がない

Coding Horror: Please Don't Learn to Code
Please Understand Learning to Code

Coding Horrorで有名なJeff Atwordが、ある州知事が今年の目標としてプログラミングを習得することを挙げていることに対し、そもそも税金を払う我々市民は、政治家にはプログラミング習得以上に重要な、政治家にしかできない問題の解決を望む、よってプログラミングを学ぶのをやめてくれという記事を書いた。これに対して、反論が多数上がっているが、Jeffも読んでいるある論文をあげて、この議論の参加するためには、必ずこの論文を知っておくべきであると書いた人がいる。この論文は有名で、非常に興味深いので、全プログラマーが読むべきである。

ふたこぶラクダという名前で知られている有名な論文がある。この論文では、60%の人間にプログラミングの素質がないと推定している。翻訳ではなく、まとめ的な感想として紹介してみる。

The camel has two humps

なぜふたこぶラクダなのかというと、プログラミング学習者の集団において、その成績をグラフ化すると2つの山があるからだ。低成績の山と高成績の山だ。大学でのプログラミング教育の中で、経験的に、プログラミング学習者には三種類いることが知られている。全然できない者と、かろうじてできる者と、すばらしくできる者だ。その中間はほとんど存在しない。できない者とかろうじてできる学習者は、授業の進み方が速すぎると文句を言い、すばらしくできる者は授業の進み方が遅すぎると文句を言う。こんなに学習にばらつきがあっては、すべての初学者向けのプログラミング教育ができない。

この傾向は、年齢、性別、教育レベルの差にかかわらず、等しく起こるものであることも、経験的に知られている。どうやら、世の中にはプログラミングを理解できる人間とそうでない人間がいるように思われる。

もちろん、教育者達は生徒の問題にして逃げたりはしなかった。彼らは教育方法がまずいのであろうと考えた。なにしろ、生徒というのは大学生のコンピューターサイエンス科に入学した学生である。彼らは基礎的な教育を受けていて、世界でも指折りの有名大学に入学できるほどの基礎的な学習能力や環境に恵まれていて、しかもプログラミングの学習に対して意欲的な人間である。それが、毎年毎年、初年度のプログラミング入門講座で半数近くが脱落して学科を変更していくのだから、自体は深刻だ。教育に問題があるに違いない。

教育の改良には、過去に様々な試みがなされた。より簡単な言語を使ってみたものの、結果は大差なかった。教育用の言語を作ってみたものの、やはり結果は同じだった。マウスだけで操作できるIDEのような、より簡単な開発ツールも作られたが、結果はまったく変わらなかった。

学習者に対する調査も様々行われた。お茶に招き話を聞いたり、コンピューターの経験や、自宅の寝室の横にコンピューターはあるかなどの調査を行った。調査結果と、プログラミング能力には、相関性があるようには思えなかった。

オックスフォードとケンブリッジからしかプログラマーを雇用しないある大企業は、新規の雇用者に対して、専攻や実績にかかわらず、必ず一からプログラミングの社内教育を行なっている。IBMなどは一度、コンピューターサイエンス科を専攻した集団より、古典を専攻した集団の方が、良いプログラマーを輩出する確率が高いとまで発表した。

多くのプログラミング学習者が理解に苦しむ問題を調査した所、以下のような結果が得られた。

  • 代入とシーケンス実行
  • 再帰と繰り返し実行
  • 並列実行

再帰やループはたしかに難しい。並列実行はとても難しいが、多くの挫折者はそこまで到達しない。しかし、代入とシーケンス実行という、プログラミングの最も基本的である概念の理解に苦しむとはどういうことか。

人間はどうやってプログラミングを学んでいるのか。ある説によれば、人間は与えられた状況に対して、メンタルモデル(規則)を形成しているのだという。そのメンタルモデルのルールにしたがって状況を解釈する。メンタルモデルが間違っていれば修正を行う。最終的に、メンタルモデルとプログラミング言語が一致するようになる。

そこで、今からプログラミングを学ぼうとする、それまでプログラミングに一切触れたことのない生徒に対して、プログラミングを教える前に、次のようなテストを行った。

テストは、複数の問題からなるが、すべての問題は、基本的に同じものである。

  1. Javaで書かれたふたつかみっつの変数の宣言と、それに続く、ひとつからみっつまでの代入文。
  2. 解答群
  3. 余白

例えば、以下のようになる。

以下の文を読んで、正しい答えをチェックしなさい。

int a = 10;
int b = 20;

a = b;

aとbの新しい値は:

解答群と、解答群に正解がないと考える場合の解答欄。

余白

生徒は、全員プログラミングに触れたことがないが、少なくとも皆、=が数学では等号記号を意味することを知っているだけの数学の基礎的な教育は受けているはずの者たちであった。

もちろん、プログラミングについて何も知らない人間なのだから、Javaのコードとして解釈した場合の代入の挙動を正しく回答したことが正解になるのではない。=は変数の値を変更しないのかもしれない。代入だとしても、右から左ではなく、左から右への代入かもしれない。代入ではなく、移動なのかもしれない。つまり、代入した後の変数は0になるかもしれない。あるいは、値の交換なのかもしれない。

この問題では、解答群の「新しい」という言葉の使用によって、値がなにか変化するものであると推測することを期待している。

どのような規則で回答するかというのは問題ではない。このテストでの評価は、ひとつの規則を、複数の似たような問題に首尾一貫して適用できたかどうかをみた。つまり、=は値を交換するという規則を推測したとしたら、ほぼすべての問題に対しておなじ交換の規則を適用した結果を回答した場合のみ、一貫したグループ(consistent group)とした。問題毎に違う規則で答えたものを、一貫していないグループ(inconsistent group)とした。何も書かずに提出したものを、空欄グループ(blank)とした。

割合としては、一貫したグループが44%、一貫していないグループが39%、空欄グループが8%であった。

既存のコンピューター科学者に意見を求めた所、空欄グループがもっともプログラミングの適正があるグループであろうと予想された。「彼らは、理解していない問題に憶測で答えることを拒否する種類の人間なのだ」と。「したがって、もっともプログラミング適正があるに違いない」

しかし、結果は異なっていた。もっとも高成績のグループは、一貫したグループであった。一貫していないグループと空欄グループに属する人間は、プログラミングの理解に苦しみ、試験の成績も低かった。

プログラミングを教え始めて3週間後に、また同じテストを行った。このとき、最初のテストで一貫していないグループと空欄グループに分類された人間で、一貫した回答に変わる者が半数ほどいた。この一貫に変わったグループに属する者は、変わらなかった者に比べて、高い成績を出した。ただし、試験の高得点は、最初から一貫した回答をしたグループだけしか達成出来なかった。

プログラミング言語とは、それ自体は無意味なものである。ある一定の一貫した規則に従って解釈した結果、これまたそれ自体では無意味な結果を出す。つまり、プログラミングの素質は、構築したメンタルモデルを、ブレずに一貫して適用できるかどうかにかかっているようだ。

無意味な文脈から一貫した規則を形成して適用できる人間は、プログラミングの素質がある。無意味な文脈から多くの規則を生成してバラバラに適用する人間は、プログラミングを学ぶのが難しい。白紙回答した人間は、無意味な文脈に対して規則を生成することを拒否する人間である。この種類の人間も、プログラミングを学ぶのは難しい。

一貫していないグループと空欄グループにプログラミングを教育するのは難しい。教育の結果、プログラミングを規則ある系であると諭すことは可能であるかもしれないが、難しい。

一貫したグループにプログラミングを教育するのは、はるかに簡単である。このグループは、観測的に、さらにふたつに分かれるようだ。ひとつは、プログラミングを非常に簡単に感じ、プログラミングを楽しみ、その後も成長してソフトウェアを書く良いプログラマーになるグループ。もうひとつのグループは、プログラミングはできるものの、それ自体には楽しみを見出さず、管理職になってUML図に溺れるグループ(やれやれ)。

プログラミングの素質がある人間の割合は、年齢や性別や教育レベルでは変わらないようだ。プログラミングの素質のある人間は、40%ぐらいであろう。つまり、残りの60%は、プログラミングの素質がないのだ。

つまり、コードが書けるとしたら、その時点ですでにエリート階級に属しているのである。もし、良いコードが書けるとしたら、指折りのエリート階級に属しているのである。

さて、プログラミングのできる恵まれた諸君に告ぐ。諸君は常人が有していない貴重な才能を有しているのである。諸君は自分の才能を正しく使っているだろうか。諸君の行なっているプログラミングは、本当に自分の人生にとって重要なプログラミングだろうか。

優れたプログラマーは常に不足してることを考えると、皆にプログラミングを教えてみるべきである。皆がプログラミングをする必要はないとしても、自分にプログラミングの素質が備わっているかどうかを見極めるのは重要である。もし、プログラミングが不可能だと感じるのであれば、それは才能の問題である。プログラミングの素質は、たいてい、学び始めて数週間で判明する。数週間学んでプログラミングを簡単だと思えなかったら、素質がないのかもしれない。

ちなみに、ふたこぶラクダの論文はとても素晴らしいので、ぜひとも読むべきである。念の為、もう一度リンクしておく。

The camel has two humps

追記:早くも誤解されている。タイトルが悪かったのかもしれないが、いきなり「ふたこぶラクダ」では、何のことかわからないだろう。

まず、このテストでは、無意味な文脈(JavaのわからないものにJavaのテスト)に対して、メンタルモデルを形成して、そのメンタルモデルを一貫して適用できるかどうかをみている。この素質は、プログラミングや、似たような問題(一部の数学など)にはよく働くが、それ以外の問題にもよく働くかどうかはわからない。ましてや、行動が一貫しているかどうかと関係しているわけではない。

政治方針が一貫しているかどうかとは関わりがないし、ましてや、この素質が政治家の素質としてふさわしいのかどうかもわからない。だから、Jeff Atwordなどは、政治家にはプログラミングをかじるより重要なことがあると言ったのだ。また別のものは、仮にそうだとしても、皆にプログラミングを学ばせてみるべきだと反論している。

6 comments:

Anonymous said...

プログラミングできる人とできない人との間の深い溝
http://d.hatena.ne.jp/masatoi/20090707/1246965336

どうしてプログラマに・・・プログラムが書けないのか?
http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm

abo_junghichi said...

件の"The camel has two humps"ですが、2014年7月24日付けで撤回論文が出たようです。
ネタ元
Island Life - 誠実さ
http://blog.practical-scheme.net/shiro/20140720-honesty
撤回論文
Camels and humps: retraction
http://www.eis.mdx.ac.uk/staffpages/r_bornat/papers/camel_hump_retraction.pdf

Nigitama said...

面白い記事の紹介ありがとうございます。

「aとbの新しい値は:」という問題文に違和感を覚えて原文にあたりました。

P6には次のようにあります。

The new values of a and b are:

たしかに。new values は a と b にかかるので、「aとbの新しい値は」という訳は正しいですね。

リンク先では、続けて次のようにあります。

In the middle column ‘=’ means equality: this doesn’t seem to have confused any of our subjects. Note the word ‘new’ at the head of the column: this seems to have given most of them a hint that change of values is at the heart of the question, whatever they may have thought about algebraic equality beforehand.

そもそもこの答えは a も b も 20 だと思っているんですが、合ってますよね?

new values は a と b の両方にかかるので、a も b も当初の値から変化していることを示唆しているように見えます。そうなると、あまり良い問題文ではないのかな、と思ってしまいますが。
問題文を Now や at the end などにした方が良かったのでは、と思ってしまいます。



Anonymous said...

Nigitamaさん

> そもそもこの答えは a も b も 20 だと思っているんですが、合ってますよね?

Javaの文法としてはそれで合っていますが、 主旨としては合ってないです。
なぜならば、Javaの文法として正しいかどうかではなく、「一貫した解き方を使ったかどうか」を見るためのテストだからです。
例えば、a=20, b=10のように交換して、10問あったら10問とも交換した人は、それで100点です(もちろん標準のJavaの文法としては0点)。
一方、9問で代入をして、1問で交換をした人のスコアは90点で、「10問とも交換した」人より低くなります。なぜならば、一貫した方法を使ったのは9問だけで、残りの1問は異なる方法を使ってしまったからです。

Yamasan said...

もし、私がプログラミングの知識が無かった頃に突然この問題が出されたら、abともに15と答えただろうと思います。

aさんが10円、bさんが20円持っていて、等しくなるようにしたら、15円ずつになる。

pg slot said...

pgสล็อต สล็อตออนไลน์ เว็บตรง แตกง่าย จุดเริ่มของพวกเรานั้นพวกเราก็จำเป็นต้องขอย้อนไปในช่วงเวลาที่พวกเรานั้นยังปฏิบัติงานประจำอยู่เลย pg slot ช่วยให้ท่านได้สนุกไปกับเรา