はじめに
メルペイのエキスパートチームの@tenntennです。Merpay Tech Openness Month 2022の2日目2本目の記事です。2022年3月14日〜3月19日の5日間でOnline Spring Internship for Gophers 2022を開催しました。本記事ではインターンシップの概要や目的、参加者に取り組んでもらった課題や作成頂いたソフトウェア、インターンシップの運営について書きます。
開催目的
インターンシップの開催目的は主に以下の2つです。
- メルカリグループについて知ってもらう
- Goコミュニティの活性化
メルカリグループについて知ってもらう
メンターとのコミュニケーションや社員とのランチ会、社内勉強会へ参加して頂くことでメルカリで働く社員や働く環境について知ってもらいたいと考えていました。また、サマーインターンシップや就業型の長期インターンシップに参加するきっかけになれば嬉しいと思っています。
Goコミュニティの活性化
私のミッションに人類Gopher化計画があります。簡単に説明すると、Goを仕事や趣味で扱う人を増やし、国内外のGoコミュニティを活性化させるというものです。今回のインターンシップも参加した学生に新しいGoの機能を学習して頂くことでそれらの機能を広め、新しいOSSを開発を創出し、参加者同士でつながって頂くことでGoコミュニティを盛り上げたいと考えて企画しました。
5日間の日程
開催概要はメルカンの記事にも書かれていますが、インターンシップは以下の日程で行われました。
1日目:講義
2日目:モブプログラミング
3日目〜4日目:個人開発
5日目:成果発表会・社内勉強会への参加
それぞれの詳細を説明します。
1日目:講義
1日目は手を動かして学ぶGo1.18の新機能という資料を使って講義形式で行いました。2022年3月18日(日本時間)に公開されたGo1.18はこれまでのリリースの中でもっとも規模が大きく、Fuzzing、Workspace mode、ジェネリクス(型パラメタ)などの大きな新しい機能を含んだバージョンになりました。Go1.18の公開に先んじて、ジェネリクス(型パラメタ)を中心にこれらの機能を学習する機会を提供させて頂きました。
ジェネリクスのパートでは、これまでのGoのジェネリクスへの取り組みからどのように最新の仕様に偏移したか、型パラメタや型成約、型セットなどの新しい概念、型パラメタを含むソースコードの静的解析について解説しました。講義の様子は録画しているため、編集後にmercari devjpのYouTubeチャンネルで公開予定ですので、チャンネル登録をしてお待ち下さい。
2日目:モブプログラミング
2日目はチームに別れ、モブプログラミングを行いました。2日目は私の他に4人のメンター社員と共にコーディングの相談にのったり、アイデアを提供したりしました。モブプログラミングで開発するソフトウェアは、共通課題を行った後に、自由課題を2つのテーマから選択して頂きました。
共通課題:sync.Mapのジェネリクス版を作ろう!
共通課題は比較的作りやすく難しすぎない課題にしました。チームメンバーは初対面の人が多いはずなので、方向性や認識がメンバー間でズレにくく、コミュニケーションが起きやすくなるように設定しました。もともとは自由課題だけの予定でしたが、メンターの1人からアドバイスを受けて設定しましたが、うまくコミュニケーションが活発になったと思います。
作るものは非常にシンプルで標準ライブラリのsyncパッケージで提供されているMap型をジェネリクス化するものです。sync.Map型はゴールーチンセーフなマップの機能を提供しますが、キーも値もany型(Go1.18で新しく提供されたanyはinterface{}の型エイリアス)です。そこでキーと値の型を型パラメータとして指定できるようにラッパーを作ってもらいました。
自由課題1:競技プログラミングで便利な最強のツールを作れ!
タイトルは勢いで書いたものなので最強である必要はありません。競技プログラミングでGoを使う上であったら便利なツールやライブラリを作ってもらいました。実は自由課題2を選択するチームはなく、すべてのチームが自由課題1を選択していました。ヒープなどのデータ構造を作るチームが多かった印象です。実際に使ってみようと試みるチームなどもありましたが、競技プログラミングのシステムがGo1.18に対応していないので難しいという判断になってたようでした。その後、go2goを再実装し、Go1.18のコードをGo1.17以下のコードに変換したら良いのではないかというアイデアで試みる参加者もいました。
自由課題2:ISUCONで便利な最強のツールを作れ!
自由課題2はISUCONで便利なツールを作るというものです。こちらは実際には選ばれませんでしたが、sync.Map型のジェネリクス版もそうですが、ジェネリクスを使うとISUCONの本番に役立つツールやライブラリが作れそうです。
3日目〜4日目:個人開発
3日目〜4日目は個人開発を行ってもらいました。開発して頂くソフトウェアはGo1.18の機能を使ったものや関連するものであれば何でもOKです。2日間で作り切る必要はありませんが、期間中である程度の形が見えてくる規模のものを作って頂くようお願いをしました。作って頂いたソフトウェアは以下のようにOSSとして公開されています。20個以上のOSSがこの期間中に公開されました。
- 静的解析による型セットの可視化
- genq (LINQ in Go with generics)
- fs.FSをAPIとして利用
- gencon ~generate type constraints~
- genericsを使った空間的データ構造の実装
- Genericsを使用したset型
- Simple Interfacde
- デバッグ用の ロギングライブラリ dl
- 構造体を定義せずにJSONデータを取得する
- ジェネリクス版 cfg 生成器
- go1.18 で競プロができるようにするツール goder
- ccffer – CornerCase Faker-Fuzzer –
- goでstream-api
- errors.As / go-cmp / StateMachine
- Fuzzingできる関数を表示する静的解析ツール / Fuzzingのひな形生成ツール
- 高速でジェネリックな行列計算ライブラリ
- Map関数使って暗号化とか
- アクターライブラリMolizenのジェネリクスによる改善
- Deep Learning by Go1.18
- ジェネリクスを用いたOrdered Map
個人開発の期間もチームメンバーやメンターと相談や雑談しながら開発を進めて頂きました。2日目にモブプログラミングを通してチームメンバーやメンターとコミュニケーションが取りやすい状態にできたと考えています。
5日目:成果発表会・社内勉強会への参加
5日目は午前中に発表資料や個人開発で作成したOSSの公開などを行って頂き、午後から成果発表会を行いました。成果発表会は1人6分程度で個人開発で作成したOSSについて発表し、メンターからフィードバックをもらうという形式で行いました。メンターだけではなく、発表を聞いている他の参加者からも積極的に質問が出ていたことが印象的です。
成果発表会が終わったあとはGo Fridayと呼ばれる2016年から続く社内勉強会に参加して頂きました。Go Fridayは事前準備なしの雑談会に近い勉強会でゆるい雰囲気で参加できます。インターンシップの参加者にもその雰囲気を実感して頂けたかなと思います。参加していた社員への質問もたくさん出て議論が盛り上がりました。
Go Fridayが終わった後は、OSSを整えたり、ブログを書く時間にあててもらいました。その後、おつかれさま会をして5日間のインターンシップは終わりました。
開催してみて
運営
インターンシップ期間中はSlackとRemoを使ってコミュニケーションを取りました。Remoにチームごとのテーブルを作り、参加者には期間中はそこに座って(物理的ではありませんが)頂きました。講義や成果発表会はプレゼンテーションモードを使って全体で行い、モブプログラミングはテーブルごとに行って頂きました。メンターテーブルを用意しておき、モブプログラミングや個人開発で困った場合には相談に来れるようにしました。
モブプログラミングの進捗はRemoのチャットに書き込んでもらう形を取りました。他のチームのソースコードが読めるようにGitHubのオーガナイゼーションを用意し、そこでソースコードを管理しました。個人開発についてはリポジトリは個人で用意してもらい、それらの情報はGoogleフォームを用いて収集しました。
メンターテーブルは常に大盛況でRemoの特性を活かした使い方ができたかなと思います。静的解析の基礎など聞きたい人が多いテーマで1つのテーブルに入り切らない場合は、別室を作ってプレゼンテーションモードを使って説明したりもしました。
全体を通しての感想
アンケートによると参加者の満足も高く、私やメンター社員も楽しく参加できました。Merpay Tech Fest 2021のセッションでも話しましたが、ハードルは高めだけど、内容の濃い学習型のインターンシップは参加者の満足度も高く、運営する社員も楽しいのでおすすめです。次回も濃い目のインターンシップを用意したいと考えています!
メルカリのインターンシップに興味のある学生の皆様は、2022年4月20日と27日に開催されるサマーインターンシップの説明会にぜひ参加してみてください。