こうしてGoogleに落ちた
TL;DR Leetcodeをもっとやる必要がありました
Googleの社員が選考過程についてブログを書いています。ちょっと前にNTTブームを引き起こしたid:kumagiさんとか。
ところで、僕もGoogleの選考をわずか一ヶ月前に受け、そして落ちました。いずれ記事にしてみたいなとは思っていたのですが、社内の方々が記事にしているのを見て秘密保持のレベルが判断できたので、ブームの内に自分でもまとめてみます。
人物
特徴量
- 非情報[科学|工学]専攻の工学系
- 国立大
- D2
- M1からは情報系のリーディング大学院に所属(情報系のフォーマルなクラスはそこでいくつか取得した程度)
- B4からデータ解析の研究室に所属
- D1時に非英語圏へ3ヶ月の研究留学
- DC1持ち
- Computer ScienceのPublication無し
- 5段階でレベルをつけると、
- Python: 4
- Ruby: 2
- Javascript: 2
- Stan: 3
- C: 1
- MATLAB: 1
- Java: 1
- Database周り: 3
- etc...
といった感じです。見れば分かる通り、情報系のまともな教育を受けていません。早いシステム言語も大して書けません。
英語
博士学生ですし、自身の分野も情報系と同じく海外の方が圧倒的に進んでいるので、英語論文は読んでましたし、書いてました。ただTOEIC自体は6年前に取った650程度のスコアがあるだけです。その点数を実際に先方へ報告しました。ただ後述するように選考の過程で英語力を評価されるタイミングはありましたが、社員の方から「英語力大丈夫?」みたいなあまり意味のない質問をされたことはありませんでした。実力本位ですね。
これはGoogleにも限られないので課程を終えられたら書くつもりですが、就活全体を通して自身の英語力は前述した研究留学の経験が一つのバロメータとして評価されていたように思えます。最近はトビタテ!とか、学振持ちなら海外渡航支援などもありますので、是非とも実力証明として留学をしましょう。そして面白い研究をしましょう。
競技プログラミング
まったく経験がありません。……この時点でSoftware Engineerに応募したことが間違っている気もします。ブログの過去記事の通り、僕はデータ分析側に興味があり、基礎アルゴリズムとデータ構造の勉強は疎かにしてしまいました。研究もアルゴリズムを考えるより、既存の手法で問題を解く方がメインです。
リクルーターとの接触
アカリクの逆採用型ITイベントで接触しました。このイベント自体も、自身で能動的に参加したわけではなくアカリク側から連絡があって受動的に参加したのですが、自分が思っていたよりいろいろな会社と話せて楽しかったです。そもそも自分自身がああいう初対面の人にPRをガンガンかけていく場が得意ということも一つの発見でした。おすすめです。
イベントの接触時には、人事社員1+現場社員1でした。イベントに応募した時点で、自分のポートフォリオスライドを作ってくるようにアカリクから指示が出されたので、それを使って自己紹介、先方からの質問といった形式です。1つ嬉しかったのは、Googleがそもそも僕のブースに来てくれた理由として学振持ちということを見てくれたことです。この点に着目してくれたのはミクシィとGoogleだけでした*1。努力した点を評価してくれるのは、何にとっても嬉しいものです。
現場社員の方は自身のエンジニア的な活動の取り組みに技術的な質問を投げかけてきて、人事の方はこちらからの非技術的な質問に答えるのがメインの役割だった気がします。もちろん、Googleという会社像についての非技術的な質問もあり、僕がよく考えずに回答したことに対してダメ出ししてきたのが面白かったです。
面談の最後には、コーディング面接を模擬的にやってくれました。この問題自体は簡単でしたが、自分がビッグオー記法を完全に理解していなかったり、計算効率が悪い回答を答えたりした凡ミスがありました。
イベント後、研究室に戻ってお礼メールを各社に送信。イベント自体は土曜日でしたが、月曜日になってから、一番最初にメールが帰ってきたのがGoogleでした*2。CV提出と引き換えに選考を進めてもらえるとのことでしたが、当時論文を提出するために格闘していたため、正式な応募まで時間的猶予をもらいました。
この段階でGoogleの選考プロセスをまともに調べて、コーディング面接の対策が必要だったという点もpendingにした一因です。イベントの間に仲良くなった別の参加者から、Googleの面接ではHacking the Coding Interview(HtCI)という本が良いらしい!和訳版もある。と教えてもらって読んだり、TwitterやGoogleで「Google 採用」と調べたアドバイスに従ってLeetcodeで遊んだりしてました。
世界で闘うプログラミング力を鍛える本 ~コーディング面接189問とその解法~
- 作者: Gayle Laakmann McDowell,岡田佑一,小林啓倫
- 出版社/メーカー: マイナビ出版
- 発売日: 2017/02/27
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (7件) を見る
落ちた身なので全く説得力のないアドバイスですが、Leetcodeをやる場合にはExplore -> Top Interview Question、へ取り組むのが良いと思っています。Easy, Medium, Hardに分かれているので、慣れているならHardとかやって一通りさらったあとに個別の問題へ移ればいいですし、僕の場合みたいに時間も経験もないならEasyからMediumへと進めていけます。ちなみにいま確認したらSolvedが60でした。確かに体感的に足りてないですし、400問ぐらい解いておくと良いらしいです。
米系有名テック企業に入りたいのであれば、何とかして内部推薦をゲットして、LeetCodeをやって、LeetCodeをやって、さらにはLeetCodeをやれば何とかなるという印象がある。LeetCode 400問くらい解いてみんなも年収2000万ゲット!! https://t.co/dRG8pc0ljH
— Mr. ベイエリア (@csstudyabroad) 2019年3月25日
ただ僕のように付け焼き刃でやっても仕方がないことですし、HtCIにも書いてあるとおり普段からLeetcodeなりやって自力を付けておくのがベストです。走り込みみたいなもんです。皆様が僕の屍を乗り越えて、LeetcodeへSign inしてくれることを期待しています。
電話面接
電話面接は2回ある場合が報告されていますが、僕の場合は1回でした。アカリクイベントの会話で1回分の面談が免除されたのかもしれません。Google docsで問題を解く形式です。いろいろな人が報告していたり、HtCIに書いてあるようにも問題自体は難しくありませんでした。全然華麗に解けなかったけど。それでも45分で解いて、電話面談は無事にパスしました。
電話面談をパスしたあともLeetcodeでの勉強は続けたり、先方から言われた面談予告の内容に対応した勉強をしていました。Web系の基礎固めをしたいと考えて
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
- 作者: 山本陽平
- 出版社/メーカー: 技術評論社
- 発売日: 2010/04/08
- メディア: 単行本(ソフトカバー)
- 購入: 143人 クリック: 4,320回
- この商品を含むブログ (183件) を見る
を読んだり、Software Engineerでも人材募集ページに書かれているような思考力の問題が出されるかもしれないと考えて
FACTFULNESS(ファクトフルネス) 10の思い込みを乗り越え、データを基に世界を正しく見る習慣
- 作者: ハンス・ロスリング,オーラ・ロスリング,アンナ・ロスリング・ロンランド,上杉周作,関美和
- 出版社/メーカー: 日経BP社
- 発売日: 2019/01/11
- メディア: 単行本
- この商品を含むブログ (1件) を見る
を読んだり、一般論を知りたいと考えて
CAREER SKILLS ソフトウェア開発者の完全キャリアガイド
- 作者: ジョン・ソンメズ
- 出版社/メーカー: 日経BP社
- 発売日: 2018/07/10
- メディア: Kindle版
- この商品を含むブログを見る
を読んだりしました。このうちWebを支える技術は、基礎技術の組み合わせでWebができている点を認識できて面白かったのでオススメです。Webの記事だと
なんかもいいと思います。
オンサイト面接
面接は5回でした。メールでは4回と聞いていたので5回目があると分かった時には、やりきった感(やりきってない)に満たされた+疲れ、でしんどかったです。オンサイト面接の形式は他の方のそれとほとんど同じです。なので割愛。英語3回、日本語2回でした。今思い返せば、この時点で僕の英語力を先方が非常に疑問視していることが推測できます。
問題はそこそこ解けた気もしていますが、きっと思い出補正で、落ちたからにはボーダーラインに達していないぐらいには全然出来ていなかったのでしょう。
1つの大きな原因として、時間を気にして練習問題を解いていなかったことが挙げられます。問題を見て分からなかった瞬間に答えを見るのは意味がありませんが、長々と考える癖を付けてしまうのも良くなかったわけです。時間制限のあるコンテスト型の競技プログラミングサイトで練習するとか、LeetcodeやHtCIの問題を解くにしても制限時間を付けてプレイするほうが良いでしょう。例えば面接が1つ30分と考えたら、5分問題把握、10分でアイディアリング、10分で実装、5分でテストといった流れが考えられます。だとしたら、練習の場合でも同じ時間配分で解いたほうが良くないですか?分からなかったら先程の400問の例のようにパターンを網羅するため、答えをみてアイディアを理解してから、コードを移さずに自分で実装してみるのが良いかと思います。
面接外の1つの大きなポイントは、なんといってもGoogleの社内に入れるということです。様々な驚きポイントがありました。
- (当たり前だけど)ゲストを社内で1人にしてはいけないらしい。常に社員の方がそばにいて、気を使わせているようで申し訳なかった。
- 伝説ともなっている昼食のバイキングは超豪華だった。具体的には、自分が行った日はむき身のカニが食べ放題だった。
- 本当に自販機にお金を入れるところがなかった。
- etc...
で、1週間後に落選通知が来ました。残念だった点として、Googleが出しているreWorkでは落選者にはフィードバックをしよう、と書かれていますが、僕にはその点は何も通知されませんでした。逆にアンケート調査もありませんでした。なかなか自分のエンジニアリングについて評価して貰える(しかもGoogleの社員に!)機会は無いので僕も期待していたのですが、全員に対して適用されるものではないようです。
敗因
上述した理由の
- 情報工学の基礎的な教養が不足していた
- 特にデータ構造は本当に弱いことがわかった。データサイズが大きくないので、Treeとか使わないで済んでしまう
- 英語力とコミュニケーションの不足
- 実際の形式と練習の形式の不一致
は特に大きな理由と考えられますが、マインド面からくる手抜きの影響も否定できません。僕も受かると思っていなかったので、「有名な社食を食べに行くか~~」と思って対策をしていた節があります。「なんとしても採用されて、面白いプロダクトを作るぞ!!」といった強い気持ちは本番のパフォーマンスというより、日々の努力のために役に立ちます。そういうハングリーさは完全に欠けていました。
まとめ
ソフトウェアエンジニアなので間違いなくアルゴリズムとデータ構造を理解しておく必要があります。Leetcodeで対策しましょう。
ちなみに僕が選考を受けてみようと思ったのは今年は選考に受かりやすいと予想したからです(それは間違いだったわけですが)。Googleは来年度には渋谷ストリームへオフィス移転します。
14~35階のオフィスフロア22階分を借り切り、現在の従業員(1300人)の2倍を収容できるという。
これを読んで、空いたスペース分社員を補充するために入りやすいんじゃないか?と考えたわけです。しかしGoogleはハードルの高さに妥協しないことで有名でしたし、そのとおりだったわけです。そういう憧れの会社であり続けてくれる点は、個人的にはちょっと嬉しいです。