EzoAI Course Catalog
Course 05 / Layer 1 -- ツール基礎

GitHub Copilot基礎

GitHub CopilotはIDE上でAIがコードを提案する最もポピュラーなAI開発ツールです。心理的ハードルの低い入口から始めて、コメントドリブン開発、テスト自動生成まで。「こうやると、こう返ってくる」を体で覚える因果関係体験型のコースです。

初級-中級約8時間(480分)9 Sections + 2 Reviewハンズオン比率 61%

目次

  1. GitHub Copilotとは 45min
  2. コード補完 50min
  3. Copilot Chat 50min
  4. 復習A -- 補完+Chatで小機能実装 25min
  5. インラインチャット 50min
  6. コメントドリブン開発 50min
  7. 復習B -- コメント設計から実装まで 25min
  8. テスト生成とリファクタリング 50min
  9. セキュリティとガバナンス 40min
  10. トレンド 20min
  11. 総合ハンズオン: CLIツール完成 75min
Section 01 -- 45min(講義30 + ハンズオン15)

GitHub Copilotとは

GitHub Copilot公式ページ

GitHub Copilot公式ページ。個人開発者からEnterprise向けまで幅広いプランを提供している

概要

GitHub CopilotはGitHubとMicrosoftが提供するAIコード補完ツールです。エディタ上で書いているコードの文脈を読み取り、次に書くべきコードをリアルタイムに提案してくれます。2021年のテクニカルプレビューから始まり、現在はプロの開発者にとって日常ツールの地位を確立しました。

仕組み

Copilotはコードの文脈を集めてLLMに送り、次に来るコードを予測します。文脈として使われるのは、現在開いているファイルのカーソル周辺コード、エディタで開いている他のタブ、隣接するファイル、そしてコメントです。これらの情報を組み合わせて、可能な限り意図に沿ったコードを生成しようとします。

