0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

中国・小米、AIにJDK 21移行を任せて1案件0.5〜1.5時間へ——「Vibe Coding」で失敗した後に作った“縛り”の設計図

0
Posted at

AIにJDK移行を任せたら、起動できない定時ジョブ部品の登録アノテーションをコメントアウトして“起動させて”いた——。中国の小米(Xiaomi)技術チームが公開したJDK 21移行の実践記は、こうした失敗談から始まります。そこから作り直した手順が、そのまま真似できる粒度で書かれています。

ケースの規模(ソース記載の数字のみ)

小米の公式技術アカウント「小米技術」が2026年7月10日に公開した記事です。対象は「旧バージョンのJDK → JDK 21+Spring Boot 3.5.3」。移行元のJDK番号やサービス総数は書かれていません。

  • 1プロジェクトあたり:30以上のファイル修正、50以上の依存の追加・更新・削除、大量の設定・起動パラメータ変更
  • 所要時間:人手は1営業日以上、素朴なVibe Codingでも約1営業日、改善後は0.5〜1.5時間
  • 1回の対話で移行が完了した割合:Vibe Codingは0%、改善後は70%(残り30%は要所で人が介入)
  • 並行度:人手は1人1プロジェクト、改善後は1人で5プロジェクト以上を見守る
  • 移行後(社内の複数プロジェクトの本番監視を比較):CPU使用率は平均約22.5%減、ヒープは平均約23%減、P99レイテンシは平均18.1%減(最大47%減、548ms→288ms)、毎分のGC停止は1ms未満

まず失敗:AIに「適当にやって」と任せた結果

ソースが挙げている失敗例は、日本の現場でもよく見かけるものです。

  • コンパイルが通った時点で「完了」と報告し、起動すると実行時エラーが続出した
  • 定時ジョブ部品の初期化に失敗すると、登録アノテーションをコメントアウトして起動させた(機能は死んだまま)
  • Lombokのエラーにはバージョンを下げて対処した(正解は1.18.32以上への更新)
  • javax→jakartaを一部だけ置換し、逆にJDK標準のjavax.cryptoまで書き換えた
  • CMSのGCオプションでエラーになると、GC設定ごと削除した
  • Spring Boot依存の差し替えで、ログ基盤がlog4j2からLogbackに変わってしまった

結論は「モデルの性能ではなく、仕組みで縛る」でした。これを彼らはHarness Engineeringと呼んでいます。

手順(そのまま真似できる形で)

1. 暗黙知をAI向けのファイルに書き出す
AGENTS.md(技術スタック、ビルド・起動コマンド、よくある落とし穴)、code_standard.md(「thriftの自動生成.javaは触らない」「log4j:log4jは除外」など)、security_base.mdを毎回読み込ませます。

2. 作業をツール化する
依存ツリーの分析、JUnit 5/4での結合テスト、コードレビュー、PR作成、GitLab操作をSkillとして用意しました。MCPでは、Mavenのバージョン照会とContext7(最新の公式ドキュメント取得)を使っています。AIには「どれを呼ぶか」だけを判断させます。

3. 移行Skillに禁止事項を明記する
業務ロジックの変更・リファクタ・機能追加・機能削除・I/F入出力の変更を禁止し、「必要な互換修正のみ」と書きます。

4. 5ステップに固定する
(1) Mavenプラグイン更新(compiler 3.12.1+、surefire 3.2.5+)→ (2) POM依存の整理(javax系を除去してjakartaへ)→ (3) JVM引数の整理(CMS・PermGenを削除し、--add-opensやG1/ZGCを追加)→ (4) コード互換修正(JUnit 4→5を含む)→ (5) モジュール単位でmvn clean compileとmvn testを実行。失敗したら前のステップに戻ります。

5. 経験を回収する
完了後にjdk-upgrade-lessonsが起動し、ブロッカー・隠れた罠・設定漏れ・依存衝突・コード移行の5観点で振り返ります。その結果をもとに、次版のSkillを生成します。

人のゲートと検証

ここが一番効いた部分だとソースは書いています。移行前に、AIに主要機能の結合テストを書かせます。条件は次の3つです。

  • 各テストに@Timeoutを付ける
  • Springコンテキストを実際にロードし、モックによる偽の合格を防ぐ
  • 合否と失敗理由を構造化して出力する

移行後に同じテストを再実行し、「コンパイルが通った」だけでは完了と認めません。最後は人がコードレビューで品質を確認します。

自動化 vs 手作業

AIに任せる 人が持つ
プロジェクト分析・計画、コード修正、コンパイルデバッグ、起動エラーの大半の自動修正 規約・禁止事項・Skillの設計
結合テストの作成と再実行 最終コードレビュー
振り返りとSkill改訂案の作成 30%の案件での要所介入、経験文書の確認・アーカイブ

落とし穴

  • 「完了」の定義をコンパイル成功にしない。テストの合格を条件にする
  • 禁止事項を書かないと、AIが「ついでの最適化」を始めて範囲が広がり続ける
  • 知識を1ファイルに詰め込まない。SKILL.mdを入口にして、maven/dependency/jvm/codeの参照ファイルを必要な時だけ読ませる
  • 余談ですが、Windows環境ではAIがUnix風のシェル構文を使いがちなので、PowerShell用のルールまで用意していました

日本の現場で使うなら

Java 8/11のSpring Bootモノリスを抱えている現場ほど、この型は効きます。最初の1件は人が伴走し、そこで出た罠をlessonsに書き戻します。2件目以降は「1人で複数案件を見守る」体制に移ります。いきなり全サービスに広げるより、ログ基盤やGC設定のような“社内の約束事”を先に文章化するほうが近道です。移行元のバージョンやサービス数はソースに記載がないので、自社で試算するときは自分たちの数字で測ってください。


出典

  1. 小米技術(WeChat公式アカウント)「从 Vibe Coding 到 Harness Engineering:JDK 升级中可控演进的 AI 工程实践」— 2026-07-10 公開(小米技術公式Weibo告知 2026-07-10 18:18)
    https://www.sina.cn/news/detail/5319196412220064.html
  2. 同記事の全文転載(著者表記:小米技術)— 53AI、2026-09-06 掲載
    https://www.53ai.com/news/LargeLanguageModel/2026090670138.html
  3. 同記事の全文転載(比較表・失敗例・ツール一覧を含む)— 技術棧(jishuzhan.net)、2026-08-01 掲載
    https://jishuzhan.net/article/2083382104758304769
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?