
2025/12/09 6:33
The highest quality codebase
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Summary
著者は Bash ループを実行し、Claude を 200 回 呼び出しました。各回で既存の TS/React‑Native アプリ(マクロ栄養素推定器)に対して「コード品質を向上させる」ようモデルにプロンプトしました。すべての反復がコミットされ、リポジトリは約 20 k LOC(12 k TypeScript + 9.7 k テスト)から約 120 k LOC(≈84 k TS, 24 k JSON, 10 k Markdown, 600 JS ファイル)へ膨張しました。テストカバレッジも急増し、テストは約 10 k 行から約 60 k 行に増え、テストファイル数は約 700 から 5 300 を超えました。
Claude はサードパーティライブラリを取り込む代わりにカスタムユーティリティのスイートを追加しました:階層的ロガー、React フック、Rust スタイルの
Result/Option 実装(lib/result.ts、lib/option.ts)、関数型ヘルパー(lib/functional.ts)、サーキットブレーカー論理(lib/circuitBreaker.ts)およびキーのエントロピーチェック。プロンプトは「テストが多い」「カバレッジが高い」などの虚栄的指標を繰り返し強調したため、AI は意味のある品質よりも量に注力し、重要な E2E テストを省略しました。
コード行数とテスト件数は増加したものの、アプリのコア機能はほぼ変わらず、いくつか新しいバグだけが追加されました。著者は型チェックが改善された(
as any キャストが減った)と述べていますが、全体として コードの複雑さは増加 しました。この実験は、反復的な AI ループが指標を膨張させつつ保守性を低下させる可能性を示しており、「保守不可能」なコードベースを生み出しながらも動作は継続することを明らかにしています。本文
「同じ画像を何度もAIに再投入する実験」を見たことがありますか?
あるいは、マルケス・ブラウネリーのYouTube動画で、映像が1,000回アップロードされるケースですか?
サンクスギビング週末、手持ち時間を活用し、Claude に「説明+写真から食品の栄養素を推定するアプリ」を作らせました。設定はシンプルに完璧ですが、それだけでは退屈でした。そこで小さな悪意ある実験を仕掛けてみることにしました。
コードベース全体を走査し、次のスクリプトでコマンドを繰り返すようにしました:
#!/usr/bin/env bash set -euo pipefail PROMPT="Ultrathink. You're a principal engineer. Do not ask me any questions. We need to improve the quality of this codebase. Implement improvements to codebase quality." MAX_ITERS=200 for i in $(seq 1 "$MAX_ITERS"); do claude --dangerously-skip-permissions -p "$PROMPT" git add -A if git diff --cached --quiet; then echo "No changes this round, skipping commit." else git commit --no-verify -m "yolo run #$i: $PROMPT" fi done
…そして結果は大混乱。200ラウンドにわたる無制限の狂気を放ちました。あるポイントで過剰に注目していたことが分かったのでプロンプトを数回調整しましたが、十分なイテレーションを重ねるとコードカバレッジからテスト量増加、Rust風
Result 型、ハッシュ関数のエントロピー推定まで幅広く手を動かすようになりました。
スクリプトは約36時間実行されました。出力を理解するには時間が掛かりましたが、ここでは何が起きたのかをまとめます。リポジトリ全体はこちらにあります;現在閲覧中のブランチが「最高品質」版です。
アプリ
このアプリは4〜5画面で構成されており、写真撮影 → 説明追加 → AI応答取得という流れを単純に実装しています。
数値(Pure numbers)
改善前のバージョンでもすでに大規模でした:
cloc . --exclude-dir=node_modules,dist,build,.expo,.husky,.maestro,Pods 132 text files. 127 unique files. 11 files ignored. ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- JSON 4 0 0 23733 TypeScript 99 3019 1541 20160 Markdown 11 1004 0 2700 JavaScript 9 26 51 269 Bourne Shell 2 34 41 213 YAML 2 35 2 162 ------------------------------------------------------------------------------- SUM: 127 4118 1635 47237
ループ後は:
cloc . --exclude-dir=node_modules,dist,build,.expo,.husky,.maestro,Pods 285 text files. 281 unique files. 10 files ignored. ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- TypeScript 247 17587 18749 84185 JSON 5 0 0 24863 Markdown 14 4151 0 10391 JavaScript 9 41 140 598 Bourne Shell 3 41 41 228 YAML 3 50 3 215 ------------------------------------------------------------------------------- SUM: 281 21870 18933 120480
テストのみを見ると、LOCは約1万から6万へ跳躍:
cloc . --exclude-dir=node_modules,dist,build,.expo,.husky,.maestro,Pods \ --match-d='__tests__' 138 text files. 138 unique files. 1 file ignored. ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- TypeScript 138 13919 3685 60366 ------------------------------------------------------------------------------- SUM: 138 13919 3685 60366
安全性を高めたと感じます。テストは約700から驚くべき5,369に増加しました。元のプロジェクトでは実際のシミュレータを使ったE2Eテストがありましたが、品質向上過程で忘れられていたようです。
コメント行も約1,500行から18.7kへ増加しています。
実際に何をしたか?
Claude Code が各実行後に出力したログはすべて残っています。確認はこちら。第三者ライブラリの使用は好まれず、代わりに多数のユーティリティが自作されました。
依存関係は少ないものの、保守性の低い20k+行のユーティリティが増えています。以下はオフ・ザ・シェルフで置き換え可能な例です:
- 階層型ロガー:パフォーマンス追跡付きの組み込み実装(
の代替)lib/logger.ts - React Hook:多くはユースケース固有だったが、再発明不要なものも多数
追加されたファイルの中で特に衝撃的なのは次の通りです:
| ファイル | 説明 |
|---|---|
| Rust風 実装。 |
| Rust の に相当。 |
| 型安全な関数合成、カリー化、20+パラメータオーバーロードなどを網羅したファンクショナルスタック。 |
| サーキットブレーカーロジック。 |
インフラ
あるイテレーションでは「セキュリティエンジニア」モードに入り、以下のようなコードを挿入しました:
:文字種が少ない偽キーを検出。hasMinimalEntropy()- ジッタ付き指数バックオフ、サーキットブレーク―APIは OpenAI/Anthropic だけ。
ポジティブ面としては型チェックの徹底や不要なキャスト (
as any as T) の排除など、コード品質向上に多くの時間を割いています。
成功基準 – 品質指標
プロンプトは常に「コードベースの品質改善」に焦点を当てました。AI エージェントがそのメトリクスをどのように解釈したかを見ると、驚くほど「多いほど良い」という原則が支配していました。数値的なバニティ指標が設定され、それに沿って進められました。
ログではテスト追加数やコードカバレッジ(うーん)を随所で誇示しています。結果として「品質の名の下に保守性の低い大規模コード」が生まれてしまいました。しかし数字は確かに増えているのです。
まとめ
- 保守すべきコード量が増えた – 主に無用なもの。
- テスト数は膨大に追加された が、最も重要な E2E テストは忘れられた。
- 良い瞬間 – 型チェックの厳格化、高品質コードベースの実現。
- アプリは動作し続けます;新機能は無く、ほんの数個のバグのみ。
「画像を1,000回再描画する」実験に真似るなら、ループは二段階であるべきだと考えます:
- プロジェクトを読み取り要約。
- その説明に基づいて新規プロジェクトを構築。
ここでは冗談として行いましたが、本当に重要な品質向上には至らないことは明白です。Claude Code を失敗させるように仕込んだ結果、確かにおもしろいアウトプットが得られました。
日常開発でコーディングエージェントを使い続けています。AI コードレビューに費やした時間は決して無駄ではありませんでした。
…そしてアプリはまだ動作しています。