✈️

ソフトウェア開発ライフサイクルでのGitHub Copilot Chatの活用

2024/05/19に公開

5/16(木)の以下のイベントでソフトウェア開発ライフサイクルでのGitHub Copilotの活用例についてGitHub Copilot Chatのデモを行いました。
https://www.avanade.com/ja-jp/events/webinars/avanade-beyond-ai-forum-2024

デモでお見せした内容をこちらに残しておきます。
※一部当日のデモでお見せした内容と異なるものもあります

ソフトウェア開発ライフサイクルにおけるGitHub Copilot Chatの活用アイデア

ソフトウェア開発をスピードアップさせるために使用できる生成AIは、Azure Open AIやAI Searchなどのサービスがありますが、今回はGitHub Copilotの活用にフォーカスして、以下の内容でGitHub Copilot Chatのデモをしました。

  • コードの要約
  • コードの説明と処理内容のヴィジュアライズ
  • コードの最適化
  • コードレビュー
  • 受入テストケースの生成

GitHub Copilotの活用というと、実装フェーズにおいてコード生成をアシストしてもらうために活用するのが多いかと思いますが、今回は実装フェーズだけでなくソフトウェア開発の他のフェーズでもこんな活用の仕方があるよ、ということでご紹介させて頂きました。

今回のデモで使用したソースコードはこちらです。
https://github.com/yuriemori/soeday-work-with-copilot-chat

上記のリポジトリは、ユーザーからの入力を受け取ってDataTableオブジェクトにデータを登録するためのC#で書かれたシンプルなコンソールアプリケーションです。
このソースの中には、敢えて意図的なバグが含まれています。

コードの要約

GitHub Copilot Chatを使って既存のコードの要約をしてReadMeファイルの作成を手伝ってもらいます。

コンテキスト変数による任意のファイルの指定

GitHub Copilot Chatでは、コンテキスト変数というチャットでコンテキストを追加できる機能があります。
https://tech-blog.cloud-config.jp/2024-02-27-github-copilot-chat-useful-features

今回は、こちらのコンテキスト変数を使用して、リポジトリ内のprogram.csの内容の要約をmarkdownで作成してもらいます。

GitHub Copilot Chatのチャットウィンドウで#fileと入力すると、

ワークスペース内のファイルが選択できるようになります。

ここでProgram.csを選択します。
そうすると、チャットウィンドウで#file:Program.csという表示になり、選択したProgram.csのファイル全体がまるっとGitHub Copilot Chatのコンテキストとして定義されました。
これでGitHub Copilot ChatはProgram.csの内容を把握してくれている状態になったので、このファイルを要約をお願いします。
こんな感じでReadMeを書いてくれとお願いしました。

レスポンスはこんな感じ。なかなかいい感じです。しかも私が意図的に仕込んだバグもちゃんとキャッチして注意点として書いてくれています。

コードの説明と処理内容のビジュアライズ

いい感じにReadMeの内容を書いてくれたので、GitHub Copilot ChatからのレスポンスをコピーしてReadMeに貼ります

