Amazonのソフトウェアエンジニア面接を受けました
カナダ・バンクーバーにはAmazonのオフィスがあり、AmazonやAWSの機能を作ったりメンテしているチームがたくさんあります。Amazonはバンクーバーでの採用を拡大していく方針のようで、2018年にはAmazonが数千人規模の巨大なオフィスをバンクーバーに建造するとカナダ首相自ら発表していて本気具合が伺えます。
Amazonは膨大なユーザー数と巨大なアプリケーションを保有していて、それらが2枚のピザルールに則ってチーム分けされ、チームごとにマイクロサービスの責任を持って運用していることで有名です。
Webフロントエンドの今後を考えた時に、この「規模」と「マイクロサービス化」というのは1つの課題だと感じていて、Amazonのような巨大な土壌の中で課題に取り組めたらいいなと思ってフロントエンドエンジニアのポジションに応募しました。
残念ながら結果として採用されなかったのですが、Amazonの面接プロセスを体験できたのは1つの貴重な体験だったので、書ける範囲で書き残しておこうと思います。
応募
Amazon Jobsというリクルーティング専用のWebサイトがあります。リクルーターから声がかかっても結局ここにレジュメを送ることになります。Amazonとは別のアカウントを作って、興味のあるポジションをポチポチしていくことになります。
バンクーバーのエンジニアポジションだけでも約800件あって全部見きれません。ページを進んでいくほどポジションがオープンになった時期が古くなっていくので、中には募集しっぱなしで放っとかれているポジションもあると思います。
僕はその中から募集が比較的新しいポジションを数個選んで応募しました。
オンラインテスト
応募した次の日にオンラインテストを受けるようにとメールで案内が送られてきました。オンラインテストは一定時間内に数問のアルゴリズムの問題を解くもので、エンジニアの職種は全部共通のものだと思います。
問題の内容はLeetCodeやHackerRankにあるような問題です。いくつかのプログラミング言語の中から好きなものを選んで取り組めます。自動補完のないテキストエディタにオンライン実行ができる機能がついているもので、一度始めるとタイマーが開始します。
テストの中には、自分が書いたアルゴリズムを文章で説明するセクションがあります。なぜそのアプローチを取ったか、時間複雑度、空間複雑度と色々な想定ケースを交えて説明できれば問題ないと思います。
オンラインインタビュー
オンラインテストに合格すると次はオンラインインタビューです。ビデオチャットごしに面接をします。Amazon Chimeをセットアップするように求められ、追ってインタビューの相手の名前とAmazon ChimeのルームIDが送られてきました。
ポジションに関係のありそうな技術的な質問を受けました。実際にあった質問の具体的な内容は明かせないですが、例えば次のような感じです。質問はいずれも抽象的で、トピックに対する理解と説明できる知識が求められます。
- Webブラウザにあるデータ永続化の機能の一覧と、それらの違いについて教えてください
- CORSについて教えてください
- あなたはCookieを用いない認証を実装しています。ユーザーを守るためにどんなことに気をつけますか?
オンサイトインタビュー
オンラインインタビューも通過すると、実際にオフィスに呼ばれて対面で面接をすることになります。間にトイレ休憩を挟みながら5-6人と1人1時間ずつ合計で5-6時間連続で面接するものです。
面接ではこれまでの経験について話します。簡単な自己紹介をした後、それまで経験したことについて聞かれます。困難な状況があったかとか、数値を用いて何かを改善したかとか、そういう質問です。
STARメソッドという「状況」「その時にすべきだったこと」「実際にしたこと」「結果としてどうだったか」と4つのファクターに沿って話します。このSTARメソッドはオフサイトインタビューの前にAmazonからメールで簡単な資料が送られてきて、練習するように求められます。
Amazonはリーダーシップ・プリンシプルという信条・文化をすごく大切にします。経験についての質問は必ずこのリーダーシップ・プリンシプルに沿っています。1つ例を挙げると、「Have Backbone; Disagree and Commit」についての質問で*『上司の決定に対して異議を唱えた時のことを話してください』*といった形です。
経験について話した後、技術的な質問をされます。これはアルゴリズムの問題の応用になるようなものあれば、システムデザインの色が強い質問もあります。実際に質問されたことは話せませんが例を挙げるとするなら次のような感じです。
- ヒープを実装するコードを書いてみてください
a
からz
までの文字と.
と*
が使える正規表現で、文字列が正規表現にマッチしているか確認する関数を書いてみてください- Todoistのフロントエンドをどのように作りますか。実装方針を実際のコードを用いて説明してください
- InstagramのようなWebサービスをどのように作りますか。フロントエンドとバックエンド合わせて全体を設計してください
技術的な質問はホワイトボードを用いて答えます。コードを用いて説明する時も、『ここで一番優先度の高い値をバイナリツリーの一番下の段に再帰的に移動させるでしょ?』 『へー、それはどうやるの?』 *『こうやって配列のX番目と2X+1番目を比べて...』*みたいな風に実際のコードをホワイトボードに書きながら説明します。
インタビュワーは正解に辿り着けるかどうかを見ているのではなくて、プロジェクトをこなす中で実装を説明したりアーキテクチャのデザインは必ずやることになるので、その時にどういう風に考えるかやどういう順番で考えるかなどを見ていると思います。
振り返り
オンサイトインタビューが最後の採用プロセスだったようですが、残念ながら僕はその後に不合格の通知を貰ってしまいました。
技術的な質問はあまり問題なく答えられたと思うのですが、コミュニケーションの面で不安を与えてしまったのかなと思います。特にインド系の面接官の英語が聞き取りづらくて何度も聞き返してしまったり、経験についての質問の中にあまり明瞭に答えられなかったものがあったりしたのが原因だと思います。
次また同じような機会があった時のために、もう少し英語でアドリブ説明する力を鍛えておきたいなーと思いました。このへんは一人で練習できないので、ネイティブの友人と模擬面接のようなことをしながら対策できるといいと思います。