1人開発の最大の弱点は「レビュアーがいない」ことにあります。 書いたコードがそのまま本番に入る。チーム開発であれば当然行われるコードレビューというセーフティネットが存在しません。
この問題を、AIによる4段階のQAワークフローで解決しました。 品質分析・テスト実行・改善提案・ドキュメント更新を、Git commit前に自動で実行する仕組みです。 ただし、AIに最終承認権は与えず、「機械的なチェック」はAIが担い、「判断」は人間が行う仕組み化について共有します。
問題:レビュアー不在のリスク
1人開発のコードフロー
1チーム開発:2 コード → PR → レビュー → 修正 → 承認 → マージ → デプロイ3 ↑4 ここで問題を検出5
61人開発(Before):7 コード → commit → push → デプロイ8 (レビューなし。問題は本番で発覚)実際に起きた事故
レビューなしで本番に入ったコードが引き起こした問題の例。
1事故1: except Exception で全エラーを握りつぶし2 → 16日間、特定機能が無効化されていることに気づかなかった3
4事故2: API keyをconfig辞書にハードコード5 → Gitにコミットされ、pushする直前に気づいた6
7事故3: 循環的複雑度60の関数を追加8 → 3週間後、修正しようとしたが理解不能どれもレビュアーがいれば指摘された問題です。
解決策:4段階のQAワークフロー
CLAUDE.mdへの組み込み
本番システムのCLAUDE.mdに以下を記載している。コード変更後、Git commit前にAIが自動的にこのワークフローを実行する。
1## Post-Implementation QA Workflow2コード変更完了後、Git commit前に自動実行:31. /sc:analyze → 品質・セキュリティ・パフォーマンス分析42. /sc:test → テスト実行・カバレッジ確認53. /sc:improve → 改善提案をユーザーに提示64. /sc:document → 変更箇所のドキュメント更新7
8例外(スキップ可): md/設定ファイルのみの変更「自動実行」できることがポイントです。 人間が「レビューして」と依頼する必要をなくしました。 CLAUDE.mdに書かれているため、AIは変更を完了するたびにこのフローを実行する。
Step 1: /sc:analyze(品質・セキュリティ・パフォーマンス分析)
変更されたコードを対象に3つの観点で分析する。
1実行例:2 品質:3 - 循環的複雑度: 最大 19(閾値20以下: OK)4 - 関数の行数: 最大 45行(閾値50以下: OK)5 - 未使用インポート: 0件6
7 セキュリティ:8 - ハードコードされたシークレット: 0件9 - 安全でないデシリアライズ: 0件10 - SQLインジェクションリスク: 0件11
12 パフォーマンス:13 - N+1クエリパターン: 0件14 - 不要なループ内計算: 0件15
1 collapsed line
16 結果: PASS(全項目クリア)Step 2: /sc:test(テスト実行・カバレッジ確認)
全テストを実行し、カバレッジが閾値を下回っていないか確認する。
1# AIが内部で実行するコマンド(概念的な流れ)2pytest tests/ --cov --cov-fail-under=80 -q3
4# 失敗時は /sc:troubleshoot で原因分析→修正試行テストが失敗した場合、AIは/sc:troubleshootで原因を分析し、修正を試みる。ただし修正後に再度テストが通ることを確認してから次のステップに進む。
Step 3: /sc:improve(改善提案)
AIがコードの改善点を提案する。ここが重要なのは、「提案」であって「自動適用」ではありません。
1改善提案:2 1. [パフォーマンス] calculate_metrics() 内のDataFrame操作を3 vectorized operationに置き換えると約30%高速化の見込み4 → 適用しますか? [Y/n]5
6 2. [可読性] config_validator.py の validate() メソッドを7 validate_required_keys() と validate_value_ranges() に分割すると8 テスタビリティが向上9 → 適用しますか? [Y/n]10
11 3. [堅牢性] api_client.py の retry ロジックに12 exponential backoff を追加すると API制限超過時の安定性が向上13 → 適用しますか? [Y/n]提案ごとにユーザーが承認する。「全部適用」は選べない設計にしている。
Step 4: /sc:document(ドキュメント更新)
変更箇所に関連するドキュメントを自動更新する。
AIが検出できるもの、できないもの
AIが得意な検出対象
1# 1. 循環的複雑度が高い関数2def process_event(data, config, system_state, resources, ...):3 if system_state == "active":4 if data["metric"] < 30:5 if config["use_filter"]:6 if resources < config["max_resources"]:7 # ... 深いネスト8 # → AIが検出: "cyclomatic complexity 35, 閾値20を超過"9
10# 2. 未使用のインポート11import pandas as pd # 使用されている12import numpy as np # 使用されている13from datetime import timedelta # 未使用 ← AIが検出14
15# 3. except Exception の握りつぶし7 collapsed lines
16try:17 result = api_client.get_resources()18except Exception:19 pass # ← AIが検出: "例外を握りつぶしています"20
21# 4. ハードコードされたシークレット22API_KEY = "sk-1234567890abcdef" # ← AIが検出: "ハードコードされたAPI key"これらは機械的にパターンマッチングできるため、AIの検出精度が高い。
AIが苦手な検出対象
1# 1. ビジネスロジックの妥当性2def calculate_resource_allocation(capacity, usage_ratio):3 return capacity * usage_ratio * 100 # ← この "* 100" は正しいのか?4 # AIはコードの文法は検証できるが、5 # 「割り当て量の計算で100倍すべきか」は判断できない6
7# 2. 実環境でのパフォーマンス影響8def fetch_all_items():9 for item in ALL_ITEMS: # 28件10 data = api.get_records(item, interval="1m", limit=10000)11 # AIは「ループ内のAPI呼び出し」を検出できるが、12 # 「28回 × 10,000行の取得が本番のレートリミットに引っかかるか」13 # は実環境の知識がないと判断できない14
15# 3. 既存システムとの整合性3 collapsed lines
16# ADR-015で「終了処理ロジックは resource_manager.py に集約する」と決定した17# 別モジュールに終了処理ロジックを書いてもAIは指摘しない18# → ADR(Architecture Decision Records)で補完補完の仕組み
AIの弱点を補うために、以下の仕組みを用意している。
1ビジネスロジックの妥当性2 → テストの期待値を人間が設定する(AIはテストを実行するだけ)3
4実環境でのパフォーマンス5 → Dry-Run/Practice期間で実環境テスト6
7既存システムとの整合性8 → ADR(Architecture Decision Records)をCLAUDE.mdから参照9 → AIがADRを読み込んで整合性をチェックGitHub PRレビューの運用
AIが作成、人間が承認
1ワークフロー:2 1. AIが feature ブランチにコードをcommit3 2. AIが develop ブランチへのPRを作成4 3. PRの説明文もAIが自動生成5 4. 人間がPRを確認し、承認してマージPRの説明文には、変更内容・テスト結果・影響範囲が含まれる。
1## PR説明文(AI自動生成)2
3### 変更内容4- resource_manager.py: リトライ制御の状態機械を追加5- config.py: retry_control_config セクションを追加6
7### テスト結果8- 新規テスト: 24件追加9- 全テスト: 4,174件 PASS / 0件 FAIL10- カバレッジ: 82% → 83%11
12### 影響範囲13- リソース管理の解放処理に新しい分岐を追加14- 既存のタイムアウト/リトライロジックには影響なし(テストで確認済み)AIに最終承認権を与えない理由
1AIに承認させない理由:2 1. ビジネスロジックの正しさはAIが保証できない3 2. 「テストが通る」ことと「正しく動く」ことは別4 3. 責任の所在が曖昧になる5 4. 人間がPRを読む習慣がなくなると、コードの理解が失われる1人開発でも「PRを読む」習慣は維持すべきだ。コード全体の理解を保つことが、長期的な保守性を支える。
4段階QAの効果
Before(QAワークフロー導入前)
1月あたりのインシデント: 8〜12件2主な原因:3 - except Exception の握りつぶし: 3件4 - 未テストの変更: 4件5 - ドキュメント未更新による設定ミス: 2件After(QAワークフロー導入後)
1月あたりのインシデント: 1〜3件2主な原因:3 - 実環境固有の問題(API仕様変更など): 1〜2件4 - AIが検出できないビジネスロジックの不整合: 0〜1件「機械的に検出可能な問題」はほぼゼロになった。残るのは「実環境固有の問題」と「ビジネスロジックの判断ミス」だけだ。
学んだこと
1. 1人開発でも4段階のQAワークフローで品質を維持できる
analyze → test → improve → document の4段階をCLAUDE.mdに記載し、commit前に自動実行させることで、レビュアー不在の穴を埋められる。チーム開発のコードレビューと同等とは言えないが、「機械的なチェック漏れ」は確実に防げる。
2. AIレビューは「機械的なチェック」が得意、「判断」は人間が補完
循環的複雑度、未使用インポート、セキュリティパターン——これらの機械的チェックはAIの得意分野だ。一方、ビジネスロジックの妥当性や設計判断の整合性は、人間がADRやテストの期待値を通じて補完する必要がある。
3. PRの承認は人間が行う
AIに最終承認権を与えない。「テストが通る = 正しい」ではないからだ。1人開発でも、自分が書いた(AIが書いた)PRを自分で読んで承認するプロセスを維持する。コード全体の理解を保つために、このステップは省略しない。
まとめ
1人開発でのAIコードレビューで重要なのは以下の3点だ。
- 4段階QAの自動実行: analyze → test → improve → document をCLAUDE.mdに記載し、commit前に毎回自動実行させる。人間が「レビューして」と依頼する必要がない
- AIと人間の役割分担: 機械的チェック(循環的複雑度・セキュリティパターン・テスト実行)はAI、ビジネスロジックの妥当性と設計判断の整合性は人間が担当
- 最終承認権は人間が保持: AIがPRを作成し、人間が承認する。AIに承認させると、コードの理解が失われ、責任の所在が曖昧になる
「AIがレビューするから品質が保たれる」のではなく「AIが機械的チェックを担い、人間が判断を担う」役割分担が品質を担保することができる