なぜ私はいまだにプログラミングをするのか

当ポストはコンピュータ・サイエンティストDaniel Lemire氏のブログ記事翻訳です。原文へのリンクはこちら:http://lemire.me/blog/archives/2011/06/06/why-i-still-program/

なぜ私はいまだにプログラミングをするのか

歳をとるにしたがって、プログラミングのような実践的な仕事から遠ざかり、チーム・マネジメントや資金調達といったもっと高級なものに仕事の場を移すことが普通のことだと思われています。「真の教授」たるもの、細かいことは下々にまかせ、「ビッグ・ピクチャー」を掲げておけばよいというようなアカデミアにおいては、これはまったくその通りなのでしょう。別の言葉でいえば、そのような組織は垂直コラボレーションの力学が働くように設計されています。つまり、階層構造の頂点に立つ人々が、他の(賃金の安い)従業員を監督するという風にできています。研究の場では、これは、シニア・サイエンティストがアイデアを出し、ジュニア・サイエンティストがそのアイデアを実装するということを意味します。時を経るにしたがい、シニア・サイエンティストはジュニア・サイエンティストのやっていることができなくなってしまうかもしれません。でも、彼らは資金調達のエキスパートになります。このモデルは規模を拡大させることができます。つまり、シニア・サイエンティストは中間レベルのサイエンティストに指示を出し、その中間レベルのサイエンティストはさらに一段下の階層にいる人に指示をだし、さらに…という具合です。ジョージ・チャムはこのモデルを“教授ネズミ講”*1と呼びました。資金が潤沢で、ずっと増え続けるならばとてもうまくいくモデルだからです。

これと逆の形態が水平コラボレーションです。このモデルではシニア・サイエンティストはすべてをこなします。壮大なアイデアを出すところから、その執行までです。彼らは面倒な仕事を、可能であれば自動化したり避けたりしようとします。コラボレーションは主に、自分とは違う視点を得るため、あるいは足りない部分を補完してくれる専門知識を得るためになされます。このモデルは資金が乏しい時でもうまくいきますが、関わる人間の頭数という意味での規模は拡大できません。水平コラボレーションには人との親密な関係が不可欠だからです。

それぞれのモデルは得意とする仕事の性質が異なります。推測するに、垂直コラボレーションは、長期計画で、かつ結果が予測できるものに向いています。水平コラボレーションは偶発的発見や「野性的」アイデアを試すのに向いていると思います。

水平コラボレーション支持者の表れとして、私は、歳をとったにもかかわらずいまだにプログラミングをしています。これは普通のことではありません。聞いた人が怪訝な顔をするぐらいには変なことなのです。書くのにとても長い時間がかかるプログラムもあります。私は年間2〜3ヶ月、プログラミングに時間を費やしています。おそらく、プログラミングのような下層のタスクに費やすには、私の時間は貴重すぎます。私のなん分の一かのお給料の人に、うまくやってもらえることですから。では、なぜ私はいまだにプログラミングをするのでしょう?

もしかしたら、私を最も擁護してくれるのは、巨匠ドナルド・クヌースかもしれません。曰く、

高位レベルの抽象的なアイデアの力と美を発見した者は、往々にしてある間違いを犯す。すなわち、低位レベルの具体的アイデアにはそれほど価値はなく、忘れてしまってもかまわないと思い込むのである。(中略)対照的に、一流のコンピュータ・サイエンティストは、コンピュータが実際どのように動いているかという基本概念に徹底して根を張った思考をする。現に、コンピュータ・サイエンスをやる上で要となるのは、様々なレベルの抽象化を同時に考える能力である。

