ユニット 4 / 12

コードレビュー、リファクタリング、および技術的負債

利益:

  • AI をコードレビューの第二の目として使用して、可読性、ロジック、セキュリティを確保する能力
  • 複雑なコードの動作を中断することなく、AI サポートを利用してリファクタリング手順を計画する機能
  • AI のレビューを検証し、テストとバージョン管理の比較により推奨事項を編集する機能

ソフトウェア エンジニアリングでは、コードは作成されるよりも読み取られることが多くなります。コード行は 1 回書かれますが、数か月にわたって何十回も読み取られ、変更され、構築されます。そのため、コード レビュー (ロジック、可読性、セキュリティについて他人または自分のコードをレビューする) とリファクタリング (動作を変更せずにコードの構造を改善する) がエンジニアリングの中心となります。 AI は、これら 2 つのタスクにとって強力な「第 2 の目」になります。可読性をすぐに示唆し、見落とされているロジックとセキュリティの問題を指摘し、大規模なリファクタリングを小さな安全なステップに分割します。ただし、重要なルールがあります。リファクタリングによって動作が変更されるべきではなく、これを保証する唯一の方法はテストです。

この単元では、コード レビューに構造化された方法で AI を使用する方法、動作を壊さずに複雑なコードを修正する方法、および技術的負債 (迅速だがコストのかかるコードの決定) を管理する方法について説明します。

概念: 技術的負債: スピードのために今日行われたコードの決定により、将来のメンテナンスが困難になります。コード臭: それ自体はエラーではないが、問題を示すパターン (長すぎる関数、反復コード)。回帰: 変更により、以前は機能していたものが壊れる場合。

構造化コードレビューでの AI の使用

時間が限られている場合は、最もリスクの高い問題に焦点を当てる必要があります。自動フォーマッタは、インデントやスペースなどの書式設定の問題を処理します。人間の注意をロジック、セキュリティ、およびエッジケースの動作に注ぐ必要があります。 AI にレビューしてもらうときは、単純なレビューの集中砲火ではなく、優先順位を付けたリストを要求してください。

  1. 範囲を与えてください。どのようなコードで、何を実行するか、どのようなコンテキストで機能するか。
  2. 優先軸を指定します。正確さとセキュリティが第一、読みやすさは二の次です。
  3. 具体的な修正を求めます。それぞれの結果に対する「問題の理由」と「推奨される修正方法」。
  4. 調査結果を確認します。 AI は誤検知も生成します。それぞれの結果をコードとテストに照らして検証します。

構造化されたレビュー プロンプト: 「上級エンジニアのように次の機能を調べます。結果を重要度の順にリストし、次のタグでマークします: [CRITICAL] ロジック/セキュリティ、[MEDIUM] エッジ ケース/パフォーマンス、[LOW] 可読性/名前。各結果について: なぜ質問するか、具体的な修正案。書式設定/インデントの問題はスキップしないでください。自動ツールが処理します。 コード: [コード]」

セキュリティに重点を置いたレビュー プロンプト: 「このコードはセキュリティ目的でのみレビューしてください: 入力検証の欠如、インジェクションのリスク、認可制御の欠如、機密情報の漏洩、安全でないデフォルト。各結果に攻撃シナリオの例を追加します。セキュリティ上の問題がない場合は、「重大なセキュリティ上の問題は見つかりませんでした」と明確に述べてください。コード: [コード]"

注意: AI が「問題なし」と言ったからといって、問題がないことを証明するものではありません。 AI は偽陰性を生成する可能性があります。実際のセキュリティ問題を回避できます。 AI レビューは人間によるレビューとセキュリティ テストに代わるものではなく、補足します。セキュリティ クリティカルなコードでは、有能なエンジニアが最終決定権を持ちます。

テスト保存されたリファクタリング

リファクタリングの黄金律: 最初にテストし、後で変更します。コードを修正する前に、現在の動作をロックするテストを行って、変更によって何かが壊れたかどうかをすぐに知る必要があります。 AI リファクタリングを行うときは、順序を崩さないでください。

  1. 現在の行動をテストしてみましょう。それ以外の場合は、AIに「特性評価テスト」(現在の行動をそのまま捉えるテスト)を作成してもらいます。
  2. 少しずつ修正してください。テストはすべてのステップで緑色を維持する必要があります。
  3. 各ステップの後に実行します。退行を早期に発見します。

安全なリファクタリング計画のプロンプト: 「次の 60 行の関数は、実行することが多すぎて読みにくいです。動作を変更せずにリファクタリングしたいです。最初に: 現在の動作をロックダウンするために必要なテスト ケースをリストします。次に: リファクタリングを小さなステップに分割し、それぞれのステップはテストがグリーンの間に実行できます。まだコードを書かずに、最初に計画を示してください。コード: [コード]」

