バイブコーディング実践編 — Claude Code を中心に AIで安全に作る力 / リファクタリングと技術債の支払い
AI支援modernization — 段階的書き換え
読了目安 6 分
学習のねらい
「レガシーコード(Legacy Code、古くなったコード)」の現代化(modernization)は、リファクタリングの中でも特に難しい作業です。AIを適切に活用することで、この作業を効率的に、かつ安全に進めることができます。
本レッスンでは、AIの支援を受けながらレガシーコードを段階的に書き換えるための具体的なアプローチを学びましょう。
段階的書き換えの重要性
レガシーコードは多くの場合、テストが不足していたり、設計が複雑だったりします。このようなコードを一度に大幅に書き換えると、予期せぬバグを大量に生み出したり、プロジェクト全体を停滞させたりするリスクがあります。これを防ぐために、以下の原則に基づいた「段階的書き換え」が重要です。
- 一度に1ファイル、またはごく小さな範囲ずつ変更する: 変更範囲を限定することで、影響範囲を把握しやすくし、問題が発生した場合の切り戻し(ロールバック)も容易になります。
- テストを先行して追加する: 変更するレガシーコードにテストがない場合、まずそのコードの振る舞いを保証するテスト(特性化テストなど)を書き、そのテストが通ることを確認してからリファクタリングに着手します。
- PR(Pull Request)サイズを制限する: 大きな変更はレビューが困難になり、見落としが発生しやすくなります。1つのPRでレビューできる現実的な変更量(例: 数百行以内)に制限しましょう。
AIをリファクタリングの補助として活用する
AIは、レガシーコードの現代化において強力な補助ツールとなり得ます。
- コードの意図を理解する: AIに複雑なレガシーコードの塊を渡し、「このコードは何をしているのか、簡潔に説明してほしい」と尋ねることで、人間が理解する手助けになります。
- 既存コードのパターンを識別する: 重複しているコードや、改善の余地があるパターンをAIに指摘させることで、リファクタリングの対象を見つけやすくなります。
- 小さな変更の提案: 「この関数をPython 3.12の型ヒントに対応させてほしい」「この部分をよりモダンな構文に書き換えてほしい」といった具体的な指示を出すことで、AIが小さなリファクタリングの提案を生成してくれます。
ただし、AIが生成したリファクタリング案は必ず人間がレビューし、テストで検証することが不可欠です。AIは文法的に正しいコードを生成できても、コードの意図やビジネスロジックの深い理解までは保証できないためです。
具体的な進め方 — Python 2.7から3.12への現代化を例に
例えば、古いPython 2.7時代のコードをPython 3.12のモダンなコードに現代化する場合、以下のような手順で進めることができます。
- 対象ファイルの選定: まず、現代化したいレガシーコードのファイルを1つ選びます。
- 既存の振る舞いをテストで保証: そのファイルに関連するテストがない場合、そのコードの現在の振る舞いを保証するテストコード(例:
pytestを使ったテスト)を作成します。- テストが失敗しないことを確認します。
- AIに現代化を依頼: Claude CodeなどのAIツールに対し、「このPython 2.7風のコードをPython 3.12の型ヒントとモダンな構文にリファクタリングして、
pytestでテスト可能な形にしてほしい。ただし、既存のテストは通過するように変更を加えてください。」といった具体的な指示を出します。 - AIの提案をレビューし適用: AIが生成したコードを注意深くレビューし、変更内容を理解・確認します。
- テストの実行とカバレッジ確認: リファクタリング後のコードで、作成したテストがすべてパスすることを確認します。さらに、テストカバレッジ(Test Coverage、テストがコードのどのくらいをカバーしているかを示す指標)を計測し、十分なカバレッジがあることを確認します。
pytest --cov=.のように実行するとカバレッジを測定できます。
- PRとして提出: 変更をコミットし、PRを作成します。PRのレビューでは、変更の意図、テストの有無、カバレッジ、そしてAIが生成した部分について特に注意を払います。
まとめ
AI支援によるレガシーコードの現代化は、段階的に進めることが成功の鍵です。一度に大きな変更を加えるのではなく、1ファイルずつ、テストを先行させ、PRサイズを制限するアプローチをとりましょう。AIをコードの意図理解や小さなリファクタリング提案の補助として活用し、最終的なレビューとテストは人間が責任を持って行いましょう。