Hatena::ブログ(Diary)

西尾泰和のはてなダイアリー

2008-09-22

例のアンケートについての解説と謝罪

反感を買ってしまった例のアンケートですが、コメント欄ですごくいい話がされていました。

http://q.hatena.ne.jp/1221708568#c131208

プログラミングとはどうあるべきかという話になった時に、彼が "We're not smart enough (to know the answer.)" と言ったのが印象に残っています。

僕もその通りだと思います。

このアンケートが反感を買った理由の一つには、質問文の表現が「この質問者は自分は本質を知っていると思っている」という誤解を招きやすいものだったことがあるのかな。実際は、漠然と「これよりはこれのほうが本質的なのでは」と思うことはあっても、「これが本質です」と人に教えられるほどの自信はありません。なのでこういう形でいろんな人の意見が聞けるのはとても面白いです:

【プログラミングとはどういうものかという本質】とは何だと思いますか? (参考)http://q.hatena.ne.jp/1221708568 - 人力検索はてな

-----

問題文や質問文の推敲が足りないのも反感を買った理由の一つだと思います。たとえばこの文の2文目の「プログラミング経験の学部一年生」は「プログラミング経験の浅い学部一年生」の間違いですね。

プログラミングに詳しい人に質問です。大学でプログラミング経験の学部一年生向けにプログラミングを教えることを想定しています。

しかし、1文目にはもっと大きなミスがあることに気づきました。「プログラミングに詳しい人に質問です」じゃなくて「プログラミング言語に詳しい人に質問です」と書くべきでした。

たとえば「C++一筋で10年仕事をしてきた人はプログラミングに詳しいか」と聞かれれば僕は「詳しいと思う」と答えます。その人が関数型言語の問題に答えられなくても、十分「詳しい」と呼んでいいだけの経験をしていると思います。一方で「プログラミング言語に詳しいか」なら間違いなくNOです。一つの言語しか知らないのは言語に詳しいとは言えません。

問題文冒頭が間違っているせいで、「お、自分向きの質問だ」と思って問題文を開き、実際の質問は全然違うのでがっかりしたり方もおられるのでしょう。申し訳ありません。

問題文も色々推敲の足りていない点があります。例えば正解の選択肢「Schemeでは関数がファーストクラスのオブジェクトである」ですが、ファーストクラスという単語を持ち出さずに例えば「Schemeでは関数を関数の引数として渡すことが出来る」といった設問にした方がよかったかもしれません。というのもC++やJavaのようなタイプのオブジェクト指向言語に慣れた人には「オブジェクトなのか?」という引っかかりを感じさせる文章だからです。

Googleで「ファーストクラスのオブジェクト」を検索すると「Schemeの手続きはファーストクラスのオブジェクト」という記述が出てきますし「ファーストクラスオブジェクト」で検索すればWikipediaの解説が出てきます。しかし「ファーストクラスのオブジェクト」という言葉を知っているかどうかはこの設問で問いたかった内容ではないので、不用意に専門用語を使ったのは失敗でした。

残りの偽選択肢も適当に作りすぎました。

たとえば整数と実数で演算子が異なるという選択肢、これはOCamlをイメージして書きました。OCamlが型に厳格なのは言語ごとの性質の違いを語る上でとても重要なことなのでこの性質はよく言及されるかとおもいます。しかし、たとえ「OCamlはそういう仕様だ」と知っていても「Schemeがそういう仕様ではない」という証明にはならないので、ここで悩んだ人も多かったようです。

「インデントでブロックを表す」はPythonをイメージして書きました。HaskellやABCも同じですね。「マクロの定義に#define」はCをイメージして書きました。「begin〜end」はPascalなどですね、ピリオドはよけいですが。こういう「他の言語の特徴を説明する文章の言語名をSchemeに置き換えた選択肢」は全部同じ問題をはらんでいます。

この辺りの適当な選択肢のせいで悩ませてしまった方には申し訳ないと思います。

-----

その他にも「ノイズ」とか「簡単なつもりだったのだけど」という発言で気分を害した方もいらっしゃると思います。申し訳ありません。どんな理由があったとしても、人を不快にさせる発言をしてしまったのはよくないことだと思います。でも、あなたを侮辱するつもりではなかったということをわかってもらえれば少しでも不快な気持ちが減るかもしれません。申し訳ありませんが、言い訳をさせてください。

