OSS初心者が1週間で2コントリビュートしてみた

# はじめに
こちらの記事は[ヤプリ Advent Calendar 2023](https://adventar.org/calendars/8946)の11日目の記事です。

https://adventar.org/calendars/8946

# OSSコミットしてますか…?
「OSSコミット、興味はあるけどなかなかやれてないなー」って方、多いのではないでしょうか?(自分もその一人でした)

OSSと聞くと、なんとなく以下のようなイメージを持っていませんか?
- 「ごりごりの技術好きがやっているギークな世界」
- 「なんとなく難易度が高そうで自分とは無縁の世界」

実際やってみて改めてわかったのですが、**これは全くの誤解でした。**
普段の開発業務のように、チケットを取って(もしくは自分で作って)、アサインしてもらって、実装が終わったらPRを出すのとそんな変わりはないです。

この記事では、
- 実際にどんなことをしたのか?
- どのようにissueを見つけたのか?
- 個人的にオススメなプロジェクトのジャンル

について話していこうと思います。

# なぜOSSコミットをするのか
誤解を恐れずに言うと、「**コスパが良いから**」の一頃に尽きると思います。
OSS活動を続けていくことで、「OSSコミッター」というステータスの他にも、「社会的幸福感」や「英語の読み書き能力」など単なるプライベートでの開発では得にくいものを得ることができると考えています。


## スキル
これはいわずもがなですが、全世界のOSSから自分が伸ばしたいスキルにフォーカスをあてて活動することができます。プロジェクトによって運用方法(コードレビュー、ドキュメント、環境構築方法、ブランチ運用など)や、アーキテクチャなども異なるので、知見の幅も広がります。

また個人開発などと違って(自分で作ったissueでなければ)「他者が考えた要件を理解する」という作業が入るので、より実践的なスキルが身につくと言えます。
## 社会的幸福感
これもいわずもがなですが、自分がOSS活動をするうえで最大のインセンティブとなってます。
全世界で利用されるOSSで自分の書いたソースコードが動いており、それが利用されているというのはソフトウェアエンジニアとして非常に社会的意義を感じることができます。

## OSSコミッターというステータス
よく求人の尚可の要件に「OSSプロジェクトへのコントリビューション経験」というのがありますよね。
いざというときは就活のアピール材料にもなります。

## 英語の読み書き能力
当然、issueやコードレビューなどのやりとりでは英語でのコミュニケーションが発生します。
相手に正確に伝えなければいけないので、ただ翻訳するだけでなく英単語の細かいニュアンスについて自然と学ぶようになります。
また、英語圏の方とやりとりすることで生きた英語に触れることができます(相手が英語圏の方とは限りませんが。笑)

## 報酬
[GitHub Sponsors](https://github.blog/jp/2019-05-24-announcing-github-sponsors-a-new-way-to-contribute-to-open-source/)というプロジェクトがあって、こちらに登録してスポンサーを募集することができます。類似プロジェクトに[Open Collective](https://opencollective.com/)というものもあります。
もちろん、こちらからOSSプロジェクトやコントリビューターへ寄付することもできます。(これも立派なOSSへの貢献ですね)

報酬はすべての人が受けられるというわけではないので自分はおまけみたいなものだと思っていますが、OSS活動によって収入を得られるとよりコミットすることができるので、大事なことだと思います。

収入の話に関しては以下の記事が参考になると思います!

https://efcl.info/2021/10/01/github-sponsors/

https://findy-code.io/engineer-lab/sosukesuzuki


# 実際にコミットしたPR
お待たせいたしました…!!(?)
こちらがOSS初心者の自分が1週間で出した2つのPRです。
File Changedを見てもらえれば普段開発をしている方なら簡単な作業だとわかると思います。自分達が思っているよるOSSコミットのハードルは低いです。
## [external-secrets/external-secrets](https://github.com/external-secrets/external-secrets)
https://github.com/external-secrets/external-secrets/pull/2919

「External Secrets Operator」、通称ESOと呼ばれる「AWS Secret」「GitLab Variable」などの外部プロバイダのシークレットを元にSecretオブジェクトを作成、管理できるフレームワークです。([参考](https://atmarkit.itmedia.co.jp/ait/articles/2209/29/news015.html))

このPRでやったのは、以下の2つです。
- `ExtermalSecretRewriteTransform`→`ExternalSecretRewriteTransform`へタイポを修正(構造体)
- 自動生成コマンドを実行し、ドキュメントを修正

単純にgrepを掛けて一括置換して、あとはESOのドキュメントにある[Developer Guid](https://external-secrets.io/main/contributing/devguide/)や[Contributing Process](https://external-secrets.io/main/contributing/process/)を参考にPRをつくりました。

こちらはリリースはまだですが、すでにmasterにマージ済みです。(作業着手~マージまで4時間ぐらいのスピード感でびっくり)


## [google/go-github](https://github.com/google/go-github)
https://github.com/google/go-github/pull/3025

Googleが管理してるGitHubAPIをラップしたGoのパッケージです。

このPRでは、以下の2つをやっています。
- [Create a temporary private fork](https://docs.github.com/ja/rest/security-advisories/repository-advisories?apiVersion=2022-11-28#create-a-temporary-private-fork) というGitHub APIのラッパー追加
- テストコードの実装

マージには二人のApprovalが必要なのですが、内一人からApprovalを貰っている状態です(2023/12/13現時点)

余談ですが、OSSでもテストコードは重要視されているので、基本テストを書かないとレビューで怒られるのでちゃんと書きましょうw(同リポジトリの他のPRで誰かが指摘されているのを見た)

こんな自分でもGoogleのリポジトリへコミットできるのはOSS活動の魅力のひとつではないでしょうか…!!

# そもそもどうやって貢献するの?
この辺は割とネットに落ちているので割愛します!
以下の記事がわかりやすいと思います↓f

https://qiita.com/shunsuke227ono/items/94dd6e707d34a1da2617
# どうやってissueを見つけたの?
じゃあ、どうやってええ感じのissueを見付けるのかというと、自分は以下の2つの方法で探しています。
自分は気になるリポジトリを見付けたら片っ端からスターに入れていって、貢献できそうなissueがないか日々ウォッチしていますw(Good First Issueは人気なのでアサイン済みのことも多いです。見付けたらすぐ内容を吟味してなるはやでアサインしてもらうことをおすすめします!)


## Good First Issue
まず有名なのはこちらかと思います。

https://goodfirstissues.com/

>Good First Issueでは下記の基準を満たしたプロジェクトがピックアップされています。
そのため、OSS未経験者でも取り組むことのできそうなissueを簡単に見つけることができます。

> Good First Issueのピックアップ基準

> good first issueのラベルが付いたissueが3つ以上あること。1
10人以上のコントリビューターがいる。
プロジェクトの詳細な説明が記されている。
CONTRIBUTING.mdがあること。2
積極的にメンテナンスを行っている
(引用元：https://qiita.com/Naughty1029/items/cf8750f375fa99bce9bb)

こちらは最初のとっかかりとしては良さそうですが、得意言語に絞ったりすると若干数が少ないので、これからがっつりやっていきたい自分としては少し物足りなかったです。なので、自分はシンプルにGitHubで探しています。(次に紹介します)


## GitHubで探す
シンプルに下記のように検索して泥臭く探しています。
とにかく数が多いので、時間はかかりますが自分にあったものを見付けられると思います。

自分は、以下のような検索条件で保存しています。
- issueが`help wanted` or `good first issue`
- issueがOpenのもの
- Go言語

https://github.com/search?q=label%3A%22help+wanted%22+label%3A%22good+first+issue%22+language%3AGo+state%3Aopen&type=Issues&ref=advsearch&l=Go&l=

上述の2つのissueはどちらもGitHub検索で探し当てました。

良い感じのissueを見付けたら、「ハロー!!これやってもええか?」って聞くと「ありがとう!じゃあこのチケットあんたにアサインするで」って感じの回答が返ってきます。
唐突にどこぞの馬の骨かもわからんやつがいきなりissueに書き込んでも快くアサインしてくれます。
**ああ、なんてすばらしきOSS文化。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/314ca883-8360-9c70-b0fc-09ba5b029180.png)


# OSS初心者にオススメのジャンル
## APIのラッパー
今回の[google/go-github](https://github.com/google/go-github)はまさにこれです。
ライブラリがサポートするAPIの追加実装であれば、だいたいAPIのエンドポイントを叩くコードを書いてそれをラップするだけなので、実装パターンも決まっており比較的難易度は低い傾向にありそうです。(リクエストやレスポンスのフィールドがめちゃくちゃ多いAPIだとちょっと面倒ですが。笑)

ライブラリ使っていて、このAPIラップして欲しいんだけど実装されていないなーと思ったらコントリビューションチャンスですよ!!

## CLI
フロントエンドが無いので比較的環境構築が簡単なのと(言語にもよるかもですが…)、仕様や実装のイメージも湧きやすいのでオススメです。


## 自分が使ったことがあるツールやライブラリ
これも当たり前といえば当たり前ですが、普段自分が利用しているツールやライブラリはなんとなく仕様もわかっているのでおすすめです。とりあえずリポジトリに入れてissueをウォッチしましょう!


# 感想
いかがでしたでしょうか…?
個人的には、普段の学習で同じアウトプットをするのであれば、自分のリポジトリにコミットするよりもOSSへコミットしていった方が実績にもなりますし、長い目で見たときにキャリアに良い影響を与えてくれると思います。
まずはタイポやドキュメントの修正などから始めてみてはいかがでしょうか?

自分はまだ始めたばかりですが、少しずつ難易度をあげて今までお世話になってきたソフトウェアたち(Docker、Terraform、GitHub CLI etc…)のコントリビューションにもチャレンジしていきたいなぁと考えています。
そして、ゆくゆくは著名なOSSのメンテナになれると良いなぁとかぼんやり思ってます。

一人でも多くの方が「OSS活動やってみようかな!」という気持ちになってくれれば幸いです。
最後まで読んでいただきありがとうございました…!