
2026/03/22 21:23
アルゴリズム的な無知を暴力的に突破する
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
著者は、1歳前後の応募から始まるGoogle面接への旅を語ります。xwf.google.com からのメール招待と、1週間以内に予定された2回のオンラインインタビューが続きます。彼らの背景は、ルーティングやメッセージ処理に焦点を当てた通信ソフトウェア開発者であり、60 FPS以上を実現する趣味レベルのゲーム開発も行っているため、アルゴリズムへの関心が自然と形成されました。
準備は Gemini Pro を LLM ルーターとして使用して始まりました。Gemini は概念的なヒントを提供しながら、著者は Best Time to Buy and Sell Stock、Contains Duplicate、Valid Anagram、Group Anagrams、Product of Array Except Self といった初期の問題を解きました。これらの基本的な課題をこなすことで自信がつきました。
2日目は「スピードラン」で、18 の LeetCode 問題(Reverse Linked List、Longest Substring Without Repeating Characters、Climbing Stairs 等)に挑戦しました。著者は Gemini のコンテキストメモリが約5問を超えると低下し始め、有用な指導を得るのが難しくなることに気づきました。
3日目から6日目までは中級レベルの課題(Merge k Sorted Lists、Course Schedule、Combination Sum、Container With Most Water、Unique Paths、Two Sum、Clone Graph、Palindromic Substrings、Find Minimum in Rotated Sorted Array)に集中しました。著者は STL の動画を視聴し、行動面接の素材も練習しました。
面接当日には、すでに約34件の LeetCode 問題をウォームアップとして解いていました。技術評価ではグラフ探索と二分探索が組み合わされ、著者は最初に反復アプローチを試みましたが、時間圧力下で構文を思い出すのに苦労しました。面接後の振り返りでは、ストレス時に学んだ概念へのアクセス性が限られていたことと、コードデバッグの改善が必要であることが指摘されました。
それにもかかわらず、採用担当者はオンサイト面接を2回設定し、ライブコーディングスキルの向上を示す第二のチャンスを提供しました。この経験により、著者は LLM と人間の指導者のどちらがより効果的か疑問を抱き、準備ツールで実践したアルゴリズム思考と日常の本番コーディングとのギャップに気づきました。
この改訂サマリーは、元のリストからすべての重要ポイントを捉えつつ、明瞭さを保ち不必要な推論を避けています。
本文
Google採用の旅(パート 1):アルゴリズム無知を突き破る
はじめに
約二か月前、xwf.google.com から届いたメールで、1年前に忘れてしまった応募について触れられていました。
最初は迷惑メールだと思い流してしまいましたが、スクリーニングコールの後、週内に2つのオンライン面接(技術的なものと行動的なもの)があることを知りました。
普通の面接ではなく、Googleという世界クラスのエンジニア工場だと思っている企業での面接でした。
私は電気通信業界で数年間ソフトウェア開発者として働き、ルーティング・メッセージ処理・ビジネスロジックといった高レベルの抽象化に集中していました。
趣味で作るゲームプロジェクトでは時折パスファインディングアルゴリズムや手書きの3Dラスタライザを実装したことがありますが、成功指標は単純でした:>60 FPSで落ちない動作なら完了です。
データ構造は実用的で、フラットベクター、固定長配列、時折マップ、難しい問題には「SQLite」を使っていました。
洗練されたアルゴリズムやデータ構造を学ぼうとしたこともありますが、それらの試みは仕事に影響しませんでした。通信やゲーム開発の最適化に時間を費やすほうがずっと効果的だと感じていたからです。
クラシックなアルゴリズムやLeetCode風の厳格なデータ構造は、私の興味の範囲外でした。
Day 0 – 計画を立てる
数日間YouTubeやフォーラムで先延ばしにしていた結果、最も効果的な戦略は「パターンをできるだけ多く学ぶ」ことだと悟りました。少なくとも核心問題を認識できる程度なら十分です。
私は次のように考えていました:
- アルゴリズム本を読むと純粋数学で概念が見えにくい。
- オンライン動画や記事を見るだけでは先延ばしになる。
- LeetCode問題を単独で解くと時間とエネルギーの浪費になる。
最大の問題は、最も簡単なLeetCode問題さえ解けないことでした。
目標は、パターンと概念を学ぶこと――すべてのニュアンスを完全に理解できなくても構わないということです。
Day 1 – 初期設定とウォームアップ
初めて人間のチュータではなく、大規模言語モデル(Gemini Pro)をアルゴリズム教師として試しました。
自分の状況、履歴書、Googleの準備資料を渡し、次のパラメータを設定しました:
- プロトコル:概念を順に探索・教授する。
- 制約:コード出力はなし。
- 目的:概念的ヒント、LeetCode問題への攻撃ベクトル、実世界例、必要なら比喩を提示。
LLMは以下の5問(Best Time to Buy and Sell Stock, Contains Duplicate, Valid Anagram, Group Anagrams, Product of Array Except Self)を提案しました。
ヒントではこれらがループと配列の単純な使用例であることが示されました。
私は自信を得た:最も簡単なアルゴリズムタスクはこなせる。
Day 2 – できるだけ多くの概念を吸収
土曜日は「最後のディープラーニングセッション」と呼び、スループットを最大化しました:
- LLMが概念(例:データ構造パターン)を選択。
- 10〜15分後に自分の試行を示す。
- 攻撃ベクトルが立てられない場合はLLMの概念解答を受け入れ、第二プロンプトでコード例と共に依頼。
- LLMのソリューションを自身のスタイルで書き直し、それをLLMに評価してもらい代替案を提案。
各問題に30分制限:
- Reverse Linked List
- Linked List Cycle
- Valid Palindrome
- Invert Binary Tree
- Longest Substring Without Repeating Characters
- …(他多数)
重要なポイント:
- リストはほとんどの場合論理的で、暴力的手法は最適ではない。
- 木問題はBFS/DFSに帰着し、UIや迷路解法のコンポーネント走査に似ている。
- グラフは最初は難しいが、練習でパターンが身につく。
- 動的計画法は依然として魔術。
Day 3 – 学んだ知識を使う
時間が逼迫。私は「Medium」レベルの問題に集中し、面接ではそれらが出ると仮定しました。
以前解いたLeetCode問題との重複を避けつつ、一般的なインタビュー課題リストを作成。
最初の3問(Merge k Sorted Lists, Merge Intervals, Design Add and Search Words Data Structure)はヒントが少なく済みました。
「Easy」問題は新しい概念を導入するために逆に難しく、 「Medium」はその難易度を上げた形でした。
- Course Schedule – 方向転換と訪問状態の追跡。
- Combination Sum – バックトラッキング初体験。
- Container With Most Water – コーナーから始まる2ポインタ法。
- Sum of Two Integers – ビット演算でのバイナリアダーバ。
- Unique Paths – 動的計画法、まだ不安。
コードをコンパイルせずにLLMへ送ると不安が増す。
オフバイワンエラーや比較演算子のミスなど、境界ケースが真剣な懸念事項となった。
Days 4–6 – 期限前に知識を統合
残り時間が少ない中で、既にカバーしたパターンと似た問題を練習:
- Two Sum
- Longest Consecutive Sequence
- Clone Graph
- Palindromic Substrings
STLと一般的なインタビューコーディングパターンの動画を視聴し、行動質問に備え、STLドキュメントを読んだ。
「分割統治」の概念を学校課題で働く友人に説明。
一つの二分探索問題:Find Minimum in Rotated Sorted Array を取り組み、2回の非最適な検索で解決したが、1回の洗練された実装はできなかった。
面接直前にはアルゴリズムを全く考えず、ゲームをプレイしカジュアルYouTube動画を観るだけ。
以前のソリューションを復習したが、特定の問題に集中しなかった。
面接当日
最終日に到達すると衝撃でした。
約34件のLeetCode問題(18 Medium, 1 Hard)を解いた状態で、技術評価はグラフ探索と二分探索が混ざったもので、ゲーム開発ロジックに非常に似ていました。
議論中に反復増加アプローチを提案したが、中途で再定義した制約で二分探索へ最適化できることに気付いた。
緊張のため反復型二分探索の標準実装は記憶から抜け、再帰版だけが残った。
反復アプローチを要求されたものの、時間内にリファクタリングできず。
最終的には口頭で二分探索ロジックを説明し、問題空間を切り取る方法を語った。
最終コードは遅れて見つかったミスが含まれていた。
冷静化と待機
面接後、不安に包まれた――失敗したのか成功したのか?
待ち時間は予想外に生産的で、アルゴリズム概念が結果への焦りによって鮮明に保たれる様子を観察できた。新しく得た知識を冷静に整理できるようになった。
数日後、電話がかかってきた。
失敗を予想していたが、リクルーターはコードのデバッグ性に関する問題を指摘しつつ、2回目のオンサイト技術面接へ進むことを提案した。
これは「もう一度チャンス」を得られた良いニュースだったが、現在の職務との両立のストレスも増えた。
電気通信業界の役割は好きだが変化を望んでいた。
エピローグ – 未解決の疑問
- LLM vs. Human Tutor – なぜドメイン固有の比喩をもっと頻繁に使わないのか?
- Production Reusability – 「忘れられた・禁じられた」コーディングパターンが日常で使われない理由は何か?(再利用性は高い)
- Fluency vs. Metric – 流暢さだけが唯一の指標なのか?(分割統治説明で二分探索を構築できたものの、単純コードパターンを忘れ続ける)
(注:この記事を書くのに約8時間、面接後数ヶ月を経て執筆しました – スピードランの一環と考えてください。)