⚒️

AI駆動開発で個人開発するなら、リファクタリングをしろ

に公開7

はじめに

AI駆動開発(Vibe Coding)で個人アプリを開発する中で、開発スピードを最大化するための気づきがあったので、共有します!

一回作って終わりではなく、継続的に新機能を追加していく前提で開発していると、「どうすれば保守性を保ちながら開発スピードを上げられるか?」という課題に直面します。

結論から言うと、リファクタリングこそが、AI駆動開発のボトルネックを解消する方法だと考えています。

AI駆動開発の真のボトルネック

私がAIでコードを作成する際、開発に時間がかかっていたのは以下の二つです:

  1. レビュー
  2. バグ修正

AIは新規コード作成では圧倒的な力を発揮しますが、細かいバグ修正やデグレチェックなどの「細かいチェック」は私たち人間の仕事です。

つまり、この「細かいチェック」の時間をいかに減らすかが開発スピード向上の鍵と考えました。

最重要ポイントは、影響範囲を狭くして、人が細かく確認する量を減らすことです。

AIができる限界を理解する

AIには明確な苦手分野があると考えています。

1. 論理的バグの検出不能

文法上は問題ないが、業務上バグっているコードを検出できません。基本的に文法チェックしかできないため、「業務観点から見たバグ」は見落としがちです。

また、そもそもAIが全てのバグを解決できるとは限りません。

2. 既存コードの修正が苦手

「この実装をこう修正して」というざっくり指示も苦手な印象です。特にフロントエンドでは、文法上は問題ないが実際はバグっている、という状況が頻発していました...

これらの問題が生じた場合は、ほとんどの場合は、人間が確認・修正する必要があると考えています...(2025年7月16日 現在)

なぜリファクタリングが効果的なのか?

答えは単純です。上記2つの工数を削減できるから、になります

具体的な例で説明します!

今回は、既存実装の「A機能」に関連した、「B機能」を追加するケースを考えてみます。

関連機能なので、既存ロジックを使い回す方針とします。

【悪い例】リファクタリングなしの開発

負のスパイラル

  1. B機能をAIで作成 → サクサク完成
  2. A機能にも修正が必要 → B機能追加の影響で既存機能も変更
  3. A機能がデグレ → AIは論理バグを検出できないため、人間がデバッグ
  4. 今度はB機能がデグレ → A機能修正の影響でB機能が壊れる
  5. デバッグ地獄 → AIが作ったB機能の詳細が分からず、コードを隅々まで調査

「AIにバグ修正もやらせればいいじゃん」と思うかもしれませんが、論理バグは文法上問題ないため、人間が修正する必要が度々出てきます。

このループが延々と続くことで、開発効率が著しく低下します。

また、レビュー時も、A機能との共有ロジックの変更が、影響ないかを細かく調べる必要があり、レビュー時の検討事項が増えて負荷が増大します。

【良い例】リファクタリング後の開発

事前にリファクタリングを行った場合は、以下の流れになります。

正のスパイラル

  1. A機能をリファクタリングB機能の追加時、A機能への影響を最小限にする設計に
  2. B機能をAIで作成 → サクサク完成
  3. A機能の修正 → 既に影響範囲を最小限にしているため、影響範囲が小さく、原因切り分けが容易
  4. B機能がデグレ → A機能とB機能に影響のある範囲だけ確認すれば問題なし

結果、A機能やB機能がデグレしたとしても、原因切り分けがすぐに出来るため、バグ修正の負荷が低減します。

また、レビュー時の負荷も、上記の流れであれば、「1. A機能をリファクタリング」の段階で、事前にA機能への影響範囲を確認できているため、「A機能はデグレしていない」という担保がしやすいです。

その結果、B機能のみのレビューに集中することができ、レビューの負荷を減らすことができます。

リファクタリングを先に行った時のメリット

メリット1:影響範囲の限定

「A機能には影響しない」ことがある程度保証されるため、B機能だけをチェックすれば済みます。

メリット2:デバッグの効率化

A機能とB機能で共通部分があっても、「A機能への影響はその共通部分だけ」と特定できるため、デバッグ範囲が明確になります。

メリット3:レビュー品質の向上