まず、そもそものきっかけは友人が「HaskellとPythonはどっちが簡単なの?」と言い出したことにあります。Pythonは世間一般で普及している多くの言語と同じ手続き型言語、Haskellは純粋関数型言語です。当然Pythonの方が簡単だと思ったのですが、証拠を示さずに「当然Pythonだろ」と答えるのはよくないことだと思ったので、はてなポイントを渡して「はてな人力検索でアンケートしてみるといいよ」と言いました。その結果がこれです。

http://q.hatena.ne.jp/1221581192

PythonとHaskellがほぼ半々です。なぜこんな結果になったのだろう。適当に答える人が多かったからだろうか。このままでは間違った印象を与えてしまう。そう思って僕が出題したのがこのアンケートです。

http://q.hatena.ne.jp/1221584268

「プログラミング歴数ヶ月の人に以下の言語からどれか一つを選んで教えることになりました。どれが一番適していると思いますか?」という質問文で選択肢にPythonとSchemeとHaskellを入れ、他にいろいろなあまり知られていないであろう言語をちりばめました。結果は順当に1位Python、2位Schemeでした。しかし3位がCoq!

http://en.wikipedia.org/wiki/Coq

CoqはWikipediaにまだ日本語の記事がないくらいマイナーな言語で、とても初心者向けとは言えません。これは何らかのノイズが入ってかき乱されているのだ、と考えました。Coqは一番上の選択肢だったので、おそらく自動的に答えるボットか、もしくはポイントだけが目当てでわからない問題にも適当に答えるユーザがいるに違いない、そのノイズを取り除くにはどうしたらいいか?そう考えました。

そして思いついたのが「1問目に『わからない問題に適当に答える人』では答えられないような設問を用意し、その正解とクロス集計する」というものでした。それを試してみたのが例のアンケートです。「学部の1年生に教える場合どれが適切か」という設問にしたのは、そうすることで多少なりとも真剣に考えてもらえるかと期待したからです。議論の種になった「プログラミングの本質」という言葉には深い意味はありませんでした。そして上で述べたように「プログラミング言語に詳しい人」と書くべきなのに「プログラミングに詳しい人」と書いてしまいました。

結果として「プログラミングに詳しい人」への「プログラミングの本質」に関する質問が「Schemeに関する問題に正答すること」で絞り込まれる形になってしまいました。これは反感を持たれても当然の状況です。

一方で僕はまだ自分のミスには気づいておらず「プログラミング言語に詳しい人」、つまり年に1個〜2年に1個程度のペースで新しい言語を学んでいて、十数年のプログラミング経験のある人をターゲットに明示して質問をしたつもりでいました。そしてふたを開けてみて「想定したターゲットなら答えられる」と思った設問の正答率が6%しかないということに衝撃を受けました。そして「簡単な設問のつもりだったのに」「20人中19人がノイズ」という発言をしてしまいました。

全て僕の手抜きとミスと勘違いが原因で起きたことです。この一件で気分を害された方には、ほんとに申し訳ないと思っています。

t-tanakat-tanaka 2008/09/23 01:01 yo-kunさんのコメントをご覧ください。多数のプログラミング言語を知っているが,たまたまSchemeは知らない人間が,消去法などをつかっても,どうやっても解けないようになっていることが問題なんです。

関数がファーストクラスのオブジェクトである言語はJavaScriptやPnutsなど,他にも多数存在します。そのためJavaScriptなどは詳しく知っているがSchemeは知らない人が消去法で解こうとしても,「これはJavaScriptのことだから違うな」としてしまい正答できません。結局,知っているどの言語にも当てはまらない「Schemeの言語仕様はキューマシンとしての実装に適しているため並列化が容易である」などを正解とおもい,誤答しているのだと思います。

>「begin〜end」はPascalなどですね、ピリオドはよけいですが。
余計ではありません。ピリオドによりRubyやVBなどが排除されます。

ちなみに「Schemeの文の終わりはセミコロンである」は,どの言語を意識された選択肢なのですか? まさかJavaやC言語じゃないですよね?

yo-kunyo-kun 2008/09/23 02:09
> しかし、1文目にはもっと大きなミスがあることに気づきました。
>「プログラミングに詳しい人に質問です」じゃなくて
>「プログラミング言語に詳しい人に質問です」と書くべきでした。
> たとえば「C++一筋で10年仕事をしてきた人はプログラミングに詳しいか」と聞かれれば
> 僕は「詳しいと思う」と答えます。

