The Wayback Machine - https://web.archive.org/web/20121111232231/http://ktamura.com:80/epriestley.html

オリジナルはココです。フェイスブックのエンジニアで史上ベスト3に入るといわれるEvan Priestley氏への質問「どうやってプログラミングを覚えましたか」に対する本人からの答えです。

手短かに言えば

何年もの歳月の賜物というか。ぼくはただひたすらプログラミングが大好きで、(フェイスブックで働いていた)過去4年間、ほとんど他のことをしていない。その前も2.5年ほどプログラマーとして働いていたし、そのさらに前も6年くらい趣味でプログラミングをしていた。ぼくは高校も大学も中退しているので、それで空いた時間もプログラミングに費やした。つい最近フェイスブックを辞めたけど、未だに起きている時間のほとんどはプログラミングだ。

もっと詳しく言えば

月並みだが、ぼくはちっちゃい頃からコンピューターが好きで、我が家にあったヤツで(最初はMac Plusで途中からIIsiになった)で散々遊んだ。8歳か9歳のころにBASICを少しかじり、こんなプログラムを書いたりしていた。

10 PRINT "HACKING "
20 PRINT RANDOM()
30 GOTO 10

(学校のアップルIIeを拝借してだが)文法はおそらく正しくないけど、乱数がスクリーンを覆う様は、まわりの9歳児にはスゴく見えたと思う。

特にぼくの興味を惹いたのはビデオゲームだった。膨大な時間を"Escape Velocity"というゲームに費やし、自分でシナリオを書いたりもした。このゲームはプラグインで拡張できるようになっていて、ResEditってもので、自作のミッションや戦闘機、武器なんかを足せるようになっていた。これは厳密にはプログラミングじゃないけど、それなりにコンピューターの内部の知見を要するもので、ここで結構プログラミングの知識を得たんじゃないかと。最終的には「ファイナルバトル」っていう自作のシナリオを他のプレーヤーと一緒になって作ったりもした。12歳くらいだったと思う。

やっぱりシナリオを書くだけじゃ物足りなく、自分でゲームを作りたかったので、12歳の誕生日にプログラミング入門のCDを両親にせがんで買ってもらった。CDの中身は、メトロワークスコードウォーリアーのIDEと、雑多なプログラミング言語とかライブラリとかのpdfで、買ってもらってから一年くらいした頃から真剣に勉強しだした。13歳の6月くらいだったろうか。一旦勉強しだすと夢中になって、C言語の初歩を二週間くらいで覚えた。そっから先もどんどんC/C++とかOpenGLを独学で覚えた。OpenGLはOS9上で遊んでいた。IIsiは、ぼくの個人マシンとなっていたと思う。

こっからしばらく、ぼくの人生は下降線を辿ることになる。引っ越したと思ったら両親が離婚し、高校には馴染めず相当サイアクだった。鬱と虚無感にさいなまされたぼくは、当然プログラミングにも身が入らず、大したことも達成せずに5年の月日が流れた。一応プログラマーとしてレベルアップはしていたが遅々としたものだった。この頃にPHPに出会い、RunicaというディアボロIIのルーンワードを検索するウェブサイトをPHPで書いた。ウェブサイトは累計100万ヒットくらいまでいって、ウェブは壮大だなあと感心したのを覚えている。結局高校はやめた。高校をやめたのは人生で最高の選択(のひとつ)だったと思う。

19になってまもない8月の終わりにポートランド・ウェブワークスで働くことになった。友達がインターンをしていたのだが、大学に進学するので辞めるむねを会社に伝えたら、「誰かよい代わりはいないか」と聞かれたそうだ。ぼくがその代わりだった。

