Slide 1

Slide 1 text

Koichi ITO / ESM, Inc. Kaigi on Rails STAY HOME Edition TDD with git. Long live engineering. 2020-10-03(Sat)

Slide 2

Slide 2 text

@koic • RuboCop core team • OSS Programmer • Agile software development practitioner • Distinguished Engineer at ESM, Inc. Me and @amapyon, @fkino, @sizuhiko

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

+0900 UTC+0200 +0300 +0800 -0400 Core developers

Slide 5

Slide 5 text

&4. *OD

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

&4.͔Β ࡾਓ໨ ͷൃදऀ

Slide 8

Slide 8 text

Support OSS community

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

An agile project in the real world

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

ͻͱͭͷ13͸ͻͱ ͭͷίϛοτʹ͢Δ A or B? ͻͱͭͷ13ʹෳ਺ ίϛοτΛؚΊΔ

Slide 13

Slide 13 text

ͻͱͭͷ13͸ͻͱ ͭͷίϛοτʹ͢Δ A or B? or C? ͻͱͭͷ13ʹෳ਺ ίϛοτΛؚΊΔ

Slide 14

Slide 14 text

SBJMTSBJMT *NQSPWF"DUJPO$BCMFSFDPOOFDUJPOSFMJBCJMJUZ

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

独⽴してリバートできる独⽴した変更単位にしておく

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

IUUQTSBJMTDPOGDPNWJEFPLFOUCFDLUJEZpSTU

Slide 20

Slide 20 text

High Cohesion Low Coupling コミット粒度への設計における⾼凝集、疎結合

Slide 21

Slide 21 text

⼀番重要なのは独⽴してリバートできる アトミックな変更単位でコミットされて いるかどうかです。 そうでなければ変更理由ではなく 作業⼿順になっている可能性が あります。 l @koic says

Slide 22

Slide 22 text

Koichi ITO / ESM, Inc. Kaigi on Rails STAY HOME Edition TDD with git. Long live engineering. 2020-10-03(Sat)

Slide 23

Slide 23 text

