Googleに落ちた話（前編）

Google採用エントリが流行っている。Googler達の声を聞いていると、「英語が苦手でも大丈夫」「競技プログラミングが苦手でも大丈夫」「情報系出身じゃなくても大丈夫」「面接でミスをしても大丈夫」優しい声ばかりだ。何だか自分でも入れそうな気がしてくる。

しかしGoogleの採用試験は難しい。とてもとても難しい。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Google採用試験、一次面接（ハングアウト+Docsでのコーディング）から箸にも棒にもかからず門前払い同然だった記憶しかないですね。一応、高校時代から3Dゲームエンジン作ったり、研究室では分散環境で動く最適化ライブラリ作ったりしてて、プログラミングはﾁｮｯﾄﾃﾞｷﾙつもりだったのですが…。</p>&mdash; はま (@hmkz_) <a href="https://twitter.com/hmkz_/status/1110415802799259648?ref_src=twsrc%5Etfw">2019年3月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">少なくとも自分の経験ベースでいうと、ひととおりのメジャー言語 (2012年当時の自分でいうとC++, Java, Python, Lua, Haskell, etc) で5万行規模のライブラリを一人で設計実装できる実力があっても、トップ会議複数本+DC1持ってても、まるで手が届かない程度には難しかったですよ。</p>&mdash; はま (@hmkz_) <a href="https://twitter.com/hmkz_/status/1110451514978365440?ref_src=twsrc%5Etfw">2019年3月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

面接に呼ばれた候補者は、Googleエンジニアを前にして、なぜか言われてもいない曲芸を始め、バランスを崩して転倒し、複雑骨折して退場していくのだ。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">&quot;Google の面接に来る人は、とてもとても肩に力が入っていることがあります。そして単に２重ループ書けば済むところで、超絶技巧ビット演算の妙技を披露したりします。披露できればまだいいのですが、大抵の場合はうまくいきません。&quot; <a href="https://t.co/uhimYzoeNE">https://t.co/uhimYzoeNE</a></p>&mdash; はま (@hmkz_) <a href="https://twitter.com/hmkz_/status/1110749083881242624?ref_src=twsrc%5Etfw">2019年3月27日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

それは緊張といった生易しいものではなく、恐怖としか言いようのないもの。Googleの採用試験は、Googleの背後に揺らぐ、巨大な亡霊との戦いである。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Googleに入った人の話だけ見ても生存バイアスとしか思えないので「橙コーダーだけどGoogle落ちました」みたいな話を読みたい…（まだ言ってる）</p>&mdash; tomerun (@tomerun) <a href="https://twitter.com/tomerun/status/1110532549619662848?ref_src=twsrc%5Etfw">2019年3月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

それなりにプログラミングができるつもりでいたにも関わらずGoogleに落ちた身として、その心理について書いてみたい。ただ、心理というものはその人の歩んできた過去にも依存するもので、面接シーンだけを語っただけで伝えられるものではない。申し訳ないが、Googleの面接よりずっと前の話から始めることにした。長くなったので前後編に分ける。

- Googleに落ちた話（前編）：高校〜Google面接前まで。この記事
- Googleに落ちた話（後編）：Google面接〜就職まで。明日公開

しがない一エンジニアの自分語りに興味がない人は、この記事は閉じて、明日の記事を読んでほしい（しかしそれだとGoogleに落ちる人の心理は分からないと思う）。この記事が、これからGoogleを受ける人にとっての心理的準備に、また、もしGoogleが私に似た人間にも興味があるなら、この心理的ミスマッチをどう防ぐのかについてのヒントになれば嬉しい。

## 高校時代 (2001年4月〜2003年3月)
情報の授業があった。BASICで円を描いたりする内容だったけど、隣のS君が5分で終わらせて、スペースインベーダーみたいなゲームを作っていた。聞けばプログラミングを極めると何でも好きなゲームが作れるらしい。自分もやってみることにした。