ポートランド・ウェブワークスでは2年半ほど働いた。業務はおおむねPHPでウェブサイトを書くことだった。入社したころは右も左もわからなかったが、社会人として働くことはスゴく楽しかった。高校がぼくにとってサイアクだった一番の理由は、できることやできるとわかっていることでもクラスの一員として宿題をやったり授業に参加したりしなくちゃいけなかったことだ。(こんなことを書くと高慢ちきに聞こえるかもしれないが、ぼくがいたのはメイン州の片田舎の公立高校で、高校2年生にもなって2週間もメートル法について勉強していた。)まあこれは別にぼくが通っていた高校のせいではない。ガッコウというものはそんなものだ。理不尽なガッコウに比べて、実社会では要領がいいこと、効率的に仕事を片付けられることが正当に評価された。働きだしたことで、ようやっとキチガイなシステムから抜け出せた気がした。

実社会へ一歩踏み出したころ、ぼくは南メイン大学にコンピューターサイエンス専攻として身をおいていた。2、3コンピューターサイエンスのクラスを取ってみたが、この時点で既に6年ほどのプログラミング経験があったこともあり、学ぶことは少なかった。つまらないので生化学に専攻を変えたところ、新しい発見の連続で俄然クラスが楽しくなった。結構たくさんクラスを取ったのだが、時間が経つにつれ仕事が大きく比重を占めるようになった。最終的には必要な単位が一番少ない数学に専攻を変えたのだが、教養のクラスを取るのがおっくうで、ポートランド・ウェブワークスを辞めたときに大学も退学してしまった。大学は比較的プラスな経験だった。学術的にというより人間的に社会的に成長した場所だった。学費のために7000ドルちょいしか借金しなかった(訳注:これはアメリカの大学の学費としては超少額です)っていうのも「プラスな経験」と思える一因だろう。

ポートランド・ウェブワークスで得た一番の教訓は「どうやってシステムをデザインするかは、その後に多大な影響を与える」ってことだ。とても小さい会社だったので、ぼくはとても自由に仕事をさせてもらった。自分で書いたコードは、働いていた2年半の間、全部メンテしていた。ソフトウェアの開発に最初から最後まで関わるという経験はとても貴重だったんじゃないだろうか。なぜなら、プロジェクト開始時のダメなデザインのしっぺ返しを、後で自分でモロに受けるからだ。当初ぼくは、ほとんど考えずコードを「アンダーエンジニアリング」していた。後々これを過度に修正してしまい、全てを「オーバーエンジニアリング」し作り込みすぎてしまった。2年半という時間はこういった失敗を経験するには十分な時間で、辞めるころにはシステムのデザインの塩梅が、かなりわかるようになっていたと思う。

2007年のはじめころには、ポートランド・ウェブワークスの仕事も物足りなくなり、大学もほとんど通っていなかった。丁度そのころ、レディット(reddit.com)で見つけたフェイスブックの採用パズルを解いて、解答をメールした。その後ちょっとして、ぼくはフェイスブックに雇われることになり、2007年の4月から働きだした。

(閑話休題:ちなみにぼくの一番得意な言語はPHPだ。PHPは概ねダメな言語とされていて、まあ妥当な評価とも言える。どこでどうやってPHPを覚えることになったか覚えてないが、多分Linuxを走らせていた友達のサーバに載っていたとかだろう。なんにせよぼくはPHPを知っていたからポートランド・ウェブワークスで働くことになったし、フェイスブックに採用されたのもPHPを知っていたからだ。ぼくの人生はPHPに貶められ、そして救われたといってもいい。フェイスブックでは、ぼくは「一番PHPを嫌っていないエンジニア」と自称していた。ぼくのことを「PHPバカ」と呼ぶ同僚もいた。ぼくは別にPHPのファンではないが、PHPに関しては膨大な知識を持っているので、他の言語を学ぼうと一念発起するには、それこそ膨大なエネルギーがいるのだ。それに、どのプログラミング言語を使うかってのは、多くの人が考えるほど重要ではないと思う。ぼくの経験上、一番PHPをバカにし、言語の重要性をうそぶく連中は、大体自分たちが提唱する言語でもロクな仕事ができないことが多い。)

