Slide 1

Slide 1 text

© 2012-2025 BASE, Inc. 2025/06/13 AI勉強会 Copilot Agentを普段使いしてわかった、 バックエンド開発で使えるTips 1

Slide 2

Slide 2 text

© 2012-2025 BASE, Inc. 2 氏名:加賀野 祐(ykagano) 所属:Cartチーム 業務:バックエンド エンジニア 趣味:お酒、旅行、キャンプ BASEは2024年8月入社です 入社前は以下の決済サービスを開発してました - 2009年〜:NET CASH - 2012年〜:WebMoney - 2017年〜:Yahoo!ウォレット、PayPay ykagano 自己紹介

Slide 3

Slide 3 text

© 2012-2025 BASE, Inc. アジェンダ 3 ● Copilotの使い方 ● coding ● unittest ● コード生成のおすすめ ● 伝えたいこと

Slide 4

Slide 4 text

© 2012-2023 BASE, Inc. Copilotの使い方 4

Slide 5

Slide 5 text

© 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では使えない)

Slide 6

Slide 6 text

© 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

Slide 7

Slide 7 text

© 2012-2023 BASE, Inc. coding 7

Slide 8

Slide 8 text

© 2012-2025 BASE, Inc. codingのプロンプト例 8 # タスクの概要 〇〇の下記コードによる判定が、複数のクラスから使用される処理のため、共通クラスに切り出したいです ## 要件 - 関連する既存コードを確認した上で実装してください - /{パス名}/ に作成してください - まずfeatureNameを定義するenum定義のNewFeatureNameクラスを作成してください - 次に判定を行うDecideNewFeatureAvailableShopServiceクラスを作成してください - userIdとfeatureNameを受け取って判定結果を返すようにしてください ## 制約条件 - 新規クラスの作成のみで影響するコードは修正しないでください ## 関連情報 以下、該当コード # タスクの概要 ## 要件 - ## 制約条件 - ## 関連情報 テンプレート

Slide 9

Slide 9 text

