Slide 1

Slide 1 text

チームが幸せになる プルリクの作り方 受託1年目が学んだ PULL REQUEST mp 1

Slide 2

Slide 2 text

自己紹介 mp 名前 @pm99763343 Xアカウント 1年6ヶ月 バックエンドエンジニア1年目 PHP歴 温泉、ドライブ、日本酒、ビール 趣味 株式会社クルービット  所属 2

Slide 3

Slide 3 text

前提条件 ソースコード管理ツール: GitHub 工数管理ツール: Redmine 3

Slide 4

Slide 4 text

この登壇でお話しないこと commitを積むとは「物語を書く」ことである/asumikamさん https://speakerdeck.com/asumikam/commit-is-the-story 4

Slide 5

Slide 5 text

もくじ 1 そもそもチームが幸せになるプルリクとは? 2 地獄の日々 3 チームメンバが幸せになるためにプルリクを見直した 4 プルリクを変えるとどうなったか?〜そして天国へ〜 5 伝えたいこと 5

Slide 6

Slide 6 text

そもそも チームが幸せになるプルリクとは? 6

Slide 7

Slide 7 text

チームが幸せになるプルリクの定義 1. 仕様理解が深まる 2. レビュワーの負担が少ない 3. チームメンバーの実装速度が上がる(未来の自分を含む) 7

Slide 8

Slide 8 text

ストーリー 8

Slide 9

Slide 9 text

地獄の日々、、、 9

Slide 10

Slide 10 text

2022年11月 株式会社クルービットに未経験で入社 10

Slide 11

Slide 11 text

楽しいチーム開発の日々ではなく、地獄の日々 11

Slide 12

Slide 12 text

PJの進行体制 弊社は受託企業 1チーム1~4人 PLが1PJに1人 1ヶ月~半年でPJの開発〜リリースを終える プライム案件ゆえにウォータフォールのようなかっちりきまった仕様 書がない 12

Slide 13

Slide 13 text

PJの進行体制 弊社は受託企業 1チーム1~4人 PJにPLが1人 1ヶ月~半年でPJの開発〜リリースを終える プライム案件ゆえにウォータフォールのようなかっちりきまった仕様 書がない 13

Slide 14

Slide 14 text

PJの進行体制 弊社は受託企業 1チーム1~4人 PLが1PJに1人 1ヶ月~半年でPJの開発〜リリースを終える プライム案件ゆえにウォータフォールのようなかっちりきまった仕様 書がない 14

Slide 15

Slide 15 text

PJの進行体制 弊社は受託企業 1チーム1~4人 PLが1PJに1人 1ヶ月~半年でPJの開発〜リリースを終える プライム案件ゆえにウォータフォールのようなかっちりきまった仕様 書がない 15

Slide 16

Slide 16 text

プルリクの作り方が良くないと、 、 、 まずめちゃくちゃ工数の負荷が増え、 チームの雰囲気は悪くなり、 仕事は思うように進まず、 空は堕ち、大地は割れ、海は枯れ、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 16

Slide 17

Slide 17 text

プルリク プルリク プルリク 17

Slide 18

Slide 18 text

具体的にどのような問題のある プルリクをあげていたかというと、 、 、 18

Slide 19

Slide 19 text

こんなプルリクをあげてしまっていた、 、 、 説明欄にチケットのリンクのみを貼っていた 説明欄に、 「ログイン機能を実装した」や「削除機能を実装した」など の一言だけ 19

Slide 20

Slide 20 text

こんなプルリクをあげてしまっていた、 、 、 説明欄にチケットのリンクのみを貼っていた 説明欄に、 「ログイン機能を実装した」や「削除機能を実装した」など の一言だけ 20

Slide 21

Slide 21 text

こんなプルリクをあげた弊害として 1. コードをちゃんと読まないと仕様が把握できない 2. 自分の機能に関連する機能を実装したプルリクを見てさっと把握した いが、結局コードをすみずみまで見ないと把握できない 3. 差し込みのタスクを優先してしばらくたって実装途中のプルリクに戻 ると何をしなくちゃいけないのか思い出せない 21

