mercariさんの「Online Spring Internship for Gophers2022」に参加しました

はじめに

3/14(月)から3/18(金)までの5日間、mercariさんの「Online Spring Internship for Gophers2022」に参加したので、それについて書いていきます。
インターンの中で学んだ技術的なことについてはすでにZennの方で「Go1.18からのWorkspace modeをさっそく使ってみた」というWorkspace modeについてまとめた記事を書いているのでそちらもぜひご覧ください。

1日目(集団講義)

まず1日目はtenntennさんによるGo1.18の新機能についての講義を1日かけて行いました。
資料がすでに挙げられているので興味があるかたは是非見てみてください。 内容としては大きく分けて

  • Generics(型パラメータ、型セット)
  • Fuzzing
  • Workspace mode

の3つについてになっていました。
この中ではGenericsがGoに与える影響が大きかったので、内容としてもGenericsが多めになっていました。
講義はまずGoがどのようなサイクルで開発とリリースを繰り返しているのかといったことや、どのようにしてコンパイラに手をいれずに新機能を試しているんかというところから始まりました。

そこからGenericsの話がはじまり、型パラメータと型セットについてときおりTRYという形式で理解できているのか実際にコードを書いて確認することができるようになっていました。
これがあることで、より自分のなかで理解を深めることができたと思います。

TRYの中では、木構造というところが自分は一番苦戦しました。
というのも、普段からガンガン深さ優先探索を書くということはしていなかったので、どの順で関数を実行して表示させるのかといったところに悩みました。
その辺のデータ構造やアルゴリズムといったところは自分の中で課題になっているので、これを機に普段慣れ親しんでいるGoを通して学んでいくのもおもしろそうだと感じました。

講義はremo上で行われ、チャットが常にオープンになっていました。それによって、参加者がコメントをしたりわからないことや気になることがあれば質問するといったことが可能になっていました。
自分はふだんからGoに関するいろいろな勉強会に参加していますが、今回のインターンの講義はその中でもかなりコメントが盛り上がっていた印象でした。

2日目(モブプログラミング)

2日目は4人1組のチームでのモブプログラミングを行いました。

モブプログラミングの課題は2種類ありました。1つ目はsync.Mapgenerics対応というものでした。
これはsync.Mapgenerics対応させてwrapperで包むというような実装で各グループ進めていました。チーム間のアイスブレイクを兼ねたものになっていたので1時間弱で全チーム実装できていたと思います。

2つ目のお題は

という2つから各チーム選ぶようになっていましたが、すべてのチームが競技プログラミングの方を選んでいました。

今回のモブプログラミングではドライバーに書いてほしいコードの指示をだして、ドライバーには特になにも考えずに言われたことだけをかいてもらうことができました。
というのも、前回モブプログラミングをした際はドライバーにエスパーして書いてもらったことが多く、あまりモブプログラミングらしいことができなくて、あまり得るものがなかったという経験がありました。
これのおかげで今回はチームでわいわいしながら開発をすすめていくことができました。わいわいやっていけたことで、詰まったときの議論もスムーズにできたと思います。
今回はドライバーの方に対して絶えず話しかけるというようにしたら、うまく書いてもらうことができたので、今後モブプログラミングをする機会があったらこれを継続していきたいです。

余談にはなりますが、モブプログラミングを通して、あらためてVS codeのLive Shareの便利さを感じました。
拡張機能をインストールとGithubMicrosoftのアカウントさえあれば使用できるため、使うハードルが低いです。
前回モブプログラミングを行った際は、役割を交換する際に毎度その時のドライバーがGithubにpushして、次のドライバーがそれをpullしてから自分の画面を共有するということをやっていたため、役割交換に時間がかかってしまっていました。
しかし、今回はLive Shareのおかげで役割交換は「次○○さんドライバーよろしくお願いします」と声をかけるだけでよくなったのでとてもよい開発体験ができました。

3日目,4日目(個人開発)

3日目と4日目は参加者がそれぞれGo1.18にまつわるOSSを開発しました。
自分はその中で、Go1.18の段階でFuzzingできる関数の一覧を表示するshowfuzzとFuzzingのひな形部分を生成するgofuzzgenという2つのツールを開発しました。 2つに分けてツールを作成した理由は、Go1.18からのWorkspace modeを使ってみたかったというところが大きいです。

個人開発の途中で詰まったり、OSSのアイデアが浮かばないといったときにメンターさんたちがお力を貸してくれるというようになっていたので、参加者全員が順調に開発できていたと思います。

また、3日目も4日目も基本的に参加者はremoの会場にいるようになっていました。
なので、すこし疲れた時や、ちょっと雑談したいときなどはチームのメンバーと話すことができたのでとても楽しく開発ができました。

この2日間で完成させることが目的ではなく、OSSを自ら開発してそれを管理していくきっかけを与えることが目的と言う話だったので今後も開発を続けていきたいです。

5日目(成果発表会&懇親会)

5日目には、3日目と4日目で開発したOSSについてそれぞれ発表会で発表しました。
ほかの参加者の多種多様なアイデアに触れることができたので、勉強になりとても面白かったです。
1日目の講義と同様にチャット欄が盛り上がっており、オンラインでの開催ではありながらも孤独感を感じずに発表することができました。

すべてが終わった後に、懇親会がありました。
懇親会ではチームを越えてほかの参加者とお話することができたので、とても有意義でした。
ちなみに懇親会もremo上で行われました。remoの強制席替え機能には驚かされました。

全体を通しての感想

一番は楽しかったということです。
というのも、インターンシップの5日間を通して自分と同年代のエンジニアとともに自分が今一番気に入っているGoについて学べたからです。
普段のインターンではフルリモートということもあり、同年代と関わる機会があまりないのでとても新鮮でした。
そして、Go1.18の新機能を本リリース前から手を動かして学ぶことができたのもとてもよかったです。
今回のインターンで学んだことを、これからの開発に生かしていきたいです。