当初、フェイスブックでは必死にならないとついていけないと予想していた。ぼくは独学でプログラミングを覚えたドロップアウトで、まともな教育も受けていない。それに、それまでもぼくは様々な分野で自分よりも何倍もスゴい人たちに出くわしてきた。たとえば中1のときにMath Countsっていう数学の大会にメイン州の代表として出たが、その時のチームメートは自分より10倍は数学ができた。フェイスブックでも同じように圧倒されるんじゃあないかと思っていたわけだ。

そして、ぼくはコードを見てしまった。

コードの質がフェイスブックの強みであったことはないが、2007年のフェイスブックのコードはグローバル変数とextract関数にまみれたヒドいものだった。「PHPベストプラクティス」なるウィキもあったが、「関数は使うな。おそい!」という、言いたいことはわかるが意味不明なことが書いてあった。そんなPHPのコードもJavaScriptのコードに比べたら断然マシだった。「ひょっとしたらぼくは自分で思っていたよりも遥かにまともなプログラマーじゃないか」とこの時思い、少し安心した。(ちなみに今のフェイスブックのコードベースは2007年と比べたら、はるかに質が上がっている。)

フェイスブックではもの凄い勢いで働いた。ポートランド・ウェブワークスの時よりも働いた。もう大学と仕事という二足のわらじを履いていなかったし(メイン州にいたころは、一週間40時間労働プラス大学でマックス単位取得なんてこともあった)、生活面でも昔より落ち着いていた。スタートアップの「モーレツ文化」に心酔し、そっから4年間ただただひたすら働いた。

ぼくのプログラマーとしての成長に一番寄与したのは、「判断力をつける」ということじゃないだろうか。働き始めた最初の2、3年は、システムをデザインする際に、ボロボロとひどいミスをした。でもフェイスブックで働きだしたころには既にそれなりの経験があったので、ぼくがデザインしたシステムは概ねシンプルさと洗練さを丁度よく兼ね備えていたと思うし、他のエンジニアのデザインの問題点も、比較的すぐに気づくことができた。これも最初の数年で培われた判断力のおかげだ。この「判断力」は、プログラマーにとって非常に重要なのだが、そう簡単に教えられるものでもない。ぼくが知る限り、判断力をつける一番の方法は、自分で設計したシステムを長い間メンテすることだと思う。

ぼくのプログラミング哲学はちょっと変わっているようだ。フェイスブックの人たちは(ある意味、現代ソフトウェアエンジニアリングも)開発スピードとコードベースのクオリティは反比例するもの、あるいはどっちか選択するものとの考えている。フェイスブックエンジニアリングのモットー「ガンガン動いてドンドン壊せ(Move Fast and Break Things)」はこの考え方を象徴している。この考え方はオカしいと思う。これはつまり「ダメなコード・プロダクトなら早く世に送り出せるが、コード・プロダクトの質にこだわっていたらいつまでたっても出荷できない」ということで、これを真に受けたら誰だって「ダメなコードでも出荷しよう」ってことになって、誰も低品質のコード・プロダクトをつくりだすことへの罪悪感を感じなくなってしまう。だって質とスピードは反比例するんだろ。

この「質v.s.スピード」という概念は根本的に間違っていると思う。だって素早く開発をしなくては環境、あるいは自分の環境の理解の変化にソフトウェアがついてこれず、ソフトウェアが解決すべき問題が解決できなくなり、必然的に質が落ちてしまう。逆に、質の高いソフトウェアを書かなくては、なにかある度にインフラが崩壊し、素早く開発をすることができなくなってしまう。インフラの崩壊は、やる気を削ぐので特にたちが悪い。フェイスブックでは「質v.s.スピード」ではなく「質=スピード」を念頭にソフトウェアを書いてきた。相当たくさんの仕事をフェイスブックではしたし、書いたもののかなりの部分が今でも使われていることを考えると、ぼくの考え方は間違っていなかったと思う。

長くなったが、最後にプログラミングを覚えるうえでのアドバイスを。

Tweet このエントリーをはてなブックマークに追加

Translated by @__kiyoto__