私の主たる主張はまさにこれです。
>まずは「プログラミングに詳しい」かどうか判定するための質問です。
とあれば、C++一筋で10年仕事してきたプログラミングに詳しい自負のある方にとっては
「nishiohirokazuという人はこの問題が解けることがプログラミングに詳しい条件だと思っている」
と勘違いされると思います。
しかも「判定するため」と明言されているので、場合によっては”必要条件”、”最低条件”という意味で取られかねません。

そんな中、「プログラムに詳しい人=プログラミング言語に詳しい人」と理解した人、もしくは誤解した人とまともな議論になるわけがありません。
プログラミング”言語”に詳しいと自負する人がこの問題を解けないならばpracticalscheme様がコメントで仰っているように『自意識過剰』『大いなるチャンス』なのでしょうが、C++一筋10年の人にとってはr24様の『SchemeはBrainf*ckと同じレベル。「こんなんも出来て面白いですね」って言語 』とかrssi様の『まあ、実用言語ではないね。』になるのだと思います。

どちらの立場に立っても相手の言い分は罵倒にしか聞こえず不毛です。

pekochupekochu 2008/09/23 03:14 件のアンケートのコメ欄、とても知的好奇心をくすぐられながら読ませていただきました。
少し荒れてしまって、大変だったと思いますが、よい機会をありがとうっ!
SICP、もう一度読もうかなと思いました。

hogegehogege 2008/09/23 03:34 question:1221708568の質問の文脈上、
「プログラミング」と「プログラミング言語」は違うと読んだ者です。

question:1221708568でのコメント欄での一連のやり取りとこのエントリーを見て
単なる興味からの質問です。

質問に
「学部一年生向けにプログラミングを教える事を想定」
「プログラミングとはどういうものかという本質を教えたいのですが」

というのがありますが、ここで使われている「プログラミング」は
「プログラミング言語」の事なのでしょうか?
それとも(プログラミング言語でなない)「プログラミング」の事なのでしょうか?

私自身、体系的な教育は受けて(学修して)いないので、
大学で(プログラミング言語ではない方の)「プログラミング」を体系的に
修得する事が出来るのであれば、そのあたりの書籍などがありそうなので
本屋なりで漁ってみようかと思いまして。

#「プログラミング=プログラミング言語」と理解した人と
#私のように誤解した人では、そもそもQ2の質問自体も受け取り方が違ったのかな?

shiroshiro 2008/09/23 04:45 西尾さんの質問文が誤解を招きやすいものだったことは私も同意しますが、その上で「プログラミング」と「プログラミング言語」の違いは今回の問題で強調されるべきことではないと考えます。なぜなら、今回の質問は明らかに「プログラミングを教える」という立場に向けられたものだからです。しかも現場のOJTではなく、学生向けの一般講座で。

「プログラミング言語」は「プログラミング」において最大にして必要不可欠な道具です (たとえグラフィカルにブロックをつなげて「プログラム」するシステムがあったとしても、そのシステムが「プログラミング言語」です)。教える側がどの道具を選択するかを議論するにあたって、少なくとも候補となる道具についてそれぞれの得失と違いを知ってることは「議論の土俵に登るための資格」と言って良いと思います。(注意:「プログラミング」について議論するなら言語について色々知ってなくてもいいですよ。「プログラミングを教える」ことについて議論するなら、というのが今回の問題です)。

和鋸でも洋鋸でも木工を教えることは出来るけれど、技術の先生がどっちを選ぶか考える時には両方知ってないとまずいですよね。両方知っているからこそ、「引いて切る」ことは和鋸に特有のテクニックだけれど「木目の方向は将来の曲がりの方向に影響を与える」ことは木工に共通のエッセンスであることがわかるわけです。和鋸しか知らずにこの二つのことがらを同等の重みで教えたら、学生はとりあえず目先の工作が楽になる「引いて切る」ことだけ覚えて、2年後に影響が出るような木目の方向については忘れてしまうかもしれません。それはまずいと思いませんか。

全ての言語に精通しろと言っているのではないですよ。せめて選択肢に上げられた言語について「言語特有のテクニック」と「普遍的なテクニック」を分けて考えられる程度にざっと知っていないと、どれで教えるのが良いかって議論は出来ないんじゃないかなあ。サッカーしか知らない人とラグビーしか知らない人とテニスしか知らない人同士が、「体育の授業でどの種目を教えるか」を議論して有用な結果が出るとは思えないですよね。