ただ、私はこれとは別に持論も持っています。

  • 私は重要な仕事やインパクトのある仕事をしたいと思っています。しかし、論文は、たくさん引用されるものであってさえも、なかなか人に読まれるものではありません。大きなインパクトを持つ論文はほとんどありません。一方で、ソフトウェアの世界で意義のある仕事をするのは、論文の世界と比べれば簡単です。例えば、最近Facebookのある開発チームが、Apache Hive(データ保存のためのHadoopベースのフレームワーク)に入っている私の“圧縮ビットマップ・インデックス・ライブラリ”のひとつをシステムに組み込みました。賭けてもいいですが、このソフトウェアを私が書くことになった原論文を、Facebookの誰ひとり読んでいないでしょう。
  • 自分のアイデアを実装しようとした際に、そのアイデアをより深く理解する必要に迫られるという経験を何度となくしてきました。よくあるのは、論文の中ではお行儀よくみえていたものが、実装しなくてはいけないとなると、突如として奇怪で扱いづらいものに感じられるということです。また、数学的議論にバグがあったことを、実装を通じて発見することも度々です。この仕事を誰か他の人にアウトソースできるでしょうか?えぇ、おそらく。でもそうしたら、この過程はいまほど実りのあるものではなくなってしまうでしょう。
  • 人は時間とともにプログラミングが上手くなるものです。私は数十年にわたってこの能力を鍛えあげてきました。他の人だったら数週間あるいは数ヶ月かかるであろう難しい問題を、一から書きはじめて数日のうちに仕上げて解いてしまうというのは気分のよいものです。

もし私の議論が理にかなっており、かつ、ドナルド・クヌースまでもが私の味方なのであれば、なぜ、私がプログラマー兼サイエンティストだと打ち明けると人々は驚くのでしょう?下層の仕事としてプログラミングを拒絶する現象は「有閑階級の理論」によって説明することができます。実際、人は有用性ではなく名誉を求めています。道具づくり、調理、あるいは農業などは名誉なこととはされません。名誉を最大化したいなら、有閑階級に仲間入りすることです。そこではあなたのする仕事は、ただちに何かの役に立つようなことがあってはなりません。そんなわけで、CEOや政治家になる方が、看護婦や料理人になるより誉れ高いのです。はるか彼方から指揮をとるサイエンティストに名誉があるのです。プログラミングは道具づくりみたいなものですから、有閑階級の人たちは関わろうとしません。彼らは肩書きに、「エンジニア」、「アナリスト」または「デベロッパー」などを使用しますが、「プログラマー」を使うことはほとんどありません。役に立ちすぎるからです。

注意:すべての人がプログラミングをすべきということではありません。プログラミングは多くの時間を消費する活動です。私はプログラミングをしすぎるため、他の多くのエキサイティングなことができないでいます。

さらなる読み物: フレデリック・P・ブルックス Jr. , 「デザインのためのデザイン」, 2010

*1:訳注:原文ではProfezi scheme."Ponzi scheme"=ネズミ講と"Professor"=教授をかけた言葉遊び

史上最も難しい論理パズル

「史上最も難しい論理パズル」(The Hardest Logic Puzzle Ever)と名づけられたパズル*1がおもしろかったので、紹介します。

3人の神様A、B、Cがいる。彼らにはシン、ギ、ランという名前があるが、A、B、Cの誰がどの名前を持つかをあなたは知らない。(ただし神様同士はお互いの名前を知っている。)シンは常に正しいことを話し、ギは常に嘘を話すが、ランが正しいことを話すか嘘を話すかは完全にランダムである。あなたに課せられた課題は、YES/NOクエスチョン(YESかNOで答えられる質問)を3回することによって、A、B、Cの正体を特定することである。ただし各質問は、ただ1人の神様に向けて行うものとする。神様は人間の言葉を理解するが、回答は彼ら独自の言語で行われる。その言語では「YES」と「NO」に相当する言葉は「ダ」と「ジャ」だが、どっちがどっちを意味するのかをあなたは知らない。

注意3点:

[1]ある神様が複数回の質問を受けることがありえる。(したがって、その場合には質問を全くされない神様がいる。)

[2]2回目の質問内容、またそれを誰に回答してもらうかは、1回目の質問に対する回答に依存してもよい。(そして当然、3回目の質問に対しても同様のことがいえる。)

[3]ランが本当のことを話すかどうかは、彼の頭の中で秘密裏に行われるコイントスによって次のように決定されると考えてよい。:コインの表が出れば本当のことを話し、裏が出れば嘘を話す。

最後の邪悪なヒネリには笑ってしまいますね。「ダ」と「ジャ」がどっちを意味するのか分からないんですって。うへぇ、これは難しい。

