はじめに
「1人で開発していると、コードの重構(リファクタリング)やテストコードの作成まで手が回らない……」
個人開発を進める中で、誰もが一度は直面する壁ではないでしょうか。新機能の追加に追われるあまり、技術負債が溜まり、気づけば「触るのが怖いコード」が生まれてしまう——私自身もまさにそのループにハマっていました。
しかし最近、Cursor(またはGitHub Copilot)と Claude 3.5 Sonnet を開発ワークフローに本格導入したことで、開発スピードとコード品質の両立が劇的に改善しました。
本記事では、1人の個人開発者が「AIを単なるコード補完ではなく、リアルなペアプログラマーとして活用する方法」と、実際に効果のあった具体的なプロンプト・プロセスの工夫を共有します。
開発ワークフローでAIに任せている 3 つの領域
現在、私は以下の 3 つの作業を重点的に AI に委任しています。
レガシーコードの安全なリファクタリング
ユニットテスト(Unit Test)の自動生成
データモデル(Freezed等)の定義とJSON変換コードの生成
特に「テストコードの作成」は、個人開発において最も後回しにされがちな領域ですが、AI を活用することで作成コストが 1/5 以下になりました。
実践例 1:スパゲティコードの重構(Before / After)
以前のコードでは、UIのイベントハンドラ内に直接データ取得と状態更新のロジックが混在していました。
AIへの指示(プロンプトの工夫)
単に「綺麗にして」と頼むのではなく、制約条件(アーキテクチャのルール)を明示するのがポイントです。
プロンプト例:
「以下の Flutter のコードをリファクタリングしてください。
制約条件:
UI層から直接のデータ取得ロジックを排除し、Riverpod の AsyncNotifier に切り出すこと
エラーハンドリングは AsyncValue.guard を使用すること
元の動作仕様を変えないこと」
リファクタリング結果の比較
// Before: UIの中にビジネスロジックが直接書かれていた
Dart
onPressed: () async {
setState(() => isLoading = true);
try {
final result = await api.fetchData();
setState(() {
items = result;
isLoading = false;
});
} catch (e) {
showErrorDialog(e);
}
}
// After: AIによってRiverpodのNotifierへ美しく分離された
Dart
onPressed: () {
ref.read(itemListProvider.notifier).fetchAndRefresh();
}
このように、自分の設計思想(Riverpod 採用など)を前提条件として与えることで、プロジェクトの文脈に沿った実用的なコードが一瞬で生成されます。
実践例 2:テストコード作成の爆速化
Riverpod の Notifier に対するユニットテストも、AI にテンプレートとモック(Mocktail等)の書き方を学習させることで、数秒で出力できるようになりました。
Dart
void main() {
late MockItemRepository mockRepository;
late ProviderContainer container;
setUp(() {
mockRepository = MockItemRepository();
container = ProviderContainer(
overrides: [
itemRepositoryProvider.overrideWithValue(mockRepository),
],
);
});
test('fetchItems 成功時に正しく State が更新されること', () async {
// Arrange
when(() => mockRepository.fetchItems()).thenAnswer((_) async => [testItem]);
// Act
final notifier = container.read(itemListProvider.notifier);
await container.read(itemListProvider.future);
// Assert
expect(container.read(itemListProvider).value, [testItem]);
});
}
「自分でゼロから書くと15分かかるテスト」が、「生成されたコードをレビューして1分で微調整するだけ」になり、テストを書く心理的ハードルが完全に消え去りました。
AIペアプロで「失敗」から学んだ注意点
便利すぎるAIですが、過信による失敗もいくつか経験しました。
コンテキスト(文脈)を与えすぎない・削りすぎない
関連するファイル(RepositoryやModel)を渡さずに指示を出すと、架空のメソッドや古いバージョンの構文(Riverpod 1.0系など)を提案されることがあります。関連コードの文脈は必ずセットで渡すのがコツです。
最終的なハルシネーション(幻覚)のチェックは人間の仕事
特にパッケージのバージョンアップによる非推奨 API(Deprecated)の混入はよく起きます。AIの提案をそのまま鵜呑みにせず、「コンパイルが通るか・意図通りの挙動か」は必ず自分の目で確認しています。
おわりに
AI を導入して最も良かったのは、単に「コードを書く速度が上がったこと」以上に、「1人開発特有の孤独感や、設計に迷った時の思考停止がなくなったこと」です。
「壁打ち相手」として AI を使いながら、自分はプロダクトの本質である「ユーザー体験(UX)の向上」や「新機能のアイディア」に集中できるようになりました。
みなさんは個人開発で AI をどのように活用されていますか?おすすめのプロンプトや使い方が格段に上がったツールがあれば、ぜひコメント欄で教えてください!