妻はDiorを欲しがっていた。代わりに私はClaude Codeに600ドルを費やし、200万行のデータベースをVibe-Codeした。
妻と私は結婚して10年になり、妻は記念日にDiorのバッグを欲しがっていました。
ところが何かを買う代わりに――私はAIの実験に完全に夢中になっていたため――休日の間ずっと書斎に閉じこもり、月額200ドルのClaude Codeサブスクリプションを3つもやりくりしながら、LLMに200万行のC++分散データベースをクロスコンパイルさせようとしていました。
その後、私に何が起きたかはたぶん想像できるでしょう。😂
振り返ってみると、これは最適なリソース配分ではありませんでした。
そこで、その週末に私は2つの教訓を学びました。
1つ目:妻の言うことを聞くこと。「Happy wife, happy life」は単なるスローガンではありません。これはシステム安定性の原則です。
2つ目:AIは、小さく明確にスコープされたタスクでは魔法のように感じられます。しかし、本物の分散インフラに向けると、まったく異なる振る舞いをします。
この記事は、2つ目の教訓についてです。
背景
私は、執筆時点でGitHub上で42K+ starsを獲得している最も人気のあるオープンソースのベクトルデータベース、Milvusのメンテナー兼コアコントリビューターです(C++、Go、Pythonで約200万行)。このシステムは完全に分散されています。プロキシノード、クエリノード、データノード、インデックスノードがすべてメッセージキューを介して協調します。私の担当領域はストレージとインデックスレイヤーです。
私は数か月前からClaude Codeを使っていて、本当に感心していました。あるCLI全体の不足していた機能を、トークン代20ドルですべて埋めてくれました。クエリ性能のホットパスを1日で5倍にしてくれました。私ならコードを触れるほど理解するだけで1週間かかるような最適化です。まるで、眠らず、時間単位で請求もしない、有能なジュニアエンジニアがいるように感じました。
そこで、本物の問題を与えてみることにしました。クロスプラットフォームコンパイルです。
600ドルの教訓
何年もの間、Milvusチームの誰もクロスプラットフォームコンパイルには手を出そうとしませんでした。ビルドシステムはGo、C++、Rustが混在し、誰も見直したがらない長年積み重なったConanとCMakeのパッチでつなぎ合わされています。Linuxで動かすだけでもすでに悲惨です。WindowsとモダンなmacOSでのビルドはあまりにも悪夢のようで、チームはそれを誰か他人の問題として扱っていました。
今の私にはClaude Codeがあると思いました。自分なら対処できる、と。
最初は、私の考えが正しいように見えました。Windowsでコンパイルでき、私はパッチを提出し、難しい部分は終わったと思いました。
するとLinuxが失敗しました。Linuxを直すとMacが失敗しました。Macを直すとGPU環境が失敗しました。修正のたびに別のプラットフォームで新たな問題が2つ発生し、パッチは積み重なっていきました。最終的には、Conan設定、CMakeスクリプト、C++互換性のためのシム、そして私にも何なのか分からないものに触れる、1000ファイル、約10万行のパッチになっていました。
腹立たしかったのはバグそのものではなく、そのループでした。私はClaudeに「場当たり的な修正はやめて」「クリーンな解決策を出して」と言い続けました。Claudeは毎回その通りに従い、よりクリーンに見えるパッチを生成しました。すると、そのクリーンなパッチが他の3つのプラットフォームを壊し、サイクルが再開しました。私の.claude/settings.local.jsonを見ると、手動承認された権限ルールが147個見つかるでしょう。その1つ1つが、「今度こそうまくいく」と私が思ったタイムスタンプです。
私はMaxプランに600ドルを費やし、休暇を丸ごと燃やしました。そして手元に残ったのは、git reset --hardコマンドの山だけでした。
私はターミナルを見つめながら、これは全部、見栄えよく包装された誇大広告にすぎなかったのではないかと考えていました。すると、問題はClaudeではないと気づきました。それは、研究課題を指定せずに大学院生にNatureに論文を載せろと言うようなものでした。私は「解決済み」とは何を意味するのかを一度も定義しないまま、問題を渡していたのです。
実際にうまくいくこと
失敗の原因はClaudeの知能ではありませんでした。プロセスの失敗でした。そこで私は、別のやり方で最初からやり直しました。
コードの前に制約。 「Windowsでコンパイルできるようにする」ではない。実際の制約を、明示的に書き出すこと。すべてのプラットフォームでユニットテストが通る、CIがどこでもグリーン、#ifdefのプラットフォーム別ハックなし、壊れた依存関係を回避するためのシムなし。ここが難しい部分だ — 何をもって「完了」とするかを知る必要があり、それには何かに手を触れる前に慎重に考えることが必要になる。複雑なインフラでは、作業の大半は考えることにある。
コードではなくテストをレビューする。 私はテストケースを書く(またはClaudeに生成させる)が、レビューするのは実装ではなくテストだ。このテストはConanレシピがARMで正しく解決されることを確認しているか? Docker内のCMake設定をカバーしているか? それなら数分で評価できる。クロスプラットフォームC++パッチ1万行を、どれだけ時間をかけても自信を持ってレビューすることはできない。
ボトムアップで、一度に一層ずつ。 Claudeに1000ファイルを変更させてはいけない。まず依存関係のバージョンを固定する。その制約が検証されたら、CMake設定へ進む。それが安定したら、プラットフォーム固有のコードへ進む。各層は、上に進む前に完全に検証できる程度に小さい。
私はこのアプローチでクロスプラットフォームビルドをゼロからやり直した。2日。数十コミット。どれも小さく、それぞれに対応するテストがある。 #ifdefハックはなし — 根本的な修正はConanレシピを更新し、サードパーティライブラリのバージョンを上げることで、実際の依存関係チェーンを修正し、その場しのぎで覆い隠すことではなかった。
同じタスク。まったく違う結果。
テストに関する洞察は、それだけで一つのポイントに値する。成熟したテストスイートを持つ分散システムでは、テストこそが仕様だ。もしそれらの統合テストが通るなら — 最初の試みで赤くなった47個すべてが — seal/flushの契約は保たれており、WALリプレイは正しく、クエリノードは依然としてセグメントを破損なくmmapロードできる。私はそれを知るためにC++を読む必要はない。
私はコードのレビューをやめた。テストのレビューを始めた。コードは実装の詳細になった。
ハードウェアを投入する
ワークフローが正しくなると、新しいボトルネックが現れた。私はそこに座って 待っていた。
2M行のコードベースを1つのClaude Codeセッションが処理するのは速くない。各タスクには実時間で20〜30分かかる。ボトルネックは知能ではなかった。スループットだった。
だから私は妻に、「AIエージェント」のためにGPU付きサーバーが必要だと言った。その会話は、予想どおりの展開になった。私は結局それを買った — さらにMacBookに加えてMac Miniも買った。最終的には、3台のマシンと6つのターミナルがあり、それぞれが独立したClaude Codeセッションを実行していた。
これを可能にするのがgit worktreeだ。各セッションにはそれぞれ独自のタスク、ブランチ、作業ディレクトリが割り当てられ、他から完全に分離される。そして制約ファーストのアプローチにより各ブランチには独自の受け入れ基準があるため、並列化は自明に安全だ。各ブランチのテストが独立して通るなら、マージのリスクは低い。
クロスプラットフォームビルドでは、これはLinux ARMのConan依存関係を解決するセッションが1つ、macOSのCMake設定を修正するセッションが1つ、Windows MSVC互換性を扱うセッションが1つ、という形で、すべてが干渉なしに同時実行されることを意味した。かつてはプラットフォーム間で直列にコンテキストスイッチしていたものが、マシン間での並列実行になった。
このパターンは日々の仕事にも一般化できる。ある日には、1つのセッションがコンパクションスケジューラをリファクタリングし、別のセッションがHNSW検索パスを最適化し、3つ目がストリーミング挿入のエッジケースに対する統合テストを書いている。私は直属の部下の様子を見るマネージャーのようにターミナル間を行き来する。ただし、この直属の部下たちはコーヒーブレイクを必要とせず、スプリント計画について意見も持たない。
本当の教訓は、バイブコーディングインフラは才能依存ではなく計算資源依存だということだ。制約要因はAIがどれだけ賢いかではない。並列に何インスタンス動かせるかだ。Anthropicは16個のClaudeインスタンスを並列に使ってCコンパイラ全体を構築したので、私の6つのターミナルは控えめに感じられた。
私が何度も立ち返ってしまうこと
AIは、目の前に置かれた問題を正確に解く。それ以上でもそれ以下でもない。問題の立て方を間違えれば、間違ったものに対する完璧な解決策が返ってくる。
「macOS 15でコンパイルできる」——これは1時間で解決した。だがそれは局所最適だ。本当の目標は「ハックなしでどこでもコンパイルできる」だった。この2つは別の問題だ。AIにそれを知る術はなかった。それは完全にエンジニア側の責任だ。
AIを使って自分のために作るのは驚くほど簡単だ——自分のマシン、自分のエッジケースを知っていて、「自分の環境では動く」は達成可能な最適化目標になる。すべてのユーザー、すべてのプラットフォーム、すべての環境で動くインフラを作るのは根本的に違う。そのギャップこそ、今もエンジニアリングが存在する場所だ。インフラソフトウェアにおいて、そのギャップは途方もなく大きい。
本番システムで最も厄介だったバグ——マージ後にリバートが必要になったもの——は、試したどのAIコードレビュー手法でも見つからなかった。バグは構文的には正しかった。問題は開発者の暗黙の前提にあり、それはdiffには見えず、周辺コードにも存在しなかった。システムの挙動は、3つの異なるコンポーネントがどう協調するはずだったのかというメンタルモデルを持っている場合にだけ意味を成した——そのモデルは1人の開発者の頭の中にだけ存在し、一度も書き下されていなかった。
それには今でも、システムを十分に理解し、何を問うべきかを知っている人間が必要だ。
3つの$200プランと、失われた1回の休暇は、私がこれまでにした中で最高の投資だった。AIの使い方を教えてくれたからではない。AIをどう使うべきでないかを教えてくれたからだ。
ツールは本当に優れている。常に欠けていたのは、その周囲のワークフローだった。コードの前にテスト、テストの前に制約、そしてそれらすべてを並列に走らせるのに十分なハードウェア。それがすべてだ。
まだ解決されていない問題
すべてが終わっても——失敗したパッチ、リセットコマンド、6つの並列ターミナル——突破するのが最も難しい問題は、やはり人間の問題だ。
今のところ、私には2つの頭痛の種があり、どちらにもきれいな解決策はない。
1つ目: 妻だ。彼女は妥当な期待を持って休暇に入った。そして、私が自分の人生に対して git reset --hard しているのを見届けて帰ることになった。Diorのバッグ予算はサーバー代になった。彼女が私のクロスプラットフォームビルドの成果に感銘を受けていないのは、当然のことだ。「結婚記念日に分散システムの仕事をしていたことをどう謝るか」というワークフローは、まだ見つけられていない。Claude Codeはここでは役に立たない。試しに聞いてみた。花と手書きのメモを提案してきた。もっと具体的にと言った。C++開発者の口調で、心のこもった手紙を12パターン生成した。どれも刺さらなかった。
休暇中にバイブコーディングをしながら関係を維持する問題を解決した人がいたら、ワークフローの提案をぜひ聞きたい。😂
2つ目: これを私以外にどうスケールさせるか。上に書いたことすべて——制約ファーストのアプローチ、git worktreeによる並列化、テストファーストのレビュー規律——は、今のところ私の頭の中とローカル環境にある。これをチームの日常的なワークフローに落とし込むのは、どんなクロスプラットフォームビルドよりも難しい。
これは部分的にはツールの問題だ。だが大部分は人の問題だ。 この種のワークフローには、物事がどう動くのかを本気で解き明かすことを楽しめるエンジニアが必要だ——実際に先にテストを書き、明確でよく定義された制約に満足感を覚え、「とりあえず通せばいい」へ近道しない人たちだ。その組み合わせは、本来あるべきよりもずっと希少だ。
だから、そう——私たちは採用している。
インフラのバイブコーディングについての記事を読んで、私が何を間違えたのかについて即座に強い意見を持ち始めるタイプのエンジニアなら、まさにあなたと話がしたい。
Milvusは本当に難しい分散システムの問題だ。ストレージエンジン、インデックスパイプライン、コンパクション、レプリケーション、障害復旧——そのすべてが現実の本番負荷の下にある。私たちはデモを作っているのではない。人々が依存するインフラを作っている。
そのレベルの問題を解くことに興味があるなら、私たちと一緒に作ろう。
そして結婚記念日のリカバリープランは、私が何とかする。
当社の募集中のポジションをご覧いただくか、LinkedInで私に直接ご連絡ください。
そして、この投稿の内容に少しでも異論があるなら、むしろ大歓迎です — ぜひ議論しましょう。
Slack communityに参加するか、 Milvus Office Hours のセッションを予約してください — 分散システム、AI インフラ、あるいは私たちが間違っていると思う点について、いつでも喜んでお話しします。
読み続けて

Migrating from S3 Vectors to Zilliz Cloud: Unlocking the Power of Tiered Storage
Learn how Zilliz Cloud bridges cost and performance with tiered storage and enterprise-grade features, and how to migrate data from AWS S3 Vectors to Zilliz Cloud.

Zilliz Cloud Update: Tiered Storage, Business Critical Plan, Cross-Region Backup, and Pricing Changes
This release offers a rebuilt tiered storage with lower costs, a new Business Critical plan for enhanced security, and pricing updates, among other features.

Vector Databases vs. Object-Relational Databases
Use a vector database for AI-powered similarity search; use an object-relational database for complex data modeling with both relational integrity and object-oriented features.



