OSSコントリビュートに挑戦してみた話

## はじめに
OSSコントリビュートに挑戦してみた備忘録です。

## 挑戦した理由
筆者は２月からエンジニアとして働く予定でして、　　

  - なにかコードを書いてプルリクして面識のあまりない誰かにマージされる、というサイクルを経験したい
  - コントリビューターという響きに単純に憧れがある
 
の２つの理由から、なにかコードを書く形でOSSコントリビュートに挑戦しよう！と考えました。

## 筆者の技術レベル
OSSコントリビューターになりたい、とぬかしているものの、筆者の技術力は、昨年からプログラミングに興味を持ち、Rubyを少し学んで２月からなんとかエンジニアとしてお金を貰えるようになった程度です。
議論されているissueは自分の力量を遥かに超えるものが大多数である、と考えたほうがいいでしょう。

## 自分にあった難易度のissueを探す
あまりに歯がたたないものは難しいし、「当てずっぽうでプルリクして見てもらえばいいや」というのは無責任だな、と考えたため
ある程度基礎的なことがわかるRubyで貢献でき、自分で概要を把握できるissueを探すことにしました。
今回はGithub上のissueを言語別についているラベルによってフィルターしてくれるサービス
[Github Help Wanted](http://github-help-wanted.com/)を使用しました。
Good first issue, help wanted, easyといったラベルがはられているisuueを中心にみていくと良いと思います。
first-timers-onlyなんていう今までコントリビュートしたことがない方向けのラベルなんかもあります。issueにやり方が丁寧に書いてあり、後はやるだけ、というissueが多いです。「ようこそOSSへ！」といった文が添えられているものも多く、エンジニアコミュニティの懐の深さを感じました。

## Issueをみつけたら
今回見つけたレポジトリはこちら
[GitHub - jbodah/spy_rb: Transparent Test Spies for Ruby](https://github.com/jbodah/spy_rb)
JSのテストなんかでよく使われているようなのですが、テストスパイというもので、テスト対象の出力（呼び出し回数等）を記録して値を出して検証できるというもののようです。とりあえず何をやっているものなのか、概要だけはREADMEを読んで把握しました。
そしてこちらが今回の対象のissue
[add Spy::Instance.called? · Issue #50 · jbodah/spy_rb · GitHub](https://github.com/jbodah/spy_rb/issues/50)
Spy::Instanceにcalled?メソッドをつくる、というものです。

* スパイしてるメソッドを呼び出したかどうかはインスタンス変数@call_historyでわかる。
* ~~結果をbooleanで返すようにする。~~ （※Rubyでbooleanはおかしいですね。trueかfalseを返す、です。）  
ある程度手順の想定ができたので、これなら貢献できるかもと思いforkしてcloneしました。
以下が実際に書いたコードです。

```ruby
require_relative 'test_helper'

class CalledTest < Minitest::Spec
  describe 'Spy::Instance#called?' do
    it 'works' do
      obj = Object.new
      spy = Spy.on(obj, :to_s)
      assert_equal spy.called?, false
      obj.to_s
      assert_equal spy.called?, true
    end
  end
end 
```

```ruby
module Spy
  class Instance
    #....
    def called?
      @call_history.any?
    end
    #....
  end
end
```

内容は簡単なもので、[プロを目指す人のためのRuby入門](https://www.amazon.co.jp/gp/product/4774193976/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=7kosei-22&creative=1211&linkCode=as2&creativeASIN=4774193976&linkId=624a4b7084c6c4263c8e2d2c70484d9f)
なんかを一通りやっている人なら誰でもかけるものだと思います。テストは他のテストの空気を読んで書いてみました。

## いざプルリク！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221383/96b9f392-0813-34ea-dd3c-91f2e5fc9d40.png)

Nice to meet youと拙い英語を添えてプルリクしてみました。あやしすぎますね。
この時は勢いで送信ボタンおしてました。

## マージされる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221383/6013731f-f613-4c15-8f36-5d50b4a62822.png)

半日くらい後、思っていたよりすんなりマージされました。
何よりうれしかったのは「Looks great, thanks!」の言葉です。
簡単なコードですが、自分が書いたコードで誰かに少しでも感謝されるって本当に嬉しいものなんですね。
どこの馬の骨なのかもわからないような者に対応して頂いた[jbodah氏](https://github.com/jbodah)に感謝します。

## OSSコントリビュートに挑戦してみるのは勉強になる　そして楽しい
いろいろなOSSのissueを把握するためにローカルに開発環境を構築したりしていると、必然的に多くのコードを読むことになるので勉強になります。例えばModuleのmixinがどんなものなのか本で読んでわかったつもりになっていても、いざ実際のコードをみるとあまり理解できませんでした…。そういった時に本を再度開きながらコードを読んで…を繰り返して行くのはよい勉強になっていると思います。
現状はGood first issueやeasyとラベルがあるissueでも、解決できるコードをプルリクする、とまでは行かないんですけどね。
あまりにとんちんかんなプルリクあげられて迷惑な方はいらっしゃるとおもいますが、forkされて怒る人は（多分）いないと思うので積極的にやっていきたいです。
自分のコードが、住む国も話す言葉も違う方のコードの一部になるというのは本当に嬉しいですし、問題を解決できるコードを考えるのは楽しいです。

### 反省
（コードの反省なんですがrequire_relative -> requireでいいですし、テストは最後の改行を忘れています。マージされたものを追加で修正するのってどうなんだろう…）

### 追記
コードを少し訂正してプルリクを投げてみました。みなさんありがとうございます！
無事マージしていただきました。

```ruby
require 'test_helper'

class CalledTest < Minitest::Spec
  describe 'Spy::Instance#called?' do
    it 'works' do
      obj = Object.new
      spy = Spy.on(obj, :to_s)
      refute(spy.called?)
      obj.to_s
      assert(spy.called?)
    end
  end
end
```