More than 1 year has passed since last update.

Ruby開発者のMatz(まつもとゆきひろ)さんが、こう語られています。

今までは、仕事は会社から与えられるもので、面白い仕事が当たればラッキーだけどそうじゃない場合もあったわけです。ところが、オープンソースの活動で自分の名前が表に出れば、今までとは違って「武器」を手に入れることができる (オープンソースへの取り組みはエンジニアにとって強力な「武器」になる より)

いつかはやってみたいOSS開発。
とはいえ、OSS開発参加って別次元のギークたちの世界だろうと思っていました。

しかし、どうやらそんなこともないようで、素晴らしいコミッターの方々のメンタリングの元、僕のgithubアカウントがこうなりました。

スクリーンショット 2015-07-13 午後10.31.33.png

...おわかりだろうか。

スクリーンショット 2015-07-13 午後10.31.57.png

!!!!

スクリーンショット 2015-07-13 午後10.32.02.png

ruby系の超大型OSS二つにcontributeして、githubが少々派手になりました。(が、最後まで読んでいただければ、これ自体は意外と簡単なんだと理解していただけます笑)

ということで、OSS開発全くした事ないしプログラミングのレベルも高くないっていう人でも、 実はOSS開発に参加できるし、参加してくなかで実力も磨ける! っていう話と その方法を共有したいと思います。

今回の記事では、 OSSとは? から コミットする方法まで 具体例込みで紹介します。

対象読者

  • 普段OSSを使ってるが、OSS開発参加は別次元の話だと思ってる
  • OSS開発参加とかしてみたいけど、何をどうすれば良いのかわからない
  • プログラマーとしての実力を世に示したい
  • 良いコードを読んでプログラマーとしての実力をつけたい
  • 大好きなOSSに貢献したい
  • なんでもいいけどプログラミング関連で新しい知識つけたい
  • OSSて何かよくわからん

OSSとは

ダウンロード.jpeg

オープンソースとは、ソフトウェアの設計図にあたるソースコードを、インターネットなどを通じて無償で公開し、誰でもそのソフトウェアの改良、再配布が行えるようにすること。また、そのようなソフトウェア。

IT用語辞典より

なぜOSS開発に参加すべきか

OSS開発に参加するべき理由は、以下の4つなのかなと思いました。

エンジニアとしての武器

OSSにコミットしてるという事実は、世界どこでもエンジニアとしての実力を証明する武器になります。

オープンソースへの取り組みはエンジニアにとって強力な「武器」になるでは、Ruby開発者のMatzさんが、こう語られています。

今までは、仕事は会社から与えられるもので、面白い仕事が当たればラッキーだけどそうじゃない場合もあったわけです。ところが、オープンソースの活動で自分の名前が表に出れば、今までとは違って「武器」を手に入れることができる

エンジニアとしての成長

OSSのコードやドキュメントを読むのは、相当勉強になります。大きいOSSになればなるほど、コードのレベルが上がるので、ちょうど良いレベルから始めて、徐々に高レベルなものにチャレンジしていくのが良さそうですね。

OSSをより便利にすることで自分も嬉しい

普段自分が使う中で見つけたバグや、不便に感じている機能改善をすることで、より都合よくそのOSSが使用できるようになりますね。cookpadさんでは、Railsの3->4のバージョンアップに際して、関連gemでupdate対応していないものは、自力でバージョンアップに対応するようにプルリクだして回ったとか...。(なんだかスゴすぎますね。)

お世話になってるOSSへの貢献欲

自分が普段お世話になってるOSSに貢献できるというのは結構純粋に嬉しいそうです。貢献欲が満たされますね。

OSS開発の手順

具体的な方法です。これに沿えば、 誰でもOSS開発できます。

1. 貢献するOSSを選ぶ

普段使っているOSSで、ここ直したいなぁ、これバグ?、ドキュメント説明悪いな、と思っているものがあれば修正するチャンスなので、それにしましょう。
(僕のように)いきなり言われても...ていう人は、普段使ってるモジュールなどの中から、そんなにスケール大きくないOSSを選ぶと良いでしょう。

まぁ近いうちにOSS開発したいなと思う人は、これらの観点を念頭に踏まえて、普段使ってるOSSで不満に思ったことを書き留めておくといいすね。

GitHubのリポジトリをチェック

一般的に、READMEのどこかや、CONTRIBUTINGなどのファイルに、どうそのリポジトリに貢献するかが書いてあります。

以下のruby/rakeというOSSでは、下から2番目と5番目にありますね。

スクリーンショット 2015-07-13 午後11.38.25.png

OSSを決めたらその、リポジトリのそれらをチェックしましょう!

2. 貢献の仕方を決める

OSSによって推奨される貢献方法が違うようですが、一般的にOSSへの開発の仕方は以下の三つかと思います。

a. 問題をイシューで報告して貢献する

あなたが、行き詰まった所、バグらしきエラーを得た所をイシューにして、対象OSSのGitHubリポジトリに報告しましょう。

b. ドキュメントに貢献する

コミットといっても、何もコードを書くことだけが、OSSへのコミットじゃない(みたい)です。現に、ドキュメントコミッターもたくさんいるし、あなたがより良いドキュメントに改善することで、次にドキュメントを読む多数の人間が救われるのならば、文字通りそれは貢献すね。

