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

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

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に置き換えた選択肢」は全部同じ問題をはらんでいます。

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

        • -

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

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

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

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

http://q.hatena.ne.jp/1221584268
「プログラミング歴数ヶ月の人に以下の言語からどれか一つを選んで教えることになりました。どれが一番適していると思いますか?」という質問文で選択肢にPythonSchemeHaskellを入れ、他にいろいろなあまり知られていないであろう言語をちりばめました。結果は順当に1位Python、2位Schemeでした。しかし3位がCoq!
http://en.wikipedia.org/wiki/Coq
CoqはWikipediaにまだ日本語の記事がないくらいマイナーな言語で、とても初心者向けとは言えません。これは何らかのノイズが入ってかき乱されているのだ、と考えました。Coqは一番上の選択肢だったので、おそらく自動的に答えるボットか、もしくはポイントだけが目当てでわからない問題にも適当に答えるユーザがいるに違いない、そのノイズを取り除くにはどうしたらいいか?そう考えました。

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

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

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