コンピュータサイエンスの学生へのアドバイス

From The Joel on Software Translation Project

Jump to: navigation, search

Joel Spolsky / 青木靖 訳
2005年1月2日 日曜


WindowsのリッチGUIクライアントにこそソフトウェアの未来があると私がわめいていたのはほんの1、2年前だというのに、学生がe-mailでキャリアについてアドバイスを求めてくることがある。今は採用シーズンでもあることだし、彼らが読んで、笑って、無視できるような一般的なアドバイスを書いてみようと思う。

大学生の多くは、幸いなことに、生意気なものであり、あまり年長者にアドバイスを求めたりはしないが、コンピュータサイエンスの分野においてはこれは良いことなのだ。年長者というのは「2010年にはキーパンチャーの需要が1億人を越える」とか「Lispを使う仕事が最近すごくホットだ」みたいな間抜けで時代遅れなことを言うものだからだ。

私自身も、学生にアドバイスするとき何について話したらいいのかわからない。私は救いがたく時代遅れで、AIMが実際どういうものかわからず、奇妙な"e-mail"と呼ばれる旧式なもの(ひゃあ!)をいまだに使っているが、これは音楽が「CD」と呼ばれる丸く平たい皿に入れて売られていた頃に人気のあったものなのだ。

CA1.JPG

だからあなたは私がここで言うことなんかは無視して、学生たちがデートの相手を見つけられるオンラインソフトウェアでも作っていた方がいいと思う。

それはともかくとして――

あなたがプログラミングが好きなら、自分の恵まれていることに感謝することだ。あなたは自分の好きなことをしていい暮らしができる数少ない幸運な人間の1人なのだ。多くの人はそんなに幸運ではない。「自分の仕事を愛する」というのは近代的な概念だ。仕事というのは、お金を稼ぐために何か不愉快なことをすることだと考えられている。そうして稼いだお金で自分の本当に好きなことをやるのだ。65になって引退したときに。ただしそれは、生活に余裕があって、それがやれないほどには老い衰えておらず、しっかりした膝やいい眼や息を切らさずに20フィート歩けることを要求されなければの話だ。

何の話をしていたんだっけ? ああ、そうだ。アドバイスするんだった。

これ以上回り道するのはやめて、コンピュータサイエンス専攻の学生へのジョエルの無料のアドバイスをあげることにしよう(安物買いの何とかとも言うけど)。

1. 卒業するまでに文章の書き方を学ぶこと。

2. 卒業するまでにC言語を覚えること。

3. 卒業するまでにミクロ経済学を学ぶこと。

4. コンピュータサイエンス以外の授業を退屈というだけの理由でさぼらないこと。

5. プログラミング中心の授業を取ること。

6. 仕事がみんなインドに行ってしまうと心配するのをやめること。

7. 何をするにせよ、いいサマーインターンの仕事をすること。

私がやるようにと言っただけの理由でこれを全部しようと思っているほどあなたが人を信じやすいなら、もうひとつ追加しておこう:

8. 自尊心を強くするのを手助けしてくれる専門家を探すこと。


卒業するまでに文章の書き方を学ぶこと

リーナス・トーバルズが伝道していなかったなら、Linuxは果たして成功しただろうか? 彼が優れたハッカーであったということと同時に、e-mailやメーリングリストを通して文章で自分のアイデアを人に伝えるリーナスの能力が、世界中のボランティアをLiunxに引きつけたのだ。

最近のエクストリームプログラミングの流行については耳にしているよね? 私がXPをどう思っているかは置いておくとして、あなたがXPについて耳にしている理由は、才能ある書き手や話し手がそれを宣伝しているからだ。

もっと小さな規模の場合においても、プログラミング組織はどんなものであれ、最も大きな権力や影響力を持つプログラマは、明確に、説得力を持って、やすやすと書き、話せる人間だ。背が高いというのも助けにはなるが、それについてはあなたはどうすることもできない。

CA2.JPG

