【AIペアプログラミング】GitHub CopilotのReact開発ユースケース
こんにちは、株式会社Gizumoでエンジニアをしている田中です。
弊社の10分勉強会でCTOの坂田よりGitHub Copilotを紹介され、そのヤバさを体感してしまったため私もフロントエンド開発で利用してみることにしました。
今回はReact
開発でのユースケースをもとにGitHub Copilot
がどのように機能するのか見ていきたいと思います。
目次
前提・対象とする読者
この記事は以下を前提として読み進めてください。
- サンプルコードは
React
とTypeScript
で記述 - 実装の詳細の解説はしない
また、対象とする読者は以下のような方を想定しています。
- プログラミングをしたことがある方
GitHub Copilot
に興味がある方、触ったことがある方- フロントエンド開発でどのように
GitHub Copilot
が機能するか知りたい方
GitHub Copilotとは
GitHub Copilot
とは、GitHubが提供するAIペアプログラマーです。
GitHubにてサブスクリプション登録をして、対応エディターに拡張機能を入れるだけで使用できます。
※記事執筆時点でのサブスクリプション料金は月$10でした。詳しくはこちらをご確認ください。
AIペアプログラマー
AIペアプログラマーはコードの自動生成をさまざまなアプローチで行なってくれます。
それは、コメントで書きたいコードを伝える、変数宣言を行う、コードの文脈から生成等さまざまです。
GitHub Copilot では、コーディング時にオートコンプリート スタイルの候補を提示する AI ペア プログラマーです。 使用するコードを書き始めるか、そのコードに何をさせたいかを自然言語のコメントで記述することで、GitHub Copilot から候補を取り入れることができます。 GitHub Copilot は、編集中のファイルや関連ファイルのコンテキストを分析し、テキスト エディター内から候補の提示を行います。
GitHub Copilotを使うメリット
- 工数削減
- モチベーション維持
1. 工数削減
GitHub Copilot
がコードを自動生成してくれるため、実装者は必要以上にコードを書く必要がありません。そうすると単純にコードを書く時間の工数が削減できます。
2. モチベーション維持
AIペアプログラミングは楽しいです。めんどくさいことをほとんど担当してくれるため、実装者は本質的な処理を考えることに専念できます。また、コーディングがサクサク進むため実装が楽しくなります。楽しいのでモチベーション維持に繋がります。
GitHub Copilotを使うデメリット
- エンジニアの仕事が減る
1. エンジニアの仕事が減る
ネタではなく、、、本当にエンジニアの仕事が減ると思います。後に紹介するテストのユースケースではコンポーネントの単体テストをほぼGitHub Copilot
のみで完結させています。人間の担当する領域が減るということはとても喜ばしいことですが、その分仕事が減るということでもあると思います。
実装のユースケース
実装のユースケースとして、以下項目に絞って解説してみます。実際に私が使用して便利だと感じたものを抜粋してます。
stateに応じたコードの自動生成
以下のようにuseState
でstate
を定義してそれを利用したハンドラーを定義する場面はかなり多くあります。
※ 本来Inputコンポーネント
内でstate
やハンドラーを定義するべきではありませんが、あくまで一例として今回は行なっています。
ハンドラーの自動生成
変数定義のconst
を書くだけでファイル内で定義されているstate
に応じたハンドラーを自動生成してくれます。tab
キーを押下することでエディターに入力されます。
⇩ 処理の内部まで実装してくれます。
ハンドラーの自動生成(useCallback
)
React
のハンドラーなのでuseCallback
でメモ化したいですよね。そんな時はコメントを利用します。
HTML要素やコンポーネントへの適用
自動でハンドラーやstate
の適用を行なってくれます。
カスタムhooks
構成がある程度決まっているカスタムhooks
はGitHub Copilot
に任せましょう。
Inputコンポーネント用のカスタムhooks
日本語で書いたコメントの内容をDeepLで翻訳しただけのものです。
日本語でも補完してくれますが、やはり英語の方が精度が高いです。
⇩ 足りないimport
は後で足してあげます。
⇩ カスタムhooks
から返す値まですべて自動生成してくれました。
API通信用のカスタムhooks
API通信用のカスタムhooks
も良い感じに作ってくれます。
テスト用によく利用するJSONPlaceholderを利用しています。
⇩ パッケージにも対応しています。
⇩ 外部APIを叩きたい時、そのURLもGitHub Copilot
が補完してくれます。useEffect
を使用して初期表示時にstate
へ値をセットしてくれています。
StoryBook
フロントエンドフレームワークを使った開発ではStoryBookを利用されている方も多いのではないでしょうか?
StoryBookの構成はテンプレート化されがちですが、コンポーネントごとにPropsが異なるため完全コピペというわけにもいきません。そんなときにGitHub Copilot
が活躍します。
MyButton.stories.tsx
は1行目のコメント以外、GitHub Copilot
の自動生成によるものです。
※ StoryBookのコード行数が多いため画像ではなくコードでの解説としています。
import clsx from 'clsx';
import { ComponentPropsWithoutRef, FC, ReactNode } from 'react';
export type MyButtonProps = {
btnType: 'info' | 'error' | 'success' | 'warning' | 'primary' | 'secondary';
children: ReactNode;
} & ComponentPropsWithoutRef<'button'>;
export const MyButton: FC<MyButtonProps> = ({
btnType,
children,
className,
onClick,
...props
}) => {
return (
<button
className={clsx('btn', `btn-${btnType}`, className)}
onClick={onClick}
{...props}
>
{children}
</button>
);
};
// MyButton Component Story
import { Story, Meta } from '@storybook/react';
import { MyButton, MyButtonProps } from './MyButton';
export default {
title: 'MyButton',
component: MyButton,
argTypes: {
btnType: {
control: {
type: 'select',
options: ['info', 'error', 'success', 'warning', 'primary', 'secondary'],
},
},
},
} as Meta;
const Template: Story<MyButtonProps> = (args) => <MyButton {...args} />;
export const Primary = Template.bind({});
Primary.args = {
btnType: 'primary',
children: 'Primary',
};
...省略
export const Warning = Template.bind({});
Warning.args = {
btnType: 'warning',
children: 'Warning',
};
コードを組み合わせる
GitHub Copilot
はプロジェクトないしはファイル内に定義したコードを組み合わせて文脈からコードを生成してくれます。以下は複数のラジオボタンをコンポーネントを用いて表示する例です。
まず、複数のラジオボタン用にオブジェクトを定義します。
const radioObj = {
name: 'animal',
group: [
{
label: '犬',
id: 'dog',
value: 'dog',
isDisabled: false,
},
{
label: '猫',
id: 'cat',
value: 'cat',
isDisabled: false,
},
{
label: '鳥(非活性)',
id: 'bird',
value: 'bird',
isDisabled: true,
},
] as const,
};
その後同じファイル内の表示したい箇所に{}
と打ち込むだけで以下のような補完を出してくれます。
⇩ プロジェクト内で定義済みのコンポーネントを使用してくれます。
⇩ … Props
もすべて補完してくれました。isDisabled
は存在しないProps
なのでリントエラーが出ています。
上記はisDisabled
の部分を正規のProps
名に修正すれば実装完了です。
テストのユースケース
テストのユースケースは単純ですが一番インパクトが強いです。
テストケースからコードを生成
テストケースの内容からコードを自動生成してくれます。(なんならテストケースまで自動生成してくれる・・・)
describe('MyInput', () => {
test.todo('画面に表示されること')
test.todo('文字を入力できること')
test.todo('placeholderに「ex. example@email.com」')
})
上記コードから.todo
を消していくだけでテストがほぼ完成します。
⇩
⇩ … GitHub Copilot
が自動生成できない部分は後で足してあげます。(ex.
以降)
モックの自動生成
API通信が絡む処理のテストはMSW等のライブラリを使用してモックサーバーを準備することが多いと思います。
モックサーバーにはテストデータが必要ですが、「内容を考えて実装する」工程には多少のコストがかかります。また、単純作業からモチベーションの低下にもつながります。GitHub Copilot
を使うことでそのコストを抑えつつモチベーションを維持しましょう。
モックのためのコメントを書く
モック生成のために必要なコメントは以下2つです。
- エンドポイント
- レスポンス型
これらをコメントで教えてあげることであとは自動生成してくれます。
⇩ posttype
の型からレスポンスを自動生成してくれています。
⇩ すべて自動生成してくれました。「// get detail …」はGitHub Copilot
が文脈から予測して候補で提示してくれているものです。
最後に
ここまで読んでいただきありがとうございました!GitHub Copilot
はいかがだったでしょうか?使い方の幅はまだまだたくさんあると思いますがAIペアプログラミング
とは何かを知っていただけたのではないでしょうか。
この記事を読んでGitHub Copilot
を今まで知らなかった・使ったことなかった人が少しでも使ってみようと思っていただけたなら幸いです。
個人的な感想として、GitHub Copilot
最大限の力を発揮するにはどうしたら良いのだろうと自然と考えることから、GitHub Copilot
のようなAI
がプログラミングしやすいように設計・開発を行うAI駆動開発も今後主流になっていきそうだなと感じています。
皆さんもぜひ導入して使ってみてください!