© 2012-2025 BASE, Inc. codingのデモ動画(約2分) 9 ■自動読み込み coding.instructions.md のヘッダには「applyTo: "**/*.php", !**/*Test.php"」と書いて ます これがあると読み込んでく れます ■並行作業 下のディスプレイでコード を生成している間に 上のディスプレイで他の実 装をしたり別の作業をした りしています ■関連ファイル 今開いているファイルは自 動的に読み込まれます それ以外の関連ファイルは コンテキストから事前に与 えておくとCopilotが読みに 行かないので効率的です ■AIにまかせる 指示した後、自分が他の作 業をしている間にAIが進め てくれるため、実装の ファーストステップはAIに まかせましょう 動画は割愛します 🙏

Slide 10

Slide 10 text

© 2012-2025 BASE, Inc. この後更に指示をします 10 # タスクの概要 以下の修正を行ってください ## 要件 - NewFeatureNameはcaseの定義のみにしてください、メソッドは不要です - DecideNewFeatureAvailableShopServiceはisFeatureAvailableメソッドをhandleにrenameしてください - handleメソッド以外は削除してください ## 制約条件 - 指示された修正以外は行わないでください ここまで修正したら後は自分で修正します # タスクの概要 ## 要件 - ## 制約条件 - ## 関連情報 テンプレート

Slide 11

Slide 11 text

© 2012-2023 BASE, Inc. unittest 11

Slide 12

Slide 12 text

© 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); } }

Slide 13

Slide 13 text

© 2012-2025 BASE, Inc. unittestのデモ動画(約2分) 13 ■LLM Claude 3.7 Sonnetを使っ ているのは、Claude Sonnet 4の推論が強く、 テストが通らない時にどこ までも原因を調査したり、 テストをスキップする実装 をしたからです ■テストが通らない場合 途中で止めてください 止めた後、具体的な修正内 容を指示するのも良いと思 います ■プロンプト例 〇〇クラスを検証する 〇〇Testクラスを 作成してください、 とこれぐらいシンプルな 指示で大丈夫です ■自動読み込み unittestはヘッダに applyToを書いても読み込ん でくれないことがあります そのため、最初に手動で指 示ファイルに追加してます 動画は割愛します 🙏

Slide 14

Slide 14 text

© 2012-2023 BASE, Inc. コード生成のおすすめ 14

Slide 15

Slide 15 text

© 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

Slide 16

Slide 16 text

© 2012-2025 BASE, Inc. Agent Modeで1〜3ファイルずつ生成する 16 Copilotが有料化することもあってあまり無駄撃ちはできなくなりました また複数ファイルを編集してもらうと、望んでいた実装とは違う実装がされてしまった場合に 取り戻すことが難しくなります(再実装はできますが・・・) そのため、ある程度小さい単位で1〜3ファイルずつ生成するのが良いと思います 1〜3ファイルの生成でもAgentは関連するファイルを確認した後、実装するため、 複数回のプレミアムリクエストが実行されていると思います ロケットの放物線がちょっとずれただけで 到達点が大きく変わってしまう画像

Slide 17

Slide 17 text

© 2012-2023 BASE, Inc. 伝えたいこと 17

Slide 18

Slide 18 text

© 2012-2025 BASE, Inc. ご確認 18 backendリポジトリで Custom Instructionsを使っている方 挙手お願いします󰢧 Meetの挙手ボタンを押してください

Slide 19

Slide 19 text

© 2012-2025 BASE, Inc. 最後に 19 Copilot Agentを スタンダードに利用できるよう Custom Instructionsの精度向上に ご協力お願いします🙏 PRお待ちしてます!

Slide 20

Slide 20 text

© 2012-2023 BASE, Inc. Appendix 20

Slide 21

Slide 21 text

© 2012-2023 BASE, Inc. 現在のCustom Instructionsの 主な指示 21

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

© 2012-2025 BASE, Inc. unittest.instructions.md の主な指示 23 - Cartのユニットテストのガイドラインに準拠 - arrange, act, assertionを記載する - DataProviderを用意するときはケース毎にメッセージを設定する - Assert、Mockの書き方 - 基本的にはAssertSameを使用する - プライベートメソッドはMock化しない、Mockは共通化する、等 - テストコードの作成後、テストを実行する - 実行結果が失敗していれば修正する

Slide 24

Slide 24 text

© 2012-2025 BASE, Inc. codereview.instructions.md の主な指示 24 Ogaさんが作ってくれました コードレビューの手順 1. まずは変更が加えられたファイルの一覧を確認してください。 2. 次に変更差分を取得して、どのような対応がされているかを解説してください。 3. 変更差分について、以下の「コードレビューの観点」の項目について○△×で評価して表にしてください。 4. テストクラスに実装されているテストケースを列挙してください。不足しているテストがあれば指摘してくだ さい。 5. 特に解説が必要な項目について、詳細な説明と改善案を提案してください。 6. 修正を加えたファイル全体を通してリファクタリングする余地があれば、その具体実装を提案してください。

Slide 25

Slide 25 text

© 2012-2023 BASE, Inc. プロンプトエンジニアリング 25

Slide 26

Slide 26 text

© 2012-2025 BASE, Inc. プロンプトエンジニアリング 26 Anthropicの開発者ガイドにプロンプトエンジニアリングについて記載がありますので 興味がある方は一読ください https://docs.anthropic.com/ja/docs/build-with-claude/prompt-engineering/overview またプロンプトエンジニアリングのチュートリアルも公開されています https://github.com/anthropics/prompt-eng-interactive-tutorial チュートリアルの説明はNotebookLMにも入れましたので、こちらで大枠は掴めます https://notebooklm.google.com/notebook/3f62bc0d-6323-4f36-80ea-a940a87348b0

Slide 27

Slide 27 text

© 2012-2025 BASE, Inc. 参考:NotebookLMでのチュートリアルの概要 27

Slide 28

Slide 28 text

© 2012-2025 BASE, Inc. Custom Instructionsの今後 28 以下検討中です(現在は汎用的な内容にするためやっていない部分も) - 役割を割り当てる - 優秀なバックエンドエンジニアとか - 熟考させ、かつ思考の過程を声に出させる - 処理に時間がかかりそう - Custom Instructionsをスリム化する - 特にunittestが雑然としてきているのでスリム化したい

Slide 29

Slide 29 text

© 2012-2023 BASE, Inc. プロンプトジェネレータ 29

Slide 30

Slide 30 text

© 2012-2025 BASE, Inc. プロンプトジェネレータ 30 Anthropicがプロンプトジェネレータを公開しています(要課金) https://docs.anthropic.com/ja/docs/build-with-claude/prompt-engineering/prompt-generator やってもらいたいタスクを入力すると、効果的に指示するためのプロンプトを生成してくれます

Slide 31

Slide 31 text

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