理解しやすいPRを初心者が楽しく作るために

# 対象
最近PR(プルリクエスト)を使用しているチームにジョインした新人。
特に「PRは初めて」とか「PRが苦手」という人向け。

# 初めに
先月チームにジョインした新人です。
チーム開発が初めてということもあってか、最近PRを送ること自体が楽しいです。

PRはコードの品質を保つのが1番の目的ではありますが、新人にとっては毎回の実装を先輩にコード単位で(強制的に)レビューしてもらえるので勉強するために凄くいい仕組みだなと思います。

とはいえ先輩も神ではないので、どんなPRでも意図を汲み取れるわけではありません。
いいフィードバックを貰うには、理解しやすいPRを出すのが大事です。

頭では分かっていても面倒に感じるとなかなか定着しないので、楽しく継続できるようにすることが大事だと思っています。

まだ試行錯誤中ですが、
理解しやすいPRにするために大事だと思ってること
それを楽しく実践するために取り組んでいること
をまとめます。 


# :notebook_with_decorative_cover: tl;dr
- コミット編
   - コミットを細かく切る
      - ``` git log```で自分の進捗に浸る
      - 絵文字コミットしてみる
   - コミットメッセージにWhatとHowを書く
      - コミットメッセージを予言する
- PR編
   - 第三者にも分かるPRにする
      - PRメッセージに引用を乗せる
      - PRメッセージに検討したことを書く
      - PRメッセージに画像や表を使う
      - WIP(作業進行中)のPRを上げる
- 終わりに
- 参考資料




# コミット編
## コミットを細かく切る
自分のセープポイントを作るって意味でも細かくコミットしていたいですが、そもそもコミットする癖がついてないと難しいです。

どの細かさがいいのかはまだ掴めてないですが、1行書いて「これは何の変更か」を言える変更となるならコミットしていいと思っています。
行ったコミットはfixupコミットやrebaseなどで整理出来るので、細かすぎる分には後で整えれば問題ないです。
勿論後からコミットを分割するのもある程度できますがやや面倒なので、細かすぎるくらいでいいと思います。

