5-3 コードレビュー
Code Review
1. コードレビューの目的
1.1 なぜレビューが必要か
コードレビューは、開発プロセスにおいて品質を確保するための重要なプラクティスである。 バグの早期発見により修正コストを削減できるだけでなく、 チーム全体のスキルアップや知識共有にも貢献する。 また、複数の目でコードを確認することで属人化を防ぎ、 チーム全体でコードベースを理解できるようになる。
| 目的 | 効果 |
|---|---|
| バグの早期発見 | テスト前に欠陥を検出、修正コスト削減 |
| コード品質向上 | 可読性、保守性、設計の改善 |
| 知識共有 | チーム全体のスキルアップ |
| 属人化の防止 | 複数人がコードを理解 |
| 規約の遵守 | コーディング標準の徹底 |
1.2 レビューの種類
コードレビューには複数の種類があり、状況に応じて使い分ける。 インスペクションは形式的で重要なコンポーネントに適用される。 現代の開発では、GitHubやGitLabのプルリクエスト機能を使った 非同期レビューが一般的であり、地理的に分散したチームでも 効率的にレビューを実施できる。
| 種類 | 特徴 | 適用場面 |
|---|---|---|
| インスペクション | 形式的、チェックリスト使用 | 重要なコンポーネント |
| ウォークスルー | 著者がコードを説明 | 設計の妥当性確認 |
| ペアレビュー | 2人で同時にレビュー | 複雑なロジック |
| プルリクエストレビュー | 非同期、ツール上で実施 | 日常的な開発 |
現代の開発では、GitHubやGitLabのプルリクエスト機能を使った 非同期レビューが一般的である。地理的に分散したチームでも 効率的にレビューを実施できる。
2. レビューの観点
2.1 チェック項目
コードレビューでは複数の観点からチェックを行う。 正確性は要件を正しく実装しているかを確認し、 セキュリティはSQLインジェクションやXSSなどの脆弱性がないかを確認する。 性能面ではN+1問題や不要なループがないかを確認する。 可読性と保守性も重要な観点であり、将来の変更を容易にするための設計を評価する。
| 観点 | チェック内容 |
|---|---|
| 正確性 | 要件を正しく実装しているか |
| セキュリティ | SQLインジェクション、XSSなどの脆弱性 |
| 性能 | N+1問題、不要なループ |
| 可読性 | 理解しやすいか、命名は適切か |
| 保守性 | 変更しやすい構造か、重複はないか |
| テスト | テストは十分か |
2.2 優先順位
すべてを完璧にしようとすると時間がかかりすぎる。 バグやセキュリティ問題は必ず修正し、 性能問題や設計の改善は基本的に修正する。 スタイルや好みの問題は提案として伝え、強制はしない。 優先順位をつけることで、レビューの効率が向上する。
| 優先度 | 内容 | 対応 |
|---|---|---|
| 高 | バグ、セキュリティ問題 | 必ず修正 |
| 中 | 性能問題、設計の改善 | 基本的に修正 |
| 低 | スタイル、好みの問題 | 提案として伝える |
3. 効果的なレビューの進め方
3.1 レビュー依頼者のベストプラクティス
レビューを依頼する側にもベストプラクティスがある。 小さな単位でレビュー依頼することで見落としを減らし、 自己レビューを先に行って明らかなミスは自分で発見する。 変更の背景を説明することでレビュアーの理解を助け、 フィードバックには迅速に対応してレビューサイクルを短くする。
| プラクティス | 理由 |
|---|---|
| 小さな単位でレビュー依頼 | 大きな変更は見落としが増える |
| 自己レビューを先に | 明らかなミスは自分で発見 |
| 変更の背景を説明 | レビュアーの理解を助ける |
| テストを含める | 動作確認の証拠を提示 |
| 迅速にフィードバックに対応 | レビューサイクルを短く |
3.2 レビュアーのベストプラクティス
レビュアーは建設的なフィードバックを心がける。 批判ではなく改善提案として伝え、具体的に指摘する。 質問形式を活用して対話を促し、良い点も伝えることでモチベーションを向上させる。 24時間以内を目安にタイムリーに対応することも重要である。
| プラクティス | 理由 |
|---|---|
| 建設的なフィードバック | 批判ではなく改善提案 |
| 具体的に指摘 | 「ここが問題」ではなく「こうすべき」 |
| 質問形式を活用 | 「なぜこうしたか?」で対話を促す |
| 良い点も伝える | モチベーション向上 |
| タイムリーに対応 | 24時間以内を目安に |
人格攻撃、曖昧な指摘、好みの押し付けは避けるべきである。 コードに対するフィードバックであり、人への批判ではない。
3.3 コメントの書き方
レビューコメントには種類を明示することで、 修正の優先度や必要性が明確になる。 [must]は修正必須、[should]は強く推奨、[nit]は些細な指摘、 [question]は質問・確認、[praise]は称賛を示す。
| 種類 | 例 | 用途 |
|---|---|---|
| [must] | この条件だとNullPointerが発生します | 修正必須 |
| [should] | このメソッドは分割した方が良いです | 強く推奨 |
| [nit] | 変数名はuserCountの方が明確かも | 些細な指摘 |
| [question] | この処理が必要な理由は? | 質問・確認 |
| [praise] | このリファクタリングは素晴らしい! | 称賛 |
4. レビューツール
4.1 プラットフォーム
現代の開発では、GitホスティングサービスのレビA機能が広く使われている。 GitHubのPull RequestやGitLabのMerge Requestは、 インラインコメントや承認フローを提供する。 Gerritは大規模プロジェクト向けに詳細なアクセス制御を提供する。
| ツール | 特徴 |
|---|---|
| GitHub Pull Request | インラインコメント、Approve/Request changes |
| GitLab Merge Request | CI/CD統合、コードオーナー |
| Bitbucket Pull Request | Jira連携 |
| Gerrit | 詳細なアクセス制御、大規模向け |
4.2 レビュー支援機能
レビューを効率化するための機能が多数提供されている。 CODEOWNERSは特定ファイルのレビュアーを自動割り当てし、 ブランチ保護ルールはレビュー承認なしでのマージを防ぐ。 スタイルの指摘は自動化(リンター、フォーマッター)に任せ、 人間はロジック、設計、セキュリティに集中することで効率が向上する。
| 機能 | 説明 |
|---|---|
| CODEOWNERS | 特定ファイルのレビュアーを自動割り当て |
| ブランチ保護ルール | レビュー承認なしでマージ不可 |
| ステータスチェック | CI通過を必須条件に |
| 自動レビュアー割り当て | 負荷分散、ランダム割り当て |
レビューの効率化
スタイルの指摘は自動化(リンター、フォーマッター)に任せ、 人間はロジック、設計、セキュリティに集中する。 レビューすべき行数を200〜400行に抑えると効果的である。
コードレビューを学んだら、次は「5-4 CI/CDパイプライン」で 継続的インテグレーションとデプロイについて学習しよう。
[1] Fagan, M. (1976). Design and Code Inspections.
[2] Google. Google Engineering Practices Documentation.