まあまあのプログラマと優れたプログラマの間にある違いは、どれだけたくさんのプログラミング言語を知っているかではなく、JavaとPythonのどちらを好むかということでもない。違いは彼らがアイデアについてコミュニケートできるかどうかという点にある。他の人を説得することで、彼らは力を得るのだ。明快なコメントや技術仕様書を書くことで、彼らは他のプログラマが自分のコードを理解できるようにしており、それによって他のプログラマがコードをスクラッチから書き直すのでなく、そのコードを利用できるようにしているのだ。それなくしては、コードには価値がない。エンドユーザのための明快な技術ドキュメントを書いてコードが何をするものなのか人々に理解できるようするというのが、他の人たちがそのコードに価値を見いだせるようにする唯一の方法なのだ。Sourceforgeには誰も使わない有用なすばらしいコードがたくさん埋もれているが、それは文章があまりうまく書けない(あるいは全然書かない)プログラマによって作られているからだ。そのため彼らの為したことを誰も知らず、彼らのすばらしいコードは萎れてしまう。

私は英語で文章を書け、しかも上手く書けるのでなければプログラマを雇わない。あなたが良く書けるなら、あなたが職を得たときすぐに仕様書を書くように頼まれるようになり、それによってあなたは影響力を伸ばすことができ、マネジメントの目にもとまるようになる。

多くの大学には「文章を書くこと中心の」授業があり、その単位を取るためには非常に多くの文章を書く必要がある。そういう授業を探して取るようにしよう! どんな分野でもいいから、毎週、あるいは毎日文章を書く宿題を出す授業を見つけることだ。

日記やウェブログをつけはじめるといい。書けば書くほど、書くのは楽になる。そして書くのが楽になれば、もっとたくさん書くようになるという、プラスのサイクルができる。


卒業までにC言語を覚えること

パート2: C言語。私がC++言語と言わなかったことに注意してほしい。Cは使われる機会が減っているが、依然現役プログラマたちの共通語であることは変わっていない。Cはプログラマが互いにコミュニケートする言語だ。そしてさらに重要なのは、MLやJavaやPython、あるいはその他の何であれ、近頃大学で教えられているトレンディでくずみたいな「現代的」言語とくらべて、Cはマシンに近いということだ。あなたは少なくとも一学期間はマシンに近いことをやる必要があり、そうでないと高級言語で効率的なプログラムを決して作れない。最高のプログラミング職である、コンパイラやオペレーティングシステムの仕事が決してできない。大規模プロジェクトのアーキテクチャ作成を任されることもない。あなたが継続やクロージャや例外処理についてどれくらい知っているかは気にしない。あなたがなぜwhile (*s++ = *t++);で文字列がコピーできるのか説明できないなら、あるいはこれがあなたにとってごく自然なことでないのだとしたら、私に言わせるとあなたは迷信に基づいてプログラミングしているのであり、製薬会社のセールス女が効くと言ったからと処方している解剖学の基礎も知らない医者と一緒だ。

卒業するまでにミクロ経済学を学ぶこと

CA3.JPG

経済学を履修してない人のためにごく簡単に説明しておこう。経済学というのは、意味があって現場でも証明されているたくさんの役に立つ理論や事実で華々しく始まり、それからあとは坂道を転げ落ちていく分野の中の1つだ。最初の有用なやつはミクロ経済学で、これは文字通りビジネスで重要な理論すべての基礎となっている。その後は悪化していき、マクロ経済学が出てくる(これはスキップして構わない)。マクロ経済学は金利と失業率の関係のような興味深い理論についての話なのだが、当たっていることよりはずれていることの方が多い。そしてそれ以降はただ悪くなっていく一方で、たくさんの経済学専攻の学生が物理学に切り替えてしまうのだが、なんにしてもそのほうがウォールストリートでいい職が得られるのだ。ただミクロ経済学は間違いなく取るようにしないといけない。需要と供給の関係とか、競争優位とか、NPVとか割引とか限界効用について知らなければ、ビジネスがどう機能するのか全然理解できないからだ。

それではなぜ、コンピュータサイエンスの学生が経済学を学ばなければならないのか? それは、ビジネスの基礎を理解しているプログラマは、理解していないプログラマよりもビジネスにとってより価値が高いからだ。それだけのことだ。コードの上では意味があるが、資本主義の観点では意味のないばかげたアイデアを持ったプログラマにイライラさせられた経験は数え切れないくらいある。あなたが経済学を理解したなら、あなたはより価値の高いプログラマとなり、その報いを受け取るだろう。その理由もまた、ミクロ経済学で学べるのだ。