[git コミットログを綺麗にしたい。fixupとsquash - かもメモ](https://chaika.hatenablog.com/entry/2019/02/25/170000)

しかし最初はそもそもコミットがただの面倒でしかなかったです。
なので癖づけのために楽しくコミットするのが大事だと感じています。

### :smirk: ``` git log```で自分の進捗に浸る
仕事終わりに今日生やしたLogを確認すると、満足感に浸れます。
翌日の出勤時に、昨日行ったコミットを眺めるのもまた乙なものです。

私は眺める用のサブコマンド作って眺めるようにしています。
<img width="535" alt="スクリーンショット 2019-08-17 13.54.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132987/369a61e8-d898-ee7d-c889-9fff2e5836f3.png">

[便利な「git-サブコマンド」を作成する](https://qiita.com/b4b4r07/items/6b76a5f969231e5e9748)


### :bulb: 絵文字コミットしてみる
淡白なコミットは絵文字が入ると途端にリッチに見えて嬉しいです。
行頭にコミットのカテゴリを示す絵文字をつければ可読性と共にテンションも上がります。

[GitHubのコミットメッセージに絵文字を入れて開発効率をあげる](https://qiita.com/Jung0/items/0a9a7a97a2c17f92d3c5)

## コミットメッセージにWhatとHowを書く
5W1Hとまではいきませんが、そのコミットで「何をどのように変更した」のかは書くべきだと思います。
PRをレビューする時にはコミットメッセージから差分に飛んでレビューする事になるので、
一目でそのコミットの概要が分かることが大事です。

[Gitのコミットメッセージの書き方](https://qiita.com/itosho/items/9565c6ad2ffc24c09364)

### :crystal_ball: コミットメッセージを予言する
![20150717220330.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132987/444fd7de-fb50-d8ef-2ea0-d65f8a40d73a.jpeg)

先に「これをこのように変更する」つもりでコードを書き始めれば、コミットメッセージに困りません。
ついすぐ手を動かしたくなってしまいよくわからないまま書き始め、100行越えのクソコミットが爆誕することが私はよくあります。
大抵そういうコミットは後でリファクタすることになるので、先が見えない時は1度考えてから書こうと決意しました。

# PR編

## 第三者でも理解できるPRにする
レビューしてもらうために分かりすくするのは勿論ですが、それ以上に情報を充実させるのもいいと思います。
というのもPRは数ヶ月後の自分や、新しくジョインする未来の同僚などの第三者が変更を理解するための最高のドキュメントだからです。

「何をどのように」はコミットメッセージに書けばいいと思いますが、
「なぜこのように変更したのか」「なぜ他の方法を取らなかったのか」は意識しないと抜け落ちがちだと思います。
というのも「なぜ」の文脈は十分現在のメンバーに共有されており必須ではない場合も多いからです。
しかし書くことでより価値の高いドキュメントになると思います。

PRメッセージやコード中のコメントアウトなどに「なぜ」も残すようにします。
第三者でも分かるPRが先輩がレビューしやすいのは言うまでもありません。
また意図が分かれば代替案を先輩が提示しやすくなります。

### :bookmark: PRメッセージに引用を乗せる
Issueベースだったり、前のPRの続きとして作られたPRは必ず引用元を記載します。
GitHubなら #1234 のように簡単にリンクを貼れるので、PRメッセージの頭に

```
ref #1234
```
みたいな感じで載せています。

[GitHubでのリンク(issue/pull request/wiki etc)](https://qiita.com/icoxfog417/items/42d1a84439e30b1f0b11)

### :pencil: PRメッセージに検討したことを書く
機能を実装する上で選ばなかった方法があれば記載します。議論や検討が多いほどその実装に至った理由を、特に第三者が理解しやすくなります。
また次のPRで実装予定の機能があればそれを書いておくのも、確認の手戻りが少なく済みます。

[GitHub「完璧なプルリクの書き方を教えるぜ」 - Amitica](https://qiita.com/umanoda/items/93aec41213f8e3ce14c8)

### :art: PRメッセージに画像や表を使う
複雑な実装になるほど文章だけだと伝わり辛いです。
逆に言えば画像や表に頼れば説明が楽になります。

DBマイグレーションであればカラムを単語の羅列にするより表の方が見やすいと思いますし、フロントエンドならスクショがあれば説明はほとんど不要です。
遷移やリアクションがあるようなフロントの実装ならGIFを貼るのもいいかもしれません。

[Macの画面を録画してサッとGIF画像に変換する](https://amitica.net/archives/454)

### :construction: WIP(作業進行中)のPRを上げる
終了してない段階でPRを上げるのはいい習慣だと思います。
成果物を出さなきゃ！と思うとPR作成の心理的ハードルが上がりますが、作業途中の相談の場として使えば簡単にPRを出せます。

選択した方法が悪ければ途中で修正できるので、手戻りも少なく済みます。
困っている事があればPR上で議論でき、その議論は残るので3.で書いたようないいドキュメントになります。

いわゆる報連相が全部出来るので、うまくいかない時ほどおすすめです。

[初心者向けWIPワークフロー&レビュー時の注意](https://qiita.com/sue738/items/09d9292e7654747ca208)

# 終わりに

皆さんの理解しやすいと思うPRをコメントで教えて下さい！
もしよさそうだったらGoodボタンよりもLGTM画像でコメントしてくれると喜びます！

![LGTM](https://i.lgtm.fun/9eo.gif)

[仕事にあそびごころを、LGTMコメントに使いたいGif画像](https://qiita.com/tos-miyake/items/7e33b67fc62620d4e87b)

# 参考資料
- [git コミットログを綺麗にしたい。fixupとsquash - かもメモ](https://chaika.hatenablog.com/entry/2019/02/25/170000)
- [便利な「git-サブコマンド」を作成する](https://qiita.com/b4b4r07/items/6b76a5f969231e5e9748)
- [GitHubのコミットメッセージに絵文字を入れて開発効率をあげる](https://qiita.com/Jung0/items/0a9a7a97a2c17f92d3c5)
- [Gitのコミットメッセージの書き方](https://qiita.com/itosho/items/9565c6ad2ffc24c09364)
- [GitHubでのリンク(issue/pull request/wiki etc)](https://qiita.com/icoxfog417/items/42d1a84439e30b1f0b11)
- [GitHub「完璧なプルリクの書き方を教えるぜ」](https://qiita.com/umanoda/items/93aec41213f8e3ce14c8)
- [Macの画面を録画してサッとGIF画像に変換する](https://amitica.net/archives/454)
- [初心者向けWIPワークフロー&レビュー時の注意](https://qiita.com/sue738/items/09d9292e7654747ca208)
- [仕事にあそびごころを、LGTMコメントに使いたいGif画像](https://qiita.com/tos-miyake/items/7e33b67fc62620d4e87b)