Upgrade to Pro — share decks privately, control downloads, hide ads and more …

コードレビューで開発を加速させるAIコードレビュー

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 コードレビューで開発を加速させるAIコードレビュー

Avatar for akkiee76

akkiee76

June 02, 2024
Tweet

More Decks by akkiee76

Other Decks in Technology

Transcript

  1. #yumemi_grow • Akihiko Sato • Mobile & Backend Engineer •

    𝕏 : @akkiee76 • Speaker Deck : @akkie76 自己紹介 2
  2. #yumemi_grow 主な AI コードレビューツール • PR-Agent • CodeRabbit • Copilot

    Pull Request 7 • PR-Agent • CodeRabbit • Copilot Pull Request
  3. #yumemi_grow PR-Agent とは? Pull Request を AI でレビューを行えるツール • PRの概要作成(

    /describe ) • コードレビュー( /review ) • 改善提案( /improve ) Pull Request 作成時に実行される 🤖 8
  4. #yumemi_grow CodeRabbit とは? Pull Request を AI でレビューを行えるツール • PRの概要作成

    • コードレビュー( Line-by-line reviews ) • 対話機能( Chat with CodeRabbit ) PR-Agent と近い機能 🤖 9
  5. #yumemi_grow PR-Agent の特徴 • Single GPT-4 call • Effectively tackle

    both short and long PRs • JSON prompting strategy • Multiple git providers ◦ GitHub, Gitlab, Bitbucket • Multiple models ◦ GPT-4, GPT-3.5, Anthropic, Cohere, Llama2 10 https://github.com/Codium-ai/pr-agent?tab=readme-ov-file#why-use-pr-agent
  6. #yumemi_grow CodeRabbit の特徴 • Prompt and pattern based customizations •

    Multiple git providers ◦ GitHub, Gitlab • Multiple models ◦ GPT-4, GPT-3.5-turbo( OpenAI ) • Price( subscription ) 11 https://github.com/coderabbitai/ai-pr-reviewer
  7. #yumemi_grow PR-Agent を利用するための準備 PR-Agentを利用するためには以下を準備します。 • OpenAI API key(従量課金設定) • GitHub

    personal access token • pr-agent-review.yaml(GitHub Actions) ◦ https://github.com/Codium-ai/pr-agent/blob/main/.github/workflows/pr-agent-review.yaml GitHub Action から OpenAI API で gpt-4による レビューを行うため利用規約を必ずご確認ください https://github.com/Codium-ai/pr-agent?tab=readme-ov-file#data-privacy 12
  8. #yumemi_grow name: PR-Agent on: pull_request: types: [opened, reopened, synchronize] #

    issue_comment: workflow_dispatch: permissions: # issues: write pull-requests: write jobs: pr_agent_job: runs-on: ubuntu-latest name: Run pr agent on every pull request steps: - name: PR Agent action step id: pragent uses: Codium-ai/pr-agent@main env: GITHUB_ACTION_CONFIG.AUTO_DESCRIBE: true GITHUB_ACTION_CONFIG.AUTO_REVIEW: true GITHUB_ACTION_CONFIG.AUTO_IMPROVE: true 実行タイミングを追加 PRへの書込み権限を付与 describe, review, improve を有効にする 13
  9. #yumemi_grow jobs: pr_agent_job: env: INSTRUCTIONS: >- - 以下の観点で指摘を分類してください - Design(設計観点での指摘)

    - 単一責任の原則違反、密結合、低凝集、DRY原則違反、拡張性などの設計的な問題 - Simplicity(理解容易性、可読性観点の指摘) - ネストが多いif文、複雑な三項演算子、複雑なstream整形文、冗長なSQLなど - Naming(適切な命名判断に関する指摘) - クラス、メソッド、変数など命名が対応する内容に相応しいかどうかの指摘 - Style(コードスタイルに関する指摘) - コードスタイル・コーディング規約違反、静的解析違反、期待権限以上のアクセス修飾子 - Functionality(機能的に不具合に関する指摘) - 不具合、パフォーマンス懸念、不要なパラメータを使用 - Test(テストコードの妥当性に関する指摘) - テストコードカバレッジの保証、閾値の妥当性、テストパラメータ群の適正 - Document(Doc、コメントの妥当性に関する指摘) - 不適切、不正確、JavaDoc・KDocなどのDocは必須 - 上記の指摘観点をCategory欄に記載すること - 上記の指摘観点をprefixに付けること。例えばDesign観点の場合はDesign:とprefixを付けること steps: env: PR_REVIEWER.EXTRA_INSTRUCTIONS: ${{ env.INSTRUCTIONS }} PR_CODE_SUGGESTIONS.EXTRA_INSTRUCTIONS: ${{ env.INSTRUCTIONS }} レビュー観点の プロンプトを追加 具体的に例示する 14
  10. #yumemi_grow CodeRabbit を利用するための準備 CodeRabbit を利用するためには以下を準備します。 • アカウント作成 / GitHub 連携

    • リポジトリ設定 • レビュー対象 / Prompt 設定 https://github.com/coderabbitai/ai-pr-reviewer?tab=readme-ov-file#disclaimer 15 こちらも利用規約を必ずご確認ください
  11. #yumemi_grow var data1: String? = null var data2: String? =

    null var flag: Boolean = false var numericValue: Int = 0 private val value1 = 50 private val value2 = 100 fun process(dataA: String, dataB: String, status: Boolean, value: Int) { data1 = dataA data2 = dataB flag = status numericValue = value send(dataB) val state = if (flag) { if (value >= value1) { if (value == value2) "State1" else "State2" } else { "State3" } } else { "State4" } println("Data $dataA state is $state. Action performed with: $dataB") } private fun send(target: String) { println("Action performed with $target") } 抽象的な命名 変更可能性 ネストの深い 三項演算子 サンプルコードでPRを作成 🛠 18 多重責務関数
  12. #yumemi_grow fun process(dataA: String, dataB: String, status: Boolean, value: Int)

    { send(dataB) - val state = if (flag) { + val state = determineState(value) + println("Data $dataA state is $state. Action performed with: $dataB") +} +private fun determineState(value: Int): String { + return if (flag) { if (value >= value1) { if (value == value2) "State1" else "State2" } else { "State3" } } else { "State4" } - println("Data $dataA state is $state. Action performed with: $dataB") } Design: DataProcessorクラスのprocessメソッドは、データの処理だけでなく、状態の決定と出力も 行っています。これにより、単一責任の原則に違反しています。状態の決定ロジックを別の メソッドに分割することをお勧めします。 22
  13. #yumemi_grow -val state = if (flag) { - if (value

    >= value1) { - if (value == value2) "State1" else "State2" - } else { - "State3" - } -} else { - "State4" +val state = when { + flag && value >= value1 && value == value2 -> "State1" + flag && value >= value1 -> "State2" + flag -> "State3" + else -> "State4" } Simplicity: processメソッド内のネストされたif文は理解しにくくなっています。 状態の決定ロジックを単純化し、可読性を向上させることをお勧めします。 23
  14. #yumemi_grow -var data1: String? = null -var data2: String? =

    null -var flag: Boolean = false -var numericValue: Int = 0 +var inputDataA: String? = null +var inputDataB: String? = null +var processingFlag: Boolean = false +var numericParameter: Int = 0 Naming: クラス変数data1, data2, flag, numericValueは、それぞれが何を表しているのかが 明確ではありません。より具体的な名前に変更することをお勧めします。 24
  15. #yumemi_grow 1-7: Design: DataProcessorクラスのプロパティは、データ処理の状態を保持するために 使用されていますが、このクラスの設計が単一責任の原則に反している可能性がありま す。データの状態管理とデータ処理のロジックを分離することで、クラスの責任をより明確 にし、再利用性とテスト容易性を向上させることができます。 9-26: Functionality: processメソッド内でsendメソッドが呼び出されていますが、sendメ

    ソッドの呼び出し条件がdataBの値に依存しているため、特定のデータに対してのみアク ションを実行するという要件がある場合、この設計では対応できません。sendメソッドの呼 び出しを条件分岐内で行うなど、より柔軟に対応できる設計を検討することをお勧めしま す。 27
  16. #yumemi_grow AI コードレビューまとめ(所感) 29 PR-Agent CodeRabbit 精度 ◯ ◯ 処理速度

    ◯ △ 安定性 ◯ △* 柔軟性 △ ◯ コスト △(従量課金) ◯(サブスク) * 独自アルゴリズムでレビューが簡易化されることがある