Slide 22

Slide 22 text

こんなプルリクをあげた弊害として 1. コードをちゃんと読まないと仕様が把握できない 2. 自分の機能に関連するプルリクを見てさっと概要を把握したいが、結 局コードをすみずみまで見ないと概要が把握できない 3. 差し込みのタスクを優先してしばらくたって実装途中のプルリクに戻 ると何をしなくちゃいけないのか思い出せない 22

Slide 23

Slide 23 text

こんなプルリクをあげた弊害として 1. コードをちゃんと読まないと仕様が把握できない 2. 自分の機能に関連する機能を実装したプルリクを見て、さっと把握し たいが、結局コードをすみずみまで見ないと把握できない 3. 差し込みのタスクを優先して、しばらくたって実装途中のプルリクに 戻ると、何をしなくちゃいけないのか思い出せない 23

Slide 24

Slide 24 text

??????? ??????? ??????? 24

Slide 25

Slide 25 text

「コミットの履歴を見れば良いのでは?」 25

Slide 26

Slide 26 text

tmp tmp tmp tmp tmp tmp tmp tmp tmp tmp tmp tmp tmp tmp tmp tmp 26

Slide 27

Slide 27 text

こんなプルリクを出し続けた結果 チームはどうなったのか 27

Slide 28

Slide 28 text

PLのスイッチコストの増大 28

Slide 29

Slide 29 text

レビュー時間の増大 29

Slide 30

Slide 30 text

負のスパイラル レビューの工数が 圧迫される 開発速度が落ちる スケジュールが 圧迫される みんな 余裕が無くなる ギスギスした 雰囲気、 、 、 30

Slide 31

Slide 31 text

31

Slide 32

Slide 32 text

「良いプルリクを意識すれば 色々変わってくると思うよ」 32 ※弊社CTO

Slide 33

Slide 33 text

私はチームメンバを自分のプルリクで 不幸にしてしまっていた、 、 、 33

Slide 34

Slide 34 text

チームメンバに幸せになってもらうために 自分のプルリクを見返すことにした 34

Slide 35

Slide 35 text

1 プルリクを作る時の粒度 2 タイトルの付け方 3 説明欄に書くべきこと チームが幸せになるプルリクの作り方 35

Slide 36

Slide 36 text

1 プルリクを作る時の粒度 2 タイトルの付け方 3 説明欄に書くべきこと チームが幸せになるプルリクの作り方 36

Slide 37

Slide 37 text

プルリクを作る時の粒度 1. そもそもプルリクを作る前に適切な粒度でチケットからプルリクが切 られている 大きくしない・複数のことをしない プルリクのタイトルで「編集機能と削除機能を実装した」みた いなのはなるべく避ける 「編集機能」と「削除機能」に分けてプルリクをつくる レビュワーの負担を下げる 開発速度をあげてマージまでの時間を短くする 37

Slide 38

Slide 38 text

1.プルリクを作る時の粒度 そもそもプルリクを作る前に適切な粒度でチケットからプルリクが切 られている 大きくしない・複数のことをしない プルリクのタイトルで「編集機能と削除機能を実装した」みた いなのはなるべく避ける 「編集機能」と「削除機能」に分けてプルリクをつくる レビュワーの負担を下げる 開発速度をあげてマージまでの時間を短くする 38

Slide 39

Slide 39 text

1.プルリクを作る時の粒度 そもそもプルリクを作る前に適切な粒度でチケットからプルリクが切 られている 大きくしない・複数のことをしない プルリクのタイトルで「編集機能と削除機能を実装した」みた いなのはなるべく避ける 「編集機能」と「削除機能」に分けてプルリクをつくる レビュワーの負担を下げる 開発速度をあげてマージまでの時間を短くする 39

Slide 40

Slide 40 text

