Slide 1

Slide 1 text

 #phpcon_niigata #a Genki Sano ソフトウェアは捨てやすく作ろう @PHPカンファレンス新潟2025 2025/05/31

Slide 2

Slide 2 text

 #phpcon_niigata #a 自己紹介 2 佐野 元気 Genki Sano 所属 : 株式会社カオナビ 職種 : バックエンドエンジニア(PHPer) 役割 : エンジニアリングマネージャー 趣味 : キャンプ、コーヒー、サウナ、ライブ参戦 @sanogemaru

Slide 3

Slide 3 text

 #phpcon_niigata #a 自己紹介 3 所属 : 株式会社カオナビ 職種 : バックエンドエンジニア(PHPer) 役割 : エンジニアリングマネージャー 趣味 : キャンプ、コーヒー、サウナ、ライブ参戦 佐野 元気 Genki Sano @sanogemaru 今月2回目の新潟です

Slide 4

Slide 4 text

 #phpcon_niigata #a 自己紹介 4 所属 : 株式会社カオナビ 職種 : バックエンドエンジニア(PHPer) 役割 : エンジニアリングマネージャー 趣味 : キャンプ、コーヒー、サウナ、ライブ参戦 佐野 元気 Genki Sano @sanogemaru 今月2回目の新潟です

Slide 5

Slide 5 text

 #phpcon_niigata #a 5 共著で本を書きました! /  新卒入社で入ってくる  後輩へのプレゼントにでも! \ \ 初心者→中級者へ  1歩踏み出したい方向けです  /

Slide 6

Slide 6 text

 #phpcon_niigata #a 6 ソフトウェア開発って 難しくないですか?

Slide 7

Slide 7 text

 #phpcon_niigata #a 7 不確実性が高い 難しいPOINT

Slide 8

Slide 8 text

 #phpcon_niigata #a 8 短い期間での仮説検証が必要

Slide 9

Slide 9 text

 #phpcon_niigata #a 9 作ったけど やっぱり要らなかった機能 副作用

Slide 10

Slide 10 text

 #phpcon_niigata #a 10 不要なコードが発生

Slide 11

Slide 11 text

 #phpcon_niigata #a 11 不要なので 捨てたほうがよさそう

Slide 12

Slide 12 text

 #phpcon_niigata #a 12 後回しにされがち

Slide 13

Slide 13 text

 #phpcon_niigata #a 13 なぜコードを「捨てられない」のか? ● 別に捨てなくてもユーザーから見た振る舞いは変わらない

Slide 14

Slide 14 text

 #phpcon_niigata #a 14 なぜコードを「捨てられない」のか? ● 別に捨てなくてもユーザーから見た振る舞いは変わらない ● 捨てたら何かが動作しなくなる可能性があってリスクが高い

Slide 15

Slide 15 text

 #phpcon_niigata #a ● 別に捨てなくてもユーザーから見た振る舞いは変わらない ● 捨てたら何かが動作しなくなる可能性があってリスクが高い 15 なぜコードを「捨てられない」のか? 短期的に見ると価値を感じにくい

Slide 16

Slide 16 text

 #phpcon_niigata #a 16 放置すると、どうなるか

Slide 17

Slide 17 text

 #phpcon_niigata #a 17 「捨てない」ことの代償 ● ムダな作業コストの発生

Slide 18

Slide 18 text

 #phpcon_niigata #a 18 「捨てない」ことの代償 ● ムダな作業コストの発生 ● コードの理解を妨げ、誤解を生むノイズ化

Slide 19

Slide 19 text

 #phpcon_niigata #a 19 「捨てない」ことの代償 ● ムダな作業コストの発生 ● コードの理解を妨げ、誤解を生むノイズ化 ● 変化への対応スピード低下

Slide 20

Slide 20 text

 #phpcon_niigata #a 20 「捨てない」ことの代償 ● ムダな作業コストの発生 ● コードの理解を妨げ、誤解を生むノイズ化 ● 変化への対応スピード低下 足かせのある状態で進むことに

Slide 21

Slide 21 text

 #phpcon_niigata #a 21 ソフトウェアは捨てやすく作ろう

Slide 22

Slide 22 text

 #phpcon_niigata #a 22 完

Slide 23

Slide 23 text

 #phpcon_niigata #a 23 「捨てやすくする」ために やっていること まだ続きます

Slide 24

Slide 24 text

 #phpcon_niigata #a 24 「捨てやすくする」ためにやっていること 1. チームで同じ方向を向く 2. 機能単位でディレクトリを分ける

Slide 25

Slide 25 text

 #phpcon_niigata #a 25 「捨てやすくする」ためにやっていること 1. チームで同じ方向を向く 2. 機能単位でディレクトリを分ける

Slide 26

Slide 26 text

 #phpcon_niigata #a 26 チームで同じ方向を向く ● まずは 「捨てやすく作る」 という方針を開発チーム全員で揃える

Slide 27

