アルゴリズム的な無知を暴力的に突破する

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 StockContains DuplicateValid AnagramGroup AnagramsProduct of Array Except Self といった初期の問題を解きました。これらの基本的な課題をこなすことで自信がつきました。

2日目は「スピードラン」で、18 の LeetCode 問題(Reverse Linked ListLongest Substring Without Repeating CharactersClimbing Stairs 等)に挑戦しました。著者は Gemini のコンテキストメモリが約5問を超えると低下し始め、有用な指導を得るのが難しくなることに気づきました。

3日目から6日目までは中級レベルの課題(Merge k Sorted ListsCourse ScheduleCombination SumContainer With Most WaterUnique PathsTwo SumClone GraphPalindromic SubstringsFind 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 – できるだけ多くの概念を吸収

土曜日は「最後のディープラーニングセッション」と呼び、スループットを最大化しました:

  1. LLMが概念(例:データ構造パターン)を選択。
  2. 10〜15分後に自分の試行を示す。
  3. 攻撃ベクトルが立てられない場合はLLMの概念解答を受け入れ、第二プロンプトでコード例と共に依頼。
  4. 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回目のオンサイト技術面接へ進むことを提案した。

これは「もう一度チャンス」を得られた良いニュースだったが、現在の職務との両立のストレスも増えた。
電気通信業界の役割は好きだが変化を望んでいた。


エピローグ – 未解決の疑問

  1. LLM vs. Human Tutor – なぜドメイン固有の比喩をもっと頻繁に使わないのか?
  2. Production Reusability – 「忘れられた・禁じられた」コーディングパターンが日常で使われない理由は何か?(再利用性は高い)
  3. Fluency vs. Metric – 流暢さだけが唯一の指標なのか?(分割統治説明で二分探索を構築できたものの、単純コードパターンを忘れ続ける)

(注:この記事を書くのに約8時間、面接後数ヶ月を経て執筆しました – スピードランの一環と考えてください。)

同じ日のほかのニュース

一覧に戻る →

2026/03/23 3:23

**PC Gamer 推奨RSSリーダー(37 MBの記事でダウンロードが止まらない場合)** - **Feedly** - クラウドベースでデバイス間同期が可能。 - カテゴリー分けやタグ付け機能が充実しています。 - **Inoreader** - 高度なフィルタリングと検索機能を備えています。 - オフライン閲覧モードもサポートします。 - **The Old Reader** - シンプルで軽量、Googleアカウント連携が可能です。 - 共有リストやコメント機能があります。 - **NewsBlur** - AIによるトピック分類と学習機能を提供。 - モバイルアプリも充実しています。 - **Reeder (macOS/iOS)** - Appleデザインに合わせた直感的なUIです。 - 多数のリーダーサービスと連携可能です。 **注意点** - 大容量の記事をダウンロードし続ける場合は、**「オフライン保存」機能**をご利用ください。 - **キャッシュクリア**や**ブラウザ拡張機能無効化**で問題が解決することもあります。 - それでも解決しない場合は、PC Gamerのサポートへ問い合わせるか、別のリーダーを試してください。

## Japanese Translation: PC Gamerの記事は、読者に通知ポップアップ、背景を暗くするニュースレターオーバーレイ、そして少なくとも5つの閉じにくいバナー広告でページを襲撃していることを示しています。ウェルカムマットを回避した後でも、その広告は記事のタイトルとサブタイトルの横に残ります。初期ページロードは37 MBです;5分以内にサイトはさらに約0.5ギガバイトの広告素材をダウンロードします。NetNewsWire、Unread、Current、Reeder など多くの RSS リーダーはこれらの侵襲的要素をフィルタリングでき、よりクリーンな閲覧体験を提供します。これはユーザーが PC Gamer サイトの煩わしさを避けるために広告なしの RSS フィードに切り替える可能性があることを示唆しており、出版社は読者の関与を維持するために過度な広告戦術を減らす圧力を受けるかもしれません。

2026/03/23 4:02

「最適化のゴールドスタンダード:ローラーコースター・タイクーンの内部を探る」

## Japanese Translation: クリス・ソーヤーの *RollerCoaster Tycoon*(1999)は、ほぼすべてのコードをアセンブリで書き、細部にわたる低レベル最適化を施したことで、滑らかなゲームプレイのベンチマークを確立しました。金額は最大想定範囲にちょうど合ったデータ型(ショップ価格は1バイト、総公園価値は4バイト)で保存されており、後にオープンソース再実装 OpenRCT2 ではこれらを統一的な8バイト変数へ移行し、現代のCPUアーキテクチャに合わせました。乗算・除算の代わりにビットシフト(`<<`/`>>`)が使用されており、コンパイラが自動で行うはずだった処理を手動で実装しています。 ゲームデザインの決定は性能制約と密接に結びついています。ソーヤーはデザイナー兼プログラマーとして、CPUフレンドリーな計算を優先する設計選択が可能でした。ゲストの移動はアトラクションへ向かう完全な経路探索ではなくランダムウォークに依存しており、多数のエージェントによる高価な計算を大幅に削減しました。パスファインディングは特定のシナリオ(例:乗物修理のメカニック、出口を探すゲスト)でのみ呼び出され、深さ制限が設けられています—デフォルトでは5つのジャンクション、条件に応じて7または8に増加し、フレームスパイクを回避します。混雑した道では同一タイルに複数のゲストが存在でき、衝突回避は完全に省かれ、近接による幸福度計算のみが影響を受けます。 OpenRCT2 はこの元のロジックをリバースエンジニアリングし、現代CPU向けに変数サイズを標準化し、パスファインダーの制限を拡張することで更新しました。これにより、レガシートリックが新しいハードウェアに適応できることが示されました。将来のアップデートでは、衝突チェックや厳密なデータサイズといった古い制約を緩和しつつ、今日のマシンで性能を損なわずにコア体験を保持することが可能です。 これらの洞察は、デザイナーとプログラマーの緊密な協働と意図的な低レベル最適化が、小規模チームでも高性能ゲームを構築できることを示しており、大手スタジオも採用すべきアプローチです。 ## Text to translate (including missing points):** Chris Sawyer’s *RollerCoaster Tycoon* (1999) set a benchmark for smooth gameplay by writing almost all of its code in Assembly and applying meticulous low‑level optimizations. Money values were stored in data types sized exactly to their maximum expected range (1‑byte for shop prices, 4‑bytes for total park value), and the original engine later shifted these to uniform 8‑byte variables in the open‑source reimplementation OpenRCT2 to match modern CPU architecture. Bit shifting (`<<`/`>>`) was used instead of multiplication/division by powers of two, a manual trick that compilers no longer perform automatically. Game‑design decisions were tightly coupled with performance constraints: Sawyer served as both designer and programmer, allowing design choices to favor CPU‑friendly calculations. Guest movement relied on random walking rather than full pathfinding toward attractions, drastically reducing expensive calculations for thousands of agents. Pathfinding was invoked only in specific scenarios (e.g., mechanics repairing rides, guests seeking exits) and had a depth limit—default 5 junctions, increased to 7 or 8 under certain conditions—to avoid frame‑spikes. Overcrowded paths allowed multiple guests on the same tile; collision avoidance was omitted entirely, with only happiness calculations affected by proximity. OpenRCT2 reverse‑engineered this original logic and modernized it—standardizing variable sizes for current CPUs and extending pathfinder limits—showing how legacy tricks can be adapted to new hardware. Future updates could relax some of these old constraints (such as collision checks or strict data sizing) without harming performance on today’s machines while still preserving the core experience. These insights underscore that close collaboration between designers and programmers, coupled with deliberate low‑level optimization, enables small teams to build high‑performance games—an approach larger studios might emulate.

2026/03/23 0:16

**バージョン管理の未来** バージョン管理は、従来型のリポジトリやブランチモデルを超えて進化しています。新たに浮上している動向としては、AI 主導の変更分析、分散したチーム間でのリアルタイム協働、および継続的デリバリー・パイプラインとの緊密な統合が挙げられます。コードベースがより大規模かつ複雑化するにつれて、これらの革新はワークフローを合理化し、マージコンフリクトを減少させ、全体的なソフトウェア品質を向上させることを約束しています。

## Japanese Translation: **Manyana** は、Conflict‑Free Replicated Data Types(CRDTs)がバージョン管理にどのように利用できるかを示すデモプロジェクトです。ユーザー体験を向上させます。 ファイルは *weave* として表現されます——1 つのデータ構造が、追加または削除された各行とメタデータを記録し、行順序を永続化し、同時挿入に対してマージ全体で一貫した順序を提供します。 CRDTs は順序非依存ですので、マージが失敗することはありません。衝突はファイルの同じ部分を編集したときだけ発生し、不透明なマージブロブではなく明確な競合マーカーが生成されます。 システムはまた、リベースが履歴を破壊せずに行えることも示しています:コミットは新しいベース上で再実行され、「プライマリー・アニサスター」注釈によって完全な祖先関係が保持されます。 チェリーピッキングとローカル Undo はまだ実装されていませんが、470 行の Python デモ(パブリックドメイン)は、CRDTs がバージョン管理における難しい UX 問題を解決し、現在のツールよりも明確な競合表示を提供できることを示しています。