Knoh, The Knowledge Hub

Evan Priestley 氏がどうやってプログラミングを学んだかを教えてください

回答の背景

本人による回答です。Evan Priestley 氏は知る人ぞ知る、Facebook を代表する (元) エンジニアの一人です。Facebook には 2007 年から 2011 年の間に在籍していました。

 

手短かに言えば: 何年もの歳月の賜物というか。ぼくはただひたすらプログラミングが大好きで、(フェイスブックで働いていた) 過去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. スピード」ではなく「質 = スピード」を念頭にソフトウェアを書いてきた。相当たくさんの仕事をフェイスブックではしたし、書いたもののかなりの部分が今でも使われていることを考えると、ぼくの考え方は間違っていなかったと思う。

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

  • ガッコウをやめよう (これは冗談だ。まともにうけないでほしい。ガッコウは行こう。ガッコウは君のためになる。ビタミンも重要だ。)

  • プログラミングが大好きであること。

  • マスターするには気の遠くなるくらいの時間を費やさなくてはいけない。近道はないし、一番ためになる教訓は、一番苦労して得るものだ。

  • 一番重要で一番やっかいなスキルはシステムを設計するための判断力だ。限りなくシンプルなデザイン(as simple as possible but not simpler) というのはなかなか教えられるものではなく、大方経験を重ねて覚えるものだ。

  • 幅広く覚えるほうが掘り下げるより大事だと思う。幅広い知識はお互いに補完しあって、大域的な理解や、新しい分野へのとっかかりにつながる。掘り下げた知識というのは大体その分野にとどまるもの。浅く広くシステム全体を理解していたほうが、ある部分を熟知しているより速くソフトウェアが開発できる。

  • プログラミングに限ったことではないけど、複雑なシステムを理解するには、全体のしっかりとしたモデルを頭の中に持つことがカギとなる。おおまかな全体図をまず把握して、そこから部分的につめていくことが大事だ。「広く浅く覚えよう」というのも、広く浅く覚えた方が、全体像を把握しやすいからだ。頭の中のモデルがしっかりできていれば、システム全体の挙動を把握・推測することもできるようになる。

  • 質v.s.スピードという二律背反の関係は、局所的なものでしかない。大域的には、片方を犠牲にした場合、知らぬうちにもう一つも犠牲にしているということをお忘れなく。

  • 「なぜ」「どうして」そうなるのか常に考えること。

  

もっと知る