でももし、おもしろそう!と感じたら、根気よく考えてみてください。楽しい時間が過ごせます。こういう問題を考えるコツはいろいろありますが、私が有効だと思うのは以下のようなものです。

  • 大きめの紙を用意して、そこで“実験”を行う。例えば、神様に問う質問で意味のありそうなものを思いつくままに書きだしてみて、それに対する神様の返答を、場合分けを慎重にしつつ、観察する。
  • パズルの簡単なバージョンを自分でいろいろつくってそれを解いてみる。例えば、
    • 神様が人間の言葉で回答してくれるんだったら?
    • 質問が3回ではなく10回まで許されていたら?
    • Aの名前がランだとあらかじめ分かっていたとしたら?
    • その他いろいろ
  • 興味をもってくれそうな友人に説明して、アイデアを交換する。
  • 自分にはこの問題が解けるのだ!と心の底から信じて数日間、数週間という単位で没頭する。

ここに解答は載せません。健闘を祈ります。


補足1:
個人的には、ランの挙動[3]は、次の[3’]を採用した方がより難しくなって楽しいと思う。([3]にするか[3’]にするかで違いが生まれることが信じられない?えぇ、ネタバレになるから説明はしませんが、確かにこの2つには本質的な違いがあるんです。)

  • [3’]ランが「ダ」と答えるか「ジャ」と答えるかは、彼の頭の中で秘密裏に行われるコイントスによって次のように決定されると考えてよい。:コインの表が出れば「ダ」と答え、裏が出れば「ジャ」と答える。(つまりランは質問の内容を全く聞いていない。)

補足2:
YES/NOクエスチョンの定義については、ちょっとだけ微妙なところがある。一見、YES/NOクエスチョンにみえる質問が、ある状況下ではYESともNOとも答えられない質問になってしまうことがありうる。当然、そのような可能性のある質問は禁止されていると考えるべきである。

補足3:
YES/NOクエスチョンの定義の拡張だとか、問題にさらなるヒネリを加えて難しくするだとかの議論がいくつかなされている。詳しくは英語版ウィキペディア(注意!リンク先に解答あり)を参照のこと。





追記:こういう論理パズルに興味がある人には、『スマリヤンの究極の論理パズル―数の不思議からゲーデルの定理へ』をおすすめします。

*1:論理学者George Boolosによって発表された。彼は論文の中で、これの原型となったパズルは論理学者レイモンド・スマリヤンによる発案であり、また、“神様の言葉の意味をあなたは知らない”という、問題を難しくするための一工夫は計算機科学者ジョン・マッカーシーのアイデアだと述べている。

[動画]「囚人のジレンマ」の見事なディール

「囚人のジレンマ」を応用したイギリスのテレビ・ショー"Golden Balls"のワンシーン:

二人の参加者が、賞金を【分け合う(Split)】か【盗む(Steal)】かという選択を迫られている。ゲームには、次のおなじみのルールが適用される:

  • 二人とも【分け合う】を選べば、賞金は山分け、
  • 一人が【盗む】、もう一方が【分け合う】を選べば、【盗む】を選んだ方が賞金を独り占め、
  • 二人とも【盗む】を選べば、どちらも賞金はなし。

しかし通常の「囚人のジレンマ」とは異なり、このショーでは二人に、事前に協議をする時間が与えられる。

ニック(画面右側):「イブラヒム、俺を信用してくれ。俺は必ず【盗む】を選ぶから。」
イブラヒム(画面左側):「え?君が選ぶのは…」
ニック:「【盗む】だ。でも信用してくれ。盗んだ後で、山分けするから。」
イブラヒム「盗んだ後って、番組収録が終わった後にってことか?」
ニック:「そうだ。」

会場が沸く

ニック:「もし君も【盗む】を選んだら、二人とも何ももらえないんだ。それだけは避けたいよな。」
イブラヒム:「それは分かってる。じゃあ、二人で【分け合う】を選ぶのはどうだ?」
ニック:「だめだ。俺は分け合わない。俺は100%【盗む】だ。」
イブラヒム:「そんなこといって、本当に盗っちゃうんじゃないのか?」
ニック:「そんなことはない。絶対嘘はつかない。俺は100%【盗む】。君が【分け合う】を選べば、後で君と分け合う。」
イブラヒム:「分かんないな。なんで僕がそんなこと…」
ニック:「じゃあ、二人で【盗む】だね。それで賞金はパーだ。」
イブラヒム:「…。君の脳みそはどうなってんだ?」

