2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
GitHub Copilotを使って自作ライブラリを作ってみよう(全1記事)
リンクをコピー
記事をブックマーク
新谷哲平氏:では「GitHub Copilotを使って自作ライブラリを作ってみよう」という題でタイミーの新谷が発表させていただきます。よろしくお願いします。
簡単に自己紹介をさせてください。タイミーでバックエンドエンジニアをしています。書くことがなかったので、好きなものはカレーと書いてみたんですが、自分が好きなカレーはジャワカレーです。みなさん、おすすめのカレールーがあれば今回のハッシュタグを使ってポストをして教えてください。よろしくお願いします。
簡単に、タイミーの紹介をさせてください。タイミーとは、働きたい時間と働いてほしい時間をマッチングするスキマバイトサービスです。
ただいまとても伸びていて、YoYで4.7倍に成長しています。これってすごい数字なんじゃないかなと思っています。また、エンジニアも例に違わず足りておらず、エンジニア採用をやっています。
タイミーでは、「GitHub Copilot for Business」、業務で使える枠が余っているので、業務で「GitHub Copilot」を使いたいよという方は、まずはカジュアル面談からよろしくお願いします。
というのは前置きとして、さっそく入っていこうかなと思っています。
まず簡単に、「こんな人向けの発表です」というところから。今回の発表は、「GitHub Copilot、最近よく聞くけれど結局まだあまり使ったことがないんだよね」という方が、「いや、これ便利じゃん。ちょっと触ってみようかな」になるところを目指したいと思っています。
GitHub Copilotをもう使いこなしているよという方は、「わかる〜」みたいなツイートをしたり、これからデモをするので、デモの応援などをよろしくお願いします。
目次について説明をします。まずは、なんで自作ライブラリなのかというところ。次に、実際にデモを交えて紹介して、やってみてどうだったかを簡単に自分なりにまとめたいなと思っています。
まず、「なぜ自作ライブラリなのか」ですが、今回は対比として業務アプリケーションを持ってきました。業務アプリケーションが固有のドメインロジックを持つというのは、当たり前ですよね。
プラス、業務アプリケーションのコードが丸々公開されていることはあまりないと思うんですね。バックエンドならたまに公開されていることもありますが、iOS、Androidとかだと、もう本当にないんじゃないかなと思っています。
対して自作ライブラリというと、固有のドメインロジックが少ない。しかも、優秀なライブラリのオープンソースはたくさん公開されている、データセットが多くて、こっちのほうが補完の性能が高いのではないかと思っているので、自分はライブラリの作成をおすすめしたいなと思っています。
とはいえ、これは相対的な話かなと思っていて、自分も業務の開発でGitHub Copilotは使っていて、生産性の向上を感じているので、業務においてGitHub Copilotが有用ではないよ、という話ではないことはご認識ください。
では、「実際に実装してみる」というところに入っていこうかなと思っています。今回は、デモを交えながら紹介していきます。こちらのソースコードは、後で「Twitter(現X)」にも流すので大丈夫です。
まず、簡単に前提についてお話をします。今回はRubyのコードなのですが、なるべくRubyの知識がなくても大丈夫なように解説をしていこうと思っています。
今回は、my_active_model gem、ライブラリを作成中だとしましょう。今、実装できているのはここまでです。attribute :nameと書くと、対応したコンストラクタと、getterやsetterが定義されます。
今回はこれに対して、valid?メソッドというのを実装してみたいと思っています。どういう変更があったかというと、attributeに対して、第2引数にstringやintegerというものが増えているのと、valid?メソッドですね、これが増えているというかたちになっています。
では、デモに移りたいと思います。今見えているのがサンプルコードの、テストコードのようなものだと思ってください。
Userクラスがあって、name、ageがあります。(スライドを示して)ここのコメントアウトしているところをこれから実装していきたいと思います。
まず、今の状態で動きそうですかね。今の状態でnameがteppeiでageが26というので、いいかなと思っています。
では、このテストコードを書いていきましょう。さっそくCopilot君が、「stringなんじゃない?」と言っていたり、ageで「integerなんじゃない?」と教えてくれました(笑)。早いですね。attributeで引数が足りないのでダメって怒られています。
では実装をしていこうと思います。まずは、attributeの引数にtypeを追加します。attributesの情報を保存したいので、ハッシュを持たせて……賢すぎるな、ちょっと。
(会場笑)
もしかすると、キャッシュが残っているかもしれませんが(笑)、やりたいことがそのまま提案されてしまって困っているんですが、保存した情報を基にattributesメソッドを生やしたいなと思っていて、インスタンス変数のattributesが返るようになっています。
これで、少なくともこちらの上のattributeメソッドのエラーはなくなったんじゃないかなと思っています。valid?メソッドがNoMethodErrorと言われていますね。
では、次ですが、valid?……キャッシュが残っているのかな? なんか賢すぎるんですが。
(会場笑)
いったん置いておきます。デモの練習をしていてちょっと気づいたんですが、valid?を先に実装しようとするよりも、valid_type?というメソッドを定義したほうが賢いことに気づいたんですよね。
これを補完してもらおうと思います。何を提案してくれたんだ? typeに、ここに、シンボルではなくクラスが入ってくるぞ、というのを実装しているんですかね。そうではないので、case……なんか出てきていますね。これ、ちょっと待ってくださいね。値と型を渡すほうが、メソッドとしてはすっきりしてそうな気がする。これでどうなるんだろう? 補完を採用してみましょう。
これで、stringが渡されたら、Stringクラスのインスタンスかどうか、integerが渡されたらIntegerかどうかをチェックしてくれるようになったかなと思っています。
これを基に、valid?を実装してくれるんじゃないかなという見立てでいかがでしょうか。補完をそのまま採用してみました。
attributesから全フィールドに対して値を取得して、validかどうか、validでないものが1つでもあればfalseを返して、全部スルーすればtrueが返る。正しそうな実装に見えます。
では、これを実行してみましょう。すると、user.valid?がtrueが返ってきていることがわかります。
では、試しにageをstringにしてみましょう。そうすると、きちんとvalid?がfalseになっているので、引数による型の検証がうまく動いているんじゃないかなと思っています。
これで、valid?メソッドはいったん実装は完了です。1度、スライドに戻ります。
次に、to_hメソッドを実装したいと思います。こちらは、連想配列ですね。連想配列の値に対して、フィールドの情報が全部入った連想配列を返したいとします。
では、これも実装していきます。to_h……もう補完してくれているんですよね。賢すぎる気がするんだよな。こちらを採用しましょう。
まず、attributesの全フィールドに対して、each_with_object。これはほかの言語でreduceのような関数になっています。引数に渡したもの、空のハッシュにどんどん値を代入していくというメソッドなので、これでいけるんじゃないですか?
はい、実行します。to_hで、nameにteppei、ageが16というかたちで、何も実装していないんですが、きちんとメソッドが定義されたことが確認できると思っています。
最後に、to_jsonメソッドを実装しようと思います。こちらは、先ほどと形は似ているんですが、JSONの文字列ですね、文字列を実装してみましょう。
では、さっそく、to_json……おっ、出ましたね。to_hメソッドを利用して、「Hashクラスのインスタンスにto_jsonメソッドが入っているだろうから、それを使ったらいいんじゃない?」。賢い。
では、実行してみましょう。
ごめんなさい、コメントアウトを外していませんでした。実行すると、あら、エラーになりましたね。(スライドを示して)これが、NoMethodErrorと言っている。
これは知っていて、Rubyでは、jsonライブラリをrequire、インポートしないと、Hashにto_jsonメソッドが生えてこないんですよね。これでto_jsonメソッドも実装できたんじゃないかなと思います。
というふうに、ちょっと今回は賢すぎたかもしれませんが、何も書かなくても自作ライブラリの一機能が実装できるというのがわかったかなと思っています。
最後に、やってみてどう感じたかというところです。
一言で言うと、自作ライブラリ作成のハードルがグッと下がったんじゃないかなと感じました。
1つ目としては、「飽きる前に最低限仕上げられる」。これが個人的にはかなり大きいと思っています。
自分の実体験として、「あっ、いいアイデア思いついた、やってみよう」と思って作り始めはするんですが、飽きて完成しないんですよね。
なので、開発生産性でいうと、生まれていないのでゼロだと思っているんですよ。ただ、今回のGitHub Copilotを使えば、飽きる前に最低限の実装を仕上げられる。最低限の実装さえ仕上げられれば、「ちょっと改善するか」という気持ちになって続けられるので、アウトプットがなかったものが、1が生まれるので、生産性は無限大なんじゃないかなと自分は思っています。
また、学習教材としてもいいなと思っています。先ほどのeach_with_objectメソッドとか、ふだん使わないメソッドの使いどころとかを知れたり、ライブラリ特有の抽象的なコード、今回のデモではあまり紹介できなかったんですが、そういったコードも提案してくれるので、勉強にもなるんじゃないかなと思っています。
ということで、初級者にとっては開発の補助輪として、中級者、上級者にとっては開発のブースターとして、GitHub Copilotを、一家に一台いかがでしょうか? ということで終わらせていただきます。ご清聴ありがとうございました。
(会場拍手)
2024.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05