Amazonのソフトウェアエンジニア面接

Amazon - We Pioneer

最近、Amazonのエンジニア採用担当者から連絡を受けました。Amazonは、ベルリンオフィスのチームのソフトウェアエンジニアの採用面接をしていたのです。

連絡を受けてから契約書にサインするまでのプロセス全体は、2カ月でした。採用プロセスで経験したことと、私が合格できた理由として思い当たることをお知らせしたいと思います。

この記事で、もし私が何か重要なことに触れ忘れていたら、ぜひコメント欄に書いてください。出来る限りの詳細を回答に書きます。

4月27日:最初の連絡

採用担当者からの連絡は、LinkedIn経由でした。ベルリンオフィスのチームのソフトウェアエンジニアを募集しているので、もし興味があれば、最新のレジュメを送って欲しいとのことでした。私は、常にレジュメを最新にしていたので、翌日、Eメールに添付して送りました。

彼女からの返信には、募集しているソフトウェアエンジニアの役割と面接の進め方についての概要が書かれていました。最初のステップは、HackerRankでの技術テストです。同日に、別メールでリンクを受け取りました。

技術テストには120分という時間制限があり、5月5日までに終わらせるよう指示がありました。私は、焦らずに、次の週末まで待つことにしました。

5月1日:事前選考

HackerRankには、HackerRank for Workという面接のためのプラットフォームがあります。これが、メールの中のリンクをクリックすると飛ぶ先です。ここには、内蔵タイマー、Java向けのある種のオートコンプリート機能付きWebエディタ、問題の記述と、自身のものを含む、様々なテストケースで解決策を試す能力が組み込まれています。

このコーディングテストがどの言語に限定されているのかは、開始するまで分かりませんでした。選択することができたのは、C、C++、Javaと、その他に数言語で、私が最も得意とする言語である、GoPHPを使おうという計画は、もろくも崩れました。そのため、Javaを使うことにしました。

テストは、特定の順序によらずに技術的に解決可能な3つの問題で構成されていました。

問題

1つ目の問題は、オブジェクト指向のデザインに関するものでした。コードをクリーンで読みやすいものに整えながら、最も効率的に問題を解決するよう、複数のクラスとそれらのメソッドの定義を与えられました。

2つ目の問題は、アルゴリズムに関するものでした。ここで、私が個人的に役立ったことについてアドバイスしましょう。特定の問題に対して、どのようなデータ構造とアルゴリズムを適用するかを考え始める前に、手で問題を解き、解決策を視覚化しましょう。そうすることによって、より広い視野から問題を見ることができます。私はこれを紙上で行い、なんて簡単なのだろうと思いました。その後、その解決策をコード化したのです。

しかし、私は間違いを犯しました。そのコードをさらに最適化して、出来るだけ美しいコードにしようとしたのです。既に全てのテストケースを終えていたので、そうではなくて、残り時間を最後の問題に使うべきでした。優先順位の付け方が悪かったのです。これが、得た教訓です。

3つ目の最後の問題は、前の問題で得た解決策の複雑性分析についてでした。解決策を説明し、私の見解としてそれが最善と考えた理由の妥当性を証明するよう求められました。しかし、時間が足りず、主要な点しか述べられませんでした。

5月4日:電話選考

採用担当者から技術テストの合格を伝えるメールを受け取った翌日、彼女は、その週の私の予定を聞いてきました。オフィスでの面接の前に、電話で私の技術スキルを確認するとのことです。5月4日に約束しました。

復習

約束の日まで2日しかなかったので、アルゴリズムとデータ構造の基本について、復習しました。具体的に、私が確認したのは、次の点です。

もちろん、アルゴリズムの複雑性とデータ構造における一般的な処理について述べることができなければなりません。私は、個人的に、Wikipediaがこの種の分析のリソースとして素晴らしいと思いました。

電話

採用担当者は、電話中、非常にフレンドリーでした。天気や都市での生活のような、全く関係のない話題から始め、実際のスキル評価の話に移りました。上記リストのほぼ全てについて触れ、さらに動的計画法再帰についての質問も幾つか受けました。何度か、用語や処理の正式名称をなかなか思い出せない時がありました。採用担当者は、通常、技術的な話題には深く入れませんが、彼女は、私が異なる名称を使った理由を積極的に聞こうとしました。

最後に、状況面接のような質問を幾つか受けました。私は何も準備していなかったので、その場で各質問に合うようなことを思い出しながら話さなければなりませんでした。

そして、彼女は、私のスキルについて好感触を得たと言い、電話を切りました。同時に私は、面接準備のための本を注文しました(下記参考資料欄参照)。ちなみに、注文先は、Amazonです。

6月2日:採用面接

すぐに同じ採用担当者から2通のメールが届きました。1通目には面接に関してのヒントやアドバイスなどがあり、2通目には応募書類が添付され、埋めるよう指示がありました。応募書類の中にあった質問は、主に、今どんな状況にあるか、この転職に伴う引っ越しでAmazonに何を求めるか(何か必要なことがあれば)、現在の仕事の給与と福利厚生はどんなものか、そして面接の希望日時はいつか、などでした。

これを記入し、送り返しました。そして4日後、面接の日時についての確認の連絡がきました。今回は初めて接触するベルリンオフィスの採用担当者からでした。さらに1週間後、その女性の採用担当者から、面接当日の細かいスケジュールと、面接官の名前と肩書きを知らせるメールが来ました。お陰で、面接官をLinkedInで前もって調べることができ、当日に話をする相手がどんな人物なのか把握しておくことができました。

準備