web10web10 2008/09/23 11:53 >今回の質問は明らかに「プログラミングを教える」という立場に向けられたものだからです。
まず、そういうこと以前にはてなアンケートでは誰でも「回答可能」という特性を無視して、精度を出そうとしても無理だと思います。
最初と最後の設問にはBOTや何も考えず回答する方が多いのでダミーの設問を置いたり、そもそもプログラムに詳しくない人も回答するわけですから「回答しないで下さい」ではなく「プログラミングがわからない人はこちら」という設問を設けるべきでしょう。
今回のアンケートの正解率が低いのは、「プログラミングがわからない人」にも設問を選ばせるようなアンケートだったからです。
試しに以下で再度アンケートをとってみましたのでご確認願います。
http://q.hatena.ne.jp/1222138124

shiroshiro 2008/09/23 11:56 あ、そうそう。「文の終わりはセミコロンである」は私も曖昧にしか覚えてなかったので確認しました。Adaがそうですね。 http://www.adaic.org/standards/05rm/html/RM-5-1.html (simple_statementとcompound_statementの定義にはセミコロンが入ってませんが、個々のstatementの定義まで見れば書いてあります。)
StatementだけでなくDeclarationもセミコロンで終わりますが、「文の終わりはセミコロンである」という言明とは矛盾しません。

nishiohirokazunishiohirokazu 2008/09/23 17:27 shiroさんのおっしゃりたいことはわかりますが、「プログラミング」と「プログラミング言語」の違いは強調すべきだったと思います。
もし質問文を今から書き換えることが出来るのであれば今からでも注釈を足したいです。
なぜなら、質問文で「プログラミング」と「プログラミング言語」の違いをあいまいにしてしまったことが、「いろいろなプログラミング言語の特徴を知っている人」に対して「学生にプログラミングを教えるのに適した言語」を問いたいという意図が伝わらなかった原因だからです。
また、hogegeさんがおっしゃっているように「学生にプログラミングを教えたいのか、プログラミング言語を教えたいのか」がわかりにくいという問題もあります。

人間はそれぞれ違う生き物なので、伝わると思って書いたことが伝わらないことはあります。
実際、shiroさんのおっしゃる「今回の質問は明らかに「プログラミングを教える」という立場に向けられたもの」が伝わらなかったことが、今回多くの人を不快にさせてしまった原因だと考えています。

nishiohirokazunishiohirokazu 2008/09/23 17:52 hogegeさん
「プログラミングを体系的に習得することの出来る書籍」としてよく使われているのがpekochuさんも言及されている「SICP」(計算機プログラムの構造と解釈)かなと思います。長年MITで使われてきた教科書で、残念ながら(?)コードはSchemeで書かれています。

ただ「プログラミングを教えるのか、プログラミング言語を教えるのか」はすごく深い問いのような気がしました。プログラミングを教えずにプログラミング言語(の分類や歴史)を教えるのはあまり意味がないと思います。しかし、多少は教えないと自分の使っている言語に機能Xがあり機能Yがないことを「プログラミングとはそんなものだ」と思い込んでしまう危険があると思います。別の言語では機能Xがなく機能Yがある、ということは教えた方がいいのかなと思っています。

kajuntkkajuntk 2008/09/23 18:05 感想と意見に分けて書きまーす。
便乗してアクセス数稼がせてもらってます。アリガトウ!

感想
安易に収束させて今回の騒動の論点がずれてると思うんだなぁ。
不快にさせてしまった原因帰属を文章や内容に求めてるけど、それも上で謝罪しているような表層的なことじゃなくてもっとプリミティブな部分だと思う。
バッシングをする隙を作った西尾君が騒動の原因ではあるけれど、ぶっちゃけて叩いてた連中は<バッシング目的に問題に便乗している>だけで、そんなに気に病むことじゃないと思うよ。
万人が不快にならない文章を日本語で書くことは不可能であるから、それを謝罪しても、今度は理由Aが理由Bに代わって隙を見てまたバッシングする人は出てくる。
それにいちいち反応してるのは建設的じゃないと思うよ。
目的がバッシングなんだから防ぎようがない。
って話を別の人に関する話題で21日にも話してた。


