世界を動かす技術を、日本語で。

LLM支援によるコード品質向上のためのMy agent.md

概要

  • LLMを使ったコーディング支援の進化と課題を解説
  • agent.mdによるコーディングスタイル最適化の実践例
  • コード品質向上のための具体的なルールや運用方法を紹介
  • LLMの弱点である「文脈希釈」への対策も説明
  • agent.mdの自動更新方法にも言及

LLMによるコーディング支援の変遷

  • 2025年中頃 に初めてLLMを使ってコーディングを試行

    • libadbmdns (RustによるmDNS実装)開発時の導入
    • 出力されたコードが コンパイル不可 という問題
  • 2026年1月 に再チャレンジ

    • 複雑な indexed-binary heap クラス生成に成功
    • Windows IOCP 実装に起因するpolling crateのバグ特定にも貢献
    • しかしコード品質は スパゲッティ状態、コメントや構造が皆無
  • コード品質の問題

    • LLMの高速化メリットが 後片付けの手間 で相殺
    • 本番水準に達するまでの 清書作業 が大きな負担

エージェント型IDEと繰り返し作業

  • 2026年3月AntigravityVS Code Claude Code プラグインを導入

    • 「ステージング」したコードに対し 反復的なレビュー が可能に
    • 魔法数排除短い関数名コメント追加 などの指摘を毎回繰り返す必要
  • コード品質は大幅に向上

    • 手作業レベルに近い品質達成
    • しかし 毎セッション同じ指摘 の繰り返しで非効率

agent.mdによるスタイル最適化

  • コーディングセッション開始時agent.md を読み込みプロンプトへ注入

    • コーディングスタイルの微調整 が可能な最適な場所
    • 繰り返し指摘する内容を agent.md に追記
  • agent.mdの配置方法

    • プロジェクトルートに設置で自動適用
    • gemini.mdclaude.mdagent.md にシンボリックリンクする運用も可能

agent.mdの主なルール例

  • 人間向け文章 (コメント・コミットメッセージ等)は 最小限の単語数 で簡潔に
  • 賛辞や極端な表現 を避け、 事実のみ を伝える
  • 魔法数・魔法文字列定数やenum で抽出、仕様由来の値も必ず定数化
  • インデント削減アローアンチパターン回避早期return/continue の活用
  • 関数名は30文字未満 で簡潔に
  • 関数引数のboolはenumに置換
  • 論理ブロック間に空行 を挿入し 可読性確保
  • 各ブロックに簡潔なコメント を追加、必要に応じてASCII図も推奨
  • メンバー可視性の変更 は設計上の大きな変更とみなし、 必ず明示的な承認 を求める
  • 抽象度レベルごとにAPIを分離、低レイヤはドライバ/抽象化レイヤに集約
  • 未編集のコードには触れない、コメントも追加しない、変更行数も最小化
  • レイヤー間の境界厳守、隣接層以外への直接アクセス禁止
  • if文は一行でも必ず{}を付与
  • コミットメッセージの7ルール を厳守
    • 件名と本文の空行分離
    • 件名50文字以内(最大72文字)
    • 件名の先頭大文字
    • 件名末尾にピリオド禁止
    • 命令形で記述
    • 本文は72文字で手動折返し
    • 本文には背景・理由を記載
  • バグ修正時はまずテストを作成、失敗確認後に修正、その後パス確認

agent.md運用の効果と限界

  • コード生成の品質が大幅向上
    • だが LLMの幻覚(hallucination) は依然残存
    • 設計やアーキテクチャ への注力が可能になった一方で、 コードの精査・検証は必須

LLMの「文脈希釈」への対策

  • Lost in the Middle論文 で指摘された context dilution/attention dilution 問題

    • コンテキストが長くなると 中間指示が無視 されやすい現象
    • 原因は未解明
  • 対策方法

    • コンテキストを短く維持 (機能ごとに新規セッション推奨)
    • "Reload agent.md" の明示的リクエストで再読み込み