1.プルリクを作る時の粒度 そもそもプルリクを作る前に適切な粒度でチケットからプルリクが切 られている 大きくしない・複数のことをしない プルリクのタイトルで「編集機能と削除機能を実装した」みた いなのはなるべく避ける 「編集機能」と「削除機能」に分けてプルリクをつくる レビュワーの負担を下げる 開発速度をあげてマージまでの時間を短くする 40

Slide 41

Slide 41 text

1.プルリクを作る時の粒度 そもそもプルリクを作る前に適切な粒度でチケットからPRが切られ ている 大きくしない・複数のことをしない プルリクのタイトルで「編集機能と削除機能を実装した」みた いなのはなるべく避ける 「編集機能」と「削除機能」に分けてPRをつくる レビュワーの負担を下げる 開発速度をあげてマージまでの時間を短くする 41

Slide 42

Slide 42 text

1.プルリクを作る時の粒度 そもそもプルリクを作る前に適切な粒度でチケットからPRが切られ ている 大きくしない・複数のことをしない プルリクのタイトルで「編集機能と削除機能を実装した」みた いなのはなるべく避ける 「編集機能」と「削除機能」に分けてPRをつくる レビュワーの負担を下げる 開発速度をあげてマージまでの時間を短くする 42

Slide 43

Slide 43 text

1 プルリクを作る時の粒度 2 タイトルの付け方 3 説明欄に書くべきこと チームが幸せになるプルリクの作り方 43

Slide 44

Slide 44 text

2. タイトルの付け方 探しやすく端的なタイトルになっている 1つの機能にたいして複数個のPRがあるときは章見出しのように 「 【機能A】外部予約サイトの席を取得して保存できるようにした」 などと 機能見出し 実装内容     に分けて書くようにする タイトルでだらだら実装理由を書かない PRを探しやすくするため 実装理由はタイトルではなく説明欄で書く 44

Slide 45

Slide 45 text

2. タイトルの付け方 探しやすく端的なタイトルになっている 1つの機能にたいして複数個のプルリクがあるときは章見出しの ように「 【機能A】外部予約サイトの席を取得して保存できるよう にした」などと 機能見出し 実装内容     に分けて書くようにする タイトルでだらだら実装理由を書かない プルリクを探しやすくするため 実装理由はタイトルではなく説明欄で書く 45

Slide 46

Slide 46 text

2. タイトルの付け方 探しやすく端的なタイトルになっている 1つの機能にたいして複数個のプルリクがあるときは章見出しの ように「 【機能A】外部予約サイトの席を取得して保存できるよう にした」などと 機能見出し 実装内容     に分けて書くようにする タイトルでだらだら実装理由を書かない プルリクを探しやすくするため 実装理由はタイトルではなく説明欄で書く 46

Slide 47

Slide 47 text

外部予約サイトとコースの設定内容が同期されて いないとエンドユーザが混乱するためAPIを使っ てコース内容を同期させるようにした 悪い例 47

Slide 48

Slide 48 text

探しづらいタイトルになっている 実装理由がタイトルにだらだら書いてある 悪い例 48

Slide 49

Slide 49 text

外部予約サイトとコースの設定内容が同期されて いないとエンドユーザが混乱するためAPIを使っ てコース内容を同期させるようにした 悪い例 49

Slide 50

Slide 50 text

【コース設定】外部予約サイトのコース設定を〇 〇システムのコース設定と紐づける処理をした 良い例 50

Slide 51

Slide 51 text

【コース設定】外部予約サイトのコース設定を〇 〇システムのコース設定と紐づける処理をした 良い例 機能見出し 51

Slide 52

Slide 52 text

【コース設定】外部予約サイトのコース設定を〇 〇システムのコース設定と紐づける処理をした 良い例 機能見出し 実装内容 52

Slide 53

Slide 53 text

【コース設定】外部予約サイトのコース設定を〇 〇システムのコース設定と紐づける処理をした 良い例 53

Slide 54

Slide 54 text

