Github Copilotを試してみた

is 何

Github Copilotとは、AIを使ったコーディング支援機能で、コメントやコードの文脈から意図を読み取り、提案してくれる。
学習モデルはGitHub上の公開リポジトリ。
読み方は コピロットではなくコパイロット。「副操縦士」の意。

試してみる

使用方法は公式に従う。
https://docs.github.com/en/copilot/quickstart

GitHubと連携されていなければ利用できないので、注意。 (拡張機能インストール時にエディタ上で案内が出る)

実際に試してみたコードが以下。
「[msec]秒の待ち時間を発生させる」関数を、TypeScriptとDartで作ってみた。

TypeScript

// [msec]秒の待ち時間を発生させる
export function wait(msec: number): Promise<void> {
  return new Promise((resolve) => {
    setTimeout(resolve, msec)
  })
}

問題なさそう。
// [msec]秒の待ち時間を発生 までタイプしたところで残りの部分はすべてサジェストされた。 (残りのコメント、コード1行目、それ以外、と順を踏んで)

Dart (Flutter)

/// [msec]秒の待ち時間を発生させる
Future<void> sleep(int msec) async {
  await Future.delayed(Duration(milliseconds: msec));
}

これもコメントをタイプした時点で残りはすべてサジェストされた。
ただ、このコードは待ち時間後に実行する関数であるcomputationが省略されており型を自動で推論できないため、Lintエラーとなる。
正しくは以下。

await Future<void>.delayed(Duration(milliseconds: msec));

完璧とはいかないが、コメントや入力途中のコードからいい感じに自動生成してくれそう。
前後の文脈も解析対象のようで、同じコメントでもファイル内のコードの内容によって自動生成内容は異なっていた。
日本語テキストの補完も問題なし。

当たり前だが、より複雑、限定的なコードほどサジェストミスも多い。
コメントや構造化を最適化できるつよつよエンジニアであれば自動生成の精度も上がって爆速開発が可能になるし、そうじゃないエンジニアも知らなかった手法の開拓や、意識的な改善も図れそうな感じ。

GitHub Copilotの課題

ただ、公開リポジトリでもライセンスの種類に関係なく学習に使用されたりしていて、著作権的に問題があるのでは、という議論は多い。
https://gigazine.net/news/20220627-github-copilot-blame/

また、プライベートなコードをGitHub Copilotの改善に使わないようには設定可能だが、コードサジェストのための情報送信は止められないため、特にセキュリティを気にするプロダクトでの使用はちょっと躊躇われるところではある。
https://zenn.dev/miyajan/scraps/3567cee380280c