
2025/12/30 4:11
AIは私たちに「良いコードを書く」ことを強制しています。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Summary
この記事は、自律ソフトウェアエージェントを信頼できるようにするには、厳格なガードレール(特に 100 % テストカバレッジ、明確なファイル構成、および自動化ツール)が必要だと主張しています。
- テストカバレッジ:エージェントが書くすべての行は二重チェックされるべきであり、未検証の行は明示的な「to‑do」項目となります。これにより、既存のコードか新規追加なのか曖昧さを排除します。
- 実行可能な例:エージェントは変更ごとに動作するコードを提供せざるを得ず、「これは正しそうだ」という漠然とした回答を排除し、信頼性を段階的に向上させます。
- ファイルシステム構成:小規模でスコープのはっきりしたファイル(例:
)はコンテキスト読み込みを改善し、切断リスクを低減します。./billing/invoices/compute.ts - 型安全性とツール:自動リンター・フォーマッタおよび TypeScript の重用により不正な状態が排除され、モデルのアクション空間が縮小され、意味的明確さ(例:
などのカスタム型)が提供されます。UserId - API コントラクト:OpenAPI スペックは強力に型付けされたクライアントを生成し、PostgreSQL の型システムと Kysely はデータへの型付きアクセスを実現します。サードパーティのクライアントラッパーも整合性のために強力な型を公開します。
- ガードレール速度:全テストスイートは高い並行度、外部呼び出しのキャッシュ、および強固な隔離で約 1 分で実行され、エージェントの反復中に頻繁に再実行できます。
- ワークフロー自動化:単一の
コマンドが git worktree を作成し、非 git 設定をコピーし、依存関係をインストールして面接エージェントを起動します。プロセスは 1–2 秒で開始される必要があり、繰り返し使用を促進します。new-feature <name> - 並列環境隔離:ユニークなポート、データベース名、キャッシュプレフィックス、または Docker コンテナにより、複数の worktree がクロストークしないようにします。
これら厳格なガードレールを採用することで(ツールとインフラへの前提投資が必要ですが)、チームはエージェント型コーダーの潜在能力を解き放ち、急速開発サイクルで見落とされやすい「良いコード」の基準を確立し、最終的にバグと保守コストを削減できます。
本文
数十年にわたり、私たちは「良いコード」がどのようなものかを知っていました。徹底したテスト、明確なドキュメント、小規模で範囲がはっきりしたモジュール、静的型付け、そして宗教儀式さえなくして起動できる開発環境です。これらの要素は常に任意でしたし、時間圧力がかかると「オプション」が削減されてしまうことも多かったでしょう。しかし、エージェントはこうしたオプションを必要としており、混乱して後から片付けることが苦手です。彼らは犬の糞を転がし回って家中に引きずり込むロボット掃除機になることもあります。
守るべきルールは、あなた自身が設定し強制するものだけです。エージェントの文脈が欠けていてガードレールが不十分だと、苦痛の世界に陥ります¹。しかしガードレールが堅固であれば、LLM は正しい道しか残らないまで疲れ知らずで回り続けることができます。
私たち6人組のチームは、エージェント型コーダーを支援するために数多くの具体的かつ時には物議を醸す投資を行ってきました。ここではあまり表面化しないものについて話しましょう。
1. 最も論争のあるガイドラインこそが最も価値がある
コードカバレッジを100 %にすることを義務付けています²。
これを聞くと多くの人は懐疑的になりますが、実際に一日使ってみると「秘密兵器」のように感じられます。私たちが使用しているカバレッジは、単なるバグ防止ではなく、エージェントが自分で書いたコード行の挙動を二重チェックしたことを保証するものです。
誤解されやすい点として、人々は「100 %カバレッジ=バグゼロ」または「ゲーム可能な指標追求」と考えがちですが、ここではそういう意味ではありません。
なぜ 100 %?
- 95 % だと「重要かどうか」の判断でテストの欠落を残します。
- 99.99 % だと、
の未カバー行が新機能作業前に存在したものか分からなくなります。./src/foo.ts - 100 % にすると曖昧さが消え、真のフェーズチェンジが起こります³。
未カバー行は「あなた自身が直近で行ったこと」の証拠です。カバレッジレポートは残すべきテストの簡易タスクリストとなり、エージェントに余計な推論自由度を与えません。100 % のカバレッジでは、モデルがコードを書いたり変更したりすると、その行がどのように振る舞うかを実際に示さざるを得なくなるため、信頼性が飛躍的に向上します。
その他のメリット:
- 到達不能なコードは削除されます。
- エッジケースが明確になります。
- コードレビューが容易になり、システム全体の挙動を具体例で確認できます。
2. ファイルシステムナビゲーション
エージェント型ツールがコードベースを探索する主な手段はファイルシステムです。ディレクトリ一覧・ファイル名読み取り・文字列検索・コンテキストへのファイル挿入といった操作を行います。
./billing/invoices/compute.ts のように階層的で意味のある命名を用いることで、実際のコードが同一でも情報量が大きく変わります。LLM をサポートするためにも、ファイル構造と名前付けは他のインターフェースと同様に慎重に設計すべきです。
- 多くの小さなファイルを好む
小さなファイルはコンテキストへのロードが容易で、エージェントが要約や切り捨てを行うリスクが低減します。完全に読み込めるサイズならモデルは全体を活発に保持できます。実際にはフローの高速化と性能劣化の防止につながります。
3. 開発環境
昔は一つの開発環境で完結していました:完璧なソリューションを作り、調整し、コマンドを走らせ、サーバーを再起動し、徐々に最適解へ収束させる。
エージェントと共に作業する場合は、まるで養蜂のようにプロセス間をオーケストレーションしつつ、各内部状態を把握しないで済む仕組みが必要です。
迅速な自動ガードレール
頻繁に実行できる軽量チェックが必須です。エージェントは「小さな変更 → 確認 → 修正 → 繰り返し」というサイクルを短く保つべきです。これらはエージェントフック、Git フック、または
AGENTS.md のプロンプトとして実装できますが、いずれの場合もコストが低く、頻繁に走らせても遅延しないようにする必要があります。
当社のセットアップでは
npm test が新規データベースを作成し、マイグレーションを実行し、全テストスイートを走らせます。これが可能なのは、各ステージを極めて高速化(高並列・強い隔離・サードパーティ呼び出しのキャッシュ)したからです。10,000+ のアサーションを約1分で完了させています。キャッシュ無しだと20–30分かかり、エージェントがタスクごとに数回テストを走らせると数時間増えることになります。
ワークフロー例
new-feature <name>
このコマンドは新しい Git worktree を作成し、
.env など git に含めないローカル設定をコピーし、依存関係をインストールしてからエージェントを起動します。プロンプトで PRD の作成を誘導し、機能名が十分に説明的なら「すぐに作業へ」と言われます。
重要なのはスクリプト自体ではなくレイテンシーです。数分かかり手間が多ければ使いません。一コマンドで 1–2 秒で新しい開発環境を整え、エージェントを即座に起動できるなら頻繁に利用します。
さらに同時に複数環境を走らせる必要があります。ワークツリーが多くても、ポート・データベース名・キャッシュ・バックグラウンドジョブなどの競合要素は環境変数で設定可能か、あるいは衝突しない形で割り当てるべきです。Docker を使えば一部自動化できますが、一般的な要求は「同一マシン上で複数の完全に機能する開発環境をクロス・トークなしで実行できる」ことです。
4. 自動化による強制
可能な限りベストプラクティスを自動化し、LLM の自由度を削減します。まだ導入していないなら、自動リンターとフォーマッタから始めてください。モデルがタスク完了時やコミット直前に自動で修正を適用できるよう設定します。
また 型付き言語 を採用することで不合法な状態・遷移の多くを排除できます。型は検索空間を縮小し、各層を通過するデータの種類をドキュメント化してくれます。
当社では TypeScript を徹底的に利用しています。型で表現可能なものはすべて型システムに落とし込み、意味合いを名前に込めることで「これは何か」「どこへ行くのか」を瞬時に把握できます。
UserId、WorkspaceSlug、SignedWebhookPayload のようなセマンティックネームは意図を即座に伝えます。一方で T などの汎用名は小規模アルゴリズムでは有効ですが、実務システム内ではあまり役立ちません。
API 側では OpenAPI を使用し、型安全なクライアントを生成しています。データ側では PostgreSQL の型システムを最大限活用し、列タイプに収まらない不変条件はチェックやトリガーで補完します。PostgreSQL は豊富な型システムを持っていませんが、驚くほど多くの正確性を保証できます。エージェントが無効データを書こうとすると、DB が明確かつ大きくエラーを報告してくれます。Kysely を使えば TypeScript 用に型安全なクライアントを生成できます。
その他サードパーティクライアントは良い型を提供するものもあれば、自前でラップして型を付与します。
エージェントは疲れ知らずかつ時には素晴らしいコーダーですが、彼らの効果は置かれる環境に大きく左右されます。「良いコード」が余計なものではなく不可欠になる瞬間を体感してください。初期投資は税金のように感じられますが、これは長年回避してきた課題です。意図的に負担し、エージェント開発ロードマップに組み込み、エンジニアリングリーダーから資金を確保し、やっと実現したいコードベースを完成させましょう。