コンピュータサイエンス以外の授業を退屈というだけの理由でさぼらないこと

コンピュータサイエンス以外の授業をサボるというのは、GPA(成績平均点)を下げるには優れた方法だ。

GPAがどれほど大きなものか過小評価しないことだ。多くのリクルーターや採用マネージャは、私も含め、履歴書を見る時真っ先にGPAを見る。そしてそのことを悪いとも思っていない。なぜか? それはGPAが他のどんな単一の数値よりも、何ダースもの教授たちが長期間に渡って様々な異なる状況下であなたの学業について考えたことの総和を反映しているからだ。STAの成績はどうかって? ハッ! そんなのは数時間のテスト1回の結果でしかない。GPAは4年間に渡る何百ものレポートや中間試験や授業への参加を反映している。GPAにも問題はある。成績は年々インフレを起こしている。あなたがその成績を田舎のコミュニティカレッジでやさしい家政学の授業で取ったのか、それともカリフォルニア工科大学で大学院レベルの量子力学で取ったのか、GPAは何も語っていない。だから田舎のコミュニティカレッジのGPA 2.5をふるい落とした後、学業成績証明書と推薦状を出してもらうことになる。その場合でも私は、コンピュータサイエンスだけでなく、一貫して成績が高い人を探す。

ソフトウェア開発者を捜している雇用主である私が、どうしてヨーロッパ史の成績を気にしなきゃいけないのか? なんといっても歴史は退屈だ。ああ、つまり君は退屈な仕事はまじめにしないから君のこと雇うべきだって言うわけ? プログラミングにだって退屈な部分はある。どんな仕事でも退屈な瞬間というのはあるものだ。そして私は楽しいことしかやろうとしない人を雇おうとは思わない。

私は大学で文化人類学というのを取った。人類学について何か学ばなきゃいけないと思ったからだ。そしてこれは面白い概説をやる授業に見えた。

CA4.JPG

面白かったかって? とんでもない! ブラジルの熱帯雨林に住むインディオとか、トロブリアンド諸島に関する信じがたいほど単調な本を読まなきゃならなかった。私にはどういう意味でもあまり興味が持てなかった。ある時など、授業があんまり退屈だったので、せめてもう少し興味深いことをやりたいと思った。草が伸びるのを眺めるとか。私は授業の内容に興味を失ってしまった。すっかり、徹底的に。ヤムイモを積み上げることについての延々と続く議論にうんざりするあまり涙が出てきた。私はトロブリアンド諸島の人たちがどうしてヤムイモを積み上げるのにそんなに時間を使っているのかわからず、今では思い出すこともできないが、その話はまったくもって退屈だった。しかしすでに学期の半ばに達していたので続けることにしたのだ。そして私は文化人類学を退屈の試練と考えることにした。退屈に対する障害物コースだ。外衣のポトラッチに関するすべてについて学ぶことを要求するテストのある授業でAを取れたなら、どんな退屈なことにだって対処できるだろう。今度たまたまリンカーンセンターで18時間あるワーグナーの指輪を聞く羽目になった時に、あれに比べればまだましだと思わせてくれるクワキウトルについてやった勉強がありがたく思えるかもしれない。

私はAを取った。私にできたのだから、あなたにだってできるはずだ。


プログラミング中心の授業を取ること

私は大学院には行かないぞと誓った瞬間を覚えている。

それは動的論理の授業で、教えていたのはイェール大学の精力的なレノール・ザックだった。頭の切れるコンピュータサイエンスのスタッフの中でも特に頭の切れる人物だ。

私の暗い思い出について語るのは、この分野にとっては不名誉なことだろうが、それでもどうにか話してみることにしよう。形式論理のアイデアは、何かが真であることを、別なことが真であることに基づいて証明する、ということだ。たとえば「成績のいい人はみな職を得る」と「ジョニーはいい成績を取った」ということから、形式論理のおかげで「ジョニーは職を得るだろう」という新たな真なる事実を見出すことができる。これはかなり奇妙なもので、脱構築主義者が形式論理の有用な部分をすべて抜き出すのには10秒しかかからないだろう。残るものは面白いかもしれないが、役には立たない。

