学部
Original2005年3月
(このエッセイの一部は、私に質問を書いた学生たちへの返事として始まりました。)
最近、コンピュータ サイエンスの学部生から、大学で何をすべきかというメールを何通か受け取りました。私は大学で哲学を専攻していたので、アドバイスとしては最適ではないかもしれません。しかし、私は CS の授業を非常に多く受けたので、ほとんどの CS 専攻生は私をハッカーだと思っていました。少なくとも、私は間違いなくハッカーでした。
ハッキング
優秀なハッカーになるために大学で何をすべきでしょうか? できることは主に 2 つあります。プログラミングを非常に上手にできるようになることと、特定の興味深い問題について多くを学ぶことです。この 2 つは、それぞれが他のことをするきっかけとなるため、同等であることがわかります。
プログラミングが上手になる方法は、(a) 難しい問題にたくさん (b) 取り組むことです。そして、難しい問題に取り組めるようにするには、非常に魅力的なプロジェクトに取り組むことです。
このプロジェクトはおそらく授業の課題にはならないでしょう。私の友人ロバートは、学部生のときにネットワーク ソフトウェアを書いて多くのことを学びました。彼のプロジェクトの 1 つは、ハーバードを ARPANET に接続することでした。ハーバードは最初のノードの 1 つでしたが、1984 年までに接続が途絶えていました。[1] この作業は授業のためのものではなかっただけでなく、彼がこれにすべての時間を費やして勉強を怠ったため、彼は 1 年間学校を追われました。[2] 結局すべてがうまくいき、彼は現在 MIT の教授になっています。しかし、そこまで極端に行かない方が幸せになれるでしょう。当時、彼はそのことでとても心配していました。
プログラミングが上手になるもう 1 つの方法は、プログラミングが上手な人を見つけて、その人の知識を学ぶことです。プログラマーは、自分の仕事の種類や使用するツールに応じてグループに分かれる傾向があり、一部のグループが他のグループよりも賢いです。周囲を見回して、賢い人が何に取り組んでいるか見てみましょう。たいていは理由があります。
あなたの周りにいる最も賢い人の中には教授もいます。ですから、面白い仕事を見つける一つの方法は、研究助手としてボランティアをすることです。教授は、退屈なシステム管理タイプの問題を解決できる人に特に興味があるので、それが仕事の足掛かりになります。教授が恐れているのは、いい加減な人や履歴書を偽造する人です。助手になると仕事が純増することはよくあることです。ですから、純減を意味することを明確にしなければなりません。
相手が「ノー」と言ったとしても、がっかりしないでください。ほとんどの場合、拒絶は相手が想像するほど個人的なものではありません。次の相手に進んでください。(これはデートにも当てはまります。)
注意してください。ほとんどの教授は頭が良いのですが、全員が面白い研究をしているわけではありません。教授はキャリアアップのために斬新な研究結果を発表しなければなりませんが、より面白い研究分野では競争が激しくなります。そのため、野心のない教授は、誰も気にしない斬新な結論の論文を次々と発表します。このような教授は避けた方がよいでしょう。
私は研究助手として働いたことがないので、その道を勧めるのは少し不誠実な気がします。私は、特に Winograd の SHRDLU をリバース エンジニアリングしようとして、自分で何かを書くことによってプログラミングを学びました。私は、生まれたばかりの赤ちゃんを持つ母親と同じくらい、そのプログラムに夢中でした。
一人で作業することにどんなデメリットがあっても、プロジェクトがすべて自分のものであるというメリットがあります。妥協したり、誰かの許可を求めたりする必要はなく、新しいアイデアがあれば、ただ座って実行し始めることができます。
自分のプロジェクトでは、新しさ (教授のように) や収益性 (企業のように) を心配する必要はありません。重要なのは、プロジェクトが技術的にどれほど難しいかということだけであり、それはアプリケーションの性質とは関係ありません。データベースなどの「本格的な」アプリケーションは、技術的にはつまらない退屈なものが多いです (不眠症に悩まされているなら、データベースに関する技術文献を読んでみてください)。一方、ゲームなどの「軽薄な」アプリケーションは、非常に高度なものが多いです。大学の CS 学部の下位 9 割の研究よりも、より知的な内容の製品に取り組んでいるゲーム会社が世の中にはあるはずです。
もし私が今大学生だったら、おそらくグラフィックスに取り組んでいるでしょう。たとえば、ネットワーク ゲームや 3D アニメーションのツールなどです。私が学部生だった頃は、グラフィックスを面白くするのに十分なサイクルがありませんでした。しかし、今ではこれより楽しい仕事は想像しにくいです。
数学
私が大学にいた頃、多くの教授がコンピュータサイエンスは数学の一分野だと信じていました (少なくともそう願っていました)。この考えはハーバード大学で最も強かったのですが、1980 年代までコンピュータサイエンス専攻すらなく、それまでは応用数学を専攻する必要がありました。しかし、コーネル大学でもほぼ同じくらいひどかったです。私が恐ろしいコンウェイ教授に AI (当時はホットな話題でした) に興味があると言ったとき、彼は数学を専攻すべきだと言いました。彼が AI には数学が必要だと思っていたのか、それとも AI はナンセンスで、何か厳密なものを専攻すればそんな馬鹿げた野望はなくなるだろうと考えたのか、今でもよくわかりません。
実際、ハッカーとして必要な数学の量は、ほとんどの大学の学部が認めたがるほど多くはありません。高校の数学と計算理論のいくつかの概念以上の知識は必要ないと思います。(n^2 アルゴリズムを書かないようにするには、それが何であるかを知っておく必要があります。) もちろん、数学アプリケーションを書くつもりなら別ですが。たとえば、ロボット工学はすべて数学です。
しかし、ほとんどのハッキングには、数式を微分するための1001のトリックを知るという意味で、文字通り数学は必要ありませんが、数学はそれ自体のために学ぶ価値が非常にあります。数学は、ほとんどすべての種類の仕事にとって貴重な比喩の源です。[3] そのために、大学でもっと数学を勉強しておけばよかったと思います。
多くの人と同じように、私は子供の頃に数学の虐待を受けました。数学は美しくもなく、人生とは何の関係もない(「文章題」に置き換えようとしたにもかかわらず)公式の集まりであると考えるようになり、テストで良い成績を取るためにはそれを暗記しなければなりませんでした。
大学でできる最も価値のあることの一つは、数学が本当は何なのかを学ぶことです。これは簡単ではないかもしれません。なぜなら、優れた数学者の多くは悪い教師だからです。数学に関する人気のある本はたくさんありますが、良い本はほとんどありません。私が思いつく最高の本は、WW ソーヤーの本です。そしてもちろんユークリッドです。[4]
すべて
トーマス・ハクスリーは「あらゆることについて何かを学び、あることについてすべてを学ぶように努めなさい」と言いました。ほとんどの大学はこの理想を目指しています。
しかし、すべてとは何でしょうか? 私にとってそれは、人々が難しい問題に誠実に取り組む過程で学ぶすべてのことを意味します。そのような作業はすべて関連している傾向があり、1 つの分野のアイデアやテクニックは、他の分野にうまく移植できることがよくあります。非常に遠いと思われる他の分野にも移植できます。たとえば、私はソフトウェアを書くのと同じようにエッセイを書きます。座って、できるだけ早くタイプできるほど速く、不十分なバージョン 1 を書き上げ、その後数週間かけてそれを書き直します。
難しい問題に取り組むだけでは十分ではありません。中世の錬金術師は難しい問題に取り組んでいましたが、彼らのアプローチはあまりにも偽物だったため、それを研究しても、おそらく人々が自分自身を欺く能力について以外は、学ぶことはほとんどありませんでした。残念ながら、私が大学で学ぼうとしていた種類の AI にも同じ欠陥がありました。非常に難しい問題に、まったく不十分な技術で軽率に取り組んだのです。大胆ですか? 詐欺に近いです。
社会科学もかなりインチキです。なぜなら、社会科学は知的流行に大きく影響されるからです。物理学者が 100 年前の同僚に会ったら、何か新しいことを教えられるでしょう。心理学者が 100 年前の同僚に会ったら、ただイデオロギー的な議論を始めるだけです。もちろん、心理学の授業を取れば何かは学べます。でも、別の学部の授業を取ればもっと学べるというわけです。
私の意見では、価値のある学部は、数学、自然科学、工学、歴史(特に経済史と社会史、科学史)、建築学、古典学です。美術史の概論コースも価値があるかもしれません。近代文学は重要ですが、それを学ぶ方法は読むことだけです。音楽については、言うほど詳しくありません。
社会科学、哲学、そして政治的圧力に応じて最近作られたさまざまな学部は飛ばして構いません。これらの分野の多くは確かに重要な問題について語っています。しかし、その語り方は役に立たないものです。たとえば、哲学は、とりわけ、私たちがお互いに対して負っている義務について語っていますが、これについては、学問的な哲学者から学ぶよりも、賢い祖母や EB ホワイトから学ぶほうが多くなります。
私は経験から話します。クリントンが「それは『is』という言葉の意味による」と言ったことで人々が笑ったとき、私はおそらく気分を害したはずです。私は大学で「is」の意味について5つほど授業を受けました。
どの分野を学ぶ価値があるかを判断するもう 1 つの方法は*、ドロップアウト グラフを作成することです。*たとえば、数学が難しすぎるという理由で数学からコンピューター サイエンスに転向した人を私はたくさん知っていますが、その逆をした人はいません。人はむやみに難しいことをするわけではありません。比例して (または少なくとも log(n)) やりがいがない限り、難しい問題に取り組む人はいません。したがって、おそらく数学はコンピューター サイエンスよりも学ぶ価値があります。同様の比較によって、大学のすべての学部のグラフを作成できます。一番下には、知的コンテンツが最も少ない科目があります。
この方法を使用すると、先ほど私が出した答えとほぼ同じ答えが得られます。
語学コースは例外です。陶芸教室のような課外活動として考えたほうが良いと思います。その言語が話されている国で生活する時間と組み合わせて受講すると、はるかに有益になります。私は新入生のときに思いつきでアラビア語を勉強しました。大変な作業でしたが、唯一残ったのはセム語の語源を識別する奇妙な能力と、人々が単語を認識する方法についての洞察力でした。
スタジオ アートやクリエイティブ ライティングのコースはワイルド カードです。通常、あまり教えられることはありません。好きなことに取り組んだり (または取り組まなかったり) して、先生の漠然とした監督の下で、お互いの作品の「批評」を交わすだけです。しかし、ライティングとアートはどちらも (一部の) 人が真剣に取り組む非常に難しい問題なので、特に良い先生を見つけることができれば、取り組む価値があります。
求人
もちろん、大学生は勉強のことだけを考えるのではなく、就職と大学院という2つの現実的な問題も考えなければなりません。
理論上、リベラル教育は職業訓練を提供するものではない。しかし、誰もがこれがちょっとした嘘であることを知っている。どの大学でもハッカーは実践的なスキルを学んでおり、それは偶然ではない。
仕事を得るために何を学ぶべきかは、あなたが望む仕事の種類によって異なります。大企業で働きたいなら、Windows でBlubをハックする方法を学びましょう。クールな小さな会社や研究室で働きたいなら、Linux で Ruby を学ぶ方が良いでしょう。そして、自分の会社を立ち上げたいなら (これは今後ますます一般的になると思います)、見つけられる限りの最も強力なツールをマスターしてください。なぜなら、あなたは競争相手と競争することになり、彼らはあなたの馬となるからです。
大学で学ぶべきスキルと仕事で使うスキルの間には直接的な相関関係はありません。大学では少し高めの目標を設定する必要があります。
フットボール選手は、試合中にそれほどの力を発揮する必要がないにもかかわらず、トレーニングで 300 ポンドのベンチプレスを行えることがあります。同様に、教授が仕事で必要となるよりも高度な内容を学ばせようとする場合、それは単に教授が学者であり、現実世界から切り離されているからというだけではないかもしれません。教授は、脳を使って重量挙げをさせようとしているのかもしれません。
授業で書くプログラムは、現実世界で書くプログラムとは 3 つの重要な点で異なります。それは、プログラムが小さいこと、ゼロから始めること、そして問題が人為的で事前に決まっていることです。現実世界では、プログラムはより大きく、既存のコードが関係する傾向があり、問題を解決する前に問題が何であるかを把握する必要があることがよくあります。
これらのスキルを習得するために、大学を卒業する(あるいは入学する)まで待つ必要はありません。たとえば、既存のコードを処理する方法を学びたい場合、オープンソース プロジェクトに貢献することができます。あなたが働きたいと思うような雇用主は、授業の課題で良い成績を取ることと同じくらい、そのことに感銘を受けるでしょう。
既存のオープンソース プロジェクトでは、3 番目のスキルである、解決すべき問題を決定するスキルをあまり練習できません。しかし、自分で新しいプロジェクトを始めることを妨げるものは何もありません。そして、優秀な雇用主は、そのことにさらに感銘を受けるでしょう。
どのような種類の問題を解決しようとすべきでしょうか。その答えを得る方法の 1 つは、ユーザーとして何が必要かを尋ねることです。たとえば、スパムの受信を止めたかったので、スパム フィルタリングの優れたアルゴリズムを偶然見つけました。今、私が欲しいのは、受信トレイがいっぱいになるのを何とか防いでくれるメール リーダーです。私は受信トレイを ToDo リストとして使う傾向があります。しかし、それはボトルを開けるのにドライバーを使うようなものです。本当に必要なのはボトルオープナーです。
大学院
大学院はどうですか? 行くべきですか? 良い大学院に入るにはどうすればいいですか?
原則として、大学院は研究の専門的訓練であり、研究を職業としてやりたいのでなければ行くべきではありません。しかし、コンピューターサイエンスの博士号を取得した人の半数は研究職に就きません。私は教授になるために大学院に行ったわけではありません。もっと学びたかったから行きました。
ですから、あなたがハッキングに主に関心があり、大学院に通うとしたら、同じように場違いな人がたくさんいることに気づくでしょう。そして、あなたの周りの半分の人があなたと同じように場違いな人だとしたら、あなたは本当に場違いな人なのでしょうか?
「コンピュータ サイエンス」には根本的な問題があり、このような状況でそれが表面化します。誰も「研究」が何であるべきか確信が持てません。多くの研究は、出版数を 1 つ増やすために学術論文の形式に詰め込まなければならなかったハッキングです。
ですから、大学院で落ち着くかどうかを尋ねるのは、ある意味誤解を招くことになります。なぜなら、コンピュータ サイエンスに完全に馴染んでいる人はほとんどいないからです。この分野全体が、自分の殻に閉じこもっています。ですから、あなたがハッキングに主に興味があるという事実が、大学院への進学を思いとどまらせるべきではありません。ただ、嫌いなことをたくさんやらなければならないということだけは、覚悟しておいてください。
一番は論文です。ほとんどの人は、論文を書き終える頃には論文が嫌いになります。論文を書くプロセスは、全粒粉で作って12時間焼いたケーキのように、本質的に不快な結果を生み出す傾向があります。論文を喜んで読む人はほとんどいません。特に著者にとってはそうです。
しかし、あなたより何千人もの人が、論文執筆に苦労してきました。そして、それ以外では、大学院は楽園に近いです。多くの人が、それを人生で最も幸せな時期として覚えています。そして、私を含め、残りのほとんどの人は、論文を書かなくてもよかった時期として覚えています。[5]
大学院の危険なところは、怖い部分が最初から見えないことです。博士課程は、数年にわたる授業で始まる大学のパート 2 です。ですから、論文を書くという恐怖に直面する頃には、すでに数年が経過しています。今辞めれば、大学院中退者になりますが、おそらくその考えは気に入らないでしょう。ロバートが 1988 年のインターネット ワームを書いたために大学院から追い出されたとき、私は彼が失敗の汚名を負わずに抜け出す方法を見つけたことをとてもうらやましく思いました。
全体的に、大学院は他の選択肢よりも良いでしょう。多くの賢い人々と出会い、あなたの陰気な先延ばし癖は少なくとも強力な共通の絆になるでしょう。そしてもちろん、最後には博士号が手に入ります。私はそれを忘れていました。それは何か価値があると思います。
博士号の最大の利点は (もちろん、学界の組合員証であること以外に)、ある程度の自信を与えてくれることかもしれません。たとえば、私の家にある Honeywell のサーモスタットは、UI が最悪です。同じモデルを持っている母は、自分のサーモスタットの操作方法を学ぶために、1 日かけて熱心にユーザー マニュアルを読みました。母は、問題は自分のせいだと思っていました。しかし、私は「コンピューター サイエンスの博士号を持つ人がこのサーモスタットを理解できないのなら、設計が悪いに違いない」と考えることができます。
この曖昧な推薦の後でも大学院に行きたいなら、入学方法について確かなアドバイスを差し上げられます。私の友人の多くは現在コンピューターサイエンスの教授なので、入学に関する裏事情は知っています。大学とはまったく違います。ほとんどの大学では、入学審査官が入学者を決定します。博士課程の場合は教授が決めます。そして、教授はそれをうまくやろうとします。なぜなら、入学した人々は彼らのために働くことになるからです。
どうやら、一流の学校では推薦状だけが本当に重要だ。標準テストは何も意味せず、成績もほとんど意味がない。エッセイは、愚かなことを言って自分を不合格にする機会に過ぎない。教授が信頼するのは推薦状だけであり、できれば知り合いからの推薦状である。[6]
ですから、博士課程に進みたいなら、教授に感銘を与えることが鍵です。教授をしている友人から、教授に感銘を与えるものが何かを知っています。単に感銘を与えようとするだけではダメです。教授は、良い成績を取ったり、大学院に進学するために研究助手になりたいと申し出たりする学生には感銘を受けません。良い成績を取ったり、研究テーマに心から興味を持っているために研究助手になりたいと申し出たりする学生には感銘を受けます。
だから、大学院に進学したいにしろ、単にハッキングが上手になりたいにしろ、大学でできる最善のことは、自分が本当に好きなことを見つけることです。教授を騙して大学院に入れてもらうのは難しいですし、問題を騙して解決してもらうことも不可能です。大学では、ごまかしは通用しなくなります。この時点から、大企業に就職したいのでなければ(それはまるで高校時代に戻るようなものですが)、前進する唯一の方法は、好きなことをすることです。
注記
[1] 誰も気にしていなかったようですが、これは1984年当時、ARPANET(後にインターネットとなる)がいかに重要でなかったかを示しています。
[2] だからこそ、私が雇用主になったとき、GPA を気にしませんでした。実際、私たちは積極的に退学した人々を探しました。ハーバード大学の周りに「自分のプロジェクトに時間を費やしたせいで成績が悪く、退学になったのですか? 私たちのところで働きませんか!」というポスターを貼ったことがあります。私たちは、そうした経験のある若者を見つけることができました。彼は優秀なハッカーでした。
ハーバード大学は、学部生を1年間退学させると、就職を義務づけます。その目的は、現実世界がいかにひどいかを見せ、大学にいられることがいかに幸運なことかを理解させることです。この計画は、私たちの大学に来たある男性にとっては裏目に出ました。学生時代よりも楽しい時間を過ごし、その年はストックオプションで教授の給料よりも多く稼いだからです。そのため、その年の終わりに後悔して大学に戻る代わりに、彼はさらに1年間休学してヨーロッパに行きました。そして、結局26歳くらいで卒業しました。
[3] エリック・レイモンドは、ハッカーにとって最も適切なメタファーは集合論、組合せ論、グラフ理論にあると述べています。
Trevor Blackwell は、数学専攻者向けの数学クラスを受講するよう注意を促しています。「『エンジニアのための数学』クラスはひどいものでした。実際、『エンジニアのための x』クラスはどれもひどいものでした。x には数学、法律、ライティング、ビジュアル デザインが含まれます。」
[4] 他に強くお勧めする本:クーラントとロビンズの『数学とは何か』 、ヒルベルトとコーン=フォッセンの*『幾何学と想像力』* 。グラフィックデザインに興味のある人には、バーンの『ユークリッド』 。
[5] 完璧な人生を送りたいなら、大学院に行き、最初の1、2年はこっそりと論文を書き、その後の3年間は1章ずつ少しずつ書き進めながら、ただ楽しむのがいいでしょう。この見通しは大学院生の口を潤ませるでしょうが、それをやり遂げる規律を持った人を私は知りません。
[6] ある教授の友人は、毎年入学する大学院生の15~20%は「見込み薄」だと言っています。しかし、彼が言う「見込み薄」とは、出願書類があらゆる点で完璧であるものの、推薦状を書いた教授を入学審査委員会の誰も知らない人々のことを指します。
したがって、理系の大学院に入学したいのであれば、本物の研究教授がいる大学に進学する必要があります。そうでないと、どれだけ優秀であっても、入学審査委員会にはリスクの高い候補者とみなされてしまいます。
これは驚くべき、しかし明らかに避けられない結果を暗示している。つまり、小さな教養大学は破滅する運命にあるということだ。ほとんどの賢い高校生は、最終的にはそうしないことにしたとしても、少なくとも科学の道に進むことを考えている。選択肢を制限する大学になぜ行くのか?
この原稿を読んでくれた Trevor Blackwell、Alex Lewin、Jessica Livingston、Robert Morris、Eric Raymond、そして数人の匿名の CS 教授、そしてこの原稿のきっかけとなった質問をしてくれた学生たちに感謝します。