ニックおどける。会場が沸く

イブラヒム:「理解できないな…」
ニック:「君の気持ちは分かる。でも俺はまっとうな男だ。ちゃんと金は分け合うから。」
イブラヒム:「それなら【分け合う】を…」
ニック:「だめだ。俺は【盗む】。」

司会者:「時間です。」

イブラヒム:「ちょ、ちょっと一言いわせてくれ。僕の父親の言葉だ。(ニックの目を正面から見ながら)“約束を守らない男は男じゃない。そんな奴には一銭の価値もない。ただの一銭もだ。”」
ニック:「俺もそう思うよ。イブラヒム、俺は【盗む】。君はどっちか選べ。」

イブラヒム:「…僕がもし…でもお前は……だめだ。僕ら全てを失うぞ。」
ニック:「そうか。じゃあ失おう。」
イブラヒム:「手ぶらで帰ることになるんだな。お前がバカだから!」
ニック:「俺はバカじゃない。」
イブラヒム:「バカだよ!大バカだ!」

司会者:「はい。一晩中議論するわけにもいきませんので。今すぐお二人とも選んでください。」

イブラヒム:「…分かったよ。ニック、お前の話に乗るよ。」

と、ここからクライマックスを迎えるわけですが、続きは動画でお楽しみください。(ここに訳したものは、動画区間2:37-5:06の会話です。)

(上の動画と同一)

僕は自分が思っていたほどは頭がよくなかった

Redditで話題になっていたポストを訳してみた。

僕は自分が思っていたほどは頭がよくなかったという高校生の独白にたいしてつけられたこのちょっと長めの返信がとても的確で示唆に富んでおり、多くの人のこころをつかんでいました。私自身、勇気づけられるというか身につまされるところがあり、忘れないために翻訳をしてみました。

まずは高校生の独白から。

僕は自分が思っていたほどは頭がよくなかった

僕はいま高校の最終学年で、次の6月に卒業する予定です。高校の成績は、いままでずっとAを取りつづけていましたが、去年始めてBをとってしまいました。もしそのBがなければ、卒業生総代に選ばれていたでしょう。

総代にふさわしいのは自分だ、つまりクラスで本当に一番頭がいいのは自分だと思いたいです。でもこの一年で、僕にそれほどの知性はないし、僕より頭のいい人はたくさんいるんだということを思い知らされました。

また僕は、自分の頭のよさについて、少なくとも自分自身に対して嘘をついているところがあります。成績表からAがひとつ盗まれちゃったんだということにして、自分自身を納得させようとしているんです。でも心の奥では分かっています。あのBは、僕への正当な評価だということを。あれ以外にも、他のいくつかの科目でBをもらってしかるべきでした。どうにかそれは避けられたわけですが。

最近、SAT (大学進学適性試験)を受けたら1900台のスコアでした。ただ単に怠けていたからこの結果だけど、本気を出したらもっと全然すごいスコアがとれるはずと考えました。なので、その後もう一度受けてみました。よく出来た感触はありましたが、結果は前回よりたった約40点よかっただけでした。

昔は、自分はMITに行けるものだといつも思っていました。でも、その可能性はゼロに等しいんだという厳しい現実が明らかになってしまいました。たぶん親元を離れずに地元のつまらない大学にいくことになるんだろう、と今になって悟りました。あぁ。

あーそれに、僕の趣味といえばゲームとRedditだけなんです。クラブ活動とかも全くしてないし。車の免許さえ持ってない。終わってる。まぁ、これは僕の知性とはなんの関係もないことですが。。。ただの愚痴です。


対する返信。

どうも、遅れてすいません。新年を祝うのに忙しくて(笑)。君がまだこのスレをみているとよいのですが。