さて、動的論理も形式論理と同じものなのだが、ただ時間の概念が加わっている。たとえば、「灯りを点けた、あなたは自分の靴が見える」プラス「以前に灯りが点いた」ということから「あなたは自分の靴が見える」ことが帰結される。

動的論理はザック教授のような頭のいい理論家たちにはアピールした。これによってコンピュータプログラムに関することを形式的に証明できるかもしれないという望みをもたらしたからだ。もしそれができたなら、これはとても有用なものとなり得る。ただし、たとえばマーズローバーのフラッシュカードがオーバーフローを起こして、火星人マービンを探して赤い惑星を走り回っているべき時に、一日中リブートし続けることにはならないと形式的に証明できたらの話だが。

だから授業の最初の日に、ザック博士はまるまる2枚のホワイトボード全体と、ホワイトボードの隣の壁のかなりの部分を使って、電気スイッチがあって灯りが消えているとき、スイッチを入れたなら、灯りが点く、ということを証明したのだ。

その証明はめちゃくちゃ複雑で間違いやすいものだった。電気スイッチを入れたら灯りが点くという事実を自分で納得するのに比べ、その証明が正しいか確認するのはずっと難しかった。実際ホワイトボード何枚分もの証明には、形式的にやるのが退屈すぎるために省略されたステップがたくさんあった。長い証明のステップは、あるところでは昔ながらの帰納法を使った証明がされており、あるところでは背理法を使った証明がされていて、またあるところでは大学院生を使った証明がされていた。

私たちは宿題で逆の命題を証明しなければならなかった。つまり、灯りが消えていたが、今は点いているなら、スイッチが入れられたはずだ、ということを証明するのだ。

私は本当にやってみた。

図書館で何時間もかけて証明しようとした。

2時間くらいたってから、私が元にしていたザック教授の証明に誤りがあるのを見つけた。たぶん私が写し間違えたのだろうと思うけど、それであることに気づかされた。何か当たり前なことを証明するのに3時間かけて黒板を埋める必要があるなら、誤りが紛れ込む可能性が何百とあり、このメカニズムは興味深いことを証明するのには決して使えないということだ。

これは動的論理学者にとってはあまり問題とはならない。彼らがそれをやっているのは有用なことのためではなく、大学の職のためだからだ。

私はこの授業を落として、コンピュータサイエンスの大学院には絶対行かないと決めた。

この話の教訓は、コンピュータサイエンスはソフトウェア開発と同じではない、ということだ。あなたが本当にラッキーなら、あなたの大学にはちゃんとしたソフトウェア開発のカリキュラムがあるだろう。ない場合だってあるが、それはエリート学校は実務的なスキルの教育は職業訓練学校や刑務所の更正プログラムでやればいいと思っているからだ。プログラミングなんぞよそで学べばいい。我々イェール大学は「将来の世界のリーダーを育てて」いるのだ。君の16万ドルの授業料がwhileループについて学ぶためだと思ってるの? エアポート・マリオットホテルでやってるJavaセミナーでも受けたら? ハハン。

問題は、ソフトウェア開発専門の学校というのがないということで、プログラマになりたければ、たぶんコンピュータサイエンスを専攻することになるということだ。専攻としては結構なのだが、しかしソフトウェア開発という分野とは異なっている

あなたがラッキーなら、コンピュータサイエンス学科でもプログラミング中心の授業をたくさん見つけられるだろう。歴史学科にも文章を書けるようになるまで山ほど書かかせるような授業がたくさんあるのと一緒だ。そしてそれらのプログラミングの授業こそ一番取るべき授業だ。あなたのやりたいことがプログラミングなら、コンピュータにさわらないラムダ計算や線形代数の授業の要点がわからなくとも、決まり悪く思う必要はない。Practicum(実習)という名の付いた400レベルの授業を探すことだ。ラテン語で飾り立てているのは、教養主義の支配する政治の目から実用的な授業を隠すための作戦なのだ。


仕事がみんなインドに行ってしまうと心配するのをやめること

第一に、あなたがすでにインドにいるのなら、この問題について悩む必要はない。だから職が全部インドに行くとかまったく気にかけなくていい。プログラミングは素晴らしい仕事だから、達者にして楽しむといい。