影響範囲が限定されているため、レビュー負荷が激減し、その結果「質の高いレビュー」が可能になると考えています。

リファクタリングのベストプラクティス

新機能追加の直前に行う

新機能を追加する前にリファクタリングを実施します。

「新機能が追加しやすくなる」ような設計に変更し、既存機能への影響を最小化する設計(構造)をこのタイミングで作ります。
理想の状態は、「新機能は追加するだけ、他の機能には影響しない」です。

「何をどうリファクタリングするか?」は、人間がコントロール

リファクタリングの方針は人間が決めることが重要です。

AIは「減らす」「整理する」といった作業が苦手な傾向があります。そのため、どうリファクタリングするかは、まだ人間が主導した方が良さそうです。
今後のプロダクトの方向性に合わせた、リファクタリングをしましょう。

機能追加とリファクタリングは分離する

機能追加とリファクタリングは同時にやるな」を徹底します。

同時に行うと、どこでバグったか特定できず、AIが作った理解不十分なコードを延々と調査することになります...(実体験)

まとめ

リファクタリングは一見遠回りに見えますが、AIの得意分野を最大限活用しつつ、人間の負担を最小化する上で、有効な方法だと考えています!

他にも、もっと良い進め方が沢山あると思います、ぜひ教えていただきたいです!


次回、「~~ AI駆動開発で個人開発するなら、設計をしろ ~~ バイブコーディングでのレビュー負荷を低減する方法」編でお会いしましょう!

Discussion

r-sugir-sugi

ためになりました!次回を楽しみにしています

天汐香弓天汐香弓

バイブコーディング作って終わりがちだったのですが、いじり始めるとノーコードでは限界が出て最近コード学習の必要性を痛感します。

スナガクスナガク

コメントありがとうございます!

そうですよね…
「痒いところに手が届かない」は、誰もが感じてると思います…

理想は、AIにエラーの原因や対処法を聞いた際、その回答の内容が理解できるレベルまで行けると、かなり楽になると思います…
(それが難しいのですが…😭)

エンジニアであれば、「そのバグ自体を出しにくくするには、どうしたらいいか?」などを考えて、コードの書き方やファイル構成などを工夫できると、ベストだと思います!

PoolaPoola

テストはどんな感じでやってますでしょうか?

スナガクスナガク

コメントありがとうございます!
テストコードと、動作確認時のテストの二つの観点から、回答します!

テストコード

単体テスト、結合テストは、基本的に全て作成しています!
(特に単体テストは、必ず作ってます)
コードもAIに作らせています。ある程度、網羅したテストを作ってくれるので、信頼して大丈夫だと思います。
ただ、エッジケースは漏れがちな印象です。数値計算ロジックなど、厳密な計算が必要な場合は、テストケースを具体的に指示したりしてます!

E2Eテストは、僕の個人開発アプリでは導入してます。
ただ、アプリの規模次第によりますが、無理してE2Eテストは導入しなくていいと思います。(テストのメンテコストや、CIの時間が伸びるコストに見合ったメリットが得られない)

ただ、E2Eテストの導入自体は、AIを使えば簡単にできるので、ひとまず作成する価値はあると思います!

動作確認時のテスト

フロントエンドの開発時は、PlayWightMCPを使っています。

PlayWightMCPは、AIにWEBブラウザを操作させるためのMCPです。
実際にアクセスする時のURL等と、操作させる内容を指示すると、AIにWEBブラウザ上で動作確認を行わせることが出来ます。
これにより、そもそもビルドエラーが出ていれば、その修正をしてくれます。
また、挙動に問題がないか?もAIがテストし、正しく動いてない場合は、修正してくれます。

ただ、スタイルのデグレなどは検知できないので、あくまで「ロジックは問題ないか?」を判定するものになります。

バックエンドの実装は、TDDなど先にテストケースを作成する方法も有効です!

上記の回答でよろしいでしょうか?
もし疑問点や不明点があれば、教えて頂きたいです!

PoolaPoola

返信ありがとうございます。
テストはリファクタリングとセットだと思ってるので、当然やってるだろうと思うも、
記載がなかったので念の為質問しました。
イメージできました。ありがとうございました。