最初はS君の薦めもあって[HSP](http://hsp.tv)でじゃんけんゲーム作ったりした。本格的なものを作ろうとすると辛くなったので、1か月ほどしてC++に転向した。3Dゲームが作りたかった。当時はUnityのような便利なフレームワークはない。フリーのゲームライブラリといえば[DxLib](https://dxlib.xsrv.jp)や[yaneSDK](http://bm98.yaneu.com/yaneSDK.html)[^1]くらいのもので、個人製作ゆえにいつ更新停止するともわからない。結局、これらを参考にしつつゲームライブラリを自作することにした。yaneSDKを調べる過程でいくつかバグを見つけたので、今は無きやねう掲示板にパッチを投稿したら、ご本人から「誰だか知らないけどあんがと」と返事をいただけた。几帳面で優しい人だと思った。ライブラリ開発はWin32APIとDirectX5がdirtyで苦労した。

[^1]: 作者はコンピュータ将棋で有名なやねうらおさんである。当時はBM98で有名だった。ブログが面白いけど、個人的には[HP時代の日記のほうがキレがいいと思うのでぜひ読んでほしい](http://bm98.yaneu.com)。

ゲームはトライアル＆エラーで作るものなのに、いかんせんC++はコンパイルが遅い。スクリプト言語が必要だ。そこそこ高速で、実行ファイルが肥大化せず、コルーチンのあるオブジェクト指向言語がほしい。これも自作かと思った矢先にすべてを備えたLuaが出てきた。C++との変数のやり取りも[luabind](https://www.rasterbar.com/products/luabind.html)を使えば一瞬だった。やはりAPIがtidyだと物事はスイスイ進むなと思った。それから数年して、C++ & Luaによる開発はゲーム業界のスタンダードになった。

実践ばかりでなくて多少は座学もせんとなーと思って、[ネットでSICP読んだり](https://mitpress.mit.edu/sites/default/files/sicp/index.html)、Introduction to AlgorithmsやTAOCPを買って読んだりしてた。学校帰りに本屋でコンピュータ系雑誌の棚を片っ端から立ち読みするものだから、すぐに顔を覚えられて追い出された。

2年生になってS君とも違うクラスになり、周囲にプログラムの話ができる人はいなくなった。自分がどの程度の実力か、勉強の方針があっているのかもわからない。ネットだけが情報源であり、交流の場だった。当時のネットは小学生からマイコン少年だったような人達の溜まり場で、高校生でゲーム会社に就職したとか、中学生でLISP処理系を自作したとか、小学生で線形代数ライブラリを自作して本も出版したといった話題にあふれていた。見渡すかぎりすごい人達ばかりで、自分はプログラミングを始めるのも遅く、客観的な業績もないので全く恥ずかしくなるばかりだった。

プログラミングしすぎて浪人した。

## 浪人時代 (2003年4月〜2004年3月)
大学に興味がなかった。そもそも元をたどれば高校にも行きたくなかった。個人ゲーム制作は途方もなく時間が溶けるので、とにかく作業時間を確保したかった。高校を卒業してやっと授業から解放されたのに、なぜまた貴重な人生を奪われなければならないのか。僕に必要なものは大学ではなく[5億年ボタン](https://dic.nicovideo.jp/a/5%E5%84%84%E5%B9%B4%E3%83%9C%E3%82%BF%E3%83%B3)だったが、誰もそんなものを持ってきてはくれなかった。[^2]

[^2]: 漫画作中では、5億年は主人公が何をしても消費しきれない途方も無い時間として描かれ、主人公は悟りまで開いてしまう。しかし一人で何かを成そうと思えば5億年はとても短い。[2019年現在の世界労働力人口は約50億人](https://www5.cao.go.jp/j-j/sekai_chouryuu/sh11-01/pdf/s1-11-1-3.pdf)であり、5億人年=60億人月はわずか地球1.2ヶ月ぶんの労働力にすぎない。こんなわずかなリソースで白紙の状態から宇宙の真理になど到達できるはずがないし、現代文明を再構築できるかさえ怪しい。なお、ここで人月計算を持ち出したのは私がSIerの一員だからではなく、一人で何でもやらないといけない状況ではNo Free Lunchに陥って人類の平均作業効率に落ち着くと想定されるためである。

今思えばAO入試とかいう選択もあったのかもしれないが、大学に興味がなかったのでそんな制度があること自体知らなかった。親や教師は僕がプログラミングをしてることは知らず、少なくとも表向きにはただ頭が悪いだけの平凡な学生だった。[^3]周囲が大学行けとうるさいので、ゲーム制作の合間に仕方なく勉強して某工大に合格した。第1志望の5類（情報系）は落ちて、第2志望の7類（生物系）に入学した。[^4]

[^3]: 両親は今も僕の仕事内容を知らないと思う。パソコンを作りながらときどきコクサイカイギという名の海外旅行をする旅芸人のような扱いになっている。

[^4]: 第2志望は選ぶのが面倒だったので、願書提出日の新聞を見て「これからはバイオの時代だ」と書かれているのを見て決めた。1類でも情報系の勉強ができるのは入学後に知った。

## 学部時代 (2004年4月〜2008年3月)
コンピュータと最も縁遠い7類に入ったこともあり、周囲には相変わらずプログラミングの話ができる人はいなかった。ネットを見るとさらに強い人が溢れかえるようになり、もう自分がコンピュータ関係の仕事に就くのは無理だろうと思った。もう周りのことは気にせずプログラミングは趣味として続けていこう。自分の気に入ったゲームが作れればいい。そんな気分だった。

ゲームエンジン開発が落ち着いてきたので、そろそろゲームを作ろうと思った。当時、個人制作ゲームの発表の場といえば同人だった。[電プロさん](https://twitter.com/rectangledenpro)の[Reiders Sphere Second](https://rectangle.jp/rs2/screenshot_rs2.html)を見て、個人でここまでやれるのかと感動した。

メタルギアソリッドを対戦できるようにしたようなやつを作ろうとした。[^5]自作ライブラリが成熟していたこともあってプログラムは順調に進んだが、素材（グラフィクス、サウンド等）が作る暇がなかった。7類の友人に頼るのは酷な気がしたので中学時代の友人にお願いしたのだけど、遠隔地ということもあってモチベーションの維持が難しかった。月1回、はるばる電車で1時間半かけて友人宅にミーティングに向かうのだが、大抵は会議さえできずに「そんなことより連邦VSジオンしようぜ」だった。遅々として進まないので、痺れを切らしたメンバーの一人がプラン縮小してボンバーマンクローンを作ろうと言い出して、結局それもプログラムは完成したが素材が揃わなかった。まぁ、当初のプランはもしやる気があったとしても工数的に無理があったと思う。無謀な計画に巻き込んでしまって申し訳なかった。

[^5]: 分かりやすくするために有名タイトルを挙げたが、当然あそこまでのクオリティで作るつもりはない。正確に言うと、[トラップガンナー](https://dic.nicovideo.jp/a/%E3%83%88%E3%83%A9%E3%83%83%E3%83%97%E3%82%AC%E3%83%B3%E3%83%8A%E3%83%BC)のようなものを作ろうとしていた。

他にプログラミング関連でやったこととしては、インカレサークルのイベントHPを作った。有料サーバを借りるお金がなかったので[XREA](https://www.xrea.com/)のLAMP環境で応募システムを作ったのだけど、締切数分前に数百件の応募が殺到して、雀の涙ほどのリソースしかない割り当てられないフリーのホスティングサービスとしてはヒヤヒヤものだった。

サークルで知り合った5類のY君にプログラミングや勉強を教えたりしていた。情報系の教科書は代表的なものを色々読んだけど列挙するのが面倒なので割愛する。本は読むだけなので面白い話はない。

プログラミングしすぎて留年した。[^6]

[^6]: 大学に興味がなさすぎたため、単位を取らないと進級できないことを知らなかった。急に留年と知らされたので驚いた覚えがある。

## 卒研 (2008年4月〜2009年3月)
生物とかホント興味なさすぎて無理だと思った。学科長に直訴したら、情報系の研究室で卒研をやらせてもらえることになった。TSUBAMEの他に研究室でも100台ほどのPCクラスタを持っていてかなり遊べた。適当に多目的遺伝的アルゴリズムを作って国際会議 ([PPSN X](http://ls11-www.cs.tu-dortmund.de/ppsn/ppsn10/index.php)) で発表した。

## 大学院 (2009年4月〜2013年3月)
研究室で使われていたJavaの内製ライブラリを拡張してjGOAL (Java Global Optimization Algorithm Library) を作った。名前のうえでは大域的最適化アルゴリズムのライブラリと言うことになっているが、実態としては分散環境で反復計算をするための汎用フレームワークで、そこに代表的な最適化アルゴリズムを載せたものである。サポートしてた機能は覚えている限りで

- 線形代数
- 乱数・確率統計
- 最適化（局所・大域ひととおり）
- ロギング
- ビューワ
- マルチクラスタに対応した分散処理・並列処理
- 実験 as Codeを実現するためのDependency Injection

最後のやつだけ意味不明だと思うので説明すると、こんな感じに最適化アルゴリズムのクラスを書いて：

```java:SimpleGA.java
public class SimpleGA {
  public SimpleGA(
    @DI("PopulationSize") int n,
    @DI("Crossover") BitstringCrossover c,
    @DI("Mutation") BitstringMutation m
  ) {
    ...
  }
  ...
}
```
こんな感じに設定ファイルを書くと：

```properties:simple-ga.properties
Model = jgoal.model.SimpleGA
Model.PopulationSize = 100
Model.Crossover = $OnePointCrossover
Model.Mutation = $BitFlippingMutation

OnePointCrossover = jgoal.crossover.OnePointCrossover
OnePointCrossover.CrossoverRate = 0.2

BitFlippingMutation = jgoal.mutation.BitFlippingMutation
BitFlippingMutation.MutationRate = 0.1
BitFlippingMutation.MaxFlip = 4
```
設定ファイルにしたがってオブジェクトが構築されて実験が走る。JavaのPropertiesに`$`で変数参照できる機能を追加しただけの簡単なお仕事。

しかし、Javaでモジュール性が高い最適化ライブラリを作ろうとすると、インターフェース地獄に陥った。1メソッドしかないインターフェースを沢山作ってGenericsで組み合わせていく感じになるので、現代でいうとSpark MLlibのJavaコードと同じような様相を呈してくる。型推論がない言語では辛すぎると思った。というか1メソッドならもう関数型でいいじゃん。当時のScalaは共用ライブラリに採用できる成熟度ではなかったので、Haskellで書き直したhGOALを作成した。jGOALの置き換えを狙ったけど、研究室メンバー全員にHaskellを覚えてもらうのは辛過ぎるということで共用ライブラリに採用されることはなかった。内容的には、2019年の今から見てもモダンな設計だと思う。

コードはSubversionで管理していた。実験の再現性を担保するために、Subversionのフックを活用して、タグをコミットすると自動的にクラスタにデプロイされて実験が走るようにしていた。今にして思えばCI/CDの先駆けである。

ちょうどこの頃、位相的データ解析 (Topological Data Analysis, TDA) が流行り始めたので[Topology for Computing](https://www.cambridge.org/core/books/topology-for-computing/1171035B570105A57865CEA390BA5E74)を輪講した。関数型言語とTDAをやった繋がりで圏論の基礎も読んだ。

大学院では学部の研究を続けるつもりはなかった。進化計算は生物のメタファで何でうまくいくのかよくわからない感じだったので、適当に理論的に解析できそうな多目的最適化アルゴリズムを作った。後付けで色々と解析してみると、このアルゴリズムが多目的最適化問題の解集合を網羅できるかどうかは解集合のトポロジーと関係がありそうな気がしてきた。多目的最適化の研究者は多いが、解集合のトポロジーを研究している人は世界的にも少数で、結局自分で考えるしかない感じだった。何もかも自分で考えているとなかなか進まないもので、修士〜博士過程で出版した論文は国際会議3本、ジャーナル3本、国内会議10本程度でイマイチだった。調べるうちにSmaleが1970年代に創始したベクトル値モース理論と関係があることがわかってきたが、そのあたりで博士課程が終わってしまった。この研究はかなり発展性があって、今も継続している。

DC1は過去に何人かの先輩が採用されていたので、ノウハウを教えてもらって書くだけだった。あんまり実力な気がしない。申請手続きがアホみたいに煩雑で、IQ3になったことしか覚えていない。なるべく政府とは関わりたくないなと思った。

プログラミングしすぎて留年しそうになったが、指導教員に止められて卒業した。

## Google面接に到るまで
少し戻って2012年の1月のことになる。Googleのエンジニアがリクルートにやってきた。（後編に続く）