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

Copilot Agentを普段使いしてわかった、バックエンド開発で使えるTips

Avatar for ykagano ykagano
June 17, 2025

Copilot Agentを普段使いしてわかった、バックエンド開発で使えるTips

2025/06/13 BASE株式会社 AI勉強会 発表資料

Avatar for ykagano

ykagano

June 17, 2025
Tweet

More Decks by ykagano

Other Decks in Technology

Transcript

  1. © 2012-2025 BASE, Inc. 2 氏名:加賀野 祐(ykagano) 所属:Cartチーム 業務:バックエンド エンジニア 趣味:お酒、旅行、キャンプ

    BASEは2024年8月入社です 入社前は以下の決済サービスを開発してました - 2009年〜:NET CASH - 2012年〜:WebMoney - 2017年〜:Yahoo!ウォレット、PayPay ykagano 自己紹介
  2. © 2012-2025 BASE, Inc. アジェンダ 3 • Copilotの使い方 • coding

    • unittest • コード生成のおすすめ • 伝えたいこと
  3. © 2012-2025 BASE, Inc. IDEでの使い方 5 以前はPHPStormで手動コーディングしてましたが、今は以下のように使ってます ▪PHPStorm Ask Modeで質問をして、手動コーディングしてます

    ▪VSCode CopilotにVibe Codingしてもらった後、PHPStormで手動実装して仕上げてます PHPStormでもAgent Modeは使えますが、VSCodeほどCustom Instructionsの仕様が洗練されていないのと VSCodeだと Claude Sonnet 4 が使えるためです(PHPStormでは使えない)
  4. © 2012-2025 BASE, Inc. Custom Instructionsで前提情報を与える 6 backendリポジトリにはCustom Instructions(前提情報)ファイルがあります -

    copilot-instructions.md - 自動で読み込まれる前提情報です。プロジェクトの概要など汎用的な内容を記載しています - coding.instructions.md - ガイドラインに沿って実装します - unittest.instructions.md - Cartのガイドラインに合わせた単体テストが実装できます - codereview.instructions.md - GitHubのMCPサーバーと連携して観点に沿ったコードレビューをします 今日はこちらの coding と unittest でのCopilot Agentへの指示について話します Custom InstructionsについてはVSCodeのドキュメント参照 https://code.visualstudio.com/docs/copilot/copilot-customization
  5. © 2012-2025 BASE, Inc. codingのプロンプト例 8 # タスクの概要 〇〇の下記コードによる判定が、複数のクラスから使用される処理のため、共通クラスに切り出したいです ##

    要件 - 関連する既存コードを確認した上で実装してください - /{パス名}/ に作成してください - まずfeatureNameを定義するenum定義のNewFeatureNameクラスを作成してください - 次に判定を行うDecideNewFeatureAvailableShopServiceクラスを作成してください - userIdとfeatureNameを受け取って判定結果を返すようにしてください ## 制約条件 - 新規クラスの作成のみで影響するコードは修正しないでください ## 関連情報 以下、該当コード # タスクの概要 ## 要件 - ## 制約条件 - ## 関連情報 テンプレート
  6. © 2012-2025 BASE, Inc. codingのデモ動画(約2分) 9 ▪自動読み込み coding.instructions.md のヘッダには「applyTo: "**/*.php",

    !**/*Test.php"」と書いて ます これがあると読み込んでく れます ▪並行作業 下のディスプレイでコード を生成している間に 上のディスプレイで他の実 装をしたり別の作業をした りしています ▪関連ファイル 今開いているファイルは自 動的に読み込まれます それ以外の関連ファイルは コンテキストから事前に与 えておくとCopilotが読みに 行かないので効率的です ▪AIにまかせる 指示した後、自分が他の作 業をしている間にAIが進め てくれるため、実装の ファーストステップはAIに まかせましょう 動画は割愛します 🙏
  7. © 2012-2025 BASE, Inc. この後更に指示をします 10 # タスクの概要 以下の修正を行ってください ##

    要件 - NewFeatureNameはcaseの定義のみにしてください、メソッドは不要です - DecideNewFeatureAvailableShopServiceはisFeatureAvailableメソッドをhandleにrenameしてください - handleメソッド以外は削除してください ## 制約条件 - 指示された修正以外は行わないでください ここまで修正したら後は自分で修正します # タスクの概要 ## 要件 - ## 制約条件 - ## 関連情報 テンプレート
  8. © 2012-2025 BASE, Inc. unittestの対象クラス 12 /** * 新機能利用可能ショップの判定を行うサービスクラス */

    class DecideNewFeatureAvailableShopService { public function __construct( private ShopRepositoryInterface $shopRepository, private NewFeatureAvailableShopRepositoryInterface $newFeatureAvailableShopRepository, ) { } /** * 指定されたユーザーIDと機能名で、機能利用可能か判定する */ public function handle(UserId $userId, NewFeatureAvailableShop $featureName): bool { $shop = $this->shopRepository->findOrFail($userId->toInt()); return $this->newFeatureAvailableShopRepository->haveShop($shop->getShopId()->toString(), $featureName->value); } }
  9. © 2012-2025 BASE, Inc. unittestのデモ動画(約2分) 13 ▪LLM Claude 3.7 Sonnetを使っ

    ているのは、Claude Sonnet 4の推論が強く、 テストが通らない時にどこ までも原因を調査したり、 テストをスキップする実装 をしたからです ▪テストが通らない場合 途中で止めてください 止めた後、具体的な修正内 容を指示するのも良いと思 います ▪プロンプト例 〇〇クラスを検証する 〇〇Testクラスを 作成してください、 とこれぐらいシンプルな 指示で大丈夫です ▪自動読み込み unittestはヘッダに applyToを書いても読み込ん でくれないことがあります そのため、最初に手動で指 示ファイルに追加してます 動画は割愛します 🙏
  10. © 2012-2025 BASE, Inc. Copilotが有料化予定です 15 1アカウントの1月あたり 300プレミアムリクエストです 右図はプレミアムリクエストの 係数です

    GPT-4.5だと係数が50のため 6回しか指示できません https://docs.github.com/ja/copilot/managing-copilot/monitoring-usag e-and-entitlements/about-premium-requests
  11. © 2012-2025 BASE, Inc. Agent Modeで1〜3ファイルずつ生成する 16 Copilotが有料化することもあってあまり無駄撃ちはできなくなりました また複数ファイルを編集してもらうと、望んでいた実装とは違う実装がされてしまった場合に 取り戻すことが難しくなります(再実装はできますが・・・)

    そのため、ある程度小さい単位で1〜3ファイルずつ生成するのが良いと思います 1〜3ファイルの生成でもAgentは関連するファイルを確認した後、実装するため、 複数回のプレミアムリクエストが実行されていると思います ロケットの放物線がちょっとずれただけで 到達点が大きく変わってしまう画像
  12. © 2012-2025 BASE, Inc. 最後に 19 Copilot Agentを スタンダードに利用できるよう Custom

    Instructionsの精度向上に ご協力お願いします🙏 PRお待ちしてます!
  13. © 2012-2025 BASE, Inc. coding.instructions.md の主な指示 22 - 基本的なガイドラインに準拠 -

    PSR12準拠 - PHP CodeSnifferのルールに準拠 - 新規ファイルと既存ファイルでルールを分けています - 既存ファイルを修正する場合 - 既存のコードのトーン&マナーに合わせてください - 新規ファイルを作成する場合 - 既存のコードのトーン&マナーに合わせないでください
  14. © 2012-2025 BASE, Inc. unittest.instructions.md の主な指示 23 - Cartのユニットテストのガイドラインに準拠 -

    arrange, act, assertionを記載する - DataProviderを用意するときはケース毎にメッセージを設定する - Assert、Mockの書き方 - 基本的にはAssertSameを使用する - プライベートメソッドはMock化しない、Mockは共通化する、等 - テストコードの作成後、テストを実行する - 実行結果が失敗していれば修正する
  15. © 2012-2025 BASE, Inc. codereview.instructions.md の主な指示 24 Ogaさんが作ってくれました コードレビューの手順 1.

    まずは変更が加えられたファイルの一覧を確認してください。 2. 次に変更差分を取得して、どのような対応がされているかを解説してください。 3. 変更差分について、以下の「コードレビューの観点」の項目について◦△×で評価して表にしてください。 4. テストクラスに実装されているテストケースを列挙してください。不足しているテストがあれば指摘してくだ さい。 5. 特に解説が必要な項目について、詳細な説明と改善案を提案してください。 6. 修正を加えたファイル全体を通してリファクタリングする余地があれば、その具体実装を提案してください。
  16. © 2012-2025 BASE, Inc. Custom Instructionsの今後 28 以下検討中です(現在は汎用的な内容にするためやっていない部分も) - 役割を割り当てる

    - 優秀なバックエンドエンジニアとか - 熟考させ、かつ思考の過程を声に出させる - 処理に時間がかかりそう - Custom Instructionsをスリム化する - 特にunittestが雑然としてきているのでスリム化したい
  17. © 2012-2025 BASE, Inc. プロンプトジェネレータ 31 ここで例に上げた指示の一部で生成してもらいました 「〇〇の下記コードによる判定が、複数のクラスから使用される処理のため、共通クラスに切り出したいです」 あなたは、〇〇 クラスのコードの一部をリファクタリングすることを課せられています。

    目標は、複数のクラスで使用される共通のロジックを、再利用可能な別のクラスに抽出することです。 以下の手順に従って、タスクを完了させてください: 1.まず、〇〇 クラスの以下のコード・スニペットを調べます: <code_snippet> {{CODE_SNIPPET}} </code_snippet> 2.コードを分析し、複数のクラスで使用されていると思われるロジックを特定します。 条件文、計算、データ変換など、一般的で広く適用できそうなものには特に注意してください。 3.分析に基づいて、再利用可能なロジックをカプセル化する新しい共通クラスを設計します。 以下のことを考慮する: - 目的を反映した適切なクラス名を選択する。 - このクラスに含めるべきメソッドを決定する - これらのメソッドが受け取るべきパラメータを決める - これらのメソッドが返すべきものを考える 4.特定された共通ロジックを新しいクラスに移動して、元のコードをリファクタリングする。 新しいクラスが自己完結型で、 CreateOrderUseCase の特定の実装の詳細に依存しないことを確認します。 5.リファクタリングのプロセスについて説明してください: - コードの特定の部分を抽出することにした理由 - 新しい共通クラスがコードの再利用性をどのように向上させるか。 - この新しいクラスを使用する際の潜在的な課題や考慮事項があれば教えてください。 6.リファクタリングされたコードを提供してください: - 新しい共通クラス - 共通クラスを使用するようになった、更新された 〇〇 クラス (またはその関連部分 ) 7.他のクラスがこの新しい共通クラスをどのように使用するかの例を示し、その再利用性を示す。 以下の形式で回答してください: <analysis> コードの分析と再利用可能なロジックの特定 </analysis> <refactoring_explanation> リファクタリングプロセスの説明 </refactoring_explanation> <refactored_code> 新しい共通クラスと更新された CreateOrderUseCaseコード </refactored_code <usage_examples> 他のクラスが新しい共通クラスをどのように使うかの例 </usage_examples> リファクタリング中は、以下のコンテキストを考慮することを忘れないでください: <context> {{CONTEXT}} </context> コード修正のプロンプトもこれぐらい書くのが理想的なのかも