Learn from history (SFFO 3FE 3FGBDUPS

Slide 24

Slide 24 text

1999 1994 2000 2002 2003 The dawn of modern engineering

Slide 25

Slide 25 text

Green Red Test first (SFFO 3FE

Slide 26

Slide 26 text

Green Refactor Red Test first and Refactoring (SFFO 3FE 3FGBDUPS

Slide 27

Slide 27 text

1999 1994 2000 2002 2003 TDD with CVS (2002-)

Slide 28

Slide 28 text

Green Refactor Red Test Driven Development (SFFO 3FE 3FGBDUPS ಈ͔ͳ͍͔Βಈ͘΁ɺԚ͍͔Β៉ྷ΁

Slide 29

Slide 29 text

Green Refactor Red TDD with SCM (SFFO 3FE 3FGBDUPS DPNNJU DPNNJU DPNNJU (SFFO DPNNJU Green

Slide 30

Slide 30 text

2005 2006 2007 2009 2008 Rails with SCM (2005-)

Slide 31

Slide 31 text

• Rails͕࢓ࣄͰ࢖ΘΕ࢝Ίͨ2007೥ࠒͷόʔ δϣϯ؅ཧʹ͸Subversion͕࢖ΘΕ͍ͯͨ • git ͰͷϩʔΧϧϦϙδτϦͱ͍͏ͷ͸ͳ͘ɺ ྫ͑͹ϒϥϯνΛ࡞Ε͹ϦϞʔτϦϙδτϦ Ͱϒϥϯν͕࡞ΒΕɺίϛοτ͢Ε͹ϦϞʔ τϦϙδτϦͰνʔϜશମͰڞ༗͞Εͨ खʹ׼ѲΔSubversion࣌୅

Slide 32

Slide 32 text

2005 2006 2007 2009 2008 DSCM wars (Around 2008) HJUIHXBS

Slide 33

Slide 33 text

• ෼ࢄSCMͰ͋ΔGit / Mercurial (hg) / Bazaar ͋ͨΓͰ೼ݖΛ૪͍ͬͯͨ • GitoliteͳͲͰࣾ಺GitαʔόʔΛཱͯͯɺmaster ʹ௚઀push͍ͯͨ͠ • git logͰmaster (main) ͷίʔυΛͲΕ͚ͩϨ Ϗϡʔ͠·͔͢ʁ GitHubҎલͷGitར༻ࣄྫ

Slide 34

Slide 34 text

2005 2006 2007 2009 2008 Raise of GitHub (2008) HJUIH XBS

Slide 35

Slide 35 text

• GitHubొ৔ҎલͰɺCSV΍SubversionͰϒϥϯνΛ ࡞Δͷ͸ٽ͖ผΕͷϦϦʔεϒϥϯνͷ࡞੒΍trunk ʹࠞͥͨ͘ͳ͍ػೳΛฒߦ։ൃ͍ͨ͠ͱ͖ͩͬͨ • GitHubͷίʔυϨϏϡʔొ৔ʹΑΓPRͷͨΊͭ·Γ ίʔυϨϏϡʔͷͨΊʹϒϥϯνΛ࡞੒͢ΔΑ͏ʹ ͳͬͨ ϨϏϡʔͷͨΊͷϒϥϯν࡞੒͕ొ৔͢Δ

Slide 36

Slide 36 text

ϨϏϡΞʔ͔Βͷఏ ҊʹΑΔϦϑΝΫλ Ϧϯάɺमਖ਼ ηϧϑϨϏϡʔΛ܁ Γฦ͢தͰͷϦϑΝ ΫλϦϯάɺमਖ਼ Refactoring with social coding Before PR After PR

Slide 37

Slide 37 text

• ίʔυͷ੒௕ͷϨϕϧΞοϓ … master (main) ʹೖ Δલͷஈ֊Ͱɺࣗଞͷίʔυ͕ʮݟ͑ΔԽʯ͞Εͯ ΑΓྑ͍࣮૷ͷఏҊ΍ɺཁ݅΁ͷൈ͚࿙ΕΛϑΟʔ υόοΫͰ͖Δ • ਓͷϨϕϧΞοϓ … ࣗ෼ͷॻ͍ͨಈ͘ίʔυ΁ͷ ίʔυϨϏϡʔ͸ϦϙδτϦʹࢀՃ͍ͯ͠ΔγχΞ ͷࢹ఺Λ֫ಘ͢Δݱࡏ࠷ߴͷΤϯδχΞҭ੒ํ๏ ίʔυϨϏϡʔʹΑΔಇ͖ํվֵ

Slide 38

Slide 38 text

2005 2006 2007 2009 2008 Rails with Git/GitHub (2008-) HJUIH XBS

Slide 39

Slide 39 text

SVNは⼆次元、 gitは三次元 l @amatsuda says দాޠ࿥ (2009೥)

Slide 40

Slide 40 text

10೥΋gitΛ৮͍ͬͯΔͱ Ͳ͏3࣍ݩͳͷ͔ͷղऍ͕ ੜ·Ε͍ͯΔͷͰ࿩͠·͢

Slide 41

Slide 41 text

TDD with git (SFFO 3FE 3FGBDUPS

Slide 42

Slide 42 text

TDD with git 5%% (JU

Slide 43

Slide 43 text

Green Refactor Red Test Driven DevelopmentͷجຊϦζϜ (SFFO 3FE 3FGBDUPS 5%% (JU

Slide 44

Slide 44 text

Green Refactor Red ࣮ફతͳTDDͷϦζϜ (SFFO 3FE 3FGBDUPS commit commit commit Basic 5%% (JU

Slide 45

Slide 45 text

Green Refactor Red Consider `git push` (SFFO 3FE 3FGBDUPS commit commit commit (SFFO push CI Basic 5%% (JU

Slide 46

Slide 46 text

Green Refactor Red ϩʔΧϧ͔ΒϦϞʔτʹpush͢Δͱ͸ʁ (SFFO 3FE 3FGBDUPS commit commit commit (SFFO push CI Basic 5%% (JU

Slide 47

Slide 47 text

• ݸਓͷίʔυΛνʔϜͷίʔυʹ͢Δߦҝ • ݸਓͷίϛοτ͸࡞ۀͷ۠੾ΓͰ·Ίʹίϛοτ͢Δ Red, Green, Refactor…
 
 
 
 • νʔϜͷίϛοτͰ͸มߋཧ༝ΛḷΕΔΑ͏ʹ੔͑Δ git push (towards “Collective Ownership”) IUUQTUXJUUFSDPNU@XBEBTUBUVT

Slide 48

Slide 48 text

Green Refactor Red ୭ͷͨΊͷίʔυʁ (SFFO 3FE 3FGBDUPS commit commit commit (SFFO push CI Basic 5%% (JU Personal Code Team’s Code $PMMFDUJWF 0XOFSTIJQ

Slide 49

Slide 49 text

͖Έ͸ݸਓͷ੒ޭͱνʔϜͷ੒ޭ ͲͪΒΛબͿʁ ಉ͡&DMJQTF*%&Λ࢖ͬͨ ϖΞϓϩάϥϛϯάͰΩʔόΠϯυ ͕͋Θͳ͍ɻ8%:5 @KKD asked @KentBeck KKD఻ฉ (2006೥ࠒ)

Slide 50

Slide 50 text

Green Refactor Red ୭ͷͨΊͷίʔυʁ (SFFO 3FE 3FGBDUPS commit commit commit (SFFO push CI Basic 5%% (JU Personal Code Team’s Code $PMMFDUJWF 0XOFSTIJQ

Slide 51

Slide 51 text

Green Refactor Red Advanced translation technique (SFFO 3FE 3FGBDUPS commit commit commit (SFFO push squash (and amend) CI Basic Advanced 5%% (JU 3FGBDUPS Personal Code Team’s Code commit design $PMMFDUJWF 0XOFSTIJQ

Slide 52

Slide 52 text

HJUCMBNF ͳͲͰ௥੻͠΍͍͢ Α͏ʹมߋཧ༝ͷ୯ ҐͰίϛοτΛ·ͱ Ί͓ͯ͘ มߋཧ༝ʹ ج͍ͮͨ࡞ۀΛ͸͡ Ίͯɺ࡞ۀͷ੾Ε໨ ੾Ε໨Ͱςετͱί ϛοτΛ͍ͯ͘͠ ϦϑΝΫλϦϯάաఔͱϦϑΝΫλϦϯάޙ pushޙ (ϝϯςφϯεͰಡΉͱ͖) pushલ (ίʔυΛॻ͍͍ͯΔͱ͖) ಈࢺͱͯ͠ͷϦϑΝΫλϦϯάΛਐΊ͍ͯΔ΋ͷ ϦϑΝΫλϦϯάͷ݁Ռ (Χλϩάͷafter) Λ squash͔ͨ͋ͨ͠΋࠷ॳ͔Β៉ྷͳίʔυ

Slide 53

Slide 53 text

• ࠷ॳ͔Β៉ྷͳίʔυΛॻ͚ΔεʔύʔΤϯδχΞʹ͸ ϦϑΝΫλϦϯά͸ෆཁ͔΋͠Εͳ͍ • ࠷ॳ͔Β៉ྷͳίʔυΛॻ͘͜ͱ͕೉ͯ͘͠΋ςετΛݩʹ ϦϑΝΫλϦϯάΛ܁ΓฦͤΔͱ͍͏TDDͱ͍͏εΩϧ • TDD (Baby steps by XP) ʹΑͬͯ࡞ۀܦաίϛοτ͕૿͑Δ • ࡞ۀͷ్தܦաΛsquash͢Δ͜ͱͰεʔύʔΤϯδχΞͱಉ ݁͡Ռʹ͚ۙͮͨίϯτϦϏϡʔγϣϯΛνʔϜʹͰ͖Δ ;ͭ͏ͷਓͷͨΊͷTDDϦϑΝΫλϦϯάͱͦͷઌ

Slide 54

Slide 54 text

pick, squash, or another PR? ࣮૷աఔͰͷςετ௥Ճɺ όάϑΟοΫε΍খ͞ͳϦ ϑΝΫλϦϯάͰ͔͢ʁ TRVBTI QJDL ϦϦʔεࠩ͠໭͠ͷͱ͖ ͳͲಠཱͯ͠Ϧόʔτ͠ ͍ͨίϛοτͰ͔͢ʁ "OPUIFS 13 ͻͱͭͷϒϥϯνʹͻ ͱͭͷίϛοτ͚ͩͰ ͔͢ʁ ػೳͷ௥Ճมߋͱ෼཭ Ͱ͖Δطଘػೳ΁ͷϦ ϑΝΫλϦϯάͰ͔͢ʁ ΋͠ϨϏϡʔͰͷࢦఠͰͳ ࣗ͘ྗͰؾ͍͍ͮͯͨΒ ίϛοτΛ෼͚·͔͢ʁ ͻͱͭͷPRʹෳ਺ͷػ ೳཁٻʹର͢Δมߋ͕ ࠞ͟Γ·͔͢ʁ No Yes Yes No Yes No Yes Yes No Yes No No Start ಠཱͯ͠ϚʔδͰ͖Δ

Slide 55

Slide 55 text

ฏ໘ͰੵΉ͚͔ͩ͠Ͱ͖ͳ͔ͬͨೋ࣍ݩ͔Β ཱମతʹ੔͑ΒΕΔࡾ࣍ݩ΁ ϦϑΝΫλϦϯάͷ݁ՌΛsquashͯ͠ (ίʔυϨϏϡʔ) ͔͋ͨ΋ ࠷ॳͷίϛοτ͔Β ಈ͘៉ྷͳίʔυʹͰ͖Δ

Slide 56

Slide 56 text

Refactoring commits (SFFO 3FE 3FGBDUPS

Slide 57

Slide 57 text

,BUB

Slide 58

Slide 58 text

• ʮၗຫɺଵଦɺ୹ؾʯͷඒֶʹͷͬͱͬͯɺࣗ෼ͷ ࡞ۀޮ཰Λ೗Կʹ্͛Δ͔ͱ͍͏໋୊ • ߟ͑ͳͯ͘΋ख͕ಈ͘͘Β͍ͷࣗ෼ͷKataͮ͘Γ • ࡞ۀͷ੾Ε໨ͱͯ͠ͷ fixup ίϛοτͱɺมߋ୯Ґ ͷίϛοτ͕͋ͬͯɺࣗ෼͸ΤΠϦΞεΛ࢖ͬͯ git ૢ࡞ϨϕϧͰ෼͚͍ͯ·͢ (զྲྀΤΠϦΞε) TDD with git commit (ࢲͷܕ)

Slide 59

Slide 59 text

Use `--fixup` to temporary commit HDJNb"EEOFXA'PP#BSADPQ` "EEOFXA'PP#BSADPQ HDJNb&YUSBDUNFUIPE` &YUSBDUNFUIPE HDJNb'JYBUZQP` 'JYBUZQP HDJNb3FOBNFNFUIPE` 3FOBNFNFUIPE HSJHJUSFCBTFJ)&"%d 3FNPWFDPNNJUNFTTBHFTPUIFSUIBO UIFpSTUNFTTBHFBOERVJUUIFFEJUPS git commit HDJNb"EEOFXA'PP#BSADPQ` "EEOFXA'PP#BSADPQ HDG pYVQ"EEOFXA'PP#BSADPQ HDG pYVQpYVQ"EEOFXA'PP#BSA DPQ HDG pYVQpYVQpYVQ"EEOFX A'PP#BSADPQ HSJ 2VJUUIFFEJUPS git commit --fixup=HEAD Before Current

Slide 60

Slide 60 text

࡞ۀཧ༝ͷίϛοτϝοηʔδΛؤுΒͳ͍ HDJNb"EEOFXA'PP#BSADPQ` "EEOFXA'PP#BSADPQ HDJNb&YUSBDUNFUIPE` &YUSBDUNFUIPE HDJNb'JYBUZQP` 'JYBUZQP HDJNb3FOBNFNFUIPE` 3FOBNFNFUIPE HSJHJUSFCBTFJ)&"%d 3FNPWFDPNNJUNFTTBHFTPUIFSUIBO UIFpSTUNFTTBHFBOERVJUUIFFEJUPS commit commit commit commit

Slide 61

Slide 61 text

ΤΠϦΞεΛ׆༻͢Δ e.g.: git config --global alias.ci commit

Slide 62

Slide 62 text

Four my git aliases I use a lot SJTIDHJUSFCBTFJ)&"%d 1. First commit in the new branch 2. Second commit and the subsequence 3. Squash the above commits into one DGDPNNJUWpYVQ)&"% DJDPNNJUW DBDPNNJUWBNFOE 4. Amend a commit message

Slide 63

Slide 63 text

Before HDJNb"EEOFXA'PP#BSADPQ` "EEOFXA'PP#BSADPQ HDJNb&YUSBDUNFUIPE &YUSBDUNFUIPE HDJNb'JYBUZQP 'JYBUZQP HDJNb3FOBNFNFUIPE` 3FOBNFNFUIPE HSJ 3FNPWFDPNNJUNFTTBHFTPUIFSUIBO UIFpSTUNFTTBHFBOERVJUUIFFEJUPS git commit ΛϦϑΝΫλϦϯάͷ౎౓ͯ͠ɺ࠷ޙʹsquash͢Δ 5IJOLBCPVUUIFDPNNJUNFTTBHF 5IJOLBCPVUUIFDPNNJUNFTTBHF 5IJOLBCPVUUIFDPNNJUNFTTBHF 5IJOLBCPVUUIFDPNNJUNFTTBHF /FFEUPBEKVTUUPDPNNJUNFTTBHF

Slide 64

Slide 64 text

Current HDJNb"EEOFXA'PP#BSADPQ` "EEOFXA'PP#BSADPQ HDG pYVQ"EEOFXA'PP#BSADPQ HDG pYVQpYVQ"EEOFXA'PP#BSA DPQ HDG pYVQpYVQpYVQ"EEOFX A'PP#BSADPQ HSJ 2VJUUIFFEJUPS git commit —fixup=HEAD Ͱ਺चͭͳ͗ͯ͠ɺsquash Ͱ·ͱΊΔ %PO`U5IJOLBCPVUUIFDPNNJUNFTTBHF %PO`U5IJOLBCPVUUIFDPNNJUNFTTBHF 5IJOLBCPVUUIFDPNNJUNFTTBHF %PO`U5IJOLBCPVUUIFDPNNJUNFTTBHF /PBEKVTUNFOUUPDPNNJUNFTTBHFSFRVJSFE You can think about the details of the commit message

Slide 65

Slide 65 text

ci = commit -v ͱ͍͏ΤΠϦΞεͰɺPRϒϥϯν΁ ͷ࠷ॳͷίϛοτʹ g ci . -m 'message' Λ࢖͏ 2 types of commit methods มߋཧ༝΁ͷίϛοτ ࡞ۀͷ੾Ε໨΁ͷίϛοτ cf = commit -v --fixup=HEAD ͱ͍͏ΤΠϦΞεͰɺ
 PRϒϥϯν΁ͷϦϑΝΫλϦϯάͰg cf . Λ૬౰ʹ࢖͏

Slide 66

Slide 66 text

• git commit --fixupʹΑͬͯɺ࡞ۀͷηʔϒϙΠϯτ ͱͳΔίϛοτϝοηʔδ΁ͷߟྀෛՙΛͳ͘͢ • fixupίϛοτ͸͋ͱͰrebase (squash)͢Δͱ͖ ʹɺσϑΥϧτͰfixupʹͳ͍ͬͯΔͷͰศར • fixup͸squashͱҟͳΓίϛοτϝοηʔδͷฤूʹ ίϛοτϝοηʔδͷλΠτϧ͕ग़ͯͣ͜ฤूෆཁ fixup vs squash

Slide 67

Slide 67 text

`fixup! `Ͱ࢝·Δίϛοτؚ͕·ΕΔ৔߹ʹ pushͨ͘͠ͳ͚Ε͹git hookͰࣗಈԽ git hookͰ`fixup!`ίϛοτͷpush๷ࢭ CJOTI JG< HJUMPHPOFMJOFNBTUFSIFBEcHSFQpYVQ >UIFO FDIPa<N<"#035>:PVDBOOPUQVTIBDPNNJUXIPTFUJUMFTUBSUTaApYVQaA a<N FYJU p FYJU

Slide 68

Slide 68 text

• SubversionͰ͸ϦϑΝΫλϦϯάதͷηʔϒϙΠϯτ Ͱͷίϛοτ͕νʔϜͰڞ༗͞Ε͍ͯͨ • gitͰ͸࡞ۀखॱͰ͸ͳ͘ɺมߋཧ༝ͷཻ౓ʹฤूͨ͠ ίϛοτʹ·ͱΊ͔ͯΒνʔϜͰڞ༗Ͱ͖ΔΑ͏ʹ ͳͬͨ • εʔύʔΤϯδχΞͰͳͯ͘΋࠷ॳ͔ΒΫΦϦςΟͷ ߴ͘Ұචॻ͖͕Ͱ͖͔ͨͷΑ͏ͳίϛοτΛ࡞ΕΔ ίϛοτͷཻ౓Λ࡞ۀखॱͰ͸ͳ͘มߋཧ༝ʹͰ͖Δ

Slide 69

Slide 69 text

Conclusion (SFFO 3FE 3FGBDUPS

Slide 70

Slide 70 text

• TDDͰ͸খ͘͞খ͘͞ͷίϛοτཻ౓ͱͳΔ • ڞ༗ϦϙδτϦʹ͸มߋཧ༝Ͱͷίϛοτཻ౓Λ࢒͢ • ϩάΛḷΔࡍʹɺςετϑΝʔετͰ࣮૷ͨ͠΋ͷ͔ɺςετϥε τͰ࣮૷ͨ͠΋ͷ͔ɺϨϏϡʔͷ൓ө͔Ͳ͏͔͸ॏཁͰ͸ͳ͍ • ͦΕΒҟͳΔཻ౓΁ม׵͢Δͷ͕rebaseͰ͋ΓSubversionͰ͸Ͱ ͖ͳ͔ͬͨ͜ͱ • ίʔυઃܭͷΑ͏ʹίϛοτઃܭΛ͢Δ͜ͱͰɺϝϯςφϏϦ ςΟΛ্͛Δ͜ͱ͕Ͱ͖Δ ৽ੈلίϛοτઃܭ

Slide 71

Slide 71 text

ਓؒ͸ͩΜͩΜͱ ͏·͘ͳ͍ͬͯ͘

Slide 72

Slide 72 text

“Tools and techniques change often, but they don't change a lot People, however, change slowly but deeply. XPE2nd Chap. 23 ツールと技術は頻繁に変わるが、⼤幅に変わることはない。 しかし、⼈はゆっくりだが深く変わっていく。 Embrace Change (มԽϮ๊༴ηϤ)

Slide 73

Slide 73 text

Have a happy engineering by TDD with git!