Copilotトライアル③ GitHub CopilotをRubyチームでトライアルしてみた

はじめに

システム本部のデベロッパーエクスペリエンス室の新田です。弊社ではこの2か月ほど、GitHub Copilotのトライアルを実施しておりました。今回この記事ではRubyチーム4名による感想をまとめて紹介したいと思います。

使用感の総評

  • 業務効率化につながったので、引き続き使いたい
    • 使い方を知らなくても1~2割くらい早く実装できてそう
    • 提案されたコードの承諾率は平均約30%とされていたが、意図的に生成させたコードについては、だいたいそんな感じだった
  • 経験の浅い言語への実装のハードルが下がった気がする
    • ググるよりも、Copilot用に文脈を書く方が早いこともあった
  • プロンプトエンジニアリングを学んでいくことが、業務効率化の鍵になりそう
  • コード補完に関しては、現時点ではそのまま適用できるコードの提案はされない
  • テストのひな形を提供してくれる点は非常に役立っている
  • Copilotの学習が進行し、提案のクオリティが向上すれば、コーディングの大きなサポートとなると感じている
  • コメントの補完は高精度で行なわれる。
  • 修正提案には、これまで知らなかった書き方が紹介されることがあり、それが勉強になる
  • あったら便利なケースもあるけれど、あることで余計な時間がかかるケースもあった

メリット・便利な点

テストの作成時のモックの使い方

  • 私が知らなかったモックを用いたテストの書き方が提案され、その結果、検知の範囲が拡大した

テストパターンの提案

  • 閾値を意識したテストパターンが提案されるため、テストの作成作業が軽減された

ダミーデータの作成

  • ダミーデータの提案では、factoryを利用し、少しの手直しで適用可能な形になっており、作業効率が上がった

一般的なミスの早期発見

  • レビューを通して、null対策などRuboCopでは検出できない部分の疑問点を指摘してもらえ、コード品質の向上に役立った

リファクタリングのサポート

  • 単一責任の原則に基づく提案が行なわれ、メソッドの長さが問題になった際の分割提案など、コードの可読性や保守性の向上に寄与している

コード補完について

  • Rubyのコード補完は、Copilotのデモで見たJavaScriptのようには動作しない印象。その点、今後の進化に期待している

いわゆるボイラープレートコードを生成してくれるので、手を動かす量が減った

  • プロトコルを継承した際に毎回繰り返し書かなければならないコードを生成してくれるため、暗記しなくて済む
  • 特にSwiftでは、長い関数名を覚える必要がなくなった
    • 例:func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int とか

ドキュメントを記述する際に詰まっていると良い表現をくれるので、記述が早くなった

言語に関する知識量が少なくても、かけるコードが増えた

  • Rubyの経験が浅くても、コメントを記述するだけで、例えば次のようなコードを生成してくれた

Swagger の yaml ファイルを編集する際は、かなりの手間が減った

  • 毎回 type: object とか required: true とか書くのが面倒だったので、これはかなりSwagger実装の負荷が下がったと思う

導入が簡単

  • RubyMine、vscode双方にプラグインをインストールして使用したが、ポップアップの誘導通りにgithubアカウントでログインしたところ設定完了した

railsのレールに乗った開発には使えそうなときがある

  • 先にコントローラーでcreateメソッドとdestroyメソッドを作成した後にroutes.rbを編集したが、改行したところ一発で実装予定だったものをレコメンドしてくれた
  • ちなみに、感動して何度も同じところでレコメンドさせて末尾のdoを消すを繰り返していたら、学習したのかdoなしのレコメンドをするようになった

デメリット・注意が必要な点

使い方を知らないと、思っていたよりも使い勝手が悪かった

  • 初めはCopilotにコード生成させようとしても、期待したコードが生成されず、少し残念な気持ちになっていた
  • エディタやIDEのように頭文字などを入力して補完をさせるのではなく、コメントアウトで行なってほしい処理を書くなど、プロンプトエンジニアリングという手法を意識すると、使い勝手が良くなった

URLなど固有の文字列を生成することもあるが、誤っていることが多いため鵜呑みにしないよう注意

CopilotはIDEが行なうコード補完とは別物だと思った

  • Copilotは大規模言語モデル(LLM)を使用してコードを生成するため、前後の文脈が大事らしい

Copilotに頼り切りになると、この先Copilotなしでは生きられないエンジニアになりそうだと感じた

  • 自動生成させることが面白かったので、何でもかんでもCopilotに生成させようとしたが、このままで良いのかと感じた
  • あくまで困ったときや、楽したいときの補助ツールとして使うのが良さそう

正直なところ自分で書いたほうが早いという意見もあった

  • 「レコメンドを読んで、問題なければ受容して、問題があれば修正するか却下して自分で書く。」
    • エンジニアのレベル次第ではあるが、この工程を踏むぐらいなら自分で最初から書いたほうが早い(とはいえ、悩んでるときにはレコメンドが役立つケースが極々稀にある)
    • また、ネットワークの問題なのかレコメンドが表示されるまでに微妙なラグがあり、それを待つことも含めると自分で書いたほうが早い。

基本的にコードが間違ってる

  • レコメンドされたメソッドの引数やメソッド内の内容が基本的に間違っておりレコメンドを受け入れたとしても修正をする手間がある
  • また、次のように注意して確認しないと気づけない間違い探しのようなレコメンドをしてくる
    • scope :published, -> { where('published_at >= ?', Time.current) }
    • published(公開済み)のものを取得したいのでpublished_atがTime.currentより小さい必要があるが、レコメンドでは逆になっている

その他TIPS

VSCodeでのCopilot Chatの日本語化

Copilot Chatはデフォルトで英語で返答します。そこで、VSCodeのキーボードショートカットを活用して、日本語での返答に設定を変更しました。
APCOM TechBlogに詳しく記載がありますので、ご確認ください。

GitHub Copilot を使う際のおすすめ記事

カカクコムでは、ともにサービスをつくる仲間を募集しています!

カカクコムのエンジニアリングにご興味のある方は、ぜひこちらをご覧ください!

カカクコム採用サイト