元Google植山 類の“実装力”の源をSakana AI・秋葉拓哉が探る「集団開発のしがらみに、個人開発で殴りこむ」
エンジニアが聞きたい○○な話
前回、研究者の牛久祥孝さんから対談のバトンを受け取ったSakana AIの秋葉拓哉さん。次なる対談相手の希望を聞くと……
秋葉さん:エンジニアの植山 類さんに、難易度の高いプログラムを一人で作り上げてしまう実装力の源を聞きたいです。
……とのこと。そこで今回は、元Googleのエンジニアで、現在は独立してBlue Whale Systemsを経営する植山 類さんと秋葉さんの対談を実施。テーマは「植山さんに聞きたい、“実装力”の源」です。
Blue Whale Systems 植山 類さん(
@rui314)
日系企業に勤めた後、2007年10月にGoogleへジョイン。Google Japanを経て本社へ異動。現在は独立しBlue Whale Systemsを創業。LLVMのリンカ「lld」と、「mold」の開発者
Sakana AI Research Scientist 秋葉拓哉さん(@iwiwi)
東京大学大学院情報理工学系研究科で博士号を取得。国立情報学研究所に入所し特任助教を務めた後、Preferred Networksへ転職。その後、Stability AIを経て2023年12月よりSakana AIに入社し現職
moldを作ったのは「大学院の単位を取るため」だった
秋葉:植山さんと最初に接点を持ったのは、僕がマウンテンビューのMicrosoft Researchでインターンをしていた時だったと記憶しています。エンジニアならば誰が見ても驚くような開発を成し遂げ続けているので、ぜひ詳しくお話を聞きたいと思い対談のリクエストをさせていただきました。
植山:ありがとうございます。初めてお会いした当時から、秋葉さんはプログラミングコンテストの上位ランカーで実力があって、おまけに話も上手かった。なかなか直接関わる機会はなかったけど、時流に乗ってディープラーニングに着手して活躍しているという話はよく耳にしていました。
秋葉:確かに、植山さんと知り合った頃はまだディープラーニングには手を出していなかったですね。今ではAIへと専門領域を移して久しいので、振り返ると長い時間が経ちました。
今回は、個人の力で優れたプログラムを生み出してきた植山さんの「圧倒的な実装力」の秘訣に迫りたいと思っているのですが、まずはキャリアの変遷から聞かせてください。プログラミングを始めたのはいつごろでしょうか。
植山:中学生の時ですね。小学生のころからパソコンに興味はあったものの、今のように1家に1台パソコンがあるような時代ではなかったので親に頼んでも買ってもらえなくて。やっと自宅にパソコンがやってきたのが、中学3年生の時でした。
最初に触ったのは、Visual Basic 2.0だったかな。当時はまだWebで得られる情報が少なかったから、情報収集はもっぱら雑誌。学生でお金がなかったので、書店のパソコン雑誌コーナーで立ち読みしていました。
秋葉:僕も中高生時代は毎日紀伊國屋に通っていました。Linuxのインストールに苦戦して雑誌や本を読んだり……懐かしいですね。
その後は、どのようなキャリアを?
植山:大学を卒業して日本の企業で働いてからGoogle Japanへ転職し、後に本社に異動しました。その後はスタンフォード大学の大学院に通って、現在は独立して自分の会社を経営しています。
Google Japanでは、Web検索チームに在籍してモバイル検索フロントエンドを担当していました。当時の仕事が面白くなかったわけではないのですが、自分の強みが発揮できている感覚は薄かったんですよね。僕の強みは、小気味よく動くものを作ることだと思っていたので。
ただ、2007~2010年くらいの検索チームは非常に景気が良くて、週ごとのトラフィックを見ても常に右肩上がりでした。そんな時流も手伝って、アメリカの本社に渡る機会に恵まれたのはついていました。
秋葉:ぜひ、エンジニアとしての植山さんの代表作についても教えてください。
植山:Googleで働いていた時に作ったLLVMのリンカ※『lld』と、スタンフォード大学院で作った『mold』が代表作です。どちらも業界標準のリンカとして多く採用されるようになりました。
先日とあるカンファレンスで登壇した時、「lld使っている人いますか?」と聞いたら会場にいた100人くらいのうち半分が挙手して、「じゃあmold使ってる人は?」と聞いたら残りの半分が手を挙げてくれました。大きなプログラムを書いているエンジニアの方には広く使われているようですね。
※機械語で記述されたプログラムを結合して実行可能なファイルを生成するもの
秋葉:moldはスタンフォード時代に作ったものだったんですね。どういうきっかけだったんですか?
植山:実は、大学院の単位を取るためのなりゆきだったんですよ。
当時、指導を受ける教授を自分で探して、プログラムを開発すればそれに見合った単位をもらえるという講義がありました。自由研究のようなイメージですね。
もともとはコンパイラを作ろうと考えていたのですが、教授との最初の1on1で「なんか新規性がないね」と言われてしまって(笑)。じゃあ何を作ろうかと教授とブレストしている中で僕が「ものすごく速いリンカを作ることならできる」とぼそっとつぶやいたら、「『ものすごく速い』なら新規性があるじゃん」と言われたんです。
僕はとにかくA+の成績を取りたかったので、それでいこうとなりました。結局Aだったんですけどね(笑)
秋葉:単位を取るためにmoldを作ってしまうのがすごいですよ。
コンパイラの話で思い出しましたが、C言語で書かれたソースコードを変換するCコンパイラ制作の記事を書かれてましたよね。僕の周りの人も参考にしています。
植山:GoogleのC++のコンパイラチームで働いていた時に書いた記事ですね。当時、1人でCコンパイラを作りたかったのですが、参考にできる資料がなかったんですよ。だったら自分が作るしかないと思って書きました。かなりボリュームのある記事になりましたね。
他には開発日記のような記事も書いていたのですが、そちらは英語版も公開していましたGoogle社内やその周りでも評判になり、GO言語を作ったロブ・パイクが僕のデスクにやってきて、「その記事を見せてくれ」と言われたこともあります。あの時はとてもうれしかったですね。
コンパイラはまるで「巨大ピタゴラ装置」
秋葉:ただ、コンパイラを専門的に仕事にする人って多くないですよね。
植山:そうですね。でも僕は、昔からコンパイラに興味があったんですよ。例えるなら、巨大ピタゴラ装置のようなイメージ。細かい仕掛けがたくさん連動して、結果的に大きなものが作られていく。その様子に心が踊るんです。エンジニアリングの領域でその条件を満たすものが、コンパイラでした。
秋葉:コンパイラは一つのものをどんどん変換して、成果物をアウトプットしますもんね。
植山:一つ一つの動作は単純なんですが、その数が100万、1000万になっても正確に動き、大きなファイルが完成する。それってすごいですよね。ディープラーニングが登場するまでは、コンパイラが最も不思議なプログラムでした。
秋葉:Googleのコンパイラチームにはどんなきっかけでジョインしたのでしょうか。
植山:社内のジョブポスティングサイト経由で接点を持ったマネジャー経由で、コンパイラ関連のポジションがあると知ったことがきっかけですね。携わったのは、ClangというC++コンパイラをWindowsに移植するプロジェクト。目的は、ChromeのWindows版をビルドすることでした。
当時はVisual Studioを使っていたのですが、どうも利便性が良くなくて。そこにあわせるとChromeの開発やアップデートも遅れてしまうわけです。
なので、自分たちでChromeの命運を握り、可能性を広げていくために、Clangの移植に踏み切りました。単に移植するのではなく、Visual Studioと相互運用できることを目指して。
プロジェクトに入るにあたって、Visual Studioでコンパイルしたファイルと相互運用できるようにClangのC++コンパイラを改良するのと、リンカを作るのとどちらを担当したい? と聞かれたんです。コンパイラは条件が複雑で難しそうだけど、リンカは気合いを入れたらどうにかなりそうかな、と思って、リンカを作ることを選びました。「リンカ希望って珍しいね」って言われましたね(笑)
秋葉:コンパイラチームにとって、やっぱり花形はコンパイラを作ることですもんね。確かに、リンカを作るのはニッチかも。作るための技術的なノウハウが載っている技術書も少ないのでは? 詳しく解説をしている本や論文があったら僕も読みたいです。
「一人で作っている」という事実こそが、個人開発の強み
秋葉:先ほど、lldはGoogleに在籍していた時に作ったとおっしゃっていましたよね。
植山:そうです。lldは、チームメンバーが作りかけていたWindowas用のリンカを引き継いで仕上げました。ただ着手してしばらくすると、「これは最初から書き直した方がいいな」と気付いたんですよね。
そこで、ドラスティックな設計変更を提案したらものすごい議論になってしまったんです。中には批判もありました。「経験の足りないプログラマはすぐに書き直そうとする」「上手くいかないに決まっている」と。
ただ、この時は僕の進め方も良くなかったと反省しています。成果物がない状態で大きな提案をしたので、議論を呼んでしまった。まず作ってみて、それを土台として議論を進めるべきだったと今は思います。
秋葉:新しいものを作る時、最初からチームを作るべきかどうかは悩ましいですよね。初期段階からチームメンバーとの議論を重ねてコツコツ作るよりも、自分の手で作って直しての試行錯誤を繰り返しながら進めた方が、結果としては早い気がします。
植山:僕も同じ意見ですね。lldに関しては、最終的には高品質なものができたのでよかったのですが、あの時の経験は今でも若干トラウマになっています(笑)
当時、lldは既存のリンカの10倍以上の速さと言われていました。そのあとに僕が個人で作ったのがmoldですが、こちらの速さはlldの2倍以上。lldを作った時の経験が活きました。
秋葉:moldを作る時、「lldのスピードを上回れる」という確信があったんですか?
植山:もちろんありました。lldを作った時もできることは全部やったつもりでしたが、「こうすればもっと速くなる」という考えがなかったわけじゃなくて。でも、それを実現しようとなると、会社に属している以上は合意をとるのが難しいだろうことも分かっていました。
秋葉:そこで働く「人の組織的構造」が「システムの構造」に影響する……というのは、いわゆる「コンウェイの法則」だと思いますが、起こりやすいケースですよね。技術的な難しさには、政治的な難しさが絡んでくるというか。
植山:そういう要因で凝り固まってしまっている領域に殴りこむなら、個人開発が強いと僕は思います。単純に「高い技術力」があるからすごいのではなく、「一人で作っている」という事実が強みになるんじゃないかな、と。
そもそも、ソフトウェアは個人の作品であるべきだと思うんです。「これはあの部署が悪い」「それはあっちが出したバグでしょ」という状況に陥らず、作ったその人が責任を負える状態が健全ですよね。
秋葉:実はそこが今回一番聞きたいポイントだったんですよ。植山さんは、自分一人の力で多くのエンジニアが束になっても作れないようなプログラムを作り上げてしまう、ヒーロー的なところがあるなと思っていて。シンプルにめちゃくちゃかっこいいんですよね。
植山さんのように実装力のあるエンジニアになるためには、どんなスキルがあったらよいのでしょうか。
植山:まずは、プログラムを書くスピードが速いといいですね。手を動かすのが速いと、いろいろなアイデアを試せるじゃないですか。結果、その中から一番いいものを選択することが可能になる。試行錯誤の量が増えるので、よいものを完成させやすいんです。実際、僕はリンカを作る時に書き直しをしていますが、これもスピードが遅いとできなかったなと思います。
それに、プログラムを書くスピードが遅いと成果物が少なくなるので、作ったものへの執着がわいてしまって「やり直し」ができなくなってしまうケースもありそうです。
あとは、単純ですが「作りたい」という気持ちが大切ですね。
秋葉:その意欲を持つのは大切ですよね。共感します。
植山:世の中の大半の人は「すごいものを作りたい!」という情熱を持っていないんですよね。だから、「作りたい」と思えることがまずは大切。僕はこの思いが人一倍強かったので、仕事が終わった後に趣味でコンパイラを作るような生活ができたんだと思います。
ただ、これは一種の呪いでもあります。今ではある程度のスキルが付いたので、みんなに使ってもらえるものを作れるようになりました。ただ、そこに至るまでには辛い思いも苦労も山ほど必要です。
でも、「作りたい」という呪いにかかっているので、作らざるを得ない。その苦しみを乗り越えると、きっと今よりも上手く開発ができるようになるはずですよ。
文/中たんぺい 編集/秋元 祐香里(編集部)