意見提案
今回に関して言えば、はてなアンケートでこの話題を扱うのは母集団として不適切ってことがわかったんだから、もっとアンケートの精度を出すためにどうすればよいか?っていう建設的な話題をするべきなんじゃないの?
結局知りたいことは未だに知らないわけじゃないですか。

yo-kunyo-kun 2008/09/23 18:27 >ぶっちゃけて叩いてた連中は<バッシング目的に問題に便乗している>だけ

私はどうして怒る人が出てきたのかというのを考えていた立場で、
攻撃的な言葉を用いた批判を擁護するつもりは全くないのですが
これに関しては「全く」同意できません。

kajuntkkajuntk 2008/09/23 18:50 >yo-kunさん
感想に同意は求めてないし、だから意見と感想に分けてる訳でアレだけど

続きがしたいならココじゃなくて僕のblogでどうぞ〜

shiroshiro 2008/09/23 18:56 西尾さんはご存知かと思いますが、AbelsonとSussmanがSICPでSchemeを使った理由は「プログラミング言語特有の瑣末なテクニックに煩わされることなく、プログラミングについての普遍的な概念を教えたい。Schemeならば言語そのものを教えるのに時間を割かなくて済む」ということだったと記憶しています。同じ理由からSussmanは機械工学の教科書(SICM)でもモデリング・検証ツールとしてSchemeを使っていますね。

SICPのPrefaceより:
”In teaching our material we use a dialect of the programming language Lisp. We never formally teach the language, because we don’t have to. We just use it, and students pick it up in a few days. ... All of the formal properties can be covered in an hour, like the rules of chess. After a short time we forget about syntactic details of the language (because there are none) and get on with the real issues -- figuring out what we want to compute, how we will decompose problems into manageable parts, and how we will work on the parts. ”

ついでに、「プログラミングをどう教えるべきか」についてのSussmanの考えもPrefaceに極めて明確に述べられてますね。それに賛成する必要はないけれど、どのプログラミング言語を教えるかについて何か言うなら、とりあえず先行する実績のあるカリキュラムの基本になったものとして押さえておく必要があると思います。

;; ところで今SCIPをオンラインで眺めてて、dedicationに引用されてるPerlisの言葉が心に沁みました。
;; http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-3.html

hogegehogege 2008/09/23 20:41 >「プログラミングを体系的に習得することの出来る書籍」としてよく使われているのが
>pekochuさんも言及されている「SICP」(計算機プログラムの構造と解釈)かなと思います。
ありがとうございます。
早速注文したので、じっくり読んで見ます

web10web10 2008/09/23 22:11 再度とってみたアンケートの結果が大体まとまったみたいなので以下でまとめました。
「はてなアンケートは使い方しだいで精度が6%から70%にUPする」
http://d.hatena.ne.jp/web10/20080923

web10web10 2008/09/23 22:40 ノイズを生むのは質問内容でなく「やりかた」だということがわかると思います。

t-tanakat-tanaka 2008/09/24 09:28 shiroさん
>Adaがそうですね。
なるほど,Adaがありましたか。
不勉強で気がつきませんでした。

shoushou 2008/09/24 13:21 >関数がファーストクラスのオブジェクトである言語はJavaScriptやPnutsなど,他にも多数存在します
「多数」存在していることを知っている奴が消去法でこれを消すかアホ。

yabukiyabuki 2008/09/24 23:50 言語と言えば、

前後に文章がないのなら、
「Schemeでは関数がファーストクラスのオブジェクトである。」よりは
「Schemeでは関数はファーストクラスのオブジェクトである。」
のほうがいいと思います。

standard_onestandard_one 2008/09/25 13:20 そもそもプログラミングという概念がコンピュータの中だけに閉じた話だと思っている時点で見識が低い。

rerorero 2008/09/27 14:51 キューマシンのみ具体例が思いつかないので教えていただけないでしょうか?

>>「begin〜end」はPascalなどですね、ピリオドはよけいですが。
>余計ではありません。ピリオドによりRubyやVBなどが排除されます。
Pascal でも end の後に . が付くのはプログラムのブロックだけではないですか?
関数や複文のブロックには付けられない気がしますが….

enicaenica 2008/10/01 11:06 * 西尾泰和はこれを機に素晴らしいアンケートシステムを作り上げたそうな *

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証