Phodal Huang が中国語で書いたこの記事は、AutoDev (unit-mesh/auto-dev) の新しいバージョンを紹介するもので、このバージョンは一連のソフトウェア開発のプラクティスをツールに組み込んでいる。AI によるリネーム、コードスメルのリファクタリングとリファクタリングの提案、コミットメッセージの生成、CLI コマンドの生成、そして彼が最も重要なものとして特に挙げる、国内のモデルと開発習慣に合わせた中国語プロンプトのサポートである。

記事の枠組みとなる主張は、生成 AI によるコーディングには 2 つの技術的な道筋、すなわちコードの再生成とコードの変更がある、というものである。著者は Unit Mesh を、新しい要件ごとに新しいコードを生成する再生成の道筋のために自分のチームが設計したアーキテクチャのパラダイムだと説明し、再生成がどれほど良くなっても生成 AI の能力に制約されるため、現時点では AutoDev のようなコード変更のアシスタントこそが適切な進化の道筋だと論じる。変更を支援するには、人間と AI が既存のコードを理解する必要があり、彼の主張によれば、それはソフトウェア開発のためのナレッジエンジニアリングの体系を構築しているかどうかにかかっている。

要点

  • 著者はこのナレッジエンジニアリングの典型的なシナリオとして 2 つを挙げている。既存の要件がどのように実装されているかを要約することと、リファクタリングである。リファクタリングについては、その難しさがコードの自動生成とアーキテクチャの設計の中間にあるため、探求に適した領域だとしている。
  • 彼は、検索拡張生成は追加の情報を提供できるが、開発者の日常的で高頻度なシナリオには適さないと論じ、したがって課題は、規約、ベストプラクティス、ソフトウェアのナレッジエンジニアリングを AI 支援ツール自体に組み込み、底上げを図ることだとしている。
  • リファクタリングについて彼は、AI によるリファクタリングはコンテキストと意図に依存すると論じる。明確な方向性がなければ、AI は主にリネームやメソッドの抽出といった基本的な手法を適用するだけだが、複数の if 文をストラテジーパターンに移すよう指示したり、継承関係やコードスメルを与えたりすれば、それらを考慮に入れるようになる。
  • 彼は、開発が十分にデジタル化されていない場合に AI がコードと要件を結びつけることを妨げる 2 つのシナリオを挙げている。要件が詳細に記録されたことがなく、コードが唯一の記録となっている場合と、人間でさえ理解できない識別子だらけのコードである。
  • コミットメッセージの生成は、DevOps の規約の自動化として示されている。IDE が社内の OA システムに接続してユーザーの身元を取得し、ユーザーの現在の要件 ID を取り出して、それをコードの変更と組み合わせ、refactor(rename): handle exceptions and improve logging for rename suggestions #129 のようなメッセージを生成する。著者はこれを、開発の「デジタルツイン」の基盤と呼んでいる。
  • コードスメルのリファクタリングは、IDE 自身のコードインスペクションの結果(たとえば、ある変数が一度も使われていないこと)を取り込み、AI がリファクタリングされたコードやリファクタリングの提案を生成するために使える入力に変換する。著者によれば、AutoDev 1.8 は JetBrains のものを模倣してプロンプトを最適化しており、ランダムなリファクタリングの提案も提供している。
  • セマンティックなリネームは、ユーザーが IDE のリネーム機能を呼び出したときに、関数やクラスの名前の候補を 5 つ生成するもので、リネームされたコードエンティティが検索可能なままであるようにする。リネームは頻繁に行われるため、この機能は設定で手動で有効にする必要がある。
  • ターミナルの CLI 生成は、日付、オペレーティングシステム、シェルをコンテキストに入れるため、「今日のブランチを作成して」と頼むと git checkout -b feature/20240406 のようなコマンドが得られる。組織は独自の規約をさらに追加できる。

背景

この記事は AutoDev 1.8 のリリースノートも兼ねており、そこに挙げられている他の変更には、中国語の設定ページとプロンプト、設定ページから LLM サーバーをより簡単にテストできる方法、2024.1 の IDE バージョンのサポート、AutoSQL のエラー処理の改善、行と列によるコード参照が含まれる。著者は最後に、このツール自身の課題を挙げている。機能が非常に多いため、プラグインに慣れていない開発者には使い始めるのが難しいというものである。