agent.mdの自動更新

  • 新ルール追加時 にエディタを開く必要なし
    • エージェントにagent.mdの更新依頼 が可能
    • 柔軟なルール追加運用が実現

Hackerたちの意見

これはほとんどの人が自分で解決しなきゃいけない問題だよね。俺はもう1年近くClaudeと一緒にやってるけど、「Arrow Anti-Pattern」コードを書いてるのを一度も見たことない。それに、他のこともプロジェクトには無駄なものばかりだし。エージェントの指示は、プロジェクトごとの経験から学ぶのが一番だよ。

そうだね、他の人のagent.mdファイルを見るのが面白いのは、彼らがエージェントと作業する際にどんな問題に直面しているかがわかるところだね。人によって全然違う問題にぶつかるみたいで、それは多分、私たちの働き方が違うからだろうね。だから、そのファイルはパーソナライズされるべきだと思う。

これらのいくつかはリンティングで強制すべきだと思う。そうすれば、手作業でコードを書く人も同じようなフィードバックが得られる。例えば、1行の「if」文でも{}を使うべきだし、関数名は短く、30文字未満にするべき。これが本当に多くの混乱を生むパターンだと思う:- ブロックが何をしているのか、なぜそうするのかを説明する小さくて要点を押さえたコメントを追加する。可能な限り例を使って。完全なシステムを説明するためにASCII図を提案する。コードの「何」を示すんだ。

エージェントに「コードは何をするのか」ってコメントを書くように言うことは絶対にないよ。デフォルトのコメントはもう十分に無駄が多いから。

エージェントに対して、リントルールでできることをお願いする人を見ると、ほんとイライラする。

そうそう。AIに「何」を説明するのをやめさせるのが本当に大変なんだ。コミットやPR、コード、どこでもそれを追加しちゃうみたい。何度も「何」じゃなくて「なぜ」を書くようにお願いしてるのに、どこかで必ずやっちゃうんだよね。

これらのエージェントや他のスキルに関して理解できないのは…なんで非決定的なエージェント(柔らかいのでも硬いのでも)にメンテナンスさせる代わりに、リポジトリに機械的なチェックや他のものをたくさん投げ込まないの?機械的なルートを使えば、チェックや失敗、もっとたくさんのことが得られるのに。ちょっとクレイジーだと思う。エージェントを定義された制約の中で動かして、うまくいかなかったら怒鳴ればいいんだよ。

自分のエージェントにはコメントを追加するのを禁止してるんだ。コードをレビューして、コメントは手動で追加する。もしコンテキストがあっても理解できない部分があったら、そのコードは捨てるよ。LLMに説明のコメントを生成させるくらいならね。そうすれば、コードは人間が読みやすく、デバッグしやすいままでいられるから。

完全なシステムを説明するためにASCIIアートを提案する。LLMはASCIIアートがすごく苦手なんだ。 https://medium.com/data-science/why-llms-suck-at-ascii-art-a...

ちなみに、私は逆の考えで、ブレース付きのブロックが続く「if」はすべて臭いと思ってる。条件付きのボディがブロックを必要とするなら、それは名前を付ける価値があるから、単一の名前付きコールに昇格させるよ。「抽出して落ちるまで」って感じで。

私のはエンジニアに言ってることをそのまま言ってる: > コードやクラスが何をするかじゃなくて、なぜそうするのかを説明するインコードコメントを書いてね。「何をするか」は自明であるべきだよ。

リンターや静的解析は、ハーネスのフックとして設定しよう。CLAUDE.mdにはあまり頼らない方がいいよ、無視されることが多いから。> コード内のASCIIアートはやめてほしい、超ウザいから。ちゃんとした図を作って、ナレッジベースに保管しておいて。必要ならリンクして、エージェントがMCPやAPIを通じてそれを取得できるようにしてあげて。

Hacker Newsで議論の続きを見る