1 プルリクを作る時の粒度 2 タイトルの付け方 3 説明欄に書くべきこと チームが幸せになるプルリクの作り方 54

Slide 55

Slide 55 text

3.説明欄に書くこと 1.チケットのリンク 2.実装内容の概要 3.レビュワーの確認事項 55

Slide 56

Slide 56 text

マークダウン必須! 56

Slide 57

Slide 57 text

3.説明欄に書くこと 1.チケットのリンク 2.実装内容の概要 3.レビュワーの確認事項 57

Slide 58

Slide 58 text

チケットのリンクが貼ってあること = 最低条件! 58

Slide 59

Slide 59 text

3.説明欄に書くこと 1.チケットのリンク 2.実装内容の概要 3.レビュワーの確認事項 59

Slide 60

Slide 60 text

2.実装内容の概要 何のどんな機能を実装したのか 何がどうなれば成功なのかレビュワーに簡潔に伝える フロントの動作を見てほしいのであれば動画を貼る モーダルの動き(例) アコーディオンメニューの動き(例) 画面遷移の様子 フロントの見た目を見てほしいのであれば画像を貼る どのみちコードのレビューはするが、ブランチに入る前に 確認できることが多く無駄なレビュー時間を省ける 60

Slide 61

Slide 61 text

2.実装内容の概要 何のどんな機能を実装したのか 何がどうなれば成功なのかレビュワーに簡潔に伝える フロントの動作を見てほしいのであれば動画を貼る モーダルの動き(例) アコーディオンメニューの動き(例) 画面遷移の様子 フロントの見た目を見てほしいのであれば画像を貼る どのみちコードのレビューはするが、ブランチに入る前に 確認できることが多く無駄なレビュー時間を省ける 61

Slide 62

Slide 62 text

2.実装内容の概要 何のどんな機能を実装したのか 何がどうなれば成功なのかレビュワーに簡潔に伝える フロントの動作を見てほしいのであれば動画を貼る モーダルの動き(例) アコーディオンメニューの動き(例) 画面遷移の様子 フロントの見た目を見てほしいのであれば画像を貼る どのみちコードのレビューはするが、ブランチに入る前に 確認できることが多く無駄なレビュー時間を省ける 62

Slide 63

Slide 63 text

2.実装内容の概要 なぜその機能を実装したのか その機能を実装することによって何が解決されたのかまで書いて あるとベスト 自分自身のプロダクト理解が深まるのでおすすめ 実装した理由が「そこにチケットがあったから」では歩兵 から抜け出せない 63

Slide 64

Slide 64 text

ー 実装した理由が「そこにチケットがあったか ら」では歩兵から抜け出せない 64

Slide 65

Slide 65 text

3.説明欄に書くこと 1.チケットのリンク 2.実装内容の概要 3.レビュワーの確認事項 65

Slide 66

Slide 66 text

3.レビュワーの確認事項 レビュワーに確認してほしいこと コードの動作を確認する前に実行して欲しいコマンドを必ず書く 実行する順番も必ずかく 「〇〇をしたら〇〇になること」のようにかならず動作と結果を セットにしてかく 66

Slide 67

Slide 67 text

3.レビュワーの確認事項 「新しくカラムを追加したので migrateコマンドの実行をお願いします。 」 67

Slide 68

Slide 68 text

3.レビュワーの確認事項 レビュワーに確認してほしいこと コードの動作を確認する前に実行して欲しいコマンドを必ず書く 実行する順番も必ずかく 「〇〇をしたら〇〇になること」のようにかならず動作と結果を セットにしてかく 68

Slide 69

Slide 69 text

プルリクを変えるとどうなったか? 〜そして天国へ〜 69

Slide 70

Slide 70 text

プルリクを変えるとどうなったか? 〜そして天国へ〜 70

Slide 71

Slide 71 text

伝えたいこと 71

Slide 72

Slide 72 text

たかがプルリク、 されどプルリク 72

Slide 73

Slide 73 text

ご清聴ありがとう ございました!!! 73