面接までの準備期間は、合計で1カ月もありませんでした。面接準備のための本を全部は終わらせられないと思ったので、各章から3つずつエクササイズを選んで解いていくことにしました。全体の思考プロセスやソ解決策を繰り返し紙に書いていき、その後、本の最後にある解答と照らし合わせていきました。黒ペンで解決策を書き、赤ペンで間違えたものにチェックをつけました。次の問題ではその赤ペンの数を減らすということを目標に、問題を進めていきました。

コーディング技術を磨くために見つけた、良いサイトがLeetCodeです。偶然、私の友人にも自分の技術を向上させたいと思っていた人がいたので、毎週火曜日の夜に2時間ほど、2人でLeetCodeの問題を一緒に解いていました。

面接の2週間前、行動面接の対策として、予想される質問の回答を、書き出し始めました。技術面接に重きをおいて、このような質問を軽く見ている人も多いですが、それは間違っています! 面接官は人間としてのあなたを知りたいし、同じチームで一緒に働きたいと思うかという目線であなたを見ています。私は、STARの形式を使ってそれらを書き出していくことにしました。準備したテーマは、難しい問題、間違いと失敗、対立が生じた時の対処法、リーダーシップについて、などです。ここでのコツは、一緒に取り組んだチームメンバーのことではなく、自分自身にフォーカスを当てて語ることです。そうすれば、面接官があなたの貢献を正確に評価しやすいはずです。

なぜAmazonで働きたいと思ったのか、明確に答えられるようにしておきましょう。もし答えられない場合は、本当にそこに転職すべきなのか再考すべきでしょう。面接官にはあなたが正直に答えているか分かってしまいますし、もし本当にその気がないなら、あなたにとっても会社にとってもただの時間の無駄になってしまいます。それに、あなたが本当に情熱を注げることではないものに、あなたの貴重な人生の数年間を費やすのはもったいないと思いませんか?

あなた自身のことを話すようにしましょう。これは、あなたが、学歴や動機、職歴を語る時もそうですし、あなたの長所と短所を話す時にもそうしてください。また、これから働く会社のことや一緒に働くチームのことで聞きたいことがあれば、それも前もって準備しておくようにしましょう。

面接当日

応募者は、約束の時間の10分前に来て、受付で登録をするように言われました。そして、パスポートを提示し秘密保持契約書に署名するように指示されました。1人の社員の方が対応してくれ、面接室まで案内してくれました。

50分間の面接が4回あり、間には10分間の休憩をはさみ、最後の面接の前は、さらに15分長く休憩がありました。各50分間は、問題を解く面接が40分間と、行動面接が10分間という構成になっていました。

最初の面接では、オブジェクト指向に関するデザインの問題で、クライアント開発者がライブラリを作成するのに使うインターフェースを構築しました。最初は簡単でしたが、進めていくと、面接官が条件や問題を追加していきました。その後、行動面接に移り、締め切りに間に合わなかった時にはどう対処するか、という質問を受けました。

ここで一番重要なのは、完全に理解するまで問題を解き始めないこと。これらの面接をブレインストーミングの時間だと思ってください。面接官と話して、質問をし、解決策について議論して、この後どうしたらいいのか確信を持った段階で、作業に取りかかり始めましょう。

もう1つ重要なのは、行き詰まったら、助言を求めること。何のアイデアも浮かばずに黙ってホワイトボードを見つめるだけという状況になったら最悪です。

2番目の面接は、製品に焦点を当てたアルゴリズムの問題でした。正しいアプローチの仕方を探り、適切なデータ構造とアルゴリズムを見極め、そしてコードを書いて問題を解決していかなければなりませんでした。続く10分間では、私がチームメンバーともめた時の出来事について話しをしました。

3番目の面接では、さまざまなユースケースのシステムデザインを構築しました。ホワイトボードにシステムコンポーネントを書いて、それらがどうやってつながって、それぞれどんな役割があるかを説明しました。そして、状況面接的な質問として、自分の上司から承認を受けずに何かの仕事を進める場合はどうするか、という質問を受けました。

最後の面接は、純粋な技術試験で、アルゴリズムの問題でした。比較的簡単なものだったので、私は始める前に基本的な解決策から始めるべきか、最適化された方法をすぐに出したほうがいいのかと尋ねました。もちろん、面接官は基本的な解決策を先に出し、それから最適化のほうを出すよう指示しました。時間切れになるまで、私は面接官と何度かやり取りをしました。そして最後に、過去に実際起こったことを変えられるとしたら、いつのことか、という質問をされました。

面接が終わると、絶対に落ちたな、と思うこともあるかもしれません。でも、面接官が「すばらしい、完璧な解決策だ」と言ってくれるところまで行けなかったからって、そんなことありません。出された問題は、最後までたどり着くようにはなっていなかったんです。採用面接で使われる問題はこのように、与えられた時間、今回の場合は40分間、という時間では完全に終わらせることができないように作られているのです。その代わり面接官は、どのくらいまで進められたかや、あなたの考え方を見ているんです。

6月16日:内定

Amazonは8日間をかけて、答えを出しました。ベルリンオフィスの採用担当者から、金曜の午後に、メールで合格の通知がありました。週明けの月曜に詳細を話し合い、その3日後の6月16日に、給与の金額も決まり、正式に内定が出ました。

翌日、私からのいくつかの質問の回答をもらい、現在勤めている会社の退職に必要な手続きについても確認をしました。そしてすぐに、Amazonに内定承諾の連絡を入れました。

参考資料

謝辞

Anton Popov氏が一連の採用活動に関してアドバイスしてくれ、この投稿の草稿についても、Sherzod Abdujabborov氏、Umed Khudoiberdiev氏と一緒にチェックしてくれました。