%%{init:{'theme':'dark','themeVariables':{'primaryColor':'#00A5BF','primaryBorderColor':'#007A8F','primaryTextColor':'#e8e8e8','lineColor':'#00A5BF','secondaryColor':'#1a1a1a','background':'#141414','mainBkg':'#1a1a1a','nodeBorder':'#00A5BF'}}}%%
graph LR
  A["現在のファイル
(カーソル位置)"] --> D["Copilot LLM"] B["開いているタブ
(隣接ファイル)"] --> D C["コメント
(自然言語の意図)"] --> D D --> E["コード提案
(ゴーストテキスト)"] E --> F["Tab: 受入れ"] E --> G["Esc: 拒否"]
Copilotの基本動作フロー。複数のコンテキストからコード提案を生成する

プラン比較

プラン価格補完Chat特徴
Free$0月2,000回月50回個人利用の入口。GitHubアカウントがあればすぐ使える
Pro$10/月無制限無制限個人開発者の標準。Agent Mode対応
Business$19/月無制限無制限組織管理、ポリシー設定、IP補償
Enterprise$39/月無制限無制限全機能。カスタムモデル、Bing検索統合

対応IDE

Copilotが使えるIDEは幅広く揃っています。

インストールと認証

VS Codeでの導入は2ステップで完了します。拡張機能マーケットプレイスで「GitHub Copilot」を検索してインストールし、GitHubアカウントで認証するだけです。認証が完了するとステータスバーにCopilotのアイコンが表示され、コード補完が動き始めます。

Freeプランの制限事項(詳細)

機能Freeプランの制限Pro以上
コード補完月2,000回まで(超過後は翌月までリセット待ち)無制限
Copilot Chat月50メッセージまで無制限
Copilot Edits利用不可利用可
Agent Mode利用不可Pro以上で利用可
モデル選択デフォルトモデルのみGPT-4o、Claude Sonnet等を選択可
パブリックコードフィルター有効(変更不可)管理者が設定可

1日あたりに換算すると約66回の補完と1.6回のChat。「触ってみる」には十分ですが、終日コーディングする使い方だと半日持ちません。業務利用を検討するなら、Free期間で機能を確認してからProに移行する流れが合理的です。

Tips: GitHub Education
学生はGitHub Education経由で無料でPro相当の機能を使えます。教育機関のメールアドレスがあれば申請可能です。

理解度チェック: Section 01

Q1. Copilotがコード提案の精度を高めるために参照するコンテキストとして正しくないものはどれですか?

正解: C。Copilotはエディタで開いているファイルとコメントをコンテキストとして使いますが、Gitの全履歴を走査するわけではありません。
ハンズオン: セットアップと初めてのサジェスト 15min
目標: Copilot拡張をインストールし、最初のコード提案を体験する

Step 1: VS Code拡張のインストール(3min)

  1. VS Codeの拡張機能パネルを開きます(Ctrl+Shift+X / Cmd+Shift+X)
  2. 検索欄に「GitHub Copilot」と入力してください
  3. 「GitHub Copilot」と「GitHub Copilot Chat」の2つをインストールします

Step 2: GitHubアカウント認証(3min)

  1. インストール後、右下に認証を求める通知が表示されます
  2. 「Sign in to GitHub」をクリックし、ブラウザで認証を完了してください
  3. ステータスバーにCopilotアイコンが表示されれば成功です

Step 3: 初めてのサジェスト(4min)

  1. 新規ファイルを作成し、言語モードを「JavaScript」に設定してください
  2. 以下のコードを入力します
function add(a, b) {

灰色のゴーストテキストが表示されたら、それがCopilotの提案です。Tabキーで受け入れてください。

Step 4: 受入れと拒否の練習(5min)

  1. 以下の関数名を1つずつ入力し、サジェストを確認してください
function subtract(a, b) { function multiply(a, b) { function divide(a, b) { function isEven(n) { function reverseString(str) {
サジェストが表示されない場合

ステータスバーのCopilotアイコンを確認してください。スラッシュの入ったアイコンは無効状態です。アイコンをクリックして「Enable Globally」を選択します。それでも表示されない場合はVS Codeを再起動してみてください。

参考リンク

Section 02 -- 50min(講義20 + ハンズオン30)

コード補完

Copilotのインラインサジェスト

インラインサジェストの仕組み

コードを入力すると、Copilotが灰色のゴーストテキストとして次のコードを提案します。これがインラインサジェストです。提案はリアルタイムで変化し、入力内容に応じて候補が更新されます。

キー操作

操作Windows / LinuxmacOS説明
受入れTabTab提案全体を受け入れる
拒否EscEsc提案を破棄する
次の候補Alt + ]Option + ]別の提案候補に切り替え
前の候補Alt + [Option + [1つ前の候補に戻る
単語単位受入れCtrl + →Cmd + →提案を1単語ずつ受け入れる

サジェスト品質を上げるコツ

受入れ/拒否の判断基準

Copilotの提案を無条件に受け入れるのは危険です。以下の3点を毎回確認する習慣をつけてください。

  1. ロジックは正しいか -- 提案されたアルゴリズムが意図した動作をするか
  2. セキュリティリスクはないか -- ハードコードされたシークレット、SQLインジェクション、XSSの可能性
  3. コーディング規約に合っているか -- チームのルールに反していないか

補完が効きやすいパターンと効きにくいパターン

効きやすい(高精度)

  • 定型的なCRUD操作
  • 標準的なアルゴリズム(ソート、検索、変換)
  • ライブラリのよくある使い方(Express、React等)
  • テストコード(関数名とimportから推測しやすい)
  • TypeScriptで型定義がある場合
  • コメントで意図を明示した直後のコード

効きにくい(低精度)

  • 社内独自のビジネスロジック
  • 外部APIの固有パラメータ(ドキュメント未公開の場合)
  • 複雑な状態管理(条件が5つ以上絡む分岐)
  • データベースのスキーマ固有のクエリ
  • 型のないJavaScriptで曖昧な変数名のコード
  • プロジェクト固有の規約(社内命名規則など)

型情報が補完精度に与える影響

TypeScriptの型定義はCopilotにとって最も確実な文脈情報です。同じ機能でも、型の有無で提案の精度が変わります。

JavaScript(型なし)

// 何が返るか曖昧。Copilotも推測に頼る function getUser(id) {

引数の型も戻り値の型もわからないため、Copilotは一般的なfetchパターンを提案しがち。実際のデータ構造と合わない場合が多い。

TypeScript(型あり)

interface User { id: number; name: string; email: string; role: 'admin' | 'user'; } async function getUser(id: number): Promise<User> {

引数と戻り値の型が明確なため、Copilotはfetch後のレスポンスの型変換やエラーハンドリングまで正確に提案できる。

注意: Copilotは「それっぽいコード」を生成する
LLMの特性上、文法的に正しいが論理的に間違っているコードを提案することがあります。特にエッジケースの処理や、ビジネスロジック固有の条件分岐で間違いが起きやすいため、受け入れた後のレビューは必須です。

理解度チェック: Section 02

Q2. Copilotのサジェスト品質を上げる方法として最も効果的なのはどれですか?

正解: C。Copilotは開いているファイルの文脈や型情報を使って提案の精度を上げます。説明的な命名と型定義が最も効果的です。
ハンズオン: コード補完を使いこなす 30min
目標: Tab受入れ、候補切替、単語単位受入れなど、補完の操作パターンを体で覚える

演習1: 関数名だけ書いて本体を補完させる(5min)

新規JavaScriptファイルを作成し、以下の関数シグネチャだけ入力してください。中身をCopilotに任せます。

function isPalindrome(str) { function fibonacci(n) { function flatten(arr) {

演習2: TypeScript型定義から実装を補完(5min)

interface User { id: number; name: string; email: string; age: number; isActive: boolean; } // この下に関数を書き始めると、型に基づいた補完が得られます function filterActiveUsers(users: User[]): User[] {

演習3: 配列操作の補完(5min)

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // 偶数だけ抽出 const evens = numbers.filter( // 各要素を2倍にする const doubled = numbers.map( // 合計を求める const sum = numbers.reduce(

演習4: API呼び出しコードの補完(5min)

// JSONPlaceholderからユーザーリストを取得する async function fetchUsers() {

fetch、try-catch、レスポンスの型変換まで一気に補完されることを確認してください。

演習5: 候補の切り替え(5min)

  1. 以下のコードを入力してサジェストを表示させます
  2. Alt+] (Option+]) で別の候補に切り替えてください
  3. 3つ以上の候補を確認し、最も適切なものをTabで受け入れます
function sortByKey(arr, key) {

演習6: 単語単位受入れ(5min)

  1. 以下を入力してサジェストを表示させます
  2. Tab全体受入れではなく、Ctrl+→ (Cmd+→)で1単語ずつ受け入れてください
  3. 途中で不要な部分をスキップし、次の行の補完に切り替えます
// メールアドレスの形式を検証する関数 function validateEmail(email) {
各演習のポイント

演習1では、関数名が説明的であるほどCopilotの提案精度が上がることを実感できるはずです。演習2のTypeScript型定義は、Copilotに最も影響を与えるコンテキストです。演習5の候補切替は、1つ目の提案が最善とは限らないことを体験する演習になっています。

自走チャレンジ
テーマ: 講師がTypeScript関数を補完させたのと同じ方法で、以下の関数シグネチャだけ書いて本体をCopilotに補完させてください。
条件: function validateEmail(email: string): boolean のシグネチャのみ記述し、Copilotの補完を受け入れる。補完結果が正しいか自分で判断し、不十分なら修正してください。
ここで動画を一度止めて、5分間取り組んでください

ヒント: 空文字、@なし、ドメインなしなどのエッジケースで手動テストしてみると、Copilotの提案の穴が見えてきます。

講師の解答例を見る
function validateEmail(email: string): boolean { if (!email || email.trim().length === 0) return false; const pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return pattern.test(email); }

解説ポイント: Copilotの提案を鵜呑みにせず、エッジケース(空文字、@なし、ドメイン部分なし等)で検証する習慣をつけてください。正規表現の複雑さは用途次第で、RFC準拠の完全なバリデーションが不要なら上記で十分です。

参考リンク

Section 03 -- 50min(講義20 + ハンズオン30)

Copilot Chat

Copilot Chatとは

Copilot Chatは、VS Codeのサイドパネルで対話形式のコード支援を受けられる機能です。インラインサジェストが「次の1行」の予測なら、Chatは「まとまった質問への回答」を担当します。コードの説明、リファクタリング提案、エラー解析、テスト生成など、開発の様々な場面で活躍します。

スラッシュコマンド

コマンド機能使いどころ
/explainコードの説明読み解けないコードに遭遇したとき
/fixバグ修正エラーの原因がわからないとき
/testsテスト生成既存コードにテストを追加したいとき
/docドキュメント生成JSDoc、docstringを自動生成
/new新規コード生成スキャフォールディング

@参照

参照対象用途
@workspaceプロジェクト全体「このプロジェクトの構造を教えて」「エントリポイントは?」
@terminalターミナル出力「直前のエラーを解説して」
@vscodeVS Code設定「この設定の意味は?」「拡張機能のおすすめは?」

ChatとInline Chatの使い分け

観点Copilot Chat(サイドパネル)Inline Chat(Ctrl+I)
起動方法サイドバーのChatアイコンコード上でCtrl+I
対話の長さ複数ターンの対話向き1回の指示で完結
コード変更回答をコピーして手動適用差分プレビューで直接適用
適した場面調査、学習、設計相談部分修正、変換、コメント追加

@workspaceとコード選択の違い

Copilot Chatに質問する方法は大きく2つあります。使い分けを誤ると、欲しい回答が得られません。

方法参照範囲向いている質問注意点
@workspace で質問プロジェクト全体のファイル構造・主要コード「エントリポイントはどこ?」「このプロジェクトの依存関係を教えて」全ファイルを読むわけではない。インデックス化された情報に基づく
コードを選択して質問選択した範囲 + 同ファイルの文脈「この関数のバグを見つけて」「このロジックを説明して」選択範囲外の依存関係は考慮されにくい

プロジェクト全体に関わる質問なら@workspace。特定コードに関する質問ならコード選択。混ぜて使うことも可能で、「@workspace この関数はどこから呼ばれていますか?」のように@workspaceとコード参照を組み合わせる方法が最も精度が高くなります。

Copilot ChatのModel選択

Proプラン以上では、Chatで使用するAIモデルを切り替えられます。Chatウィンドウ下部のモデル名をクリックすると選択肢が表示されます。

モデル特徴向いている場面
GPT-4o高速、バランスが良い日常のコード質問、リファクタリング提案
Claude Sonnet 4長文脈に強い、コード理解が深い大きなコードベースの分析、複雑なロジックの説明
Gemini 2.5 Proマルチモーダル対応画像を含む質問、長いドキュメントの分析
o4-mini推論特化(思考プロセスを可視化)アルゴリズム設計、数学的な問題

モデルごとに得意分野が異なるため、タスクに応じて使い分けるのが理想です。ただし、大半の開発タスクはGPT-4oで十分対応できるので、まずはデフォルトで使い、不満を感じた場面で切り替えを試す程度の運用で問題ありません。

Tips: Chat履歴の活用
Copilot Chatの会話はセッション内で文脈が保持されます。「先ほどの関数を」という指示が通るので、段階的にコードを洗練させるワークフローに向いています。新しいトピックに移るときは「+」で新しいスレッドを開始してください。

理解度チェック: Section 03

Q3. @workspaceを使った質問の特徴として正しいのはどれですか?

正解: B。@workspaceはプロジェクト全体のファイル構造とコードを参照して回答を生成します。プロジェクトの全体像を把握する質問に適しています。
ハンズオン: Copilot Chatを使いこなす 30min
目標: Chat機能で質問、説明、リファクタリング、エラー解析、テスト生成、ドキュメント生成を体験する

演習1: コードの説明を聞く(5min)

  1. 以下のコードをファイルに貼り付けてください
  2. コード全体を選択し、Copilot Chatで「このコードを説明してください」と質問します
function debounce(fn, delay) { let timer; return function(...args) { clearTimeout(timer); timer = setTimeout(() => fn.apply(this, args), delay); }; }

演習2: リファクタリング提案(5min)

  1. 以下のコードを選択し、Chatで「この関数をリファクタリングしてください」と依頼します
  2. 提案されたコードと元のコードを比較してください
function processData(data) { let result = []; for (let i = 0; i < data.length; i++) { if (data[i].status === 'active') { if (data[i].age >= 18) { if (data[i].email) { result.push({ name: data[i].name, email: data[i].email, age: data[i].age }); } } } } return result; }

演習3: エラー解析(5min)

  1. 以下のエラーメッセージをChatに貼り付けてください
  2. 「このエラーの原因と解決策を教えてください」と質問します
TypeError: Cannot read properties of undefined (reading 'map') at UserList (/src/components/UserList.tsx:12:18) at renderWithHooks (react-dom.development.js:14985:18)

演習4: /testsでテスト生成(5min)

  1. 演習1のdebounce関数を選択した状態で、Chatに /tests と入力してください
  2. 生成されたテストコードを確認し、テストケースが適切か評価してください

演習5: /docでドキュメント生成(5min)

  1. 演習2のprocessData関数を選択し、Chatに /doc と入力してください
  2. JSDocコメントが生成されることを確認します
  3. 生成されたドキュメントがパラメータと戻り値を正しく記述しているか確認してください

演習6: @workspaceで全体把握(5min)

  1. 何かしらのプロジェクトフォルダをVS Codeで開いてください(手元のプロジェクトで構いません)
  2. Chatで以下のように質問します
@workspace このプロジェクトのエントリポイントはどこですか? 主要なファイル構造も教えてください。

プロジェクト全体を俯瞰した回答が返ってくることを確認してください。

各演習のポイント

演習2では、ネストの深い条件分岐がfilter+mapのチェーンにリファクタリングされるはずです。Copilotは定型的なリファクタリングパターンを良く知っています。演習3のエラー解析は実務で最も使う場面の1つで、スタックトレースから原因箇所を特定する力は人間を超える場合もあります。

自走チャレンジ
テーマ: 以下のサンプルコード(DL提供)をCopilot Chatに渡して、3ステップを自分の指示文で実行してください。
条件: (1)コードの説明をさせる (2)改善点を指摘させる (3)テストを生成させる。各ステップで自分なりの指示文を書くこと。
ここで動画を一度止めて、5分間取り組んでください

ヒント: /explain でコード説明、/tests でテスト生成が使えます。自然言語での改善依頼と比較してみると、スラッシュコマンドの守備範囲がわかります。

講師の解答例を見る
ステップ1: /explain このコードが何をしているか、関数ごとに説明してください ステップ2: このコードの改善点を3つ挙げてください。パフォーマンス、可読性、エラーハンドリングの観点で分析してください ステップ3: /tests このコードのユニットテストを生成してください。正常系とエッジケースを含めてください

解説ポイント: /explain や /tests のスラッシュコマンドは定型操作を高速に行えます。一方、改善提案のような分析的な作業は自然言語で観点を指定した方が精度が高くなります。両者の使い分けを体感してください。

参考リンク

復習A -- 25min

復習ハンズオン A: 補完+Chatで小機能実装

復習ハンズオン 25min
目標: コード補完とCopilot Chatを組み合わせて、3つのユーティリティ関数を実装する

ここまでに習得したインラインサジェストとCopilot Chatを組み合わせて、以下の3関数を実装してください。

課題: ユーティリティ関数3つを実装

  1. formatDate(date) -- Dateオブジェクトを「YYYY-MM-DD」形式の文字列に変換する
  2. truncateText(text, maxLength) -- 指定文字数で切り詰め、末尾に「...」を追加する
  3. groupBy(arr, key) -- オブジェクト配列を指定キーでグループ化してMapを返す

手順

  1. 関数シグネチャを書いてCopilotの補完で本体を生成(各3min)
  2. Copilot Chatで各関数のテストコードを生成(各2min)
  3. テストを実行し、必要に応じて修正(残り時間)
// utils.js function formatDate(date) { } function truncateText(text, maxLength) { } function groupBy(arr, key) { } // テスト console.log(formatDate(new Date(2026, 3, 2))); // "2026-04-02" console.log(truncateText("GitHub Copilot は便利なツールです", 15)); // "GitHub Copilot..." console.log(groupBy([{type:"a",v:1},{type:"b",v:2},{type:"a",v:3}], "type")); // Map { "a" => [{...},{...}], "b" => [{...}] }
Section 04 -- 50min(講義20 + ハンズオン30)

インラインチャット

インラインチャットとは

コードエディタの中でCtrl+I(macOSはCmd+I)を押すと起動する、軽量な対話インターフェースです。サイドパネルのChatとは違い、コードの文脈に直接結びついた操作ができます。選択範囲に対して「TypeScriptに変換して」「エラーハンドリングを追加して」と指示するだけで、差分プレビュー付きで変更案が表示されます。

主な使い方

Copilot Edits(マルチファイル編集)

Copilot Editsは複数ファイルにまたがる変更を一度に行える機能です。Edit Modeに入り、変更したいファイルをWorking Setに追加し、「全コンポーネントにエラーバウンダリを追加して」のような横断的な指示を出せます。変更は差分プレビューで確認してから適用します。

Copilot Editsの具体的な操作手順

  1. Copilot Chatパネル上部の「Edit」タブ(ペンアイコン)をクリックしてEdit Modeに切り替える
  2. Working Setに対象ファイルを追加する。「Add Files...」ボタンから選択するか、エクスプローラーからドラッグ&ドロップ
  3. チャット欄に変更指示を入力。「すべてのファイルでconsole.logをlogger.infoに置換して」のように横断的な指示が可能
  4. 各ファイルの差分プレビューが表示される。ファイルごとに Accept / Discard を選択
  5. 全ての変更を確認したら Done で完了
Tips: Working Setの選び方
Working Setに入れるファイルが多すぎると、Copilotが全ファイルの文脈を処理しきれず精度が落ちます。1回のEdit操作では5ファイル以内に絞り、関連性の高いファイルだけを追加するのが実用的です。10ファイル以上の変更が必要な場合は、2-3回に分けて実行してください。
%%{init:{'theme':'dark','themeVariables':{'primaryColor':'#00A5BF','primaryBorderColor':'#007A8F','primaryTextColor':'#e8e8e8','lineColor':'#00A5BF','secondaryColor':'#1a1a1a','background':'#141414','mainBkg':'#1a1a1a','nodeBorder':'#00A5BF'}}}%%
flowchart TD
  A["コードを修正したい"] --> B{"修正の範囲は?"}
  B -->|1行〜数行| C["インラインサジェスト
Tab / Esc"] B -->|関数1つ程度| D["Inline Chat
Ctrl+I"] B -->|調査・学習・設計| E["Copilot Chat
サイドパネル"] B -->|複数ファイル横断| F["Copilot Edits
Edit Mode"]
修正の範囲に応じた機能の使い分けフロー
Tips: Inline Chatの差分プレビュー
Inline Chatの結果は、変更前と変更後が色分けされた差分で表示されます。緑が追加、赤が削除。内容を確認して「Accept」で適用、「Discard」で取り消しです。盲目的にAcceptせず、差分を読む癖をつけてください。

理解度チェック: Section 04

Q4. Copilot Editsが適している場面はどれですか?

正解: C。Copilot Editsは複数ファイルのWorking Setに対して横断的な変更を指示できる機能です。1ファイル内の修正ならInline Chatの方が手軽です。
ハンズオン: インラインチャットの操作 30min
目標: Ctrl+Iの操作に慣れ、選択範囲への指示、変換、コメント追加を体験する

演習1: JavaScriptからTypeScriptに変換(5min)

  1. 以下のJavaScriptコードをファイルに貼り付けてください
  2. コード全体を選択し、Ctrl+I を押して「TypeScriptに変換してください。引数と戻り値に型を付けてください」と入力します
function findUser(users, id) { return users.find(user => user.id === id); } function getFullName(user) { return `${user.firstName} ${user.lastName}`; } function calculateAge(birthDate) { const today = new Date(); const birth = new Date(birthDate); let age = today.getFullYear() - birth.getFullYear(); const monthDiff = today.getMonth() - birth.getMonth(); if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birth.getDate())) { age--; } return age; }

演習2: try-catch追加(5min)

  1. 以下のコードを選択し、Ctrl+Iで「try-catchでエラーハンドリングを追加してください」と指示します
async function fetchUserData(userId) { const response = await fetch(`https://api.example.com/users/${userId}`); const data = await response.json(); return data; }

演習3: async/awaitに書き換え(5min)

function getData() { return fetch('https://api.example.com/data') .then(response => response.json()) .then(data => { console.log(data); return data; }) .catch(error => { console.error('Error:', error); throw error; }); }

選択してCtrl+I、「async/awaitで書き直してください」と入力します。

演習4: JSDocコメント追加(5min)

  1. 演習1で変換したTypeScriptの各関数を選択してください
  2. Ctrl+Iで「JSDocコメントを追加してください」と指示します
  3. param、returns、exampleが含まれているか確認してください

演習5: 変数名のリネーム(5min)

function calc(d, r) { const t = d.map(x => x.v * r); const s = t.reduce((a, b) => a + b, 0); return { t, s }; }

選択してCtrl+I、「変数名をわかりやすい名前にリネームしてください」と入力します。d、r、t、s、x、v、a、bといった1文字変数が説明的な名前に変わることを確認してください。

演習6: 複数ファイルの一括変更(5min)

  1. Copilot Chatパネルで「Edit」モードに切り替えます(ペンアイコン)
  2. Working Setに2つ以上のファイルを追加してください
  3. 「すべてのconsole.logをlogger.infoに置き換えてください」のような横断的な指示を出します
  4. 各ファイルの差分プレビューを確認し、Acceptで適用します
Section 05 -- 50min(講義20 + ハンズオン30)

コメントドリブン開発

コメントドリブン開発とは

コードを書く前に、コメントで「何をする関数か」を書き、CopilotにImplementationを生成させる手法です。先にコメントを書き、EnterでCopilotにコードを提案させ、Tabで受け入れる。この流れを繰り返すだけで、驚くほどの精度でコードが生成されます。

なぜ効果的か

Copilotはコメントを最重要コンテキストとして扱います。コメントの直後に来るコードを予測する精度は、変数名や型情報だけの場合よりも格段に高くなります。「何を書くか迷ったらまずコメントを書く」が鉄則です。

コメントの書き方

効果的なコメントには4つの要素があります。

  1. 目的 -- この関数は何をするのか
  2. 入力 -- どんなデータを受け取るか
  3. 出力 -- 何を返すか
  4. 制約条件 -- エッジケースや性能要件

良いコメント vs 悪いコメント

良いコメント

// ユーザーリストをageで昇順ソートし、 // activeなユーザーのみ返す // 入力: User[] // 出力: User[] (age昇順、isActive===true) // 制約: 元の配列を変更しない

目的、入出力、制約が明確。Copilotは高精度なコードを生成できます。

悪いコメント

// ユーザーの処理をする

曖昧すぎてCopilotが何を生成すべきかわかりません。意図しないコードが出てくる確率が高い。

Tips: 日本語コメントでも動く
Copilotは日本語コメントも理解します。「// ユーザーリストを年齢でソートする」と書けば英語と同等の精度でコードを生成します。ただし、変数名は英語の方がLLMの学習データとの親和性が高いため、コメントは日本語、コードは英語というスタイルが実用的です。

理解度チェック: Section 05

Q5. コメントドリブン開発で、Copilotの精度を最も上げる要素はどれですか?

正解: C。Copilotは目的・入出力・制約を含む具体的なコメントから、意図に合ったコードを高精度に生成します。
ハンズオン: コメントから関数を生成 30min
目標: コメントを設計書として書き、Copilotにコード生成させる一連の流れを体験する

演習1: データバリデーション関数(10min)

以下のコメントをコピーし、その直後にカーソルを置いてCopilotの提案を待ってください。

// メールアドレスのバリデーション // 入力: string (メールアドレス) // 出力: { valid: boolean, errors: string[] } // チェック項目: // - 空文字でないこと // - @が1つ含まれること // - @の前後が空でないこと // - ドメイン部分に.が含まれること // 制約: 正規表現は使わず、文字列操作で実装する function validateEmail(email) {

「正規表現は使わず」という制約がCopilotの生成にどう影響するか確認してください。制約を外すと正規表現ベースのコードが出るはずです。

演習2: API呼び出し+エラーハンドリング(10min)

// REST APIからユーザーデータを取得する // エンドポイント: https://jsonplaceholder.typicode.com/users/{id} // 入力: userId (number) // 出力: Promise<User | null> // エラーハンドリング: // - ネットワークエラー → コンソールにログを出して null を返す // - 404 → null を返す // - その他のHTTPエラー → Error をスローする // リトライ: 最大3回、1秒間隔 async function fetchUser(userId) {

リトライロジックまで含めたコメントを書くと、Copilotがfor/whileループでリトライ処理を実装するのが確認できます。

演習3: CSVパース+集計(10min)

// CSV文字列をパースして部門別の売上合計を集計する // 入力: csvString (string) - ヘッダー行あり、カンマ区切り // 形式: "部門,製品,売上\n営業,SaaS A,500\n開発,ツールB,300\n..." // 出力: Map<string, number> - キー:部門名, 値:売上合計 // 制約: // - 1行目はヘッダーとしてスキップ // - 売上が数値でない行は無視する // - 空行は無視する function aggregateSalesByDepartment(csvString) {
各演習のポイント

演習1では制約条件の威力を体験します。「正規表現を使わず」と書くだけでCopilotの出力が変わる。制約を書き換えて別バージョンも生成させると、コメントの力がよくわかります。演習2のリトライ処理は、コメントなしでは生成されにくいパターンです。演習3はヘッダースキップや数値変換のエッジケース処理がコメントの制約から生成されることを確認してください。

自走チャレンジ
テーマ: 以下の仕様をコメントだけで記述し、Copilotに実装させてください。
条件: 「配列内の重複を除去し、昇順ソートして返す関数。空配列の場合は空配列を返す。数値型のみ対応。」をコメントで表現し、関数名だけ書いて本体はCopilotに任せる。
ここで動画を一度止めて、5分間取り組んでください

ヒント: コメントに「空配列の場合」「数値型のみ」のような制約を含めるかどうかで、Copilotの出力が変わります。制約なしバージョンも試して比較してみてください。

講師の解答例を見る
// 配列内の重複を除去し、昇順ソートして返す // 空配列の場合は空配列を返す // 数値型のみ対応 function uniqueSorted(numbers: number[]): number[] { return [...new Set(numbers)].sort((a, b) => a - b); }

解説ポイント: コメントの具体性が補完精度を左右します。「ソートして返す」だけだとlocaleCompareベースの文字列ソートが提案される場合があり、「昇順」「数値型」と明記すると (a, b) => a - b のパターンが出やすくなります。

参考リンク

復習B -- 25min

復習ハンズオン B: コメント設計からテストまで

復習ハンズオン 25min
目標: コメント設計 → インラインチャットで実装 → Chatでテスト生成の一連フローを体験する

課題: 簡易カート計算モジュール(3関数)

ECサイトのカート計算を行う3つの関数を以下のフローで実装してください。

  1. コメントを書く -- 各関数の目的・入出力・制約をコメントとして記述(5min)
  2. Copilotで実装 -- コメントドリブンで本体を生成、インラインチャットで微調整(10min)
  3. テスト生成 -- Copilot Chatの /tests でテストを生成し実行(10min)
// cart.js // 関数1: calculateSubtotal // カート内の商品の小計を計算する // 入力: items - [{name, price, quantity}, ...] // 出力: number (小計) // 関数2: applyDiscount // 合計金額に割引を適用する // 入力: subtotal (number), discountCode (string) // 出力: { total: number, discount: number, code: string } // 割引コード: "SAVE10" → 10%OFF, "SAVE20" → 20%OFF, 不明なコード → 割引なし // 関数3: calculateShipping // 配送料を計算する // 入力: subtotal (number), prefecture (string) // 出力: number (配送料) // ルール: 5000円以上は送料無料、北海道・沖縄は+500円、それ以外は一律800円
Section 06 -- 50min(講義20 + ハンズオン30)

テスト生成とリファクタリング

/testsコマンドの活用

Copilot Chatの /tests コマンドは、選択したコードに対してユニットテストを自動生成します。JestやMochaなどのテストフレームワークを認識し、プロジェクトに合ったテストコードを出力してくれます。

対応テストフレームワーク

言語フレームワーク備考
JavaScript/TypeScriptJest, Mocha, Vitestpackage.jsonの依存関係から自動判別
Pythonpytest, unittestpytestが優先される傾向
JavaJUnit 5アノテーションベースのテスト生成
Gotestingテーブル駆動テストを生成しやすい

生成テストの検証ポイント

AIが生成したテストをそのまま使うのは危険です。以下の観点で検証してください。

リファクタリング提案の活用

Copilot Chatに「この関数を小さく分割して」「デザインパターンを適用して」と依頼するとリファクタリング提案を得られます。長い関数の分割、ネストの解消、早期リターンの導入など、定型的なリファクタリングパターンの提案精度は高いレベルにあります。

AI生成テストの限界
Copilotはコードの構造からテストケースを推測しますが、ビジネスロジックの「意図」まではわかりません。「この関数は特定の業務ルールに基づいて10%の手数料を加算する」という背景知識はAIにはなく、テストケースが業務要件を満たしているかは人間が判断する必要があります。
ハンズオン: テスト生成とリファクタリング 30min
目標: /testsコマンドでテストを自動生成し、リファクタリングの流れを体験する

演習1: 既存関数にテストを生成(10min)

  1. 以下の関数をファイルに貼り付けてください
  2. 関数を選択し、Copilot Chatで /tests と入力します
  3. 生成されたテストコードをテストファイルに保存してください
function calculateTax(price, taxRate, isExempt) { if (isExempt) return price; if (price < 0) throw new Error('Price cannot be negative'); if (taxRate < 0 || taxRate > 1) throw new Error('Tax rate must be between 0 and 1'); const tax = Math.round(price * taxRate); return price + tax; } function applyBulkDiscount(items) { const total = items.reduce((sum, item) => sum + item.price * item.quantity, 0); if (total >= 100000) return total * 0.85; if (total >= 50000) return total * 0.9; if (total >= 10000) return total * 0.95; return total; }

演習2: エッジケースの追加(5min)

  1. 生成されたテストに対し、Chatで「以下のエッジケースのテストを追加してください」と依頼します
エッジケースを追加してください: - price が 0 の場合 - taxRate が 0 の場合 - taxRate が 1 の場合 - items が空配列の場合 - quantity が 0 の商品がある場合

演習3: テスト実行(5min)

  1. Node.jsの場合: node --test テストファイル名 で実行できます
  2. Jestを使う場合: npx jest で実行してください
  3. テストが失敗した場合、エラーメッセージをChatに貼り付けて修正を依頼します

演習4: 長い関数のリファクタリング(10min)

function processOrder(order) { let total = 0; for (let i = 0; i < order.items.length; i++) { let item = order.items[i]; let price = item.price; if (item.discount) { if (item.discount.type === 'percent') { price = price * (1 - item.discount.value / 100); } else if (item.discount.type === 'fixed') { price = price - item.discount.value; } if (price < 0) price = 0; } total += price * item.quantity; } if (order.coupon) { if (order.coupon.type === 'percent') { total = total * (1 - order.coupon.value / 100); } else if (order.coupon.type === 'fixed') { total = total - order.coupon.value; } if (total < 0) total = 0; } let shipping = 0; if (total < 5000) { shipping = 800; if (order.address.prefecture === '北海道' || order.address.prefecture === '沖縄県') { shipping += 500; } } total += shipping; let tax = Math.round(total * 0.1); total += tax; return { subtotal: total - tax - shipping, shipping, tax, total }; }
  1. この関数全体を選択し、Copilot Chatで「この関数を小さな関数に分割してリファクタリングしてください」と依頼します
  2. 分割された各関数の責務が明確になっていることを確認してください
  3. リファクタリング後のコードに対しても /tests でテストを生成し、動作が変わっていないことを検証します
リファクタリングのポイント

この関数には少なくとも4つの責務が混在しています。商品価格の割引計算、クーポン適用、配送料計算、税計算です。各責務を独立した関数に分割すると、テストしやすくなり、後からの修正も容易になります。Copilotはこの分割を的確に提案できるはずです。

自走チャレンジ
テーマ: 講師がテストを自動生成したのと同じ方法で、サンプルコード(DL提供)に対してテスト生成から改善までを一連で実行してください。
条件: (1)サンプルコードに対してテストを生成させる (2)生成されたテストを実行する (3)エッジケースの不足を特定する (4)追加テストをCopilotに依頼する。
ここで動画を一度止めて、7分間取り組んでください

ヒント: /tests で最初のテストセットを生成した後、「境界値テストを追加してください」「エラーケースのテストが足りていません」のように自然言語で追加依頼すると効果的です。

講師の解答例を見る
ステップ1: /tests (サンプルコードを選択した状態で実行) ステップ2: 生成されたテストファイルでnpx jest を実行 ステップ3: 「以下のエッジケースが未テストです。追加テストを生成してください: (1)引数が空の場合 (2)型が不正な場合 (3)境界値(最大・最小値)」 ステップ4: /tests で再度生成し、追加分をマージ

解説ポイント: 自動生成テストは正常系に偏りがちです。エッジケース(null、undefined、空配列、巨大入力等)は人間が指摘して追加生成を依頼するフローが実用的です。

参考リンク

Section 07 -- 40min(講義25 + ハンズオン15)

セキュリティとガバナンス

コード提案のライセンス問題

Copilotはパブリックリポジトリのコードを学習データに含んでいます。そのため、提案されたコードが既存のオープンソースコードと一致する可能性があります。GitHubはこの問題に対処するため「パブリックコード一致検出フィルター」を提供しています。フィルターを有効にすると、約150文字以上の一致が検出された場合に提案がブロックされます。

パブリックコード一致フィルターの仕組み

このフィルターはCopilotの提案を送信する前に、GitHubのパブリックリポジトリと照合する仕組みです。具体的には以下の流れで動作します。

  1. Copilotがコード提案を生成する
  2. 生成された提案を、GitHubのパブリックコードインデックスと照合する
  3. 約150文字以上の連続一致が検出された場合、その提案をブロックする
  4. ブロックされた場合は別の提案を生成するか、提案なしとする

フィルターの対象はコードの文字列レベルの一致であり、意味的な類似性(ロジックは同じだが変数名が違う等)は検出しません。GPLライセンスのコードと構造が似ているが文字列が異なるコードは通過するため、ライセンスリスクを完全にゼロにするものではない点に注意してください。

設定場所はGitHub.comの Settings > Copilot ページ。「Suggestions matching public code」の項目でBlock/Allowを選択できます。Business/Enterpriseプランでは組織管理者が全メンバーに対して一括でBlockを強制する設定も可能です。

Copilot Business管理画面

Business/Enterpriseプランでは、組織管理者がCopilotの利用を統制できます。

社内ポリシー設定のポイント

設定項目推奨値理由
パブリックコード一致フィルター有効ライセンスリスクの低減
テレメトリデータ送信無効(またはBusiness以上で管理)コードスニペットが外部に送信されるリスク
利用可能リポジトリの制限組織の方針に合わせて設定機密プロジェクトでの利用を制御
Chat機能有効(レビュー文化と併用)生産性向上の効果が大きい

セキュリティリスク

原則: Copilotの提案は「コードレビュー必須」
AI生成コードだからといって品質が保証されるわけではありません。むしろ、一見正しそうに見えて微妙にバグを含むコードが混入するリスクが人間が書く場合と異なります。通常のPRレビューに加え、生成コードの出所を意識した検証プロセスを設けてください。
ハンズオン: セキュリティ設定の確認 15min
目標: Copilotのセキュリティ設定を確認し、危険な提案パターンを理解する

演習1: フィルター設定の確認(5min)

  1. VS Codeの設定(Ctrl+,)を開き、「copilot」で検索してください
  2. 「GitHub > Copilot: Enable」がオンになっていることを確認します
  3. GitHub.comのCopilot設定ページ(github.com/settings/copilot)にアクセスし、「Suggestions matching public code」の設定を確認してください

演習2: APIキーのハードコード体験(5min)

  1. 新規ファイルで以下を入力し、Copilotの挙動を観察してください
const API_KEY = "

Copilotがダミーの文字列を提案する場合があります。本番コードでこのパターンを使ってはいけません。

演習3: 安全なパターンへの修正(5min)

  1. 以下のコードを貼り付け、Ctrl+Iで「環境変数から読み取る安全なパターンに修正してください」と指示します
const config = { apiKey: "sk-1234567890abcdef", dbPassword: "mypassword123", jwtSecret: "super-secret-key" };

環境変数 (process.env) を使うパターンに変換されることを確認してください。

参考リンク

Section 08 -- 20min(講義のみ)

トレンド

Copilot Agent Mode

Agent Modeは、Copilotが自律的にタスクを実行する機能です。チャットで指示を出すと、Copilotがターミナルコマンドの実行、ファイルの編集、テストの実行を自分で行います。人間は結果を確認してAccept/Rejectするだけ。「テストが通るまで修正を繰り返して」のような複合的な指示が可能になりました。

Copilot Workspace

GitHub Issueから出発して、仕様策定、実装計画、コード生成、PRの作成までを一気通貫で行う機能です。Issueに書かれた要件をCopilotが解析し、影響するファイルを特定し、変更計画を立案し、コードを生成します。開発者は各ステップでレビューと修正を行い、納得したらPRを作成します。

Multi-file Editing(Copilot Edits)の進化

Section 04で触れたCopilot Editsは、継続的に進化しています。Working Setの自動提案、変更のundo/redo、コンテキストのより深い理解が改善されており、実用性が着実に上がっています。

Copilot Extensions

サードパーティの開発者がCopilotの機能を拡張できる仕組みです。@docker、@azure、@sentry のようにChat内で外部サービスと連携できます。自社のAPIやツールをCopilot Extensionとして公開し、チーム内で共有する使い方も可能です。

Tips: Copilotの進化を追う
Copilotは月単位で機能が追加されます。GitHub BlogVS Code Release Notes を定期的にチェックしてください。VS Codeの「Copilot」カテゴリのリリースノートが特に参考になります。

参考リンク

Section 09 -- 75min(講義10 + 実践65)

総合ハンズオン: Node.js CLIツールをCopilotで完成させる

ゴール

これまで学んだCopilotの機能を総動員して、Node.jsのTODOアプリ(CLIツール)を完成させます。コメントドリブンで設計し、インラインサジェストで実装し、Chatでテストを生成し、インラインチャットでエラーハンドリングを追加する。一連の開発フロー全体をCopilotと協働して進めてください。

7ステップの流れ

%%{init:{'theme':'dark','themeVariables':{'primaryColor':'#00A5BF','primaryBorderColor':'#007A8F','primaryTextColor':'#e8e8e8','lineColor':'#00A5BF','secondaryColor':'#1a1a1a','background':'#141414','mainBkg':'#1a1a1a','nodeBorder':'#00A5BF'}}}%%
graph LR
  A["1. 初期化
5min"] --> B["2. コメント設計
10min"] B --> C["3. 実装
15min"] C --> D["4. テスト
10min"] D --> E["5. エラー処理
10min"] E --> F["6. README
5min"] F --> G["7. 動作確認
10min"]
総合ハンズオンの7ステップフロー
総合ハンズオン: TODO CLIツール 65min
目標: Copilotの全機能を使って実用的なCLIツールを完成させる

Step 1: プロジェクト初期化(5min)

mkdir todo-cli && cd todo-cli npm init -y # TypeScriptを使う場合 # npm install typescript @types/node --save-dev # npx tsc --init

package.jsonが作成されたら、メインファイル(todo.js または todo.ts)を作成してください。

Step 2: コメントドリブンで主要関数を設計(10min)

以下のコメントテンプレートをファイルに貼り付け、各関数の仕様をコメントとして書いてください。

// todo.js - TODOアプリCLIツール // データはJSONファイル(todos.json)に永続化する const fs = require('fs'); const path = require('path'); const DATA_FILE = path.join(__dirname, 'todos.json'); // loadTodos: JSONファイルからTODOリストを読み込む // ファイルが存在しない場合は空配列を返す // 出力: Array<{id, title, done, createdAt}> // saveTodos: TODOリストをJSONファイルに保存する // 入力: todos (Array) // addTodo: 新しいTODOを追加する // 入力: title (string) // 出力: 追加されたTODOオブジェクト // idはDate.now()で生成 // listTodos: TODOリストを一覧表示する // 完了済みは[x]、未完了は[ ]で表示 // completeTodo: 指定IDのTODOを完了にする // 入力: id (number) // 出力: boolean (成功/失敗) // deleteTodo: 指定IDのTODOを削除する // 入力: id (number) // 出力: boolean (成功/失敗) // main: CLIのエントリポイント // process.argvからコマンドと引数を解析 // コマンド: add, list, done, delete

Step 3: Copilot補完で実装(15min)

  1. 各コメントの下にカーソルを移動し、Copilotのサジェストを受け入れて実装します
  2. 提案内容を確認し、必要に応じて候補を切り替えてください(Alt+]/[)
  3. main関数のコマンド解析部分は、switch文またはif-else分岐が提案されるはずです

Step 4: Chatでテスト生成(10min)

  1. 実装した関数を選択し、Copilot Chatで /tests を実行してください
  2. addTodo、completeTodo、deleteTodoの各関数にテストが生成されることを確認します
  3. テストファイルを保存し、実行してみてください

Step 5: インラインチャットでエラーハンドリング追加(10min)

  1. loadTodos関数を選択し、Ctrl+Iで「JSONパースエラーのハンドリングを追加してください」と指示します
  2. main関数を選択し、「不正なコマンドが渡された場合のエラーメッセージとヘルプ表示を追加してください」と指示します
  3. deleteTodo関数に「存在しないIDが指定された場合のエラーメッセージを追加してください」と指示します

Step 6: /docでREADME生成(5min)

  1. Copilot Chatで以下のように依頼してください
@workspace このCLIツールのREADME.mdを生成してください。 使い方、コマンド一覧、インストール方法を含めてください。

Step 7: 最終動作確認(10min)

# TODOの追加 node todo.js add "GitHub Copilotの使い方を復習する" node todo.js add "テストを書く" node todo.js add "READMEを更新する" # 一覧表示 node todo.js list # 完了にする(IDは実行時に確認) node todo.js done 1234567890 # 削除 node todo.js delete 1234567890 # もう一度一覧表示して結果を確認 node todo.js list

成果物チェックリスト

うまくいかない場合のヒント

ファイルの読み書きでエラーが出る場合は、DATA_FILEのパスを確認してください。__dirnameが期待するディレクトリを指しているか、todos.jsonの書き込み権限があるかを確認します。テストでファイルI/Oが絡む場合は、テスト用の一時ディレクトリを使うか、fs.writeFileSync/readFileSyncをモックすることをChatに相談してみてください。

参考リンク

ダウンロード

テンプレート・サンプルファイル

各セクションで使用するテンプレートとサンプルファイルです。クリックでダウンロードできます。

コメントドリブン設計テンプレート.md Copilot社内利用ポリシー雛形.md サンプルコード(バグ入り).js Copilot環境チェックリスト.md