腾讯エンジニアが AI で老朽プロジェクトをリファクタリングする手法を公開
本文の状態
日本語全文を表示中
詳細モードで約29分の本文を読めます。
同じ出来事の情報源
この情報源を基点に整理
Tencent Engineering
腾讯工程师が、歴史的重負荷のある既存プロジェクトにおいて AI の性能を向上させるため、AGENTS.md を中心とした「AI 上下文工程」の構築と運用手法を実践報告した。
Continue in AI NEW LAB
このニュースを、実務の判断につなげる
AI NEW LABで、試したことや先に確認したい条件を共有できます。まずはログインなしで読めます。
AI NEW LABで論点を見るAI深層分析を開く2026年8月7日 21:15
AI深層分析
キーポイント
AI 活用における文脈不足の課題
既存プロジェクトでは AI が胡言乱語する原因が、業務背景や技術的負債といった「コンテキスト(文脈)」の欠如にあると分析し、これが開発コストを押し上げていると指摘した。
AI 可維持なプロジェクトへの再構築
単なるコード修正ではなく、AI が日常の排障や機能追加に参加できる状態へリファクタリングするプロセスで、体系的に文脈情報を付与する戦略を提案した。
AGENTS.md による静的文脈の構築
プロジェクト根目录に AGENTS.md を配置し、業務背景やアーキテクチャ、規範などを索引化することで、AI が必要な情報を即座に取得できる環境を整える手法を詳述した。
動的知識の落盤と更新ルール
対話中に得られた解決策やルールを、対応するモジュール内の AGENTS.md に即時記録し、根目录の索引も同期させる運用フローを定めた。
AI による知識管理の自動更新ルール
対話中に発見された再利用可能なルールやプロジェクト知識は、対応するモジュールの AGENTS.md に記録し、同時に根目录の索引を更新する必要がある。
重要な引用
AI の文脈知識が不足していることが、旧プロジェクトで AI が活用できない主な原因である
同じことを AI に伝える際、人間同士のコミュニケーションコストを減らすため、AI への指示は一度だけ強調すれば済むようにする
根目录の AGENTS.md と CLAUDE.md は索引概要のみとし、詳細は各モジュールに記述して管理する
「アーキテクチャ設計之所以重要,不是因为它看起来高级,而是因为它能把复杂度压下来。」
編集コメントを表示
編集コメント
本記事は、大規模な既存システムにおける AI 活用における普遍的な課題である「文脈の欠如」に対し、具体的なドキュメント設計(AGENTS.md)で解決する実用的なアプローチを示している。技術的負債が蓄積したプロジェクトでも、適切な文脈工程を構築することで AI の協働能力を劇的に引き出せる可能性を提示しており、現場開発者にとって即座に実践可能な指針となる内容である。
Source Article
元記事を日本語で読む
本文に関係しない購読案内、埋め込み通知、サイト内プロモーションは除いています。
「胡言乱语」から正確なコードへ:AI に古いプロジェクトを読み込ませる方法
腾讯プログラマーによる寄稿 | 2026年8月7日 17:36 発表(広東)
実務の負債を抱えたプロジェクトを、AI がメンテナンス可能な形へリファクタリングする
作者:被删
AI 時代の新たな役割:AI の世話役。
AI が強力になった現在でも、多くの人は「AI は新プロジェクトの迅速な開発には向いているが、重厚な歴史資産を抱えた既存プロジェクトでは大きな力を発揮できない」と考えています。
ここ半年ほどはプロジェクトのリファクタリングに注力してきました。初期段階では AI を活用しても難航しましたが、現在は AI が問題を効率的に特定し、プロジェクトのニーズに即した最適なソリューションを提示できるようになりました。この劇的な転換点となったのは、プロジェクト向けに AI 用のコンテキスト(文脈)エンジニアリングを構築し始めた時です。
もちろん、この一年で AI の能力自体も飛躍的に向上しました。また、私のリファクタリング努力により、プロジェクトの品質やアーキテクチャの合理性も着実に高まっています。しかし、AI 用のコンテキスト整備が果たした役割は極めて重要でした。
本稿では、リファクタリングの過程で、以前は AI が胡散臭い回答を繰り返していた状況をどう変え、今では AI が効率的にプロジェクトを支えるパートナーとなったのかについてお話しします。
思考:AI による生産性向上とは、いったい何を向上させているのか?
過去一年間で AI の能力は劇的に進化しました。当初は明確な小タスクしか処理できませんでしたが、現在は問題の特定や実行可能なソリューションの提案、さらには自己の実行とテストまでを支援できるようになり、私たちの業務における関与度が高まっています。
現在では多くの新事業が「AI ネイティブ」プロジェクトとして始動しており、企画からリリースに至るまで開発者が一行もコードを書かずに、すべて AI が完結させるケースすらあります。
しかし、AI の能力がどれほど強力になったとしても、共通認識として「歴史債務(技術的負債)の蓄積が深刻な既存プロジェクトでは、AI の活用は限定的であり、開発者の深い関与が必要である」という考え方が根強く残っています。
その大きな理由の一つは、「AI が持つコンテキスト知識が不足している」ことです。
ビジネス上のボトルネックは往々にしてコンテキストの欠如に起因します
実は AI と開発者に本質的な違いはありません。決定的な差は、私たちが AI よりも豊富なコンテキストを持っている点にあります。そのコンテキストとは以下のようなものです。
・事業の歴史的背景や、プロジェクト全体の協業体制(他モジュールとの関係性など)
・過去の要件定義書や技術仕様書(これらは別ファイルに保存されているか、開発者やプロダクトマネージャーの頭脳の中に存在します)
・実際の稼働状況:どのブランチの機能が現在も動いているのか、あるいは単なる後方互換性のために残された機能で実際に実行されることはないのか
・アーキテクチャ設計と技術的負債の現状:どの技術改修が中途半端に終わっているか、完全なリファクタリングが未完了であるかなど
これらの課題は、AI であれ新規参入した開発者であれ直面するものです。私たちが過去に行ってきた「規範の策定」「ドキュメント作成」「汎用化・プラットフォーム化」などの活動は、すべてこれら対接やコミュニケーションのコストを削減するためでした。
現在では多くの人が AI にコード記述を任せることで、開発コストは大幅に低下しました。しかし今、私たちが直面しているのはむしろ「コミュニケーションと協業のコスト」です。人間同士の間でそうであるように、人間と AI の間でも同様の課題が生じています。
リファクタリングを通じて、AI が維持可能なプロジェクトへと変革する
さて、改めて「AI による業務効率化」とは具体的に何を指すのでしょうか。
過去一年で AI は多くの業務に組み込まれ、開発プロセスの効率化に貢献することは間違いありません。しかし、その役割はそれだけではありません。問題の特定やシステム現状の分析、技術方案の設計と実装、コードレビューなど、AI が担える範囲は広がっています。現在、多くの人が AI をより深く活用しようとしていますが、依然として対象となるのは AI 原生で生まれた新プロジェクトに限られるケースがほとんどです。
旧来の事業と新規事業の違いは、AI に提供できる「文脈(コンテキスト)」の充分さにあります。技術負債が多く維持コストが高い既存プロジェクトこそ、AI を活用したリファクタリングに適しています。リファクタリングの過程で AI に対して十分な文脈情報を段階的に蓄積していけば、最終的には AI がメンテナンス可能なプロジェクトへと生まれ変わります。
これまでのリファクタリングの理由は、大きく分けて三つでした。すなわち、アーキテクチャ設計が業務の拡張に対応できなくなったこと、技術負債が深刻化して専門的な対策が必要になったこと、そして新規参入者が既存のコードを自分の流儀で書き直そうとしたことです。
現在のリファクタリングは、プロジェクト内の既存課題を解決するだけでなく、AI が日常的なトラブルシューティングや機能拡張、アーキテクチャ最適化に参加できるようにするための文脈情報を整備することが目的です。これにより、開発者は高コストな維持作業や繰り返しのコミュニケーションから解放され、真の意味でのプロジェクト効率化が実現します。
AI 向け文脈情報の構築
私は昨年末からプロジェクトの技術負債の整理に取り組み始めました。今年に入り AI の能力は飛躍的に向上しましたが、依然として判断ミスが発生することがあります。
判断が誤る原因の一つに、アーキテクチャの過剰設計や、設計段階では想定していた実装プロセスが実際には変形してしまっていることが挙げられます。さらに深刻なのは、コード上では存在するものの実際に実行されていない「生きた」コードが存在することです。開発者も AI も、コード内の参照関係だけではそれが本当に動作しているのかを判断できません。なぜなら、コード上には正しい参照があるにもかかわらず、実際の稼働時にはそのパスが一度も通らないケースがあるからです。
こうした文脈情報は、AI 以外からは入手が困難な場合が多く、開発者自身ですら把握できていないことが珍しくありません。
長年のプロジェクトにおいて、文脈情報の維持は常に業務上の痛点でした。チームのナレッジ構築は重要ですが、その価値を可視化しにくいことから、コスト対効果などの理由で、多くのチームが知識基盤の整備に着手できず、むしろ技術力が高いチームほど「コードを読んで自分で解決する」というスタイルを好む傾向さえあります。
開発者はドキュメント作成や閲覧を嫌がり、細かな情報や協業の内容は各自の頭の中に留め置かれます。情報の非対称性や欠落が協業プロセスでのズレを生み、アーキテクチャ設計や技術方案が当初の意図通りに完遂されないことも多々あります。
私たちが過去に推進してきた「機能コンポーネント化」「プラットフォーム化」「汎用化」の目標は、すべて開発・維持コストの削減にあります。開発者が合意した規範やプロトコルを強制することで、それらが協業における文脈情報として機能するのです。
AI と協働する場合も同様です。開発コストが AI によって劇的に低下した現在、業務効率のボトルネックは「人間同士の協業」や「人間と AI の協業」に生じています。チームドキュメントやナレッジを整備するのは人間同士の協業を減らすためですが、AI 向け文脈エンジニアリングを構築する目的は、「同じ内容は一度だけ AI に伝えれば十分」という状態を作ることです。
AGENTS.md から始める
AI の文脈知識を蓄積する最もシンプルな方法は、静的な文脈から始め、コードリポジトリに紐付く「AGENTS.md」を作成することです。
ただし、AI が扱える文脈には限界があります。そのため、プロジェクト情報をドメインごとに分割し、重要な内容のみをプロジェクトのルートディレクトリにある AGENTS.md に配置する必要があります。例えば:
知識インデックス
各分野の知識は、どこで入手すべきかを記述します。具体的には以下のような項目です。
- ビジネス背景に関する知識
- アーキテクチャ情報と技術ソリューションの蓄積
- 汎用コンポーネントおよび規範
- 外部連携システムの情報
- その他、業務に関する各種規範など
要件
- AI がコードを自動生成・提出する際、コミットメッセージは必ず
| pubで終わらせます(これはプロジェクトリポジトリの規範です)。
知識の定着化規範
- ルートディレクトリの
AGENTS.mdと CLAUDE.md には、索引概要(パスと 1〜2 文の要約)のみを記載し、詳細な記述はここに積み重ねないこと。 - 会話の中で再利用可能なルール、互換性に関する知見、トラブルシューティングの結論、あるいはプロジェクト固有の知識が明らかになった場合は、必ず該当するモジュール内の AGENTS.md に記録し、同時にルートディレクトリの AGENTS.md と CLAUDE.md における知識索引も更新すること(内容は各モジュールの内容を基準とする)。
- 知識索引に内容の陳腐化や不正確さが認められた場合は、自ら修正するか、新しい AGENTS.md を作成して対応する。これは簡単な一歩です(yuankai さんの積極的な共有への感謝を込めて)。
AI と共に業務リファクタリングを進める
現在、AI の能力は飛躍的に向上していますが、それでも「コードが動いているなら手を出さない」という考えから、多くの業務でリファクタリングが先送りされています。この歴史的教訓は、依然として多くの人々の判断に影響を与えています。
もしその業務がすでに更新を停止している状態であれば、大きな問題にはならないかもしれません。しかし、プロジェクトが急速に進化し続けているのであれば、AI 対応可能な形へリファクタリングを進めておくべきです。そうすれば近い将来、より多くの作業を AI に任せる体制を整えることができるようになります。
まず、私たちが取り組んでいる教育向けミニプログラムプラットフォームについて簡単に紹介します。このプラットフォームは、教育現場向けの「プロジェクト制作+カリキュラム提供+ミニプログラムの体験・公開」を統合したシステムです。教育コンテンツの生産から学習プロセス、プロジェクト開発、作品の体験と公開管理に至るまでを一貫してサポートする仕組みで、主な機能は以下の通りです。
- 自由創作/AI コーディング:ミニプログラムのプログラミング、コンパイル、プレビュー、公開、および AI を活用したコーディング支援
- カリキュラム学習・制作:プロジェクトベースの学習やカリキュラム作成、能力設定。ミニプログラムプレビュー、リッチテキスト編集知識パネル、コードエディタ、AI 対話機能、クイズなど多様なコンテンツセクションを含む
- リソース管理:学校・クラス・学生アカウント、ミニプログラムの管理、クラウド開発および混元(Hunyuan)リソースの統括
image自由創作(コード編集+ミニプログラムプレビュー+AI 対話+コードバージョン管理+素材ライブラリリソース管理)
imageシステムの複雑さは、大きく 2 つの側面に分類されます。
フロントエンドの WEB アプリケーション自体が抱える複雑さには、業務上の複雑なインタラクション設計(例:コース学習や自由創作、コース制作といった複雑なセクションでは、横画面・縦画面への対応、ドラッグによる調整、アニメーション効果などの多様な要件を同時にサポートする必要がある)が含まれます。さらに、機能の高度な結合も課題です。複数の複雑なインタラクションページ間のロジックが if/else 文で無理やり分離されているケースがあります。また、一部には過度な設計による技術的複雑さもあります。例えば、コードエディタに OT(Operational Transformation)協働機能をサポートさせることで、実装の複雑さが大幅に増大しました。
このプロジェクトでは、WEB 以外のモジュールも多数関わっています。一般的なバックエンドモジュールに加え、シミュレータープレビュー用のコードコンパイルモジュール、プロジェクト管理やコード取得を担う Node モジュール、AI Agent モジュール、課金機能モジュール、そして腾讯云や混元といったサードパーティのサービス連携など、多岐にわたる要素が絡み合っています。
最も複雑な「自由創作」「コース学習」「コース制作」ページについて、過去半年のリファクタリングを AI 分析で可視化したものが以下の通りです:
image
image
AI もこの複雑さの中で効果的に動作できるようにするためには、AI を活用して既存の設計と実装プロセスを再構築する必要があります。
では、AI に「何をすべきか」をどう教えるのか。答えはシンプルです。「我々がどのように行うか」を AI に示せば、AI はそれを実行します。ただし、AI がコードを自己流で読み解いて理解しようとするだけでは不十分な場合が多く、初期段階では人間による適切な誘導が不可欠です。
一、プロジェクトから不要になったコードを削除する
技術的負債の多い業務システムにおいて、最も混乱を招くのは「実際には機能していない」コードが多数存在することです。私たちのプロジェクトもその典型例です:
- 純粋な WEB プロジェクトであるにもかかわらず、古いクライアント向けの互換性コードをコピー&ペーストして改造した結果、環境判定のための if/else ブロックが無数に残っています。
- コードエディタには OT 協働機能が設計されていましたが、実際の実装では HTTP リクエストによる同期のみで、協働機能は実装されませんでした。
- 一時期 WebIDE へのアーキテクチャ変更を試みましたが実現せず、その名残としてモジュール間で N 種類もの非整合的なメッセージ通信方式が混在しています。
- AI Agent 機能は当初 WEB アプリ内で実装されていましたが、現在は独立した Node モジュールへ移行済みです。しかし、フロントエンド側では新旧の処理経路が複雑に絡み合い、どのコードが実際に有効なのかを判別することが困難になっています。
これらの技術的負債は開発者にとって負担となるだけでなく、AI にとっても大きな障壁となります。なぜなら、単に「コードが参照されているか」だけで実効性を判断できないからです。一部の条件分岐は環境変数に記述されており、同じプロジェクトの開発者であっても正確な挙動を把握するのが難しいケースさえあります。
しかし、これらの負債を整理・解消する過程で、AI を活用して参照されていない不要コードを素早く特定し、実際のシステム動作やチームメンバーからのヒアリング情報を組み合わせながら、AI と協力してリファクタリングを進めることができます。同時に、そのプロセスと知見を AI に学習させることも可能です。
「汚い山」の整理における第一歩は、「コードが実際に動く状態」と「コードの外観」を一致させることです。
二、複雑なアーキテクチャをシンプルにするための「引き算」
実は多くのビジネスにおいて、それほど高い複雑さは必要ありません。しかし実際の開発現場では、過度な設計が至る所に散見されます。そして何より恐ろしいのは、一度過度に設計したものを完全には改修できず、さらに数回にわたる不十分なリファクタリングの末に、多くの過去の負債(デッドコードや技術的負債)が残ってしまうことです。
プロジェクトへの参画が増えるにつれ、私はこの事柄をより深く理解するようになりました。アーキテクチャ設計が重要なのは、それが高級そうに見えるからではなく、複雑さを抑制できるからです。
例えば先ほど挙げた例では、OT(Operational Transformation:協同編集)によるコードの同時編集機能を実装しましたが、実際のビジネスシーンには協働のニーズはなく、可視な未来においてもそのような需要は存在しません。
これは「複雑さのために複雑さを追加する」という過度設計の典型例です。多くのプロジェクトで見られる現象ですが、「シンプルにする」よりも「複雑にする」方が価値があるように見えてしまう傾向があります。私はこの考えには賛成しませんが、理解はできます。
私たちは設計段階で将来の事業拡大を過剰に考慮しがちですが、実践してみると、ビジネスの変化は想像とは大きく異なることがほとんどです。優れたアーキテクチャとは、現在の状況に根ざし、業務の変動に応じて柔軟に調整できるものです。
コード編集における協働機能のリファクタリングでは、以下の 2 段階で実施しました。
- リファクタリングステップ:コアとなる改修点 / AI の役割 / AI のパフォーマンス
- 第 1 回リファクタリング:OT と WebSocket を停止し、HTTP による更新送信と定期ポーリングへ移行 / 補助的な最適化案の提示と実行支援 / 判断が不正確な場合が多く、誘導が必要
- 第 2 回リファクタリング:定期ポーリングを停止し、HTTP によるコード送信は維持しつつ、AI が更新したコードをプッシュして取得する仕組みへ変更 / 主導的な案の提示と実行支援 / 多くの場合で分析が正確であり、偶発的に誘導が必要
第 1 回リファクタリングの際に AI に十分なコンテキスト情報を付与したおかげで、第 2 回では AI が主導する方針が全体的に明確になり、判断もほぼ正確でした。その結果、実装効果も非常に良好でした。
「技術的負債(スーパースラッシュ)の整理」ステップ 2:複雑な問題を単純化する。
三、規範を定め、プロジェクトに制約と境界を設定する
プロジェクトがメンテナンス困難になる真の原因は、業務そのものの難易度ではなく、明確な規範や境界の欠如、そして長期間にわたる収束プロセスの不足にあります。
私たちのプロジェクトではページ数が多く、インタラクションも複雑です。特に自由度の高いクリエイティブページやコース制作ページなどは、画面幅への対応(レスポンシブ)、各セクションのドラッグ&ドロップ、表示・非表示のアニメーション、そして多言語対応など、多くの要素が絡み合っています。
業務が急速に迭代(アップデート)する一方で、開発アーキテクチャも進化し続けています。しかし、デザイン稿自体も頻繁に変更され、同じコンテンツでも時期によってデザイン稿の表現が異なるという問題が発生しました。その結果、プロジェクト内の各ページで多くの不整合が見られるようになりました。もちろん、これには開発過程におけるスタイルの繰り返し変更による破損も含まれており、これについては後述する自動化テストの章で詳しく説明します。
しかし、スタイルに関する問題は典型的な課題であり、解決策はシンプルです。デザインチームと連携し、プロジェクト全体の規範を統一することです。具体的には以下の通りです。
- ページレイアウト規範(タイトル・コンテンツ・間隔など)
- 画面幅への対応規範
- ユニットコンポーネントの統一規範(ポップアップ・テーブル・ボタンなど)
- ページスクロールに関する規範
これらのスタイル規範を現場に落とし込むため、2 つのアプローチを組み合わせて実施しました。
- 統一コンポーネントの構築:過去のデザイン稿で規範に適合しない要素をすべて整理し、統一されたコンポーネントとして再編成する。
- 規範の蓄積と AI による自動チェック:AI に規範を学習させ、MR(Merge Request)プロセス内で自動的にルール違反を検出させる。
こうして規範が確立されれば、今後の長期的な迭代プロセスにおいても、継続的なガバナンスと遵守が可能になります。
「技術的負債の整理」ステップ 3:実行に根拠を持たせる。
四、基準を定め、自動化テスト基盤を構築する
明らかに、今後は AI を活用した開発ニーズがさらに増えるでしょう。要件定義からアーキテクチャの改修、バグ修正に至るまで、変更が他の機能にどのような影響を与えるかを素早く判断するのは困難です。そのため、自動化テストの基盤整備はもはや必須となっています。
かつてフロントエンドで大量のテストケースをカバーしなかったのは、変化が激しく、ケースの維持コストが高すぎるからです。
しかし今は AI がいます。AI の支援により、自動化テストの開発工数は劇的に減りました。今やテストケースの維持コストは、AI へのコンテキスト提供とトークン使用量のみとなっています。
単体テスト・E2E テストのカバー率向上と MR パイプラインによる回帰テスト
テストケースの構築と整備は一度で完了するものではなく、継続的な取り組みが必要です。そこで私はこのプロジェクトを数期に分けて進めました。
- 期間:主な内容 / AI の役割 / 具体的な対応
- 第一期:プロジェクトの自動化テスト能力(単体・E2E)の構築 / 主導:方針策定と実行 / AI に期待する挙動を指示し、調整を行う
- 第二期:MR 回帰パイプライン(単体・E2E)およびパイプライン用イメージの構築 / 支援:方針策定と実行 / 社内 CI/CD ツールや Docker 構築などのコンテキストを提供し、AI に実装を指示
- 第三期:テストケースの整理と追加(P0/P1/P2 の優先度分類) / 支援:文脈に基づき整理 / 既存のテストケースを提供して分析させ、コア機能と非コア機能の境界を AI に示唆・調整させる
- 第四期:複雑なフローにおけるテストケースの整理と追加 / 支援:分析と実行 / 複雑なフローのコンテキストを提供し、AI に分析とケース構築を指示
単体テストは主に単純な機能の検証に用いられ、モックデータに基づいて構築されます。一方、E2E テストは複数ページにわたるロードやインタラクションを含むため、実際の環境で連続して実行されるケースも少なくありません。実環境での実行にはテストアカウントの準備が必要であり、テスト完了後にはデータのクリーンアップも不可欠です。例えば、テスト中に作成された空のプロジェクトなどは削除しないと、すぐにアカウント制限に達してしまいます。
この一連の作業には、合計で約 1〜2 か月を要しました。改修前後では変化が顕著で、最大の改善点は以下の通りです。以前はリリース前に必ず手動でコア機能を回帰テストする必要がありましたが、特に「自由創作」「学習コース」「コース制作」のように、シナリオは異なるものの機能が強く結合しているこれらの領域のページにおいて、その負担が大幅に軽減されました。
もちろん、新方針が稼働し始めた当初は、テストケースのカバー率と有効性を確認するために人手による検証も併せて行いました。しかし現在では、ほぼ手動テストは不要です。昨年は毎回のリリースでコアフローに問題が発生していましたが、ここ数ヶ月のリリースではユーザーからの報告がほとんどなく、実際にはユーザー数は継続的に増加しています。
視覚回帰テストの構築
昨年までは、プロジェクト全体がバグの特定・修正や技術負債の整理、新機能への迅速な対応で手一杯でした。そのため、スタイル(デザイン)の問題はケースバイケースでの対応しかできませんでした。
今年上半期に大半の技術負債を解消し、単体テストと E2E テストのカバー率が安定したことで、ようやくスタイル問題が課題として浮上してきました。
前述の「規範策定」の部分でもスタイル問題への対処方針は説明しましたが、「気づかないうちにスタイルが壊れてしまう」という根本的な問題は解決していません。スタイルが壊れる原因は多岐にわたり、統一コンポーネントの変更、自己テスト・レビューの不十分さ、AI による変更の境界線不透明などが挙げられます。これは開発者にとって再作業の連続となり、デザイナーにとっては確認と指摘の繰り返しという過酷な状況を生み出しています。
すでに全体の自動化テストフレームワークが構築されているため、新しい視覚回帰テストのパイプラインを設けるのは苦痛ではありません。プロジェクトに特化した Docker 環境を用いて、視覚回帰専用のパイプラインを追加し、その結果物をコードリポジトリと連動させることができます。
ただし、視覚回帰は一枚の大きなスクリーンショットですべてのスタイル問題を網羅できるわけではありません。パイプラインの安定性を考慮し、各テストケースに対して許容されるピクセル誤差の範囲を定義する必要があります。したがって、視覚回帰の全体像としては以下のような構成になります。
- 大きなスクリーンショット:大規模なレイアウト異常を検出するために使用。許容誤差は比較的大きく設定しますが、文字や角丸などの細部までは検出できません。
- コンポーネントごとの小さなテストケース:各コンポーネントを個別に分割し、各種状態でのスタイル回帰をカバー。許容誤差は厳しく設定し、精密な問題の発見に役立てます。
この仕組みの利点は、開発プロセスでテストケースの異常が期待通りかどうかを正確に判断できず、AI が誤って他のスタイルを変更してパイプラインを通過させてしまった場合でも、MR(Merge Request)の段階ですぐに発見できることです。
下の画像は、パイプラインの異常を検知した際、AI が修復処理中にスタイルを誤って変更してしまった例です。この場合、MR の時点で明確に気づくことができます:
imageMR でのカスタムルール適用
既存の機能が壊れていないことをパイプラインで保証するだけでなく、新たに追加された機能も定めた規範に従って実行されているかを確保する必要があります。そのために必要なのが、MR パイプライン内で AI がコードレビューを行う機能です。
この機能は当初、自社で構築する予定でしたが、ちょうど「工蜂」に類似した機能が提供されていたため、早速試用することにしました。手順も非常に簡単で、プロジェクト内に AI レビューのルールを追加し、工蜂上でそのルールファイルを AI に指定するだけです(図参照):
imageもちろん、この機能は最近追加されたばかりで、まだ実践段階にあります。そのため、有効性と効果を検証するには十分な時間が経過していません。
これで、毎回の MR マージ時には以下のパイプラインを通過する必要があります:
四、技術的負債の解消:問題の再発を防ぐ
五、債務管理の日常化
前述した通り、技術的負債が生じる原因の多くは、リファクタリングや新方案の実装が不徹底であることにあります。その結果、問題が積み重なり、長期的に負債へと変貌していきます。
多くの歴史的プロジェクトでこうした課題を目にします。実際、ほぼすべてのプロジェクトに以下の共通の問題が存在しています:
- 業務のスピードアップにアーキテクチャ設計が追いつかず、技術的負債となる
- 技術リファクタリングが中途半端で、新たな負債を生む
- プロジェクトの反復的な改修により、新旧の負債が重層的に蓄積する
過去に見てきた実際の稼働プロジェクトでは、技術改造を完全に完了させた例はありませんでした。多くの場合、チームは意欲的に着手しますが、その後の業務方向の変更や、新機能へのリソース集中、コスト対効果の低下などにより、改造が中途半端で終わることが多々あります。
しかし、AI を活用することで、この課題をより効果的に解決できるようになります。集中的な技術特化プロジェクトとして行っていた改造を、日常の開発プロセスに組み込むことで、継続的な改善を実現できるのです。
解決策はシンプルです。前述の「規範の策定」を補完し、継続的なガバナンスの方針を示すことで、今後の開発プロセスにおいて AI が新しい規範に従いながら過去の課題も同時に整理できるようにします。また、MR(Merge Request)レビュー時に導入した AI による自動チェックを活用すれば、新たに発生する問題を検知することも可能です。
「コードの腐敗」を解消する第五のステップ:毎日少しずつ手を加えれば、プロジェクトは長く保たれます。
結びに代えて
元々は、AI に頼って過去半年間のコードリポジトリの変遷を振り返る記事を書こうと考えていました。しかし、いざ書いてみると「もっともらしいが味気ない」という感想しか浮かびません。やはり手書きの方が味わいがありますね。
AI が担える役割は増え続けており、我々が介入する機会は減りつつあります。いつになったら完全に任せていいのでしょうか?それとも、本当に任せるべきなのでしょうか?
旧時代の守人である私のような「古参」の視点からすれば、実装の実行、コミュニケーションの効率化、記録の蓄積といったタスクは AI に委ねて構いませんが、「思考」だけは人間が行うべきだと考えます。
AI には私の思考を代筆することはできません。十分なコードやドキュメントを読み込み、AGENTS.md から始まり私と共にリファクタリングを進めてきたとしても、やはり「思想の核」という部分では物足りないのです。
微信で開くにはこちらへ
原文を表示
原创 腾讯程序员 2026-08-07 17:36 广东
image
将真实债务项目重构成 AI 可维护项目
image
作者:被删
AI 时代赋予 AI 的新角色:AI 铲屎官。
在 AI 很强的现在,依然很多人会认为,AI 更适用于新项目快速迭代,但很难在一个背负着沉重的历史包袱的项目中起到很大的用处。
最近大半年都在重构项目,从前期使用 AI 依然困难重重,到如今 AI 能高效定位问题、给到十分贴合项目需要的解决方案,中间特别明显的一个转折点,在于开始给项目搭建 AI 上下文工程。
当然,这一年来 AI 的能力本身也在不断加强,我们项目的质量和架构的合理性在我的努力重构下也在稳步提升,但 AI 上下文的搭建依然起到了十分关键的作用。
今天给大家分享的,主要是如何在重构过程中,将 AI 总是胡言乱语,变成了 AI 也可高效助力的一个项目。
思考:AI 提效到底是在提效什么?
在过去的一年里,AI 的能力有大幅度的提升,从最初只能做点明确的小任务,到如今能协助排查问题、提出可落地的解决方案、自执行落地和自测等等,在我们工作中参与的幅度越来越大。
如今很多新业务直接是 AI 原生项目,意味着从立项到上线,开发未亲自写过一行代码,基本上都是 AI 自行完成的。
但即使在 AI 能力很强的今天,大家还是有些共识,比如一个历史债务很重的项目中,AI 能发挥的作用很少,还是需要开发的介入更多。
这很大一部分原因是:AI 的上下文知识不够。
业务瓶颈常在上下文
其实 AI 和开发并没有太大的区别,很多时候区别只是在于,我们比 AI 拥有更多的上下文,这些上下文包括:
业务的历史背景,项目的整体协作方式(与其他模块的关系等)。
过去的需求文档、技术文档,可能存在其他地方或者是开发和产品的脑袋中。
项目真实运行情况,哪些分支代码上的功能还在跑的、哪些只是历史兼容但不会运行到的。
架构设计和技术债务情况,哪些技术改造只做了一半,未改造彻底等。
这些问题,不管是 AI 还是新加入业务的开发来说,都会遇到,而我们过往经常做的定规范、写文档、做通用化/平台化方案等很多工作内容,都是为了降低对接和沟通成本。
现在我们很多人都会让 AI 写代码,开发成本大大降低了,如今困扰我们的往往是沟通协作成本。人和人之间如此,人和 AI 之间也是如此。
重构成为 AI 可维护项目
回到话题,我们常说的 AI 提效,到底是指什么?
在过去这一年中 AI 已经逐渐参与到很多业务中,十分肯定的是它能提效我们的开发过程,但 AI 还能做更多,包括排查问题、系统现状分析、技术方案设计和落地、代码 Review 等等。如今很多人也已经在尝试让 AI 参与更多,但大多数依然仅限于 AI 原生的新业务。
旧业务和新业务,其实区别便在于 AI 的上下文是否充分。对于历史债务多、维护成本高的项目来说,其实正适合带着 AI 进行重构,重构的过程中给 AI 逐渐补充足量的上下文信息,这样重构后我们就能得到一个 AI 可维护的项目。
过去我们重构,原因无非是架构设计已无法支持业务迭代、技术债务过重需要专项治理、来新人了大家都按自己的想法重做一遍。
如今我们重构,除了治理项目中的既有问题,更是给 AI 添加足够的上下文信息,使得 AI 能参与到日常排障、功能迭代、架构优化中,让开发从日常的高成本维护和反复沟通协作中减负,达到真正的项目提效。
AI 上下文内容建设
我从去年年底就开始治理我们项目的技术债务,今年刚开始的时候,AI 能力已经很强了,但依然经常会判断出错。
判断不准确的原因除了架构过度设计、同时设计的方案落地过程变了形之外,还有很多并没有真实在运行的代码。这些代码是否真的运行,不管是开发还是 AI 都无法通过相关引用判断,因为代码有真实的引用,但在真实运行时可能某个链路却彻底不会运行到。
这些上下文除了 AI 无非获取,很多时候开发自己也无法获取。
过去很长的工程项目中,上下文信息的维护也常常是业务痛点。团队知识的建设很重要,但是无法体现价值,因此往往因为性价比等各种原因,几乎没有团队能将团队知识建设得很好,甚至很多技术强的团队反而崇拜“自己看代码解决”的协助方式。
开发都不爱写文档,也不爱看文档,每个细节和协作内容都存在各自的脑袋中。信息的不对齐、遗漏导致协作过程中的变形,架构设计、技术方案也常常很难坚定不移地完整落地。
我们过去推崇的功能组件化、平台化、通用化,目标都是为了减少开发和维护成本,因为约束了大家认可的规范和协议,这些规范和协议便是我们协作中的上下文信息。
和 AI 协作也是如此,并且在开发成本已被 AI 大大降低的今天,业务开发的效率往往卡在人与人、人与 AI 的协作中。建设团队文档和知识,是为了减少人与人之间的协作,那么建设 AI 上下文工程,便是为了:同样的事情,应该只需要跟 AI 强调一遍即可。
从 AGENTS.md 开始
AI 的上下文知识沉淀,最简单的方式便是从静态上下文开始,这便是跟着代码仓库走的AGENTS.md。
当然,AI 上下文也是有限的,因此我们需要将项目的信息拆分领域放在对应的位置,只保留最重要的内容放置在项目根目录的AGENTS.md中,比如:
知识索引
此处描述各个领域的知识需要去哪里找,比如
- 业务背景知识
- 架构信息&技术方案沉淀
- 通用组件&规范
- 三方的对接系统信息
- 其他业务规范等
要求
- AI 代提交代码时,commit message 必须以
| pub结尾(这条为我们项目仓库规范)
知识落盘规范
- 根目录 AGENTS.md 和 CLAUDE.md 只保留索引概要(路径 + 1~2 句摘要),不在此堆细节。
- 当对话中出现可复用的规则/兼容性/排障结论/项目知识时,必须就近落盘到对应模块
AGENTS.md,并同步更新根目录 AGENTS.md 和 CLAUDE.md 中的知识索引(以模块内容为准)。 - 当发现知识索引出现内容过期或不准确时,主动修改新建一个根目录的AGENTS.md,是一个简单的开始(此处感谢 yuankai 同学的积极分享)。
带着 AI 一起重构业务
即使在 AI 能力超强的现在,依然有无数的业务不会选择进行重构。“代码还能跑就不要动”,这样的历史教训还在深刻影响着不少人。
这对一个停止迭代需求的业务来说,或许问题不大。但如果项目还在快速迭代,将项目重构成一个 AI 项目,在不远的未来可以逐步放手交由 AI 去做更多的事情。
先简单介绍下我们的小程序教育平台,该平台可以理解为一个面向教育场景的“项目创作 + 课程教学 + 小程序体验/发布”平台。它是围绕教育内容生产、学习过程、项目开发、作品体验和发布管理串起来的一整套系统,核心功能包括:
自由创作/AI Coding:小程序编程/编译/预览/发布、AI 编程
课程学习/课程制作:项目式课程的学习、制作、能力配置,包括小程序预览、富文本编辑知识面板、代码编辑器、AI 对话、答题等各种内容板块
资源管理:学校/班级/学生账号、小程序管理、云开发/混元资源等
image自由创作(代码编辑+小程序预览+AI对话+代码版本管理+素材库资源管理)
image系统的复杂度拆分为两部份:
前端 WEB 本身的复杂度。除了业务需求上的复杂交互设计(比如课程学习/自由创作/课程制作等复杂板块需要支持宽窄屏+拖拽调整+动画效果),还有需求迭代导致的功能高度耦合(比如多个复杂交互页面逻辑均耦合在一起用 if/else 隔离),以及部份过度设计的技术实现(比如代码编辑器设计支持 OT 协同导致复杂度提升不少)。
项目中还涉及到 WEB 外的其他模块。除了常见的后端模块外,还包括模拟器预览的代码编译模块、项目管理和代码拉取等 Node 模块、AI Agent 模块、付费能力模块,以及三方的能力比如腾讯云、混元等。
对于最复杂的自由创作/课程学习/课程制作页面,近半年的重构对比(AI 分析画的图):
image
image我们目标是 AI 也能在这种复杂度中有效运作,那么可以带着 AI 把这里的链路和设计一起重构。
AI 怎么知道要怎么做,那当然是我们怎么做,它就怎么做。AI 自行读代码理解依然可能不准确,前期会需要不少引导的工作。
一、移除项目中不再起作用的代码
对于债务较多的业务来说,最混淆视听的无非是设计了许多并没有真正起作用的功能代码,比如我们项目:
纯 WEB 项目,但因为复制粘贴旧的客户端兼容代码改造,遗留了大量的环境判断 if/else 代码
代码编辑设计了 OT 协同,但由于各种原因最终落地时只是纯 HTTP 请求同步代码,并没有用到协同
项目曾经尝试调整为 WebIDE 的架构,最终没有落地,但模块间保留了 N 种不一致的消息通信方式
AI Agent 功能曾经在 WEB 端实现,如今迁移到了单独的 Node 模块,但前端新旧链路耦合严重,难以分辨哪些代码还在生效
这些遗留的问题不仅对开发来说很吃力,对 AI 来说也很吃力,因为它无法通过单纯的代码是否有引用来判断代码是否还真实有效,有些判断条件甚至写到了环境变量中,即使是同个项目的开发也很难辨认。
但我们在梳理治理这些债务的过程中,可以同时借助 AI 来快速辨别完全无引用的代码,再结合项目真实运行情况和从同事那问来的背景情况,和 AI 一起治理重构这些代码,同时让 AI 记录沉淀下来。
屎山清理第一步:让代码跑起来和看上去一致。
二、做减法,复杂架构简单化
其实大多数的业务里,不需要多高的复杂度。但是实际在开发过程中,过度设计的业务比比皆是。而真正让人害怕的是,过度设计之后并不能改造彻底,更可怕的是,项目在经历几轮重构不彻底之后,落下了许多的历史包袱了。
随着参与的项目数量越多,我越来越能理解这件事:架构设计之所以重要,不是因为它看起来高级,而是因为它能把复杂度压下来。
举个例子,上面提到了我们业务实现了 OT 协同编辑代码,但实际上业务场景里并没有协同的诉求,在可见的未来中也不存在类似的需求。
这是一个过度设计的经典案例,为了追求复杂度而增加复杂度,这种其实在我们很多项目中都比较常见,毕竟做复杂比做简单更能体现价值。虽不赞同,但可理解。
我们总在设计的时候过度考虑未来业务的拓展性,但是实践下来结果往往是业务变化总是跟想象的不大一样。好的架构必然是立足于现在,随着业务变动而调整的。
在代码编辑协同这个案例中,分成了两次重构,分别是:
重构步骤
核心重构点
AI 角色
AI 表现
第一次重构
下线 ot 和 websocket,改用 http 提交更新 + 定时拉取
辅助方案优化 + 执行落地
常常判断不准确,需要引导
第二次重构
下线定期拉取逻辑,保留 http 提交代码 + AI 更新代码后推送拉取
主导方案 + 执行落地
大多数情况下分析准确,偶尔需要引导
由于在第一次重构过程中,给 AI 引导添加了不少的上下文信息,在第二次重构过程中 AI 主导的方案整体上比较清晰,判断也基本准确,落地效果也很不错。
屎山清理第二步:将复杂问题简单化。
三、定规范,给项目设置约束边界
真正让一个项目难以维护的,往往不是业务本身有多难,而是缺少约束的规范和边界、以及长时间的持续收敛。
我们项目页面很多,交互也复杂,尤其是高复杂度的自由创作页面和课程制作页面,宽窄屏适配+各板块拖拽+板块出现/隐藏动画效果+国际化支持。
image除了业务在快速迭代,开发的架构也在迭代以外,我们设计稿其实也在不断地调整,会出现同样的内容在不同时期的设计稿上不一致等问题,使得项目各个页面看起来问题很多。当然,这里也有不少是开发过程导致样式反复改坏的问题,后面会在自动化测试中统一阐述。
但样式设计是一个比较典型的问题,解决方法也很简单:拉齐设计同学,一起定下项目整体上的规范,包括:页面布局规范(标题&内容&间距)、宽窄屏适配规范、统一组件规范(弹窗&表格&按钮等)、页面滚动规范等等。
样式规范的落地,使用了两种方案的组合:
建设统一组件,将过往设计稿中不符合规范的统一收纳处理。
建设规范沉淀,让 AI 自行检查是否遵循规范,并在 MR 过程中进行规则检测。
规范有了,才能在后续长期的迭代过程中,持续地治理和遵循。
屎山清理第三步:让事情的执行有所依据。
四、定标准,建设自动化测试工程
显而易见,未来越来越多的需求会使用 AI 开发,需求开发、架构改造、问题修复过程中,难以快速判断是否有其他功能受到影响。因此,自动化测试的工程建设势在必行。
在过去,前端之所以很少使用大量的测试用例覆盖,因为前端的变化十分快,用例的维护成本很高。
但如今我们有 AI 了,自动化测试的开发工作量已经大幅度下降。在 AI 的协助下,测试用例维护成本仅剩下了 AI 上下文的维护、token 的成本。
单测/E2E用例覆盖 + MR 流水线回归
用例的搭建和完善并不是一次能达成的目标,需要持续的建设,因此我也拆了好几期进行:
搭建步骤
核心改造点
AI 角色
AI 表现
第一期
搭建项目自动化测试能力(包括单测和 E2E)
主导方案 + 执行落地
需要配合告诉 AI 预期进行调整
第二期
搭建 MR 回归流水线(包括单测和 E2E) + 流水线镜像
辅导方案 + 执行落地
需要提供蓝盾流水线、司内 docker 构建等上下文,配合 AI 调整实现
第三期
梳理和补充测试用例(拆分 P0/P1/P2)
根据上下文整理用例,拆分核心用例和非核心用例
需要提供过往已有用例辅助分析,引导和调整核心/非核心边界
第四期
梳理和补充复杂链路测试用例
辅助分析 + 执行落地
需要提供复杂链路上下文,引导分析建立用例
单测核心用于简单功能的测试,都是基于 Mock 数据建设。E2E 则涉及到多页面的链路加载和交互,不少功能会使用线上真实连续运行。真实环境的执行需要配合提供测试账号,也需要在测试完成后进行数据的治理,比如测试过程产生了很多的新建空项目,需要移除,否则测试账号很快便会触碰上限。
这部分的工作,陆陆续续大概花了一两个月。改造前后有特别明显的变化,最大的改善便是:过去每次发布前,我都需要自行回归核心的功能点,尤其是场景不一样但是功能高度耦合的 自由创作/课程学习/课程制作 这几个板块的页面。
当然,在方案上线并开始运行的一段时间,也是会人工辅助验证,确认用例覆盖是否足够和有效。现在基本上不再需要人工测试,从去年的每次发版必出核心链路的问题,到近几个月的发版基本很少用户反馈了,而我们的用户量其实是在持续上涨的。
视觉用例回归建设
去年的时候,项目整体上还处在焦头烂额地排查问题/修复问题、治理历史债务、快速迭代新需求的阶段,样式问题的治理基本上只能 case by case 解决。
今年上半年把大部分债务治理完成后,单测和 E2E 用例能力覆盖稳定了,样式问题便开始出现在我们视野范围中了。
其实前面在“定规范”的部分,也阐述了样式问题的治理方案,但依然无法解决一个问题:样式在不知不觉中会被改坏。样式被改坏的原因很多,包括改动统一组件、自测走查不仔细、AI 改动不确定边界等等,这里不仅对开发来说产生不少的反复开发工作量,对设计同学来说更是需要反复走查提问题的炸裂存在。
基于项目已经搭建好了整体的自动化测试框架,新增视觉用例的流水线便不再痛苦。基于针对项目定制的 Docker 流水线环境,新增一条视觉回归的流水线,并将视觉回归的产物跟随着代码仓库走。
当然,视觉回归并不是一张大的截图就能解决所有样式问题,考虑到流水线稳定性情况,是要给每个视觉用例的像素偏差定个范围值的。因此,视觉回归的整体解决方案会是:
大的截图用于检测大的布局异常问题,像素偏差允许范围会比较高,识别不了小问题(文字、圆角等问题)。
各个组件拆出小的视觉用例,补充各种状态下的样式回归,像素偏差会限制比较严格,用于发现精确问题。
这样的好处是,即使开发过程未能准确判断测试用例的异常是否符合预期,让 AI 误动了其他的样式来让流水线通过,我们也能直接在 MR 过程中发现。
下图便是发现流水线异常,AI 在修复过程中把样式改动到了,在 MR 的时候就可以明显发现:
imageMR 自定义规则
除了流水线确保已有功能没有改坏以外,我们还需要确保新增的功能是否都能按照定下的规范来执行。为此,我们需要一个在 MR 流水线中进行 AI 评审的能力。
这部分原本以为要自己建设,正好看到工蜂有类似的能力,便试用上了。操作也很简单,在项目中添加 AI 评审的规则,然后在工蜂中选择该规则文件给到 AI,如图:
image当然,这个能力刚补充上线,目前还在实践中,还没有运行足够的时间去验证可行性和效果。
至此,我们的每次 MR 合入时,都需要通过以下流水线:
image屎山清理第四步:避免问题反复出现。
五、将债务治理常态化
前面也提到过,债务的产生,很多时候来自于重构和方案落地的不够彻底,一次次遗留的问题,久而久之便成了债务。
这些问题在很多历史项目中我们都能看到,因为几乎所有项目都会存在这样的问题:
架构设计跟不上业务迭代,变成了技术债务
技术重构没有执行彻底,产生了新的技术债务
项目反复迭代&改造,新旧债务层层叠加
在过去,我看过的所有真实在跑的项目都没能彻底完成技术改造,很多时候大家都兴致冲冲起了个头,后续因为业务方向调整、业务需求挤压、性价比下降等各种原因未能改造彻底,总是留下不少的尾巴。
这个问题,在 AI 加入之后,我们可以得到更好地解决:将周期集中的技术专项改造,变成日常开发的常规化改造。
解决方案也很简单,无非是通过前面的“定规范”,补充持续的治理方向,在后续迭代的过程中,AI 会遵循新规范顺手治理历史问题。同时,通过 MR review 时定下的 AI 评审,来检测是否有新增问题。
屎山清理第五步:每天做一点,事情更长久。
结束语
本来想用 AI 回顾我们代码仓库近半年的演化总结文章,看了下,言之凿凿,食而无味。罢了,还是手写有味道。
AI 能做的事情越来越多了,我们干涉的越来越少了。什么时候能完全放手呢?我们应该真的放手吗?
作为旧时代守门人的老古董,我觉得落地执行、沟通提效、记录沉淀都可以交给 AI,唯独思考不可以。
正如 AI 无法写出我的思考,即使它读了足够的代码和文档、也是从AGENTS.md开始便跟随着我一路重构,但还是少了一些思想内核吧。
跳转微信打开
関連記事
今日のまとめ
AIデイリーブリーフで今日の重要ニュースをまとめ読み