ちゃんとmarkdownになってます。プレビューでもちゃんと表示されてる(´▽`)

せっかくなので、もっと読みやすいようにこの処理内容をフローチャートにしてより分かりやすくビジュアライズします。

mermaid記法による処理内容のフローチャートの生成

コンテキスト変数#fileで先ほど作成したReadMeを選択して、ReadMeの内容をmermaidでフローーチャート化してもらいます。

期待通りmermaidで処理内容をgraph TDを使ってフローチャートで表現されるように書いてくれました。
処理内容も合ってる!

ホントにちゃんと図式化できてる?を確かめるために、mermaid editorにコピペしてみます

ちゃんとフローチャートがレンダリングされました

フローチャートの処理内容も合ってます。
欲を言うと最初の処理開始と処理終了も定義してほしかったですが、処理内容の説明としてはいい感じ。

コードの最適化(不具合対応のバグチケット生成と修正提案)

上記でGitHub Copilot Chatに指摘されたように、このソースコードの中には意図的なバグが仕込まれています。これらの不具合を修正するために、まずは不具合修正のためのチケットを作成してもらいます。

GitHub Copilot Chatのレスは下記です。こちらもいい感じ。しかも修正案まで提案してくれます。

一般的によいバグチケットというものは以下が含まれている必要がありますが、先ほどのレスでもきちんと含まれていますね、

  • 簡潔なタイトル
  • 再現手順
  • ASIS
  • TOBE

コードレビュー(コードベースの品質評価)

今度は、GitHub Copilot Chatにコードベースの品質をレビューして品質を評価してもらいます。
コンテキスト変数でcodebaseを選択し、以下のように品質を評価してくれとお願いしてみます。
codebaseのコンテキスト変数は、コードベースを検索し、クエリに関連する情報を引き出してくれます。

チームで定義されているコーディングルールに則ったレビュー

ここでは、以下のようにコーディングルールが定義されているCodingRule.mdに則ってGitHub Copilot Chatにコードレビューをしてもらおうと思います。

上記のCodingRule.mdをコンテキスト変数に設定して、ソースコードのコードレビューと品質の評価を行ってもらいました。

Copilot Chatからのレスはこんな感じ。CodingRule.mdで言及されているSOLID、KISSの原則、C#の命名規則をちゃんと参照してくれて、定義されたコーディングルールに則ったレビューをしてくれています。加えて、コーディングルールでは言及していないけども一般的にコードレビューでチェックするであろうエラーハンドリングの有無も確認してくれています。
さらに、最後の方でどのようにソースコードを改善していけばいいか提案してくれていますね。リファクタの時に使えそうです。

受入テストケースの生成

最後に、受入テストケースを作ってもらいましょう。このソースコードに対する改善依頼の以下のようなPBIがあったとして、

このPBIに定義された受入基準を突破するように受入テストケースを書いてもらいます。

Copilot Chatのレスはこちら。悪くないですね。

受入テストは自動化したいので、MS Testで書いてもらいました。レスポンスのコードは下記です。それっぽい。
ATDD(受入テスト駆動開発)にも活用できそうですね。

using Microsoft.VisualStudio.TestTools.UnitTesting;
using YourNamespace; // Replace with your actual namespace

[TestClass]
public class YourClassTests
{
    [TestMethod]
    public void IsEmailValid_ValidEmail_ReturnsTrue()
    {
        Assert.IsTrue(YourClass.IsEmailValid("test@example.com"));
    }

    [TestMethod]
    public void ContainsFullWidthCharacters_NoFullWidthCharacters_ReturnsFalse()
    {
        Assert.IsFalse(YourClass.ContainsFullWidthCharacters("test@example.com"));
    }

    [TestMethod]
    public void ToDataTable_LessThanTenEntries_ReturnsDataTable()
    {
        var list = new List<YourClass> { /* Add less than 10 entries here */ };
        Assert.IsNotNull(YourClass.ToDataTable(list));
    }

    [TestMethod]
    public void ToDataTable_NullableFieldIsNull_ReturnsDataTable()
    {
        var list = new List<YourClass> { /* Add entries with null nullable fields here */ };
        Assert.IsNotNull(YourClass.ToDataTable(list));
    }

    [TestMethod]
    public void IsEmailValid_InvalidEmail_ReturnsFalse()
    {
        Assert.IsFalse(YourClass.IsEmailValid("test@.com"));
    }

    [TestMethod]
    public void ContainsFullWidthCharacters_HasFullWidthCharacters_ReturnsTrue()
    {
        Assert.IsTrue(YourClass.ContainsFullWidthCharacters("テスト@example.com"));
    }

    [TestMethod]
    [ExpectedException(typeof(SomeException))] // Replace SomeException with the actual exception type
    public void ToDataTable_MoreThanTenEntries_ThrowsException()
    {
        var list = new List<YourClass> { /* Add more than 10 entries here */ };
        YourClass.ToDataTable(list);
    }

    [TestMethod]
    [ExpectedException(typeof(SomeException))] // Replace SomeException with the actual exception type
    public void ToDataTable_NonNullableFieldIsNull_ThrowsException()
    {
        var list = new List<YourClass> { /* Add entries with null non-nullable fields here */ };
        YourClass.ToDataTable(list);
    }
}

ちなみに、私が事前に書いてたテストコードの一部はこれです。メアドのValidationのメソッドのテストは同じ感じに書いてくれてます。

 //ちゃんとしたメアドの場合、Trueを返すか検証するテスト
    [TestMethod]
    public void TestValidEmail()
    {
        // Arrange
        string email = "example@example.com";

        // Act
        bool result = Program.IsEmailValid(email);

        // Assert
        Assert.IsTrue(result);
    }

GitHub Copilotのパワーをフルに発揮するためのデザインパターン

GitHubのアーキテクトのYuki Hattoriさんが、GitHub Copilotの力をフルに発揮するためのデザインパターン&エクササイズを公開されています。
https://patterns.hattori.dev/ja/

AIネイティブなソフトウェア開発においては、開発者は以下を意識することでAIの恩恵を最大限に受けながら迅速にソフトウェア開発ができますよ、というものです。ぜひ上記のリンクからご確認ください。

  • AIが理解しやすい一貫した命名規則
  • 一貫したコーディングスタイル
  • ハイレベルアーキテクチャを先に
  • 小さなコードチャンクで作業する
  • コンテキストレスアーキテクチャ
  • 微細なOSS関係の排除

まとめ

GitHub Copilotの活用は実装フェーズでの活用が多いですが、GitHub Copilotはソフトウェア開発ライフサイクルの各フェーズで活用できる可能性があります。
特に、今回ご紹介したような既存コードの要約やドキュメンテーション、ビジュアライズはもはやメンテが困難になってしまったレガシーコードの解読やリファクタでも活用することができ、開発者以外の方にもbenefitがあるかなと思います。

Discussion