弱いプロンプト / 強いプロンプト

弱み: 「このコードを改善してください。」 (結果: 何を改善すべきか不明。AI は任意の変更を加え、サイレントに動作を変更する可能性があります。) STRONG: 「可読性を高めるために、この支払い計算関数をリファクタリングします。制約: 動作はまったく同じでなければなりません。戻り値は変更してはなりません。long 関数を意味のあるユーティリティ関数に分割し、マジック ナンバーを名前付き定数に増やします。変更点を項目ごとにリストし、各項目が動作を変更しない理由を説明します。コード: [コード]」

強力なプロンプトは、「動作はまったく同じでなければならない」という制約と、何を改善する必要があるかを明確に示します。この制約がなければ、AI は「改善」の名のもとにロジックを変更し、静かな後退を引き起こす可能性があります。

技術的負債の管理

アプローチ

短期的には

長期的には

借金を無視して

早い進歩

メンテナンスが麻痺し、チームの速度が低下

すべてを書き直す

常駐機能の開発

リターンは不確実、リスクは高い

測定され、テストで保護されたリファクタリング

軽度の減速

持続可能なスピード

最も健全な方法は 3 番目です。負債を可視化し (リストで追跡し)、最も痛むところから始めて、各修正をテストして検証します。 AI は債務項目を特定して優先順位を付けるのに役立ちますが、どの債務を支払うかはビジネス上の決定です。

ミニケース

ケース 1 — サイレント回帰。開発者はAIに「この機能を単純化してください」と指示します。 AI が条件を誤って変換し、リターンの計算が壊れます。テストが行​​われていないため、顧客の苦情により 3 週間後にエラーが発生します。チームは、最初に特性評価テストを作成することで同じ仕事を行い、最初の実行時に赤色のテストでエラーを検出します。

ケース 2 — 有用な第二の目。 AI はコード レビューで、ユーザーの承認がサーバー上ではなくインターフェース内でのみチェックされていることを認識します。これは不正アクセスの脆弱性です。エンジニアはサーバー側の認証チェックを追加します。 AI検査は実際のセキュリティインシデントを防ぎます。

ケース 3 — 誤検知。 AI は「この変数は決して使用されないので、削除してください」と言います。ただし、可変反射メカニズムを通じて間接的に使用されます。エンジニアが提案をテストに対して検証しなかった場合、その提案は削除され、実行時エラーが発生します。 AI のあらゆる発見は実装前に確認する必要があります。

よくある間違い

  • テストを行わないリファクタリング。動作を確実に保持するためには何も残されていません。
  • AI の結果を検証せずに適用する。偽陽性と偽陰性の両方が発生します。
  • フォーマットの問題で人間の時間を無駄にしている。自動化ツールで解決できるタスクに焦点を当てると、実際のリスクが見えにくくなります。
  • 「問題ありません」という回答を保証します。 AI は脆弱性を回避できます。人間によるレビューが必要です。
  • 借金を一度に全額返済しようとしています。大規模な書き換えにはリスクが伴います。テストによって測定および保護されているステップが優先されます。

要約すれば

コードのレビューとリファクタリングによって、コードの寿命が決まります。 AI は強力な第 2 の目であり、計画ジェネレータであり、優先順位付けされた調査結果、セキュリティ シナリオ、およびスモールステップのリファクタリング計画を提供します。ただし、リファクタリングによって動作が変更されるべきではなく、これを保証できるのはテストだけです。 AI のすべての結果をコードとテストに照らして検証します。 「問題ありません」という答えを証拠として受け取らないでください。技術的負債を可視化し、慎重かつテストで保護された手順で負債を返済します。

アプリケーションタスク

40 ~ 70 行の、やや複雑な関数を作成します (または AI に生成させます)。まず、構造化されたレビューのプロンプトに従い、結果を [CRITICAL]/[MEDIUM]/[LOW] に並べ替えます。少なくとも 1 つの検出結果をコードに対して手動で検証します。次に、安全なリファクタリング計画のプロンプトが表示されたら、最初に特性評価テストを生成して実行し、次にリファクタリングを小さなステップで適用し、各ステップでテストが緑色のままであることを確認します。

チェックリスト

  • [ ] レビューを優先度タグ (重大/中/低) で構造化しました。
  • [ ] コード/テストに対して少なくとも 1 つの AI 結果を検証しました。
  • [ ] リファクタリングの前に現在の動作をテストしました。
  • [ ] 小さなステップで変更を加え、各ステップでテストを実行しました。
  • [ ] プロンプトで「動作は同じでなければならない」という制約を指定しました。
  • [ ] セキュリティに関する調査結果には人による確認が必要であることを確認しました。