Slide 27 text

 #phpcon_niigata #a 27 チームで同じ方向を向く ● まずは 「捨てやすく作る」 という方針を開発チーム全員で揃える ● 私たちのチームの約束事 ○ 捨てる勇気を持つ ○ 10分以内に機能が消せるように作る

Slide 28

Slide 28 text

 #phpcon_niigata #a 28 チームで同じ方向を向く ● まずは 「捨てやすく作る」 という方針を開発チーム全員で揃える ● 私たちのチームの約束事 ○ 捨てる勇気を持つ ○ 10分以内に機能が消せるように作る

Slide 29

Slide 29 text

 #phpcon_niigata #a 29 チームで「捨てる」をポジティブに!

Slide 30

Slide 30 text

 #phpcon_niigata #a 30 「捨てやすくする」ためにやっていること 1. チームで同じ方向を向く 2. 機能単位でディレクトリを分ける

Slide 31

Slide 31 text

 #phpcon_niigata #a 31 機能単位でディレクトリを分ける ディレクトリ構成を レイヤーに基づいた構成 (Package by Layer) ディレクトリ構成を 機能に基づいた構成 (Package by Feature)

Slide 32

Slide 32 text

 #phpcon_niigata #a 32 機能単位でディレクトリを分ける ディレクトリ構成を レイヤーに基づいた構成 (Package by Layer) ディレクトリ構成を 機能に基づいた構成 (Package by Feature)

Slide 33

Slide 33 text

 #phpcon_niigata #a /app ├─ Feature1 │ ├─ Http │ ├─ Models │ └─ Services ├─ Feature2 │ ├─ Http │ ├─ Models │ └─ Services ├─ Feature3 │ ├─ Http │ ├─ Models │ └─ Services ... 33 Package by Feature ● 機能に基づいたディレクトリ構成

Slide 34

Slide 34 text

 #phpcon_niigata #a /app ├─ Feature1 │ ├─ Http │ ├─ Models │ └─ Services ├─ Feature2 │ ├─ Http │ ├─ Models │ └─ Services ├─ Feature3 │ ├─ Http │ ├─ Models │ └─ Services ... 34 Package by Feature ● 機能に基づいたディレクトリ構成 ● 凝集度が高くなりやすい ○ 機能的に関連性の高いコードが同じ ディレクトリに集まる

Slide 35

Slide 35 text

 #phpcon_niigata #a /app ├─ Feature1 │ ├─ Http │ ├─ Models │ └─ Services ├─ Feature2 │ ├─ Http │ ├─ Models │ └─ Services ├─ Feature3 │ ├─ Http │ ├─ Models │ └─ Services ... 35 Package by Feature ● 機能に基づいたディレクトリ構成 ● 凝集度が高くなりやすい ○ 機能的に関連性の高いコードが同じ ディレクトリに集まる ● 結合度が低く保ちやすい ○ 機能間のインターフェースを明確にす れば、機能間の疎結合を促進しやすい

Slide 36

Slide 36 text

 #phpcon_niigata #a /app ├─ Feature1 │ ├─ Http │ ├─ Models │ └─ Services ├─ Feature2 │ ├─ Http │ ├─ Models │ └─ Services ├─ Feature3 │ ├─ Http │ ├─ Models │ └─ Services ... 36 Package by Feature ● 機能に基づいたディレクトリ構成 ● 凝集度が高くなりやすい ○ 機能的に関連性の高いコードが同じ ディレクトリに集まる ● 結合度が低く保ちやすい ○ 機能間のインターフェースを明確にす れば、機能間の疎結合を促進しやすい ● 中〜大規模なプロジェクトに向く

Slide 37

Slide 37 text

 #phpcon_niigata #a 37 凝集度を高く・結合度を低く 作るのが大事 POINT

Slide 38

Slide 38 text

 #phpcon_niigata #a 凝集度を高く・結合度を低く 38

Slide 39

Slide 39 text

 #phpcon_niigata #a 凝集度を高く・結合度を低く 39 こちらを 目指す

Slide 40

Slide 40 text

 #phpcon_niigata #a 40 機能間の疎結合を意識することで 「捨てやすく」なる

Slide 41

Slide 41 text

 #phpcon_niigata #a 41 まとめ

Slide 42

Slide 42 text

 #phpcon_niigata #a 42 まとめ ● ソフトウェアは「捨てやすく」作ろう! ● 捨てるのは大変なので、チームで一丸となって立ち向かおう! ● 機能単位の整理整頓で、いつでもサヨナラできる準備を ● 仮説検証を恐れず、軽やかにプロダクトを育てよう!

Slide 43

Slide 43 text

 #phpcon_niigata #a Thanks! 43 相談・指摘・その他 下記のXアカウントまでお願いします!

Slide 44

Slide 44 text

 #phpcon_niigata #a 44 参考・出典 ● ソフトウェアは捨てやすく作ろう - @sanogemaru ● 不要コード削除のススメ - @naopusyu ● Package by Layer vs Package by Feature - Sahibinden Technology ● ソフトウェア開発って なにか?を学ぶ勉強会 - Yasunobu Kawaguchi ● コード品質はやはりビジネスに影響を与える - mtx2s’s blog