OSS 初心者が初めてのコントリビューションを通して学んだ3つのこと

こんにちは、 サーバサイドエンジニアの伊藤です。

新卒Rubyエンジニアがオススメする実務で役にたった技術書5選 この記事を書いた時から、ちょうど1年が経ちました。 本当に、時が経つのは早いですねー。。。

そんなこんなで、今年もこの季節がやって来ました。12月と言えば、そうAdvent Calendar の時期ですね!!!

ということで、Enigmo Advent Calendar 2019 を公開します!!!

Enigmo Advent Calendar 2019 記念すべき1日目は、

私、伊藤が 「OSS 初心者が初めてのコントリビューションを通して学んだ3つのこと」 をお届けします。

そもそものきっかけ

弊社では、EC サイトのBUYMA だけではなくSTYLE HAUS というファッションメディアの開発も行なっています。

STYLE HAUS の開発時、記事パーツのアイコン画像をYaml で管理するため、zilkey/active_hash というgem を導入しました。

基本的には ActiveHash*1 を用いることで、スムーズに開発を行うことができました。 ただ、ActiveHash で生成したデータを、sort しようとした時ActiveHash::Base.order が存在しないことに気がついてしまいました。

確かに、ActiveHash を利用して生成したデータは Array なので、Enumerable#sort_by を用いることで、sort は可能です。

↓こんな感じ。

w/ Enumerable#sort_by
Image.all.sort_by(&:title)

ただ、RailsActiveRecord にどっぷりハマった身としては、どうしてもActiveHash::Base.order を使いたい。。。

↓こんな感じ。

w/ ActiveHash::Base.order
Image.order(:title)

そこで、隣の席の先輩エンジニアに相談してみました。

伊藤:
なんで、ActiveHash::Base.order ってないんですかねー? ActiveHash のREADME にもActiveRecord-like model って書いてあるのに。。。

隣の席の先輩エンジニア:
そんなの知らん。無ければ自分でメソッド生やしたらいいやん。

伊藤:
ヒィィィィィ(゚ロ゚;ノ)ノ

当時の私にはメソッドが無ければ自分で実装するとう言う発想はなく、 まさに青天の霹靂でした。

と言うわけで、

やったこと

  1. 本家 ActiveRecordorder メソッドの実装を読み込む。
  2. TDD を意識して、RSpec を実装する。
  3. (2) で実装したテストをパスさせるように、ActiveHash::Base.order を実装する。
  4. PR を作成する。
  5. 祈る。そして、待つ。

何だかんだ最初は OSS と聞いてビビっていましたが、 基本的にやった事はこれだけです。

パッチを投げてからActiveHash の戻り値を chainable にするため ActiveHash::Relation が導入されたので、 実際は(4)と(5) の間でレビューを受けてorder をcahinable に対応する処理を追加実装しました。

今回実装の内容は割愛しますが、ご興味のある方はこちらをご覧下さい。

github.com

学んだこと

ソースコードへの抵抗がなくなった。

恥ずかしながらこれが私にとって初めての OSS コントリビューションでした。*2

こちらで ActiveRecordソースコードをがっつり読み込むまでは、どちらかと言うとネットに落ちているブログ記事や公式ドキュメントを読むだけで終わっていました。 それで理解できなければ、先輩エンジニアのところに泣き込んでいました。。。*3

しかし、今回ソースコードを読み込んだ事で、ソースコードに対しての畏怖の念は無くなりました。 現在では公式ドキュメントはもちろん、それでも分からなければソースコードを読み本当の仕様を確認できるようになりました。

OSS への PR の出し方、所作を学ぶことができた。

PR のコメントの文面は OSS ごとに特有のものがあると思います。 すでに、当該の OSS でマージ・クローズされている PR のフォーマットを参考にしました。 内容に関しては、MECE を意識しました。*4

MECE とは、

  • Mutually(お互いに)
  • Exclusive(排他的に)
  • Collectively(集合的に)
  • Exhaustive(余すところのない)

要は、「内容に漏れがなく、重複がないように。」と言うことです。 レビューしてくれる方が実装内容および、 PR コメントを見ただけで全てが理解できるように意識しました。

OSS を身近に感じることができた。

以前は OSS コントリビューターさんやメンテナーさんは、雲の上の存在。 いや、むしろその存在すら意識していなかったかも知れません。。。

今まではどこかで OSS はあって当然のように思っていましたが、微力ながらのコントリビューションを通してその考えを新たにすることができました。

私たちが OSS の恩恵を受けられるのは、多くのコントリビューターさん、メンテナーさんのお陰なんだなぁと。

本当に感謝です。

今後も機会があれば微力ながら OSS に貢献していきたいと思います。

本日はこの辺で、 最後まで読んでいただきありがとうございます!

株式会社エニグモ 正社員の求人一覧

hrmos.co

*1:ActiveHash は、Ruby のHash をActiveRecord-like のモデルとして使用するためのbase class です。

*2:レビューを受けてマージされるまでの間に他の OSS に投げたパッチがマージされてしまいましたが。。。

*3:良くも悪くも弊社のエンジニアは良い方ばかりなので、基本的に質問すれば親切に教えてくれます。

*4:これに関しては一回の PR で学んだと言うよりは、いくつかの PR を経て学んだと言う感じですが。。。