しかし私はコンピュータサイエンス学科への入学者が危険なほど減っているという話をずっと耳にしている。その理由は「職がすべてインドに行ってしまいそうな分野に進むのを学生たちが恐れている」ためだという。これはいろいろな意味で間違っている。第1にビジネスの現在の流行に基づいて職を選択するというのはばかげている。第2に、仮にすべてのプログラミングの職がインドや中国に行ったとしても、プログラミングというのは、ビジネスプロセスエンジニアリングのような、様々な種類のとても興味深い仕事に対するいいトレーニングになる。確かにITをやっているたくさんの人間が、自分たちがいかに長く職を得られないでいるかと騒いでいるが、でも、どう思う? 連中を怒らせるリスクを恐れずに言うと、本当にいいプログラマは仕事を得ているのだ。第4に、他にもっといいアイデアがあるっていうの? 歴史を専攻してどうするつもり? ロースクールに進む以外に選択肢はないだろうね。そして私の知っている事実が1つある。実務に就いている法律家の99%は、自分の仕事を嫌っているのだ。仕事の時間の1分1分を嫌い、しかも週90時間働いている。前に言ったように、プログラミングが好きなら自分の恵まれていることを感謝することだ。あなたは自分の好きなことをやっていい暮らしができる幸運な少数者の1人なのだから。

なんにしても、学生がインドのことを本当に憂慮しているとは思わない。コンピュータサイエンスの入学数の減少は、ドットコムの狂乱で大きくふくらんだ入学数が正常なレベルに回復しているに過ぎない。本当はプログラミングが好きじゃないけど、給料の高くてかっこいい仕事をして24歳でIPOを迎えるチャンスがコンピュータサイエンス学科にはあると思った人たちによってバブルになっていたのだ。その人たちは、ありがたいことに、とうの昔にどこかへ行ってしまった。


何をするにせよ、いいサマーインターンの仕事をすること

やり手のリクルーターたちは、プログラミングを愛している人というのは、中2のときに歯医者のためにデータベースを作ってやり、大学に入る前の3度の夏を子供向けのコンピュータキャンプで教え、大学新聞のためにコンテンツマネジメントシステムを構築し、ソフトウェア会社でサマーインターンをやっているものだと知っている。それが彼らが履歴書の中に探すものなのだ。

CA5.JPG

あなたがプログラミングを楽しんでいるなら、あなたが犯しうる最大の過ちは、(夏休みの、パートの、あるいはそのほか何であれ)プログラミング以外の仕事をすることだ。他の19歳の若者たちはみんなショッピングモールでシャツをたたむ仕事をしたがっているのは知っているが、あなたは19歳であっても極めて価値の高いスキルを持っており、それをシャツをたたんで無駄にするというのはばかげている。あなたが卒業する時までに、履歴書にたくさんのプログラミング仕事がリストアップされているようにすべきだ。アバクロンビー&フィッチの卒業生たちはといえば、レンタカー会社で「人々のレンタルのニーズを満た」しているのだ。(トム・ウェリングは別だ。彼はテレビでスーパーマン役をやっている。)

あなたの人生を簡単にしてあげるため、そしてこのエッセイが実のところいかに利己的か強調するために言っておくと、私の会社であるFog Creek Softwareでは、ソフトウェア開発のサマーインターンシップをやっており、これはあなたの履歴書に花を添えるはずだ。去年のインターンのベンはこう言っている。「ソフトウェアのコーディング、開発、それにビジネスについて、他のどんなインターンシップよりもFog Creek Softwareで多くのことを学ぶことになるはずだ」。彼がそう言っているのは、彼の部屋にならず者の一団を送り込んでそう言わせたからというばかりじゃない。応募の締め切りは2月1日になっている。さあ乗った乗った!

あなたが私のアドバイスに従うなら、あなたはMicrosoftの株を早く売りすぎたり、ドアのついた自分のオフィスが欲しいためにGoogleの仕事を蹴ったり、そのほか愚かな人生の決断をすることになるかもしれないけど、それは私のせいじゃないよ。私の言うことなんか聞くなとは言ったはずだからね。


(オリジナル: Advice for Computer Science College Students)

戻る

Personal tools