さて。私はちょっとユニークな視点を持っていると思います。私は、MITの入学試験をいままで様々な視点で見てきました。受験生として、学生として、教師として、そして今は有望な学生を面接する卒業生として。君がMITに触れているのをみて私は、ちょっと時間をかけていい返信をすべきだなと思いました。

入学試験に関する標準的なアドバイスから書き始めるつもりでした。(例えば、SATのスコアは大した問題じゃないよ、とか。)そんなアドバイスもありでしょう。しかし君の抱えている問題は入試云々よりも遥かに大きなものです。君が遭遇しているのと同じ問題に同級生たちがぶつかるのを私は何度となくみてきました。もし昔の記憶をここに再現できるなら、新入生の頃の私を君にみせてあげたい。

私は意気揚々とMITの寮に引っ越してきました。とりあえずMITに入学したのです。加えて、一年生の微積分と物理の単位をすでに取っていました。つまり一年先の数学、微分方程式と、物理2という難しい方の物理から始めることができたのです。履修登録は簡単にできて、私は自分の決断に満足でした。

時間が経ち、壁にぶち当たりました。私は高校時代それほどよい生徒ではありませんでした。悪い成績をとれば、適当ないいわけをしたものです。そんなものどうでもいいとか、忙しすぎたとか、やる気がでないとか、(そしてたいていの場合には)他にやるべきことがあったからだなどと言って。いい成績をとれば、エゴが満たされました。自分はちょっとやる気がないだけで、他の誰よりも頭がいいんだと思えました。しかしいまや、そんな考え方は通用しませんでした。私はそれまでMITを全く見くびっていたのです。ほんとうに惨めな気持ちでした。

幸運なことに、私のとなりの部屋にはRという賢いやつが住んでいました。Rは、控えめに言っても、優秀な学生でした。彼は2年生でしたが、学部で最も進んだ数学のクラスにすでに出席していました。彼はMITに来て、微積分、多変数微積分、微分方程式、線形代数、実解析(MITで最も難しいと悪名高いクラス)、そしてその他多くの数学の単位を取得しました。そしてなにより、彼は魅力的で、やる気があって、社交的でした。人間なら1つや2つあるだろう欠点もこれといってありませんでした。

微分方程式に半学期悩まされたあと、プライドを捨ててようやくRのところへ助けを求めに行きました。確か彼は私の教科書を一晩借りて復習して(彼は小学3年生からの全ての授業内容を憶えているわけではない)、その後、私の分からないところをひとつひとつ丁寧に解説して教えてくれました。その結果、学期末に私はB+をとり難を逃れることができました。ここでひとつ大切なことがあります。それは、彼が教えてくれたことのなかに、頭の回転が速くなければ理解できないことなどひとつもなかったということです。彼のことを知るにつけ分かったことは、彼の知性と実績のほとんどは、まさに勉強と鍛錬によってもたらされているということでした。そして、必要に応じて学んで訓練をした知性の道具や数学の道具を蓄積した結果として、彼の大きな道具箱があるのだと知りました。彼はそれらの道具をいくつか見せてくれましたが、私にとっての本当の収穫は、自分独自の道具をどうやって探して、つくって、改良するかという方法を理解したことでした。Rに憧れ、尊敬をしていました。私は、彼のずば抜けた能力と張り合えるようには一生なれないだろうと思うと同時に、その原因がなんだかも分かっていました。私と彼を比較すれば、私は信念に欠如しており、彼は信念にあふれているということです。遺伝子の偶然などということではなく。

「頭がいい」ことが成績の良し悪しを決めるのだと言って自分自身を欺くのは簡単なことです。とても多くの場合で、これはあり得るなかで最も安易な説明です。なぜなら、これを認めれば努力をする必要もありませんし、自分の失敗をただちに正当化してくれるからです。君はいま気づかずにこの罠にはまろうとしています。君は最初の2段落では自分の知性を問題としていますが、続けて、自分にはふさわしくない良い成績をとったと言って卑下していますね。やる気のなさが、クラブ活動をしていないことの要因だとは君は思っていますが、SATスコアの要因とは思っていないようですね。(おもしろい事実:SATの成績と最も相関の高い変数はSATのために費やした勉強時間です。)君のこの最後の一文は、投稿した文章全体にもあてはまってしまうでしょう。

