誰も手を付けられなかった時代遅れのシステムが、AIで1週間で蘇った話
所属している会社や現場で、誰も触りたくないコードはないだろうか。
1ヶ月かかると言われていた作業を、1週間で終わらせた。
その方法を書いておく。
はじめに
「やらないといけないのはわかってる。でも誰も手を付けたくない」
そういう仕事が、どの現場にも一つはあると思う。
今回向き合ったのは、Python 3.7 → 3.12のバージョンアップ作業だ。
Pythonとはプログラムを書くための言語の一つで、
定期的にバージョンアップがある。
古いバージョンのまま使い続けると、セキュリティ上のリスクが高まったり、サポートが切れて動かなくなるリスクが出てくる。
放置できない。でも変更箇所が膨大で、現役で動いているシステムだから壊すわけにもいかない。典型的な「触りたくない案件」だった。
チームの中でも同じ作業に約1ヶ月かかるのが相場。テストやレビューまで含めると4ヶ月近くになる見込みだった。
自分はAIコーディングツール「Cursor」を使い、中心となる実作業を約1週間弱で終わらせた。
やったことはシンプルで、「人間がやらなくていい作業をAIに全部渡した」それだけだ。
そもそも何がつらい作業なのか
バージョンアップがなぜ時間がかかるのか、少し説明する。
今回のアップデートは、実はPythonだけではなかった。
- Python 3.7 → 3.12
- FastAPI 0.47 → 0.128(APIのフレームワーク)
- Pydantic V1 → V2(データのバリデーションライブラリ)
FastAPIとPydanticはセットで使われることが多いが、
それぞれメジャーバージョンが上がっており、書き方が大きく変わっている。
特にPydantic V1→V2は破壊的変更が多く、エンジニアの間でも「重い」と有名なアップデートだ。
非エンジニアにたとえるなら、WordとExcelを同時に新しいバージョンに上げたら、操作方法がかなり変わってしまったようなイメージに近い。
今回の対象は社内で稼働している4つのAPIサーバー。APIとはシステム同士がやり取りするための窓口のようなもので、これらのコードベース全体に古い書き方が散らばっている状態だった。
従来のやり方では、公式のリリースノートやマイグレーションガイドを一つひとつ確認しながら、慎重に石橋を叩くように進めていく。丁寧ではあるが、とにかく時間がかかる。
Cursorに何を任せたか
今回の作業を「人間がやるべきこと」と「AIに任せられること」に分けた。
自分がやったこと(判断が必要な作業)
- サービスの仕様が変わっていないかの確認
- AIが修正した内容がリリースノートや仕様に沿っているかのチェック
- 利用ライブラリの更新方針の決定
Cursorに任せたこと(量が多いが、パターンが決まっている作業)
- エラーログからの原因調査と修正
- 廃止・変更されたメソッドの洗い出し
- コードベース全体への大量の置き換え
- 同じ修正パターンの繰り返し適用
特に「廃止メソッドの大量置き換え」はAIの独壇場だった。
人間がやると単純作業なのにミスも起きやすく、時間も溶ける。
CursorはコードベースをIndexして全体を把握しながら一気に処理してくれる。自分はその結果を確認・判断することに集中できた。
なぜ4倍速になったのか
時間が圧縮された理由はシンプルだ。「手を動かす時間」が激減したからだ。
コードを読んで理解する時間・判断する時間は変わらない。
でも「修正を書く→エラーを確認する→また修正する」というループをAIが高速で回してくれた。
自分は判断するだけでよかった。
バージョンアップ系の作業はAIと相性がいい、というのが今回一番の気づきだ。
新規開発はサービス仕様の背景や設計の判断が多く、
AIだけに任せるのは難しい場面も多い。
でもバージョンアップは違う。「やることは決まっている、量が多い」という構造で、AIが最も力を発揮しやすい文脈にはまる。
AIでも対応できなかったこと
AIは万能ではない、という話もしておく。
サービスの仕様や技術的な経緯が絡む判断は、AIには任せられなかった。
AIはコードの表面は読めても、
「なぜこの設計になっているのか」「過去にどんな経緯でこの仕様になったのか」までは把握できない。
仕様に関わる修正を任せると的外れなアウトプットが返ってくることがあった。
こういった判断は、サービスの背景を知っている人間が持つ必要がある。
もう一つは、Flakyなテストコードだ。
テスト実行前のデータ挿入で不整合が起きるなど、実行環境やタイミングに依存した問題はAIには原因の特定が難しく、手動でデバッグする必要があった。
「AIに全部任せれば終わる」ではなく、
「AIが得意な部分を任せ、人間が判断する部分は人間が持つ」という分担が重要だと改めて感じた。
次の挑戦:本番はこれから
今回のPython3.7→3.12は、ある意味ウォーミングアップだった。
社内には、一部の顧客が今も使い続けている旧管理画面がある。
こちらはPython 2で書かれており、スコープも大きく、現役で動いているだけに緊張感が高い。
Python 2は2020年にサポートが終了しており、今回の3.7→3.12よりはるかに変更の幅が広い。
ただ、今回で「パターンが決まっている大量作業はCursorへ、判断・確認は自分が持つ」という型は掴んだ。
この型で挑む予定なので、また結果をレポートしたいと思う。
まとめ
- Python 3.7→3.12 / FastAPI 0.47→0.128 / Pydantic V1→V2 を同時アップデート
- チームの相場1ヶ月のところ、実作業1週間弱で完了
- 鍵は廃止メソッドの大量置き換えをCursorに任せ、自分は判断・確認に集中したこと
- バージョンアップのような「やることは決まっている、量が多い」作業こそAIが最も得意な領域
- 次はPython 2の旧管理画面という、より難易度の高い移行に挑む