Help us understand the problem. What is going on with this article?

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

はじめに

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

挑戦した理由

筆者は2月からエンジニアとして働く予定でして、  

  • なにかコードを書いてプルリクして面識のあまりない誰かにマージされる、というサイクルを経験したい
  • コントリビューターという響きに単純に憧れがある

の2つの理由から、なにかコードを書く形でOSSコントリビュートに挑戦しよう!と考えました。

筆者の技術レベル

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

自分にあった難易度のissueを探す

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

Issueをみつけたら

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

  • スパイしてるメソッドを呼び出したかどうかはインスタンス変数@call_historyでわかる。
  • 結果をbooleanで返すようにする。 (※Rubyでbooleanはおかしいですね。trueかfalseを返す、です。)
    ある程度手順の想定ができたので、これなら貢献できるかもと思いforkしてcloneしました。 以下が実際に書いたコードです。
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 
module Spy
  class Instance
    #....
    def called?
      @call_history.any?
    end
    #....
  end
end

内容は簡単なもので、プロを目指す人のためのRuby入門
なんかを一通りやっている人なら誰でもかけるものだと思います。テストは他のテストの空気を読んで書いてみました。

いざプルリク!

image.png

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

マージされる

image.png

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

OSSコントリビュートに挑戦してみるのは勉強になる そして楽しい

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

反省

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

追記

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

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
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away