> まぁ、これは僕の知性とはなんの関係もないことですが。。。ただの愚痴です。

君がAをとったのは、君が勉強をしたかあるいは授業内容が簡単だったからです。君がBをとったのは、おそらく、どうやって扱ったらいいのか分からないことや、そう簡単には腑に落ちないようなことをすぐ理解してしまうのに慣れすぎたからだと思います。思うに、君は早いうちに認知と知性に関する道具をつくり上げて、新しいことを身につけたり処理したりということを素早くできるようになったのです。でも、あまりにもそれに頼り過ぎてしまって、それだけでは対処できない事態に必要となる、ちゃんとした道具一式を全く発達させなかったのです。私がそうでした。でも、大学一年の一学期に壁にぶつかるまではそれに気づきませんでした。君に質問があります。だれか今までに時間をかけて勉強の仕方を教えてくれた人はいますか?それとは別に、先生やカリキュラムなしで自分自身で勉強する方法を君は学んだことがありますか?これらは習得することのできる最も重要な道具です。なぜなら、この道具を使って、さらに強力でさらに遠くを見通すことのできる道具をつくることができるからです。それがただ雪だるま式に大きくなることで、Rのような人になるのです。

MITの卒業率は97%です。つまり入学したほとんどの人が卒業します。3%の卒業できない人とその他の卒業できる人を分けるものがなんだか分かりますか?私には分かります。私は何回もそれをみてきましたし、私自身危うく卒業できないところでした。MITの4年間を、卒業できないほどの悪い成績で過ごす人はほとんどいません。実際、そういう人を一人もすぐには思い出すことができません。MITを卒業するのに失敗する人というのは、入学して、いままでに経験したなによりも難しい問題に遭遇し、助けを求める方法も問題と格闘する方法も知らないために燃え尽きてしまうのです。うまくやる学生はそういう困難にぶつかったとき、自分の力不足と馬鹿さ加減に滅入る気持ちと闘い、山のふもとで小さな歩みを始めます。彼らは、プライドに傷がつくことは、山頂からの景色を眺めるためであれば取るに足らないということを知っているのです。彼らは、自分が力不足であると分かっているので助けを求めます。彼らは知性の欠如ではなく、やる気の欠如が問題だと考えます。私は、やる気をみつける方法を教えてくれる人と出会えて幸運でした。インターネット上でできることは小さなものですが、私があなたに対してその役割を果たすことが出来ればと願っています。私は大学一年目の挫折から立ち直り、学業がとてもうまくいくようになり、同級生、下級生のティーチングアシスタントを務めるまでになりました。4年生のときには、寮で新入生の横に座り、私がかつて先輩から教えてもらったことと同じことを教えたものでした。そして彼らが、かつての私が抱いたものと同じ感情と闘い、それを克服するのをみてきました。MITを卒業するまでに私は、入学時に尊敬していた人になっていたのです。

君はとても若い。頭があんまりよくないのではなどと悩むには本当に若すぎる。年をうんととってボケ始めるまでは、「頭がよく」なるチャンスはあるのです。括弧付きで言ってみたのは、「頭がよい」というのは単に、「とても多くの時間と汗を費やしたので、難なくやっているようにみえるまでになった」ということを言い換えているに過ぎないからです。君は、自分は燃え尽きてしまった、あるいは、燃え尽きてしまうかどうかの岐路に立っているという風に感じています。でも実際には、燃え尽きることにするかしないかを決断する岐路に立っているのです。これが決断であるということを認めるのは怖いことです。なぜならそれは、君にはなにかをする責任があるということですから。でも、それは力が湧いてくる考え方でもあります。君にできるなにかがあるということですから。

さぁ、やってごらん。








訳者追記:
読んでくれた若い人へ。もしあなたがこの記事を気に入ったなら、物理学者ファインマンのエッセイ集『ご冗談でしょう、ファインマンさん』を読んでみることをおすすめします。知的好奇心を常に強く持って生きることで、人生がいかに豊かで楽しいものになり得るのかということを、ファインマンのエッセイは教えてくれます。読んで勇気が湧いてくる本です。

原著で読みたい方はこちら。