Googleのソフトウェアエンジニアの選考と面接対策
この度Googleのソフトウェアエンジニアのオファーをもらいました。この記事では、主にGoogleの選考に関して、何か参考になる情報を共有できればと思います。私の経歴としては、情報系の学部卒、社会人経験年数3年未満で、ソフトウェアエンジニアをしております。新卒のときにGoogleのソフトウェアエンジニアを受け、オンサイト面接で不合格になりました。今回、中途採用でもう一度選考を受け、ソフトウェアエンジニアのオファーを頂けることとなりました。対策としては、LeetCodeで練習し、元Googlerの方に模擬面接していただき、コンピュータサイエンスの本を読むなどしました。
注:この記事の内容は、主に自分の経験や伝聞とBlindや1point3acresといったサイトに共有されている情報に基づいたものです。
応募に関して
応募するときには、できればGooglerから推薦をもらえると良いかもしれません。推薦をもらうと良い理由は、リクルーター(ソーサー)に履歴書を確実に見てもらえることと、同じ履歴書であっても面接をスケジュールしてもらえる確率が上がることにあります。
選考に関して
新卒や経験年数の浅い人を対象にした選考の場合、アルゴリズムとデータ構造(コーディング)に関する問題が重点的に聞かれます。大まかに選考の流れは、(コーディングテスト)→電話面接→オンサイト面接→採用委員会→チームマッチング→オファーとなっております。
コーディングテスト
新卒の場合ですと、コーディングテストが最初の段階で1回あることが多いようです。指定された時間に一人でコードを書き、提出するという方式です。新卒では同時期にさばききれない程の多くの応募があるため、コーディングテストによって候補者を絞るという目的があるようです。このステップは、足切りに過ぎないと考えて良さそうです。
リクルーターコール
技術面接に入る前に、リクルーターと簡単に自分の経歴や今後のプロセスについて話す電話が設定されることもあります。この段階で、リクルーターは予め用意された簡単な一問一答形式の問題(例:〇〇の時間計算量は?)を出すこともあるようです。こちらは足切り程度の目的なので、そこまで厳しく見られていないようです。このときに、自分はどのレベルの選考に入っているのか確認するのが良いでしょう。
電話面接
電話面接に関しては、コーディング面接が一回あることが多いようです。私は新卒の時にオンサイト面接をやったことがあったので、電話面接をスキップできないかと交渉したところ、このステップはスキップできました。その他にも、Facebookのオンサイトが来週あるから急いでほしいなどとリクルーターに伝えることで、そのままオンサイト面接に進んだ人もいるようです。電話と書いてありますが、実際の電話で行われる場合もありますし、Google Hangoutsで行われる場合もあります。英語に自信のない方は、Hangoutsだと音質が良いのとCC字幕が付けられるので、コールをHangoutsで設定してもらうといいかもしれません。
オンサイト
オンサイト面接の内訳としては、ターゲットとなるレベルごと(経験年数は目安)に以下のようになっていることが一般的なようです。面接の内訳がどうなっているかをリクルーターに確認しておきましょう。一度に全ての面接が設定されず、まずは2回、出来が良ければ残り3回というように設定される場合もあるようです。
L3(新卒):コーディング面接4回、Googleyness & Leadership(G&L、Behavioralと呼ばれるコーディングではない普通の面接)1回
L4(博士、経験2年~):L3と同じセットか、システムデザイン1回がコーディング1回の代わりに入る場合もあり(希望制との噂も)
L5(経験6年~):コーディング面接3回、システムデザイン1回(必須)、G&L1回
最近では、オンサイトはGoogle Hangoutを通じて行われるのが一般的かと思います。バーチャルオンサイトなどと呼ばれたりします。コーディング面接は、以前はGoogle Documentを用いて行われていたようですが、現在では簡易的な共有コードエディタ(任意の言語に対するシンタックスハイライトのみで、コードは実行できない)を用いて行われることが多いです。
(本義の)オフィスで行うオンサイトの場合ですと、Chromebookかホワイトボードが選択できるようになっております。問題のアプローチを議論するときはホワイトボード、コーディングはChromebookで行うというふうに使い分けるのが良いかと思います。
なお、電話面接やオンサイトをスケジュールするときは、十分に準備をする時間を設けるようにしましょう。もし面接の少し前の時に、準備が間に合わないということでしたら、リクルーターと相談して、面接の日を先延ばしにしてもらいましょう。
採用委員会(Hiring Committee)
オンサイト面接でのフィードバックが集まると、リクルーターは候補者の情報をパケットとしてまとめて、採用委員会に提出します。この段階で面接のフィードバックが芳しくない場合は、リクルーターはパケットを提出せずに、そのまま候補者にお祈りする場合もあります。電話面接を含む面接のフィードバックに加えて、履歴書や大学の成績、候補者の元同僚などのGooglerのレファレンス(希望制)などといった情報がレビューされるようです。いつ採用委員会に進むかどうかが明示的に知らされていない場合は、リクルーターに確認してみましょう。そのときに面接のフィードバックをかなり具体的なレベルで共有してくれることも多いです。日本の場合だと、東京の採用委員会の次は、マウンテンビューの採用委員会といったように、2段階でレビューが行われるらしく、段階に応じてパケットに必要な情報も異なるようです。採用委員会の段階で、L4では採用できないが、L3で採用したいといったダウンレベリングが行われることも多々あります。
チームマッチング
採用委員会が、候補者に対して採用の決定を下すと、チームマッチングが行われます。採用委員会の前にチームマッチングが行われるパターンもあります。リクルーターは候補者のパケットをヘッドカウントのあるチームのマネージャーに共有して、興味をもったマネージャーが出たら30分ほどのコールが設定されます。コールの後、マネージャーと候補者のお互いが承諾したらマッチングとなります。コールの内容はチームによって様々ですが、面接というよりはお互いの興味がマッチしているかを試す場という位置づけが強い印象です。L5以上になると経歴や専門性のマッチもより求められるかもしれません。チームマッチングの次は、オファーステージとなり、給与の交渉等が行われます。
時期によっては、ヘッドカウントが少なく、チームマッチングがスムーズにいかないこともあるようです。採用委員会の決定は、1年間有効との説があり、その期間内にチームマッチングすれば追加の面接は不要となっているようです。注意しておかないといけないのは、採用委員会で採用の決定がなされたからといって、その時期のヘッドカウントの影響などもあり、必ずしもオファーが確約されているわけではないという点です。コロナ禍のような特殊な状況やヘッドカウントがなくなったりした時は、採用自体が止まってしまい、能力に関係なく採用されないこともあります。原則としては、早めに動くのが良いのかもしれません。上記の有効期限についても、新卒の場合は、通常のヘッドカウントの扱いと異なるシステムで動いているようで、あまり当てはまらないかもしれません。また、採用委員会の決定は特定の地域に限定されていないので、チームがなかなか見つからない場合は、他の地域や国でヘッドカウントのあるチームがないかリクルーターに聞いてみてもいいかもしれません。
対策
準備
対策の基礎となるのは、アルゴリズムとデータ構造(コーディング)に関する問題について十分練習を積むことかと思います。プログラミング言語の選択はなんでもいいのですが、特にこだわりがなければ、同じことを表現するのに文字数が少なめになるPythonがおすすめです。なお、L5以上で必須となるシステムデザインについては、私が詳しくないので、Blindなどを参照してください。
大学でアルゴリズムとデータ構造を勉強したことがない人は、問題を解く前に勉強しておくと良いかと思います。Courseraなどのオンラインコース、YouTube、教科書などを使うとよいでしょう。LeetCodeのExploreセクションも良いかもしれません。
コンピュータサイエンスの知識に関しては、nucさんの推薦図書(リンクの記事の下の方にある)を読むと役立つかと思います。直接的に知識問題が聞かれることもあるし、学んだ知識が間接的にコーディング問題や議論に使えるからです。
場合によっては、機械学習やフロントエンドなどの特定の分野に関するポジションに応募したとき、その分野に関する面接が何回か入ることもあります。例えば、フロントエンドでは、Lodashが提供するある関数をJavaScriptで実装してみくださいといった問題が出題されることがあるようです。このような専門分野の面接を追加で対策したくない人は、ジェネラリストの面接を希望すると良いかもしれません。
コーディングの練習には、LeetCodeを使うとよいでしょう。簡単なセットから練習したい場合は、新井康平さんの60問のリストが良さそうです。続いて、Blind 75と呼ばれるセットを解けるようにしましょう。他にはSean PrashadさんのLeetCode Patternsが良いでしょう。これらの問題が解けるようになったら、有料プランになりますが、頻度順でソートされた問題をやったり、LeetCodeのGoogleタグや自分の受ける企業のタグの問題を解くいいと思います。
やった問題を復習するときは、問題文か問題のタイトルだけを見て、どういった問題か、どんなアプローチがあるのか、制約が変わるとどのように解き方が変わるかなどを考えるとよいでしょう。また、短い時間でミスなく実装できるように繰り返し練習することも、本番で限られた時間で力を発揮するために役立つかと思います。
典型問題が解けるようになると、Googleで面接官の経験のある方と模擬面接をやってみるとよいでしょう。知人に(元)Googlerがいない場合は、Twitterで模擬面接をやっている方などがいないか探して、コンタクトを取ったらいいかと思います。私も元Googlerの方に連絡を取って、知人でも同窓でもなかったにもかかわらず、快く模擬面接を受け入れてくださり、大変親切にしてもらいました。その他に、現役のエンジニアが有料で模擬面接をやってくれるサービスもあるようです。模擬面接で受けたフィードバックを踏まえて本番の面接に臨むようにすると、そのまま本番での良い点数につながると思います。テクニカルな面以外での模擬面接の効用だと、これぐらいできると50%ぐらい合格するといった具体的なフィードバックが、実際にGoogleで面接経験のある方から得られるというのが大きいと思います。ああ、こんな感じで大丈夫なんだというような実感を得た上で面接に臨むというのが、本番の面接でパフォーマンスを発揮するのに案外重要な気がしています。似たような話だと、身近にGoogleからオファーをもらった同期や知人が多数いると、あの人もできるなら私もできそうといった気持ちが生まれ、気軽に選考に参加できるような気がしております。
面接編
元Googlerの方からもらったアドバイスとして、研究室の同期や同僚と話すように話そうというものがありました。他には、コーディング面接は、面接官が想定している解答を推測して答えるゲームなのではないという話もありました。また、配点的には、正しいコードが書けているというのは、そこまで大きな比重を占めていないという感覚だそうです。例えば、LeetCodeのMedium程度だと、コードが書けることは期待されていますが、その後の議論も重要であったり、Hard位の難しさになると、妥当な方針が立てば十分であったりなどいった感じです。では、どれぐらいできていればいいのかというと、Googleの同僚に同じ質問をしたときの返答がある種のベンチマークになっているようです。
問題にアプローチするときは、まずは問題の要件、制約を確認することから始めましょう。コーディング面接では、LeetCodeや競技プログラミングの問題とは異なり、要件が曖昧であることが多いです。
候補者:グラフのサイズはどれくらい大きくなるでしょうか?空のインプットが来たらどうしますか?
問題へのアプローチを面接官に説明するときは、できれば時間計算量と空間計算量をそのときに述べるとよいでしょう。その時点で分からなかった場合でも、実装後に面接官に聞かれる前に言えると良さそうです。複数のアプローチを考えることができたら、トレードオフを議論できると良いですね。
候補者:インプットの配列がソートされているので、バイナリーサーチが使えそうですね。このアプローチだったら、時間計算量は O(logN)になり、空間計算量は…
実装を始める前に面接官がアプローチに納得しているかどうか確認しましょう。問題を聞いていきなり実装をしないようにしましょう。
候補者:こんな感じで解くと上手くいきそうですね。この方法で実装をはじめて良さそうでしょうか?
面接官:良さそうですね。じゃあ、実装してみましょうか。
納得していない場合だと、以下のようなやり取りになるかもしれないですね。
面接官:そうですね…この方法が上手くいかないテストケースって何かありませんかね。
アプローチがすぐに思いつかない場合だと、愚直な方法や使えそうなデータ構造やアルゴリズムを整理することから始めると良いかもしれません。
候補者:愚直にやると、全てのパターンを確認する方法が使えると思います。しかし、この方法だと計算時間がO(N^2)になってしまうので、インプットが大きすぎると厳しそうですね…
候補者:ハッシュテーブルで今まで見た範囲の答えを記憶することができると思うんですが…
実装が終わると、時間計算量と空間計算量を確認しましょう。テストケースをいくつから走らせてみるのも良いかと思います。
候補者:実装はこんな感じになると思います。ちょっとテストしてみましょうか?
面接官:では、お願いします。
候補者:もしインプットが空の時は、このif文に入って…
面接官が用意している問題は、多くの場合、小問1, 2, 3といったように複数のステップに分かれていることが多いです。最初は簡単なウォームアップ的な問題が来ることが多く、ここに時間をかけすぎないようにしましょう。感覚的にはLeetCodeでEasyレベルの問題が来たら、間違いなくウォームアップの問題のはずです。
面接官:この場合は、この方法でいけそうですね。それでは、何々が与えられてない場合について考えてみましょうか。
問題が解き終わると、議論的な要素が入ってくることもあります。制約が変わるとアプローチがどのように変わるかなどを実装抜きで議論したりすることもあります。実装が難しかったり、長くなるような問題ですと、アプローチや考え方を見るのが主な目的で、実装が期待されていない可能性が高いです。
面接官:もし仮に要素数が数十億個だったら、どうなると思いますか?
候補者:そうですね...その場合、メモリは何々GB必要なので、このデータ構造はメモリに収まらなく…
英語
日本で面接する場合であっても、2~3回の面接は必ず英語になるはずです。英語の聞き取りがあまり得意でない方は、Google HangoutsのCCボタンをクリックすると字幕がリアルタイムで生成されるので良さそうです。
英語力自体の向上には、英語のPodcastを聞くやYouTubeを観る等の習慣を身に着けると良さそうです。その他に、読み物はなるべく英語にするなども英語力の向上に役立つはずです。
情報収集
アカウント登録に所属企業のメールアドレスが必要になると思いますが、Blindでいろいろな内部事情が共有されているので情報収集におすすめです。給与情報に関しては、Open SalaryやLevels.fyiを参考にするとよいでしょう。
この記事が気に入ったらサポートをしてみませんか?