c. コードに貢献する

バグや、よろしくないコードを発見したら、誰かが直すのを待つのではなく、自分で直してしまおう!というのが、このコードへの貢献ですね。もしくは既存のOPENなイシューからコード改変するのもいいすね。コードを実際に書くときは、そのOSSのコードの雰囲気や様式にならって、コードを書くのがポイントのようです。華型ですね。

3. 実際に貢献する

一般的に、READMEのどこかや、CONTRIBUTINGなどのファイルに、どうそのリポジトリに貢献するかが書いてあるので、それらに沿った上で、以下が基本的な流れです。

i) 対象リポジトリをforkする。

ソフトウェア開発におけるフォークとは、あるソフトウェアパッケージのソースコードから分岐して、別の独立したソフトウェアを開発することである。(wikipediaより)

GitHub上でのforkは簡単で、以下の赤丸の部分をポチってください。それで、リポジトリのコピーが、あなたのアカウント以下に作成されます。

スクリーンショット 2015-07-13 午後11.38.25.png

ii) まずはローカルで動作確認

まずは、userとして、ローカルでそのOSSを使って動作確認しましょう。その過程でわかりづらかった点などがあれば、メモっておくと良いです。それらは貢献のチャンスになります。(とSEゼミで教わりました。)

iii) 問題に対して、なんらかの形で貢献する

イシュー発行の場合

リポジトリの issues -> New Issue からイシューを書きましょう。英語で書く + 周り(特にメインのコミッター)がどのようにissueを書いているかを参考にするのが良さそうです。

ドキュメント/コードに貢献する場合

forkしたリポジトリを、ローカルにgit cloneしましょう。それから、ブランチを切って、ローカルでドキュメントの該当部分を修正します。終え次第コミットしましょう。コミットはこまめにしましょう。

作業ブランチ名と、コミットメッセージをわかりやすいものにするのもポイントです。これも周りをみて、強めの人を真似ると良さげです。

リモートの自分のブランチにプッシュしたら、それを持ってプルリクエストを送りましょう。

僕が実際に送ってみたプルリクは以下です。

スクリーンショット 2015-07-13 午後11.52.27.png

現状の問題が何で、自分はこうすれば解決されると思うんだけど、どう思う?、という 提案 をする気持ちで、プルリクを送ってみると良さげです。
ちなみにこちらのプルリクは、2015/07/13現在OPENですし、mergeされるかどうかはわかりません。明らかな不備ではなかったものの、改善提案的なノリで送ってます。ちなみに内容は、エラーメッセージの補足提案で全然大したものではないですが...笑。

4. Mergeされる/議論する

プルリクを出すと、そのままmergeされたり、「ここもっとこうしてよ」的な議論が始まったり、「ちがうな〜」て言われたりします。
議論が続くようでしたら、それに対応していきましょう。
mergeされたら、嬉しいですね。contributeおめでとうございます。

スクリーンショット 2015-07-14 午前0.01.51.png

これはドキュメントのタイポを直しただけのこれまた人様に見せるレベルのコミットではありませんが...。こんなんでも、優しくmergeしていただけました ^^ (mergeしてくださった方は日本人のコミッターの有名な方でした。)

さあ あなたもコミッターに

おそらく、コミット自体のハードルは相当低いということはわかっていただけたかと思います。

フローさえわかっていれば、自分の実力にあったOSS選べばコードにも貢献できそうだな、っていう見通しも立ちますね。ぼくは、日頃使ってるgemのバグを解消して回ろうかと思ってます。

少しずつコミットのレベルを上げて、いずれは真のコミッターになれるイメージが沸いたところでみなさんも、ぜひ今日から始めてみましょうOSS開発!

言語ごとのOSS一覧参考記事たち

これらの記事を参考に自分が開発参加したいOSSを見つけてもいいですね!

PHP: http://www.moongift.jp/tag/php
Java: http://d.hatena.ne.jp/taichitaichi/20110609/1307641027
Python: http://www.reddit.com/r/Python/comments/1ls7vq/best_written_projects_on_python_github/
Ruby(Rails): http://www.moongift.jp/tag/ruby-on-rails
JavaScript: http://www.moongift.jp/tag/javascript


事の発端と謝辞

SEゼミ さんの主催する OSS Hack Weekendというものに参加しました。強めの企業さんから来たかなり強めのOSSコミッターのメンターさんたちが隣について、"初めてのOSS Hack"をサポートしてくれるという超贅沢イベントでした。(メンターも内容もすごいのに、タダだし、選考もないし、Tシャツももらえるし...。)
普段、Rails(自体もOSS)で、いろんなgem(<-OSS)とか、使ってる中で、こういう中もの作るのハードル高いのかなぁとぼんやりと思ってた中、このイベントを見つけて飛びついた次第です。

お世話になったSEゼミ さん、メンターの皆様、ありがとうございました。

※ 今回の記事の内容はほぼ全てこのOSS Hack Weekendで学んだ事です!


追記や、アドバイスなどあれば、気軽にコメントしてください!(OSSに習い)みなさんのアドバイスを追記して良いものにしていければと思ってます。