Amazonフロントエンドエンジニア面接体験記:緊張で手が震えてから内定まで
3年経験のAmazonフロントエンドエンジニア面接の完全体験記。技術1次・2次・3次面接の実際の問題レビュー、React原理、Promise手書き実装、アルゴリズム問題の詳細解法、全プロセスのタイムラインと感想を共有。
Amazonフロントエンドエンジニア面接体験記:緊張で手が震えてから内定まで
背景紹介
まず私の基本状況から説明します。フロントエンド開発3年の経験で、現在は中規模のIT企業で業務開発に携わっています。主に社内管理画面とC向けモバイルWebページを担当しています。技術スタックはReact中心で、Vue2のプロジェクトもいくつか経験しました。2026年3月、LinkedInでAmazonのフロントエンドエンジニアの求人を見つけ、2日間迷った末に応募しました。
なぜAmazonに転職しようと思ったのか?正直に言うと、現在の会社で3年働いて業務には慣れましたが、技術的な成長が明らかに鈍化していました。チームの技術スタックが古く、Reactはまだバージョン16、ビルドツールはWebpack3のままで、アップグレード提案してもなかなか進みません。Amazonのエンジニアリング文化は厳しいがやりがいがある、大規模なスケールの技術課題に触れられると聞いていました。元同僚2人がAmazonに転職して活躍しているのも後押しになりました。
準備期間は約2ヶ月でした。LeetCodeは約120問解き、主にTop 100とAmazonの頻出問題に集中しました。React内部実装は「React技術解明」シリーズで学び、FiberアーキテクチャとHooksの実装に重点を置きました。ネットワークとブラウザの原理も復習し、各プロジェクトの背景、技術アプローチ、データ指標をまとめたドキュメントも作成しました。
1次面接:技術基礎面接(ビデオ面接、58分)
面接官は眼鏡をかけた気さくなエンジニアで、私より2〜3歳上くらいに見えました。簡単な自己紹介の後、すぐに技術問題に入りました。
1. React Fiberアーキテクチャの原理を説明してください
これは十分に準備していました。React15のStack Reconcilerの問題から説明しました——仮想DOMツリーの再帰的トラバーサルは中断できず、一度始まると最後まで実行し続けなければならず、メインスレッドが長時間占有され、ユーザーインタラクションがカクつく問題。そしてFiberの核心的なアプローチ:レンダリング作業を小さな単位(Fiber Node)に分割し、各単位の実行後に制御をブラウザに返し、ユーザー入力やアニメーションなどの高優先度タスクを処理できるようにする。Time Slicingと優先度スケジューリングの概念、requestIdleCallbackからMessageChannelへの進化についても触れました。
面接官はFiberの優先度スケジューリングの実装方法を深掘りしました。Laneモデルについて説明しました——更新の種類によって異なる優先度があり、ユーザー入力はデータ取得による更新より優先度が高く、高優先度の更新は低優先度の更新を中断できる。この部分はうまく答えられ、面接官も頷いていました。
2. ブラウザのイベントループメカニズム
マクロタスクとマイクロタスクの違いから説明しました。setTimeout、setIntervalはマクロタスク、Promise.then、MutationObserverはマイクロタスク。各マクロタスクの実行後、すべてのマイクロタスクをクリアしてからレンダリング更新を行う。実行順序の例も示し、面接官からの追加質問はありませんでした——おそらく合格。
3. HTTP/2とHTTP/1.1の違い
多重化、ヘッダー圧縮(HPACKアルゴリズム)、サーバープッシュ、バイナリフレーミングという主要な改善点を説明しました。HTTP/2の多重化がHTTP/1.1のヘッドオブラインブロッキング問題を解決すること(TCPレベルのヘッドオブラインブロッキングは残る)、同じTCP接続上で複数のリクエスト・レスポンスを並行転送できることを強調しました。面接官がHTTP/3の改善について尋ねたので、QUICプロトコルに基づき、UDPでTCPを置き換えてTCPレベルのヘッドオブラインブロッキングを解決、0-RTT接続確立についても説明しました。
4. 初回画面読み込み最適化のアプローチ
プロジェクトでの実際の経験に基づいて回答しました:コード分割(React.lazy + Suspense)、ルート遅延読み込み、画像遅延読み込み(IntersectionObserver)、重要リソースの事前読み込み(preload/prefetch)、SSR/SSG、CDNアクセラレーション、Gzip/Brotli圧縮、Tree Shaking。面接官が実際のプロジェクトでの最適化効果を尋ねたので、初回画面読み込み時間が3.2秒から1.1秒に、FCPが2.8秒から0.9秒に改善したと答えました。
5. 仮想リストの実装アプローチ
核心的なアプローチを説明しました:ビューポート内のリスト項目のみをレンダリングし、スクロール位置に基づいてレンダリング範囲を動的に更新する。startIndexとendIndexの維持、スクロール時の白画面を防ぐための上下バッファ領域についても触れました。しかし疑似コードを書くよう言われた時、実装が不完全で、バッファの計算ロジックが曖昧でした。この部分は準備不足でした。
6. アルゴリズム問題:LeetCode 146 LRUキャッシュ
この問題は以前練習していました。アプローチはHashMap + 双方向連結リスト。get操作はO(1)でノードを見つけて連結リストの先頭に移動、put操作は容量超過時に末尾ノードを削除。しかしコードを書く際、エッジケースの処理が不十分でした——容量0の場合と初期化時のhead/tailポインタの接続。面接官が指摘してから気づき、急いで修正しました。ここは減点されたと思います。
7. プロジェクトの深掘り
パフォーマンス最適化の具体的なデータとコンポーネントライブラリの設計思想について聞かれました。パフォーマンス最適化は十分に準備しており、データ文書を提示しました。コンポーネントライブラリについては、機能別パッケージ分割、テーマカスタマイズ、ドキュメント自動生成について説明し、バージョン管理とリリースプロセスについても答えられました。
1次面接のまとめ:全体として五分五分という感じ。Fiberとイベントループは明確に説明でき、HTTP/2もまずまず。しかしLRUのエッジケースと仮想リストのコード未完成が減点要素。面接後、アルゴリズムが書ききれなかったのが不安でした。
2次面接:技術深掘り面接(ビデオ面接、72分)
1次面接の約4日後に2次面接の通知が来ました——1次は合格したようです。2次の面接官はテックリードで、存在感があり、話し方は簡潔で直接的、あまり笑わない人で、さらに緊張しました。
1. Promise.allをスクラッチで実装
練習していましたが、実際に書く際に少し詰まりました。核心的なロジックはカウンターで完了したPromiseの数を追跡し、すべてのPromiseがresolveしたら結果配列を返す。しかしエッジケース——空配列は即座にresolve、いずれかのrejectで全体をreject——を理解するのに約3分かかりました。合計約15分で書き上げ、面接官は「基本的に正しい」と言いましたが、エラー処理の追加を求められました。
2. マイクロフロントエンドソリューションの比較
qiankun、Module Federation、iframeの3つのアプローチの長所と短所を説明しました。qiankun(single-spaベース)はShadow DOMやランタイムサンドボックスでスタイル分離を行うが、CSS分離が不完全;Module Federationはビルド時ソリューションで依存関係の共有が便利だがバージョン管理が複雑;iframeは最もシンプルだが通信が面倒でパフォーマンスが悪い。面接官がプロジェクトでの選定理由を尋ねたので、導入コストの低さからqiankunを選んだと答えました。
3. Webpackビルド最適化
いくつかの側面を説明しました:splitChunksによるバンドル最適化、thread-loaderによるマルチスレッドコンパイル、TerserPluginによる並列圧縮、DLLPluginによる事前コンパイル、hard-source-webpack-pluginによるキャッシュ、externalsによる大型依存の除外。面接官がWebpack3からWebpack5へのアップグレード経験を尋ねた時、正直にまだアップグレードできていないと答えました。少し恥ずかしかったです。
4. プロジェクトで遭遇した最も困難な技術的問題
メモリリークの問題を共有しました——SPAのページ遷移でコンポーネントが正しくアンマウントされず、タイマーとイベントリスナーが蓄積し続ける問題。Chrome DevToolsのMemoryパネルでヒープスナップショットを比較し、useEffectのクリーンアップ関数が書かれていないことを特定。面接官が他の一般的なメモリリークシナリオを尋ねたので、クロージャ参照、DOM参照の未解放、グローバル変数などを説明しました。
5. アナリティクスSDKの設計
アーキテクチャの観点から説明しました:イベント収集層(自動収集+手動報告)、データ組立層(ユーザーID、デバイス情報、ページ情報などの共通フィールド追加)、報告戦略層(バッチ報告、オフラインキャッシュ、失敗時リトライ)、データストレージ層(IndexedDB/LocalStorage)。面接官がアナリティクスデータの損失を防ぐ方法を尋ねたので、Beacon APIとbeforeunloadイベントを組み合わせたアプローチを説明しました。
6. React Hooksの内部実装とクロージャの罠
HooksはFiberノード上に連結リストとして保存され、各レンダリング時に順番に値を取得するため、条件文の中にHooksを書けないことを説明しました。クロージャの罠は、関数コンポーネントが各レンダリングで新しいクロージャを作成するため、useEffectやイベントハンドラで取得するstateが古い可能性があること。解決策としてuseRefで最新値を保存する方法や、依存配列に追加する方法を説明しました。
クロス質問:「このプロジェクトをやり直すならどう改善するか?」ViteでWebpackを代替する検討、より包括的なモニタリングシステムの導入、コンポーネントライブラリの早期抽象化などを上げました。
2次面接のまとめ:1次よりかなり難しかった。Promise.allは書けたが流暢ではなく、マイクロフロントエンドとアナリティクスSDKはまずまず。6対4でポジティブだが、確信はありませんでした。
3次面接/HR面接(ビデオ面接、35分)
2次面接の3日後に3次面接の通知が来ました。面接官は部門のシニアマネージャーで、40代くらい、とても落ち着いていて、ゆっくり話すが一つ一つの質問に重みがありました。
1. なぜ現在の会社を離れるのか
技術的な成長が頭打ちになり、より大規模な技術課題に取り組みたいと説明しました。現在の雇用主の悪口は言いませんでした——これは重要です。
2. キャリアプラン
短期的にはAmazonでフロントエンドエンジニアリングとパフォーマンス最適化を深めたい、長期的には技術エキスパートとしてチームの技術決定に影響を与えたいと答えました。面接官が「技術エキスパートとマネジメントのどちらを志向するか」と尋ねたので、現段階では技術志向だと答えました。
3. 同僚との意見対立の処理
まず相手の視点と動機を理解し、感情ではなくデータと事実に基づいて議論すると答えました。実際の例として、バックエンドエンジニアとのAPI設計の意見対立を、両アプローチのパフォーマンスデータを比較して合意に至った経験を共有しました。
4. 最大の失敗経験
本番インシデントを共有しました——カナリアテストなしでデプロイしたため、一部ユーザーの画面が空白に。事後レビューを行い、デプロイチェックリストとカナリアリリースプロセスを確立しました。面接官が「やり直すならどうするか」と尋ねたので、時間がなくてもカナリアデプロイを坚持すると答えました。
給与:希望を聞かれたので、月額35K相当と答えました。範囲内とのこと、詳細は承認待ち。
逆質問:チームの技術スタック(React + TypeScript + Vite、一部Next.js)とオンボーディングプロセス(メンターシップ制度とテックトーク)について聞きました。面接官は詳しく答えてくれました。
面接問題まとめ
1次面接:
1. React Fiberアーキテクチャの原理と優先度スケジューリング
2. ブラウザイベントループメカニズム
3. HTTP/2とHTTP/1.1の違い
4. 初回画面読み込み最適化のアプローチ
5. 仮想リストの実装アプローチ
6. LeetCode 146 LRUキャッシュ
7. パフォーマンス最適化データとコンポーネントライブラリ設計
2次面接:
1. Promise.allのスクラッチ実装
2. マイクロフロントエンドソリューション比較(qiankun/Module Federation/iframe)
3. Webpackビルド最適化
4. 最も困難な技術的問題とトラブルシューティング
5. アナリティクスSDK設計
6. React Hooks内部実装とクロージャの罠
3次面接/HR面接:
1. 転職理由
2. キャリアプラン
3. 意見対立の処理
4. 最大の失敗経験
心得とアドバイス
1. アルゴリズムは必ず練習する必要があります。Amazonのアルゴリズム要件は確かに他社より高いです。最適解は求められませんが、基本的なアプローチは正しく、エッジケースを考慮する必要があります。最低100問は解き、Top 100とAmazon頻出問題に集中することをお勧めします。
2. プロジェクト経験はデータで語ることが重要です。「パフォーマンスを最適化した」という言葉は曖昧すぎます。「FCPを2.8秒から0.9秒に改善した」という具体的な数字が必要です。面接官は貢献を定量化できるかどうかを重視しています。
3. ソースコードは深く理解する必要があります。暗記するのではなく、設計思想を理解する。Fiberアーキテクチャなら、なぜそのように設計されているのか、何を解決しているのかを説明できなければなりません。
4. 手書きコードの練習は必須です。Promise.all、デバウンス/スロットル、ディープクローン——これらの頻出手書き問題はスムーズに書けるように。面接での手書きはIDEでの記述とは全く違う感覚です。白紙ノートで練習することをお勧めします。
5. メンタルが重要です。1次面接でアルゴリズムが書ききれなかった時、諦めそうになりましたが、踏ん張って良かったです。面接中に分からない問題に遭遇するのは普通で、思考プロセスを示すことが諦めるより良いです。
結果:3次面接から2週間後にオファーを受け取りました。給与は希望より少し上で、全体的に満足しています。
よくある質問FAQ
Q:Amazonのフロントエンド面接でアルゴリズムの要件は高いですか?
A:平均より上です。1次面接にはほぼ確実にアルゴリズム問題があり、LeetCode中程度の難易度です。最適解は不要ですが、アプローチは正しく、基本的なテストケースを通過するコードが必要です。
Q:面接プロセスはどのくらいかかりますか?
A:応募からオファーまで約5週間。1次から2次まで4日、2次から3次まで3日、3次からオファーまで2週間でした。
Q:どのようなプロジェクトのハイライトを準備すべきですか?
A:パフォーマンス最適化、エンジニアリング基盤構築、コンポーネントライブラリ開発が差別化要素です。最も重要なのは、何をしたか、なぜその方法を選んだか、測定可能なインパクトは何かを明確に説明できることです。
Q:Amazonの面接官のスタイルはどうですか?
A:全体的にプロフェッショナルで、回答に基づいて深掘りしますが、意地悪な質問はありません。技術面接の面接官は明らかにスキルが高く、深いレベルでの追及を感じました。
Q:3年経験でどのレベルに該当しますか?
A:通常はSDE II(L5)です。詳細は面接パフォーマンスとプロジェクトの関連性によります。基本給の範囲は勤務地により約130K〜170Kドルです。