社内でOSSコードリーディング会を始めました

### はじめに

この記事は[GLOBISのカレンダー | Advent Calendar 2021](https://qiita.com/advent-calendar/2021/globis)の16日目です。

こんにちは、グロービス基盤チームエンジニアの[@shifumin](https://twitter.com/shifumin)です。最近の趣味は自宅筋トレとポケモンユナイトです。  

昨日の記事は、@masaibarさんのAndroidの動作再生画面の回転仕様を再現するべく奮闘した[AndroidでYouTubeの再生画面の回転仕様を再現する](https://qiita.com/masaibar/items/e0d58e84b3102c57a88b)でした。
今日のこの記事では試行錯誤しながら社内でOSSコードリーディング会を始めた話を紹介したいと思います。

### きっかけ

開発を進めていると必要に応じて利用しているオープンソースのライブラリの実装を読むことがあるかと思います。その際に「ライブラリのコードリーディングの速度が遅い気がする」「皆どうやって読んでいるんだろう」という思うことが多く、また最近業務で認証機構のリプレイスに携わっている関係上ライブラリの実装を読む頻度も高まっていました。ある日、前述の疑問を抱きながらライブラリのコードを読んでいた時に「社内でOSSコードリーディング会を開けば同僚のノウハウが手に入るのではないか」という天啓を受け、善は急げと社内Slackの技術トークチャンネルで参加者を募ったことがOSSコードリーティング会発足のきっかけとなりました。  
社内に学習意欲の高い人が多く、こういう風に誰かが勉強会を開こうとした時にすぐに参加者が集まるのがグロービスのいいところだと謙遜なく思っています。

### コードリーディング会の進め方

ここからは実際にコードリーディング会を実際にどのように始め、どのように進めたかを紹介します。

#### 初回
初回は、題材のOSS決めと参加者ごとの目標の話し合いを行いました。

題材のOSS決めは、参加者の大半が普段Railsのコードを書いているバックエンドエンジニアであったため読みたいOSSがある程度被っているのではないかという想定の元、事前に読みたいOSSを挙げていただいて初回で1人2票の投票で民主主義的に決めました。

[![Image from Gyazo](https://i.gyazo.com/50847313d7dd56e2c1a2a55b84fd8164.png)](https://gyazo.com/50847313d7dd56e2c1a2a55b84fd8164)
Ruby Gemsが多く候補として上がっていますね。

投票で[Sidekiq](https://github.com/mperham/sidekiq)と[Hanami](https://github.com/hanami/hanami)が同票となったため、それぞれの読みたい想いを書いていただいた上での再度の決選投票を行いました。しかし、決選投票でも同数となったため最後は主催者特権で独断と偏見で最初の題材をSidekiqを決めました。~~上で民主主義的に決めると言ったな。あれは嘘だ~~


また、ただOSSのコードを読むだけの時間にしたくなくて、コードリーディング会をこれから行っていく上でこの会を通じてどうなりたいかというゴールを参加者同士で共有しました。

[![Image from Gyazo](https://i.gyazo.com/926f897d2db6d353ac6431f4d00eedd4.png)](https://gyazo.com/926f897d2db6d353ac6431f4d00eedd4)

一部に謎の目標がありますが、様々な目標が出ました。
そして、参加者がそれぞれの目標を持ってOSSコードリーディング会が始まりました。

#### 2回目以降

僕たちは毎回予習担当を事前に決めておいてその回の担当者ができるだけ予習を行ってからコードリーディング会に臨むという進め方を採用しています。担当者がモブプロで言うところのドライバのように画面を共有し説明を交えながらコードを読み進めていくイメージです。
予習担当者の負担がかなり大きいのは間違いないのですが、進め方を参加者で議論した際に「ダラダラとコードを読んでいるのではなく方向性を持って進める有意義な時間にしたいね」という話が上がったため、この進め方を選びました。  

#### その題材の初回
1つの題材のOSSはもちろん複数回で取り扱いますが、その題材の初回の会では全体像を把握することに努めています。

/  

[![Image from Gyazo](https://i.gyazo.com/6a23eaa090b892024f8503006c836d47.png)](https://gyazo.com/6a23eaa090b892024f8503006c836d47)

Sidekiq初回の大作Miroボードの例。モジュールの依存関係がまとめられています。Sidekiq初回ではいきなりコードを読み進めていくのではなく、このMiroを元にまずは各モジュールの責務や依存関係の把握を行いました。

/ 

[![Image from Gyazo](https://i.gyazo.com/0eb389a5d9d952fe255a9dca65dc2419.png)](https://gyazo.com/0eb389a5d9d952fe255a9dca65dc2419)


Hanami初回のモデル周辺回の例。Hanamiはフレームワークということもあり、初回ではRailsとの比較のためモデル周りの違いに触れました。Repositoryパターンの理解のためコンソールで実際にリポジトリを触ってみるなども合わせて行いました。  

#### その題材の2回目以降

その題材の2回目以降の会では、予習担当者が予習時に出てきた疑問点やその他メモを元に全員で同期的にコードを読み進めていきながら各内容を議論しました。

[![Image from Gyazo](https://i.gyazo.com/7df349da57ea5d6a1f11c1a2aba3a325.png)](https://gyazo.com/7df349da57ea5d6a1f11c1a2aba3a325)

Sidekiqのある回では、Sidekiq：：CLIはなぜシングルトンとして取り扱っているのか、プロセス/スレッドでどのように並列処理を実現しているかをメインに読み進めていき議論しました。

### コードリーディング会を行なってよかったこと、わかったこと

コードリーディング会はこの秋に発足したためまだ回数はそこまで重ねられていないのですが、今までの会で個人的には下記の点で行なってよかったと感じています。  

- Ruby言語自体の理解が深まった
  - プロセスやスレッドの取り扱い方、yieldにまつわるブロック周辺の取り回し など
- ライブラリのコードを読む速度が上がった
  - 探している箇所の目処の付け方やメタプロに遭遇した時のコードの読み方の理解
- 良い設計とはどういうものかという理解と意識が高まった
  - モジュール、メソッドの切り分け方やネーミング、オプションの受け渡しなど
- (付随的ではあるが)自分の知らないデバッグ方法がわかった
  - コンソールでのデバッグやエディタのショートカットなど


### おわりに

この記事では、僕たちが始めた現時点でのOSSコードリーディング会について紹介しました。

「現時点での」と書いたのは、自分たちにフィットする進め方を手探りしながら会を重ねているため、現在は題材のOSSによって参加モチベーションが上下する、予習担当者の負担が分かっていたこととはいえやはり重い、などの課題も見つかったためです。勉強会は継続して行うことも重要な要素だと考えるため、今後も進め方を改善して継続して参加できるOSSコードリーディング会にしていきたいと思っています。

社内でOSSコードリーディング会を開くなどの際に何かの参考になれば幸いです。