Google面接合格への道

本記事は、元Amazon・現Googleソフトウェアエンジニアの[Shantanu Kshire](https://shantanukshire.medium.com/)氏による「[My Preparation Journey for Google Interviews](https://medium.com/swlh/my-preparation-journey-for-google-interviews-f41e2dc3cdf9)」（2020年12月24日公開）の和訳を、著者の許可を得て掲載しているものです。

#Google面接合格への道

##はじめに

すべてのソフトウェアエンジニアは、自分の技術力でインパクトを与えたいと願っています。世界的なテクノロジー界の巨人は、何十億人ものユーザーにエクスペリエンスを提供できる、技術者にとって素晴らしい職場です。

![Image for post](https://miro.medium.com/max/1000/1*SuxLOmVaGixNpc7yQjQItQ.jpeg)
Photo by [Achintha Maddumabandara](https://www.shutterstock.com/g/achinthamb) on [Shutterstock](https://www.shutterstock.com/)

最近、面接を何度か経験し、**Google**や**Amazon**からオファーを受けました。ここ数年、面接対策をする上でオンラインコミュニティにとても助けられました。この記事では、私の面接対策をすべて共有し、学んだことを還元したいと思います。:)

##ソフトウェアエンジニア面接プロセス

プロセスは通常、採用担当者が最終候補者をリストアップすることから始まります。それから一次審査で、候補者の職務への適性を判断します。これを通過すると、典型的なソフトウェアエンジニア面接を、以下の段階を踏んで実施します。

-   コーディング　3-5回
-   システム設計　1回
-   リーダーシップ原則　1回

**P.S.** 面接プロセスに占める割合が高いため、コーディング面接対策を中心に扱いますが、システム設計とリーダーシップ原則についても、後の章で簡単に説明します。

##A. コーディング

ソフトウェアエンジニアは困難な状況に陥ることがよくあります。例えば、曖昧で不明確な要件への対応、複雑な問題の分析、エッジケースの処理、トレードオフを考慮したアプローチの決定などです。コーディング面接は、これらのスキルを垣間見る1つの方法です。

簡潔に言いましょう。コーディング面接では、**データ構造とアルゴリズムによる問題解決**に重点を置いています。これらの問題はトリッキーなものになりがちで、候補者の分析能力を見抜くのに役立つ情報が得られます。

>データ構造とアルゴリズムによる問題解決に長ける。このスキルを身につけるには時間がかかる。近道はない。必要なのは絶え間ない努力のみ。自然な問題解決スキルが身につくまでは、練習、練習、また練習。

##戦略

###1. 準備時間の見積もり

これは無視されたり、不要とみなされたりすることが多いです。データ構造とアルゴリズム（DSA）による問題解決に関する現在の自分の能力を確認することをお勧めします。私は、自分の強みと弱みを調べて、準備時間の見積もりを行いました。**これは、長期的（または短期的）な目標に向けて心の準備をし、モチベーションを維持するのに役立ちました。**

>「十分な準備時間をとること。**準備不足よりは、準備過剰の方がましだ。**」

合計時間は、それぞれの専門知識によります。大まかに言うと、以下に分類しています。

-   初級：少なくとも1つのプログラミング言語で快適にコーディングできる。データ構造とアルゴリズムの基礎知識が不足している。低難易度の問題を解くのに苦戦する（またはかなり時間がかかる）。
-   中級：データ構造とアルゴリズムの知識が十分ある。低難易度の問題を解くのは問題ない。多くの中難易度の問題を解ける。高難易度の問題に苦戦する。
-   上級：中難易度の問題を解くのは問題ない。多くの高難易度の問題を解ける。

私は面接前に中級レベルに達しました。

![Image for post](https://miro.medium.com/max/370/1*7hmoYjlU641Vi8LFfYdhpA.jpeg)
準備時間の見積もり

###2. コーディングと学習プラットフォーム

[**LeetCode**](https://leetcode.com/)、[**InterviewBit**](https://www.interviewbit.com/)、[**GFG**](https://www.geeksforgeeks.org/)は、コーディングの練習で頼りになった、主なプラットフォームです。面接前に、LeetCode 320問、InterviewBit 80問、GFG 30問ほど解きました。

![Image for post](https://miro.medium.com/max/381/1*pSLqVZhmOL293KqrNffTlQ.png)
問題の難易度分布

中難易度の問題は、面接で出題される問題の大部分であるため必須です。これらの問題を解くことで、スピードと問題解決能力が格段に向上します。

早い段階で、低難易度と中難易度の問題の組み合わせから始めることが重要です。自信がついてきたら高難易度の問題を始めましょう。高難易度のものが解けなくてもやる気をなくさないでください。練習して完璧になるまでに長い時間がかかることがあります。私は気が滅入った時は、低難易度の問題に戻ってモチベーションを上げるようにしていました。

>成長のマインドセットを維持する。解けない問題はすべて、新しいことを学ぶチャンスだ。

-   **LeetCode**：間違いなく、最高のプラットフォームの1つです。LeetCodeの一番の魅力は、コミュニティです。ディスカッションフォーラムは非常に便利で、たくさんの解法が見られます。ためらわずに**LeetCodeプレミアム**を選んでください。それだけの価値があります。
-   **InterviewBit**：[Programming Track](https://www.interviewbit.com/courses/programming/)に従うことを強くお勧めします。このプラットフォームでの経験は、実際の面接に最も近いです。コードがすべてのテストケースを通過することもありますが、（実際の面接で要求されるような）時間や量でない場合、InterviewBitは追加のフィードバックとして、報告してくれます。
-   **GFG**：私はこのプラットフォームを、主に問題発見とDSAの基礎のために使いました。トピックの解説や言語に合わせた実装が本当に良いです。GFGには、企業やトピック固有の問題集も結構あります。

私は学習の際に、1つのリソースに全面的に頼ることはありませんでした。それぞれのリソースから新しい知見を得ました。日記をつけ、常に自分の知識を集約し、拡大していきました。

-   [**アルゴリズム専門講座**](https://www.coursera.org/specializations/algorithms)：このCourseraの講座は最高です！4つのコースがあり、DSAのトピックのうち基本すべてと、上級いくつかをカバーしています。初心者に最適です。
-   **Youtube**：ビデオ解説は私のお気に入りです！[Rachit Jain](https://www.youtube.com/channel/UC9fDC_eBh9e_bogw87DbGKQ)、[Abdul Bari](https://www.youtube.com/channel/UCZCFT11CWBi3MHNlGf019nw)、[Tushar Roy](https://www.youtube.com/user/tusharroy2525)（素晴らしい手引き！）、[BackToBack SWE](https://www.youtube.com/c/BackToBackSWE)のチャンネルのコンテンツは役に立ちます。
-   [**Cracking the Coding Interview（コーディング面接の攻略方法）**](https://www.crackingthecodinginterview.com/)（参照「[ソフトウェアエンジニアのための必読書10選](https://qiita.com/baby-degu/items/a91ebdde5b9cd1a47f63#cracking-the-coding-interview)」）**と[Elements of Programming Interviews（プログラミング面接の要素）](https://elementsofprogramminginterviews.com/)**：対策の補足として使いました。これらの本は、理論と問題を簡単にブラッシュアップするのに役立ちました。個々のトピックを扱うのは時間がかかることがあります。その代わり、面接の前に各章を幅広くカバーすることにしました。
-   [**CLRS - Introduction to Algorithms（アルゴリズム入門）**](https://en.wikipedia.org/wiki/Introduction_to_Algorithms)（参照「[ソフトウェアエンジニアのための必読書10選](https://qiita.com/baby-degu/items/a91ebdde5b9cd1a47f63#cracking-the-coding-interview)」）：疑似コードを調べるのに使うことがあります。時間計算量や理論に関する深い知識を得るのに便利なリソースです。

最後に、[Vaidehi Joshi](https://medium.com/u/8f55993c973e?source=post_page-----f41e2dc3cdf9--------------------------------)の[BaseCS](https://medium.com/basecs)の記事を紹介します。彼女は、DSAのトピックについて、直感的でわかりやすい説明を書いています。

###3. タイマーの使用

面接時間が短くなってきているため、問題解決のペース配分を考えることが重要です。一般的に、コーディング面接は45〜50分で、候補者は、中難易度2問、または高難易度1問、または低難易度1問と高難易度のフォローアップ1問を解くことが期待されています。

最初の問題を解けたとしても、必要以上に時間を使ってしまうと、2つ目の問題に取り組む時間が十分なくなります。

私は、問題解決セッション中にタイマーを使って時間を計っていました。

-   中難易度の問題：20分
-   高難易度の問題：40～45分

初心者は、正解に到達することの方がずっと大切なので、無視してもいいです。

###4. 模擬面接

私は実際の面接の前に、模擬面接をたくさんしましたが、これは非常に有益です。**テスト環境において早い段階で失敗することで、有益な知見を得られます。**思考プロセスのギャップに気付くのに役立ちます。すべての模擬面接で、それぞれの間違いを修正、改善してください。

>「模擬面接に連続合格したら、明るい兆しだと思ってください。」

-   【無料】[LeetCode模擬面接](https://leetcode.com/interview/)
-   【無料P2P】[Pramp](https://www.pramp.com/)
-   【無料P2P】[InterviewBit模擬面接](https://www.interviewbit.com/mock-interview/)

有料の模擬面接には、さらにメリットがあります。特に面接後のフィードバックでは、面接官が期待していることについて、詳しいことがたくさん分かります。

-   【有料】[ExpertMitra](https://expertmitra.com/)
-   【有料】[Mocki](https://mocki.co/)
-   【有料】[技術模擬面接](https://www.techmockinterview.com/)

###5. ロードマップの準備

ここまで、対策に必要なさまざまな要素についてお話ししてきました。それでは、それをつなげてロードマップを作ってみましょう！

面接1ヶ月前の私のカレンダーのスナップショットです。

![Image for post](https://miro.medium.com/max/700/1*VJz8eR0ynAtjYhK32mkEGQ.jpeg)
対策スケジュール

私は、対策全体をタスクとマイルストーンのセットに分割しました。面接の数週間前（あるいは数ヶ月前）に毎日の目標を割り当てました。この方法は、ランダムになることを避け、途中で迷走するのを防ぐのに役立ちました。

-   平日は、仕事のため数時間しか割り当てられませんでした。この時間枠には問題解決セッションを予定しました。
-   時間に余裕のある週末には、理論のトピックを予定しました。
-   面接が近付くと、模擬面接を予定しました。最後の数週間は、コーディングセッションを減らし、[Cracking the Coding Interview](https://www.crackingthecodinginterview.com/)と[Elements of Programming Interviews](https://elementsofprogramminginterviews.com/)を読むことに重点を置きました。

![Image for post](https://miro.medium.com/max/287/1*nJb_b0gk6AAflnEUO8Wy2A.jpeg)
1週間の時間配分

多くの人は家庭の用事やフルタイムの仕事があるでしょう。スケジュールが計画通りに進むとは限りません。しかし、趣旨は習慣を作ることです。進行中や保留中の項目の経過を追いましょう。**自分にとってベストなスケジュールが見つかるまで、微調整を続けてください。**

##B. システム設計

この面接では、技術的な設計スキルが試されます。さらに、低レベル設計（LLD）と高レベル設計（HLD）に分けられます。この分野の知識は、業界経験と共に成長します。

分散システム、負荷分散、ネットワークプロトコル、コンシステントハッシュ法、CAP定理、レプリケーションとシャーディングなどの概念に関する知識を習得してください。

-   Youtubeチャンネル：[Gaurav Sen](https://www.youtube.com/channel/UCRPMAqdtSgd0Ipeef7iFsKw)と[Narendra L](https://www.youtube.com/channel/UCn1XnDWhsLS5URXTi5wtFTA)
-   【有料】[システム設計面接の理解](https://www.educative.io/courses/grokking-the-system-design-interview)（システム設計に最適なリソースの1つ。非常にお勧めです。）
-   【有料】[オブジェクト指向設計面接の理解](https://www.educative.io/courses/grokking-the-object-oriented-design-interview)
-   【有料】[AlgoExpertシステム設計の基礎](https://www.algoexpert.io/systems/fundamentals)

##C. リーダーシップ原則／行動

ここまでとは異なり、これは純粋に技術的な面接ではありません。Googleは候補者のことを、候補者自身の言葉でより深く知りたいと思っています。行動に関する質問もあります。

-   候補者の性格
-   過去のプロジェクトや実務経験
-   困難な状況で講じる対策
-   ポジティブまたはネガティブな評価への反応など

>「ここで重要なのは、**透明性を保ち、ただ自分らしくいることです**。」

[Cracking the Coding Interview](https://www.crackingthecodinginterview.com/)で、S.A.R.（状況、行動、結果）について言及されている章を取り上げます。過去の仕事に基づいてストーリーを分類することで、インパクトのある論点を明らかにすることです。詳しくは、[ソフトスキルシート](https://www.crackingthecodinginterview.com/uploads/6/5/2/8/6528028/cracking_the_soft_skills_-_v6.pdf)を見てください。

![Image for post](https://miro.medium.com/max/700/1*Jw645mi5fbDi4YM5dxZ6zg.jpeg)
S.A.R.モデル

##秘訣

-   LeetCodeやCodeforcesのコーディングコンテストに参加します。解けなかった問題を記録し、常に解法を模索します。
-   私はLeetCodeの「Shuffle」を多用しました。また、すごく嫌いな問題を解くのは避けましょう。ほとんどの場合、時間を費やす価値がありません。
-   面接の多くは、Google Docsや[CollabEdit](http://www.collabedit.com/)など、IDE以外のエディタで行われます。そのため、シンプルなメモ帳で本番さながらのコードを書いてみましょう。
-   面接中は声に出しながら考えてください。間違った方向に進んでいる場合、面接官があなたを正しい道に戻すのに役立ちます。
-   面接で出題される問題の解法をたくさん書き留めることから始めることがよくあります。ブルートフォースの最も簡単なものから最適なものまで、それぞれのデータ構造と時間／量の複雑さを定義します。問題を分解する体系的な方法は、自分の思考プロセスを説明するのに役立ちます。

##FAQ

####Q1. どのDSAのトピックをターゲットにしますか？どんなリソースを参考にしましたか？
前述の学習リソースが役に立ちます。トピックごとに個別のリソースを追加すると記事が長くなるため、ここでは割愛します。

ハイレベルなトピックを順不同で紹介します。
>連結リスト、ビット操作、スタックとキュー、バイナリ検索、ヒープ、貪欲法、動的計画法、Vectors／ArrayLists、Big O時間と空間、ソート、2つのポインタ、スライディングウィンドウ、ユニオン検索、文字列操作、ツリーとグラフ、幅優先探索（BFS）／深さ優先探索（DFS）、再帰、バックトラッキング、ハッシュ、トライ木、セグメントツリーとバイナリインデックスツリー

####Q2. どんなプログラミング言語を学びましたか？
私の考えでは、1つの言語を徹底的に学ぶことで十分です。私が好きなのはJavaです。

####Q3. 何千もの問題の中から、どの問題が練習に適しているかを知るにはどうすればいいですか？
すべての問題を解くことは事実上不可能です。しかし、DSAのトピックは最大でも12～15個です。トピックに特化した問題を解くことで、それぞれのカテゴリーを強化してください。練習すれば、必要とされる正しいデータ構造やアルゴリズムを見極めることができます。量より質に重点を置きます。

####Q4. 競技プログラマーでなくても、チャンスはまだありますか？
はい、もちろんです。この場合、競技プログラミングは必須ではありません。

-   競技プログラミングはスポーツであり、トピックや問題の範囲はずっと幅広いです。CodeChefやCodeforcesなどのプラットフォームは競技プログラミングの傾向があります。
-   競技プログラミングと重複していて、役立つ可能性のある領域が確かにあります。例えば、採用担当者があなたのプロフィールや問題解決などに注目してくれるようになるなど。

しかし、コーディング面接は全く異なる場面であり、異なる優先順位があります。

####Q5. 電話面接を勝ち取る方法は？どのように応募しましたか？
採用担当者からLinkedInで直接連絡がありました。私は最終候補者のリストアッププロセスを知りませんが、いくつか提案があります。

-   学生として、学業に専念しましょう。コンテストやHackathonsに参加し、刺激的で革新的なプロジェクトに取り組みましょう。オープンソースで貢献しましょう。プロフィールを際立たせる方法はたくさんあります。

##おわりに

最も大事なポイントは、面接対策への道を楽しむこと。仕事に勤勉であること。自分のバージョンアップ版になるために、忍耐力を持ち、敬意を払い、常に努力すること。残りは後からついてきます :)

**P.S.** 質問がある場合は、[LinkedInのプロフィール](https://www.linkedin.com/in/shantanukshire/)か、[shantanu.kshire@gmail.com](shantanu.kshire@gmail.com)までご連絡ください。通常3日以内に返信します。

##翻訳協力
この記事は以下の方々のご協力により公開する事ができました。改めて感謝致します。

Original Author: [Shantanu Kshire](https://shantanukshire.medium.com/)
Original Article: [My Preparation Journey for Google Interviews](https://medium.com/swlh/my-preparation-journey-for-google-interviews-f41e2dc3cdf9)
Thank you for letting us share your knowledge!

選定担当: @gracen
翻訳担当: @gracen
監査担当: -
公開担当: @gracen

##ご意見・ご感想をお待ちしております
今回の記事はいかがでしたか？
・こういう記事が読みたい
・こういうところが良かった
・こうした方が良いのではないか
などなど、率直なご意見を募集しております。
頂いたお声は、今後の記事の質向上に役立たせて頂きますので、お気軽に
コメント欄にてご投稿ください。[Twitter](https://twitter.com/BabyDegu?lang=ja)でもご意見を受け付けております。
皆様のメッセージをお待ちしております。