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?

個人開発の開発速度を2倍にする「AIペアプログラミング」実践:CursorとClaudeでコード重構とテスト作成を自動化した話

0
Posted at

はじめに
「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 をどのように活用されていますか?おすすめのプロンプトや使い方が格段に上がったツールがあれば、ぜひコメント欄で教えてください!

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?