Slide 1

Slide 1 text

DX Improvements Keishin Yokomaku (@KeithYokoma) / Merpay, Inc.

Slide 2

Slide 2 text

Developer Experience ։ൃମݧ merpay Android Engineers meetup

Slide 3

Slide 3 text

DX Improvements Why DX matters? ▸ ϓϩμΫτ͸೔ʑ੒௕Λଓ͚Δ ▸ ৽ػೳͷ௥Ճ ▸ طଘػೳͷվम ▸ όάमਖ਼ ▸ ͳͲ merpay Android Engineers meetup 3

Slide 4

Slide 4 text

DX Improvements Why DX matters? ▸ ιʔείʔυ΋ຖ೔มԽΛ͠ଓ͚Δ ▸ ৽͍͠Ϋϥεɾϝιουͷ௥Ճ ▸ طଘΫϥεɾϝιουͷৼΔ෣͍ͷมߋ ▸ Ϣχοτςετͷ௥Ճɾߋ৽ ▸ ͳͲ merpay Android Engineers meetup 4

Slide 5

Slide 5 text

DX Improvements Why DX matters? ▸ ୹ظؒͷΠςϨʔγϣϯΛܧଓ͠ɺϓϩμΫτΛ੒௕ͤ͞Δϓϩηε ▸ ΞδϟΠϧ ▸ 1 ~ 2 िؒͷεϓϦϯτ ▸ ࡉ͔͘ϓϥϯχϯά͠ɺࡉ͔͘੒Ռ෺ΛੵΈ্͍͛ͯ͘ merpay Android Engineers meetup X

Slide 6

Slide 6 text

DX Improvements Why DX matters? ▸ มԽ΁ͷదԠ͕ٻΊΒΕଓ͚Δ ▸ ૉૣ͍ػೳ࣮૷ʢࡉ͔͘࡞Γ্͍͛ͯ͘ϓϩηεͷ܁Γฦ͠ʣ ▸ ૉૣ͍ৼΓฦΓʢࡉֶ͔͘ͼΛൃݟ͠దԠ͍ͯ͘͠ϓϩηεͷ܁Γฦ͠ʣ ▸ ͜ΕΒ͕͏·͘Ͱ͖͍ͯΔ͔Ͳ͏͔Ͱ DX ͕ܾ·Δ merpay Android Engineers meetup 5

Slide 7

Slide 7 text

DX Improvements Good DX ▸ ૉૣ͍ػೳ࣮૷Λ࣮ݱ͢Δ͜ͱ͕Β ▸ มߋʹͭΑ͍ઃܭ΍ςετͷ࢓૊Έ ▸ ໨తʹ͔ͳͬͨϑϨʔϜϫʔΫͷར༻ ▸ ݟੵ΋ΓͷͨΊͷυϝΠϯ஌ࣝ ▸ ݟੵ΋ΓͷͨΊͷٕज़త஌ݟɾܦݧ ▸ ͳͲ merpay Android Engineers meetup 6

Slide 8

Slide 8 text

DX Improvements Good DX ▸ ૉૣ͍ৼΓฦΓΛ࣮ݱ͢Δ͜ͱ͕Β ▸ ఆظతͳৼΓฦΓͱ۩ମతͳΞΫγϣϯͷ࣮ߦ ▸ νʔϜ಺Ͱͷ໰୊ೝࣝͷ໨ઢ͕͍͋ͬͯΔ ▸ νʔϜ಺Ͱͷղܾࡦͷ໨ઢ͕͍͋ͬͯΔ merpay Android Engineers meetup 7

Slide 9

Slide 9 text

DX Improvements Bad DX ▸ ૉૣ͍ػೳ࣮૷Λ્֐͢Δ͜ͱ͕Β ▸ ৽ػೳ͕ଞͷطଘػೳʹӨڹΛ༩͑Δ ▸ όάमਖ਼͕ผͷόάΛݺͿ ▸ ςετ͕ॻ͖ͮΒ͍ɾॻ͍͍ͯͳ͍ ▸ ଞͷมߋࠩ෼ͱͷίϯϑϦΫτ͕ଟ͍ ▸ ͳͲ merpay Android Engineers meetup 8

Slide 10

Slide 10 text

DX Improvements Bad DX ▸ ૉૣ͍ৼΓฦΓΛ્֐͢Δ͜ͱ͕Β ▸ ৼΓฦΒͳ͍ ▸ ௿͍৺ཧత҆શੑ ▸ ՝୊ײ͕ڞ༗Ͱ͖ͳ͍ɺվળఏҊΛ͠ͳ͍ɺͳͲ ▸ ղܾࡦ͕͏·͘ػೳ͔ͨ͠ܭଌ͠ͳ͍ ▸ ͳͲ merpay Android Engineers meetup 9

Slide 11

Slide 11 text

DX Improvements Why DX matters? ▸ ѱ͍ DX ͸ϓϩμΫτͷܧଓతͳ੒௕Λ๦͛ͯ͠·͏ ▸ ਎ಈ͖͕औΓͮΒ͘ͳΓٻΊΒΕΔεϐʔυͰ։ൃ͕͢͢·ͳ͘ͳΔ ▸ DX ͸์͓ͬͯ͘ͱѱ͘ͳΔ ▸ ׂΕ૭ཧ࿦ ▸ ୭Ͱ΋ׂΕ૭͸࡞ͬͯ͠·͏΋ͷ ▸ ͕࣌ؒͨͭͱউखʹ૭ׂ͕ΕΔ͜ͱ΋͋Δ merpay Android Engineers meetup 10

Slide 12

Slide 12 text

DX Improvements DX (Developer Experience) Improvements ▸ ։ൃମݧΛܧଓతʹϝϯςφϯε͢Δ͜ͱɾͦͷϚωδϝϯτ merpay Android Engineers meetup 11

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

ϝϧϖΠ Android νʔϜͰͷऔΓ૊Έ merpay Android Engineers meetup

Slide 15

Slide 15 text

DX Improvements DX (Developer Experience) Improvements in Merpay Android ▸ ϝϧϖΠ Android νʔϜͰ࣮ࢪͨ͠ DX վળͷΞΫγϣϯ 1. ݱঢ়෼ੳ 2. վળఏҊ 3. ࣮ߦ merpay Android Engineers meetup 14

Slide 16

Slide 16 text

ݱঢ়෼ੳ merpay Android Engineers meetup

Slide 17

Slide 17 text

DX Improvements Analyze: ݱঢ়෼ੳ ▸ KPT ▸ ͏·͘Ͱ͖͍ͯΔͱࢥ͍ͬͯΔ͜ͱ ▸ վળ͍ͨ͠ͱࢥ͍ͬͯΔ͜ͱ ▸ վળͷ༏ઌॱҐ෇͚ ▸ ՝୊ʹର͢Δશһͷ໨ઢΛ߹ΘͤΔͨΊͷଧͪख merpay Android Engineers meetup 16

Slide 18

Slide 18 text

DX Improvements Analyze: ݱঢ়෼ੳ ▸ ͏·͘Ͱ͖͍ͯΔͱࢥ͍ͬͯΔ͜ͱ ▸ ϚϧνϞδϡʔϧͰ Feature ͝ͱʹ෼཭ͨ݁͠Ռɺେਓ਺Ͱ΋ίϯϑϦΫτ͕ গͳ͘։ൃΛਐΊΒΕ͍ͯΔ ▸ Redux Ͱঢ়ଶͷભҠͷݟ௨ཱ͕ͯ͠ΒΕ͍ͯΔɺςετ͕ॻ͖΍͍͢ ▸ σʔλϨΠϠʔ͕੔උ͞Ε͍ͯͯ୯७ʹཧղͰ͖Δ ▸ ͳͲ… merpay Android Engineers meetup 17

Slide 19

Slide 19 text

DX Improvements Analyze: ݱঢ়෼ੳ ▸ վળ͍ͨ͠ͱࢥ͍ͬͯΔ͜ͱ ▸ ςετΧόϨοδ͕௿͍ɻಛʹ View ϨΠϠʔͷςετ͕ॻ͚͍ͯͳ͍ɻ ▸ ෳࡶͰϒϥοΫϘοΫεͳφϏήʔγϣϯϑϨʔϜϫʔΫͷཧղ͕େมɻ ▸ Ϟδϡʔϧ͝ͱʹॻ͖ํͷ౷Ұײ͕ͳ͍͜ͱ͕͋Δɻ ▸ CI ʹ͕͔͔࣌ؒΓ͗ͯ͢͠·͍଴͕ͪൃੜ͍ͯ͠Δɻ ▸ ͳͲ… merpay Android Engineers meetup 18

Slide 20

Slide 20 text

DX Improvements Analyze: ݱঢ়෼ੳ ▸ վળͷ༏ઌॱҐ෇͚: νʔϜ͕࠷΋ࠔ͍ͬͯͦ͏ͳ͜ͱ ▸ ςετΧόϨοδͷෆ଍ ▸ ෳࡶͳφϏήʔγϣϯϑϨʔϜϫʔΫ ▸ ٕज़తͳཧ༝Ͱ଴ͪͷଟ͍։ൃϓϩηεɾϫʔΫϑϩʔ ▸ ஌ࣝɾ஌ݟͷଐਓԽ merpay Android Engineers meetup 19

Slide 21

Slide 21 text

DX Improvements Analyze: ݱঢ়෼ੳ ▸ վળͷ༏ઌॱҐ෇͚: νʔϜ͕࠷΋ࠔ͍ͬͯͦ͏ͳ͜ͱ ▸ ςετΧόϨοδͷෆ଍ ▸ ෳࡶͳφϏήʔγϣϯϑϨʔϜϫʔΫ ▸ ٕज़తͳཧ༝Ͱ଴ͪͷଟ͍։ൃϓϩηεɾϫʔΫϑϩʔ ▸ ஌ࣝɾ஌ݟͷଐਓԽ merpay Android Engineers meetup 20 ʹ ٕज़తෛ࠴

Slide 22

Slide 22 text

DX Improvements Analyze: ݱঢ়෼ੳ ▸ վળͷ༏ઌॱҐ෇͚: νʔϜ͕࠷΋ࠔ͍ͬͯͦ͏ͳ͜ͱ ▸ ςετΧόϨοδͷෆ଍ ▸ ෳࡶͳφϏήʔγϣϯϑϨʔϜϫʔΫ ▸ ٕज़తͳཧ༝Ͱ଴ͪͷଟ͍։ൃϓϩηεɾϫʔΫϑϩʔ ▸ ஌ࣝɾ஌ݟͷଐਓԽ merpay Android Engineers meetup 21 ʹ DevOps

Slide 23

Slide 23 text

DX Improvements Analyze: ݱঢ়෼ੳ ▸ վળͷ༏ઌॱҐ෇͚: νʔϜ͕࠷΋ࠔ͍ͬͯͦ͏ͳ͜ͱ ▸ ςετΧόϨοδͷෆ଍ ▸ ෳࡶͳφϏήʔγϣϯϑϨʔϜϫʔΫ ▸ ٕज़తͳཧ༝Ͱ଴ͪͷଟ͍։ൃϓϩηεɾϫʔΫϑϩʔ ▸ ஌ࣝɾ஌ݟͷଐਓԽ merpay Android Engineers meetup 22 ʹ ҉໧ͷ஌ࣝ

Slide 24

Slide 24 text

DX Improvements Analyze: ݱঢ়෼ੳ ▸ ࠷༏ઌͰऔΓ૊Ή΂͖՝୊ྖҬ 1. ҉໧ͷ஌ࣝͷղফ 2. ٕज़తෛ࠴ͷղফ 3. DevOps ͷվળ merpay Android Engineers meetup 23

Slide 25

Slide 25 text

վળఏҊ merpay Android Engineers meetup

Slide 26

Slide 26 text

DX Improvements Strategy Proposal: վળఏҊ ▸ ՝୊ྖҬ͝ͱʹऔΓ૊ΈΛϒϨΠΫμ΢ϯ͢Δ 1. ҉໧ͷ஌ࣝͷղফ 2. ٕज़తෛ࠴ͷղফ 3. DevOps ͷվળ merpay Android Engineers meetup 25

Slide 27

Slide 27 text

DX Improvements Strategy Proposal: վળఏҊ ▸ ՝୊ྖҬ͝ͱʹऔΓ૊ΈΛϒϨΠΫμ΢ϯ͢Δ 1. ҉໧ͷ஌ࣝͷղফ ‣ Be on the same page:
 νʔϜ͕҉໧తʹ͍࣋ͬͯΔ஌ࣝΛڞ༗͠ܗࣜԽ͢Δ࡞ઓ merpay Android Engineers meetup 26

Slide 28

Slide 28 text

DX Improvements Strategy Proposal: վળఏҊ ▸ ՝୊ྖҬ͝ͱʹऔΓ૊ΈΛϒϨΠΫμ΢ϯ͢Δ 2. ٕज़తෛ࠴ͷղফ ‣ Foundation Makeup:
 ςετΛॻ͖΍͘͢͢ΔͨΊͷ࢓૊ΈԽ΍ϘΠϥʔϓϨʔτͷղফͳͲ
 ػೳ։ൃΛࢧԉ͢ΔͨΊͷج൫Λͭ͘Δ࡞ઓ ‣ Foundation Refactoring:
 ෳࡶͳφϏήʔγϣϯΛ؆ૉԽ͢Δ࡞ઓ merpay Android Engineers meetup 27

Slide 29

Slide 29 text

DX Improvements Strategy Proposal: վળఏҊ ▸ ՝୊ྖҬ͝ͱʹऔΓ૊ΈΛϒϨΠΫμ΢ϯ͢Δ 3. DevOps ͷվળ ‣ CI Campaign - Make the CI great again:
 ೔ʑͷ։ൃϫʔΫϑϩʔͷதͰগͳ͔Β͵࣌ؒΛ઎ΊΔ CI Λվળ͢Δ࡞ઓ ‣ United we code, United we ship:
 ϝϧϖΠͷػೳΛϝϧΧϦΞϓϦʹ౷߹͢ΔεςοϓΛվળ͢Δ࡞ઓ merpay Android Engineers meetup 28

Slide 30

Slide 30 text

DX Improvements Milestone Proposal: վળఏҊ ▸ ͦΕͧΕͷऔΓ૊Έʹ͍ͭͯυΩϡϝϯτԽ͠ڞ༗ ▸ Background: औΓ૊Έʹࢸͬͨഎܠ͸ͳʹ͔ ▸ Objective: Ͳ͏͍͏໨తͰऔΓ૊Ήͷ͔ ▸ Goal: ԿΛͲ͜·ͰऔΓ૊Ήͷ͔ ▸ Steps/Approaches: Ͳ͏΍ͬͯऔΓ૊Ήͷ͔ ▸ վળͷ໨త͔Βํ๏ʹࢸΔ·ͰɺνʔϜͰͷ໨ઢΛ͋ΘͤΔ merpay Android Engineers meetup 29

Slide 31

Slide 31 text

࣮ߦ merpay Android Engineers meetup

Slide 32

Slide 32 text

҉໧ͷ஌ࣝͷղফ merpay Android Engineers meetup

Slide 33

Slide 33 text

DX Improvements Tacit Knowledge: ҉໧ͷ஌ࣝ ▸ νʔϜͱͯ͠ͷ՝୊ 1. ϑϨʔϜϫʔΫʹ͍ͭͯ஌͍ͬͯΔਓɾ͞ΘΕΔਓ͕ݶΒΕ͍ͯΔ 2. ਓʹΑͬͯࡉ͔͍࣮૷ํ๏΋·ͪ·ͪͳࣄ͕͋Δ ‣ ஌ࣝͷଐਓԽ͕ڧ͘ɺڞ༗͢΂͖஌͕ࣝڞ༗Ͱ͖͍ͯͳ͍ merpay Android Engineers meetup 32

Slide 34

Slide 34 text

DX Improvements ϝϧϖΠ Android ͷऔΓ૊Έ ▸ νʔϜ͕͍࣋ͬͯΔ҉໧ͷ஌ࣝΛܗࣜԽ͢Δ 1. ࢀߟ࣮૷ͷϝϯςφϯε 2. φϨοδγΣΞͷଅਐ merpay Android Engineers meetup 33

Slide 35

Slide 35 text

DX Improvements ࢀߟ࣮૷ (sample app) ͷϝϯςφϯε ▸ ϝϧϖΠ Android Ͱ࠾༻͍ͯ͠ΔΞʔΩςΫνϟͷࢀߟ࣮૷ΞϓϦ ▸ MVVM + Redux ͷ࣮૷ྫ͕͋ͬͨ ▸ Controller ΍ Navigation ͷ࣮૷ྫ͕ͳ͔ͬͨ: => ࡞Δ ▸ TODO ▸ ΑΓݱ࣮ʹଈ࣮ͨ͠૷ྫ: ωοτϫʔΫ I/O ͳͲ… ▸ KDoc ΍ Wiki ͸ʁ merpay Android Engineers meetup 34

Slide 36

Slide 36 text

DX Improvements φϨοδγΣΞͷଅਐ ▸ ִि༵ۚͰϥϯν݉ษڧձΛ։࠵ ▸ ͜Ε·Ͱ7ճ։࠵ ▸ ऴྃ࣌ʹαʔϕΠΛ࣮ࢪ ▸ ͲΜͳ͜ͱ͕஌ΕͯΑ͔͔ͬͨ ▸ ΋ͬͱ஌Γ͍ͨ͜ͱ͸ͲΜͳ͜ͱ͔ merpay Android Engineers meetup 35

Slide 37

Slide 37 text

DX Improvements φϨοδγΣΞͷଅਐ ▸ ͜Ε·Ͱͷ಺༰ ▸ ؆ૉԽͨ͠φϏήʔγϣϯͷ࢓૊Έͷ঺հ ▸ Mockk ʹΑΔςετ ▸ View ϨΠϠͷߏ੒ͱϢχοτςετ ▸ ϩάऔಘͷޮՌతͳ࣮૷ྫ ▸ ͳͲ… merpay Android Engineers meetup 36

Slide 38

Slide 38 text

DX Improvements φϨοδγΣΞͷଅਐ ▸ औΓ૊Έͷ݁Ռ ▸ ٕज़తෛ࠴ͷղফͷऔΓ૊Έ͕͏·͘ճ͖͍ͬͯͯΔ ▸ νʔϜ಺ͰΑΓΑ͍΍ΓํΛٞ࿦͢Δϕʔε͕Ͱ͖ͨ merpay Android Engineers meetup 37

Slide 39

Slide 39 text

ٕज़తෛ࠴ͷղফ merpay Android Engineers meetup

Slide 40

Slide 40 text

DX Improvements Technical Debt: ٕज़తෛ࠴ ▸ ϝϧϖΠ Android ๊͕͍ٕ͑ͯͨज़తෛ࠴ 1. ݁߹౓ͷߴ͍ View ͱ௿͍ςετΧόϨοδ 2. ಠࣗφϏήʔγϣϯϑϨʔϜϫʔΫ merpay Android Engineers meetup 39

Slide 41

Slide 41 text

DX Improvements Technical Debt: ٕज़తෛ࠴ ▸ ϝϧϖΠ Android ๊͕͍ٕ͑ͯͨज़తෛ࠴ 1. ݁߹౓ͷߴ͍ View ͱ௿͍ςετΧόϨοδ 2. ಠࣗφϏήʔγϣϯϑϨʔϜϫʔΫ merpay Android Engineers meetup 40

Slide 42

Slide 42 text

DX Improvements ϝϧϖΠ Android ͷઃܭ ▸ MVVM + Redux merpay Android Engineers meetup 41

Slide 43

Slide 43 text

▸ MVVM + Redux DX Improvements ϝϧϖΠ Android ͷઃܭ merpay Android Engineers meetup 42 DataSource API Client Storage Model

Slide 44

Slide 44 text

▸ MVVM + Redux DX Improvements ϝϧϖΠ Android ͷઃܭ merpay Android Engineers meetup 43 DataSource API Client Storage ViewModel ViewModel Reducer

Slide 45

Slide 45 text

▸ MVVM + Redux DX Improvements ϝϧϖΠ Android ͷઃܭ merpay Android Engineers meetup 44 DataSource API Client Storage View ViewModel Reducer Controller

Slide 46

Slide 46 text

DX Improvements ϝϧϖΠ Android ͷઃܭ: MVVM + Redux ▸ ͜ͷઃܭΛ࠾༻ͨ͠ཧ༝ ▸ ෳࡶͳঢ়ଶ؅ཧΛ Redux ͷॿ͚ΛआΓͯݟ௨͠Α࣮͘૷͍ͨ͠ ▸ ঢ়ଶมԽΛؔ਺ͱͯ͠ఆٛ͠ɺϢχοτςετΛ؆୯ʹͰ͖ΔΑ͏ʹ͍ͨ͠ ▸ View ͷؔ৺Λঢ়ଶʹԠͨ͡ View ͷૢ࡞ͱঢ়ଶมԽͷτϦΨʔʹݶఆ͍ͨ͠ merpay Android Engineers meetup 45

Slide 47

Slide 47 text

DX Improvements MVVM + Redux: ͏·͘Ͱ͖ͨ͜ͱ ▸ Model ͕ϨΠϠԽ͞Ε͍ͯΔ ▸ ঢ়ଶΛද͢ΦϒδΣΫτΛఆٛͰ͖Δ ▸ ঢ়ଶભҠͷఆ͕ٛ Reducer ʹ·ͱΊΒΕΔ ▸ ঢ়ଶͷมԽΛ Reactive Extension ͰදݱͰ͖Δ ▸ View ͸ঢ়ଶΦϒδΣΫτͷมԽΛݕ஌ͯ͠ɺඞཁͳ View ͷૢ࡞ʹूத merpay Android Engineers meetup 46

Slide 48

Slide 48 text

DX Improvements ViewModel example: ొ৔ਓ෺ ▸ Input: UI ͷΠϕϯτͱ ViewModel Ͱͷ Action ͷൃՐͷڮ౉͠໾ ▸ Store: Redux ͷ Storeɻঢ়ଶΛอ࣋͠มԽ͕͋ͬͨΒ௨஌͢Δ ▸ Reducer: Redux ͷ ReducerɻAction ʹԠͨ͡ঢ়ଶભҠΛఆٛ͢Δ ▸ ViewModel: Input ͔Β Action Λ࡞Γग़͠ Store ʹ఻ୡ͢Δ merpay Android Engineers meetup 47

Slide 49

Slide 49 text

DX Improvements ViewModel ͷγʔέϯε: View ͔ΒͷೖྗΛड͚औΔ merpay Android Engineers meetup X View ViewModel Model Reducer Store Trigger Input by click

Slide 50

Slide 50 text

DX Improvements ViewModel ͷγʔέϯε: Action ΛൃՐ merpay Android Engineers meetup X View ViewModel Model Reducer Store Trigger Input by click Dispatch loading Action

Slide 51

Slide 51 text

DX Improvements ViewModel ͷγʔέϯε: ঢ়ଶΛม͑Δ merpay Android Engineers meetup X View ViewModel Model Reducer Store Trigger Input by click Dispatch loading Action Recude Action

Slide 52

Slide 52 text

DX Improvements ViewModel ͷγʔέϯε: ঢ়ଶΛอଘ merpay Android Engineers meetup X View ViewModel Model Reducer Store Trigger Input by click Dispatch loading Action Recude Action Change State

Slide 53

Slide 53 text

DX Improvements ViewModel ͷγʔέϯε: ঢ়ଶมԽΛ௨஌ merpay Android Engineers meetup X View ViewModel Model Reducer Store Trigger Input by click Dispatch loading Action Recude Action Change State Notify state change

Slide 54

Slide 54 text

DX Improvements ViewModel ͷγʔέϯε: API ͔ΒσʔλΛऔͬͯ͘Δ merpay Android Engineers meetup X View ViewModel Model Reducer Store Trigger Input by click Dispatch loading Action Recude Action Change State Notify state change Fetch data Data

Slide 55

Slide 55 text

DX Improvements ViewModel ͷγʔέϯε: Action ΛൃՐ merpay Android Engineers meetup X View ViewModel Model Reducer Store Trigger Input by click Dispatch loading Action Recude Action Change State Notify state change Fetch data Data Dispatch loaded Action

Slide 56

Slide 56 text

DX Improvements ViewModel ͷγʔέϯε: ঢ়ଶΛม͑ɺ௨஌͢Δ merpay Android Engineers meetup 48 View ViewModel Model Reducer Store Trigger Input by click Dispatch loading Action Recude Action Change State Notify state change Fetch data Data Dispatch loaded Action Recude Action Change State Notify state change

Slide 57

Slide 57 text

DX Improvements ViewModel example class SampleViewModel( private val input: SampleInput, private val sampleDataSource: SampleDataSource ) { private val store = Store(SampleState(), SampleReducer()) val state: Observable = store.states fun onCreate() { store.dispatch( input.loadData.flatMap { sampleDataSource.getData() .map(::FinishDataLoadingAction) .toObservable() .startWith(StartDataLoadingAction()) } ) } } 49 merpay Android Engineers meetup

Slide 58

Slide 58 text

DX Improvements ViewModel example class SampleViewModel( private val input: SampleInput, private val sampleDataSource: SampleDataSource ) { private val store = Store(SampleState(), SampleReducer()) val state: Observable = store.states fun onCreate() { store.dispatch( input.loadData.flatMap { sampleDataSource.getData() .map(::FinishDataLoadingAction) .toObservable() .startWith(StartDataLoadingAction()) } ) } } X merpay Android Engineers meetup

Slide 59

Slide 59 text

DX Improvements ViewModel example class SampleViewModel( private val input: SampleInput, private val sampleDataSource: SampleDataSource ) { private val store = Store(SampleState(), SampleReducer()) val state: Observable = store.states fun onCreate() { store.dispatch( input.loadData.flatMap { sampleDataSource.getData() .map(::FinishDataLoadingAction) .toObservable() .startWith(StartDataLoadingAction()) } ) } } X merpay Android Engineers meetup

Slide 60

Slide 60 text

DX Improvements ViewModel example class SampleViewModel( private val input: SampleInput, private val sampleDataSource: SampleDataSource ) { private val store = Store(SampleState(), SampleReducer()) val state: Observable = store.states fun onCreate() { store.dispatch( input.loadData.flatMap { sampleDataSource.getData() .map(::FinishDataLoadingAction) .toObservable() .startWith(StartDataLoadingAction()) } ) } } 50 merpay Android Engineers meetup StartDataLoadingAction FinishDataLoadingAction

Slide 61

Slide 61 text

DX Improvements Reducer example class SampleReducer : Reducer { overrider fun reduce( current: SampleState, action: SampleAction ): SampleState = when (action) { is StartDataLoadingAction -> { current.copy( data = Loading() ) } is FinishDataLoadingAction -> { current.copy( data = Success(action.data) ) } } } 51 merpay Android Engineers meetup

Slide 62

Slide 62 text

DX Improvements MVVM + Redux: ͏·͘Ͱ͖ͨ͜ͱ ▸ Reducer ͷςετ ▸ Action Λೖྗͨ͠Βɺద੾ͳঢ়ଶʹભҠ͢Δ ▸ ViewModel ͷςετ ▸ Input ͔Βద੾ͳ Action Λ (ෳ਺ճ) ൃՐ͢Δ merpay Android Engineers meetup 52

Slide 63

Slide 63 text

DX Improvements ϝϧϖΠ Android ͷઃܭ: MVVM + Redux ▸ MVVM + Redux Ͱୡ੒Ͱ͖͍ͯΔ͜ͱ ✔ෳࡶͳঢ়ଶ؅ཧΛ Redux ͷॿ͚ΛआΓͯݟ௨͠Α࣮͘૷͍ͨ͠ ✔ঢ়ଶมԽΛؔ਺ͱͯ͠ఆٛ͠ɺϢχοτςετΛ؆୯ʹͰ͖ΔΑ͏ʹ͍ͨ͠ ‣ MVVM + Redux Ͱୡ੒Ͱ͖͍ͯͳ͍͜ͱ ? View ͷؔ৺Λঢ়ଶʹԠͨ͡ View ͷૢ࡞ͱঢ়ଶมԽͷτϦΨʔʹݶఆ͍ͨ͠ merpay Android Engineers meetup 53

Slide 64

Slide 64 text

DX Improvements Conductor: View ϕʔεͷը໘ߏஙϥΠϒϥϦ ▸ Navigation Architecture Component ͕·ͩͳ͍ࠒ͔Β։ൃ͕࢝·ͬͨ ▸ Single Activity Ͱը໘ભҠΛ࣮ݱ͍ͨ͠ ▸ Fragment ΑΓ΋γϯϓϧʹը໘Λѻ͍͍ͨ ▸ Fragment in Fragment…? merpay Android Engineers meetup 54

Slide 65

Slide 65 text

DX Improvements Conductor: View ϕʔεͷը໘ߏஙϥΠϒϥϦ ▸ Α͘࢖͏Ϋϥε ▸ Controller:
 Fragment ʹ૬౰͢ΔΫϥε ▸ Router:
 Navigation Architecture Component ͷ NavController ʹ૬౰͢ΔΫϥε merpay Android Engineers meetup 55

Slide 66

Slide 66 text

DX Improvements Controller example class SampleController : Controller() { private val input = SampleInput() private val viewModel = SampleViewModel(input, SampleRepo()) override fun onAttach(view: View) { super.onAttach(view) button.setOnClickListener { input.loadData.input() } viewModel.state .subscribe { state -> when (state.data) { is Loading -> { progressBar.isVisible = true } is Success -> { progressBar.isVisible = false } is Failure -> { progressBar.isVisible = false } } }.addTo(compositeDisposable) } } 56 merpay Android Engineers meetup

Slide 67

Slide 67 text

DX Improvements Controller example class SampleController : Controller() { private val input = SampleInput() private val viewModel = SampleViewModel(input, SampleRepo()) override fun onAttach(view: View) { super.onAttach(view) button.setOnClickListener { input.loadData.input() } viewModel.state .subscribe { state -> when (state.data) { is Loading -> { progressBar.isVisible = true } is Success -> { progressBar.isVisible = false } is Failure -> { progressBar.isVisible = false } } }.addTo(compositeDisposable) } } X merpay Android Engineers meetup

Slide 68

Slide 68 text

DX Improvements Controller example class SampleController : Controller() { private val input = SampleInput() private val viewModel = SampleViewModel(input, SampleRepo()) override fun onAttach(view: View) { super.onAttach(view) button.setOnClickListener { input.loadData.input() } viewModel.state .subscribe { state -> when (state.data) { is Loading -> { progressBar.isVisible = true } is Success -> { progressBar.isVisible = false } is Failure -> { progressBar.isVisible = false } } }.addTo(compositeDisposable) } } X merpay Android Engineers meetup

Slide 69

Slide 69 text

DX Improvements View ͱͯ͠ͷ Controller ▸ View ͱ ViewModel ͷڮ౉͠ ▸ Input ʹΑΔ ViewModel ΁ͷೖྗ ▸ Input ͱ͍͏ܗͰந৅Խ͍ͯ͠ΔͷͰ୯७ ▸ State Λߪಡͯ͠ View Λૢ࡞ ▸ ϩδοΫΛϕλॻ͖͍ͯͯ͠ີ݁߹͍ͯ͠Δ merpay Android Engineers meetup 57

Slide 70

Slide 70 text

DX Improvements ີ݁߹ͰςετΧόϨοδͷͳ͍ View ▸ State ͷߋ৽͔ΒͲͷΑ͏ʹ View Λૢ࡞͢Δ͔ςετͮ͠Β͍ ▸ ViewModel ͷϞοΫ͕ͳ͍ͱ State ͕ྲྀͤͳ͍ ▸ Activity ͳͲͱಉ͘͡ Controller ΠϯελϯεΛૉ௚ʹ͸࡞Εͳ͍ ▸ ݁ՌςετΛॻ͔ͣʹखಈͰؤுͬͯ֬ೝ͍ͯͨ͠ merpay Android Engineers meetup 58

Slide 71

Slide 71 text

DX Improvements ີ݁߹ͰςετΧόϨοδͷͳ͍ View ▸ View ͷ੹຿Λ͢΂ͯෛͬͨ Controller ▸ Controller ͸ Activity ΍ Fragment ͱಉ͡ Template Method Pattern ͷ࣮૷ ▸ ϥΠϑαΠΫϧ͝ͱద੾ͳॲཧΛ͢Δ৔ॴ ▸ ͋Γ͕ͪͳ Fat Activity ݱ৅ ▸ ద੾ͳ Delegate Λ࡞Γɺ
 Controller ͔Β͸ϥΠϑαΠΫϧ͝ͱద੾ͳϝιουݺͼग़͠ʹཹΊΔ merpay Android Engineers meetup 59

Slide 72

Slide 72 text

DX Improvements ViewDelegate ▸ State ʹԠͨ͡ View ͷૢ࡞ʹ໊લΛ͚ͭΔ ▸ Controller ͔ΒʮState Λߪಡͯ͠ View Λૢ࡞ʯ͢Δ໾ׂΛҕৡ ▸ ςετ͔Β೚ҙͷ State Λ publish ͢Ε͹ɺ
 ରԠ͢Δ View ͷૢ࡞͕Ͱ͖͔ͨͲ͏͔ݕূͰ͖Δ ▸ Controller ͸ϥΠϑαΠΫϧʹैͬͨΦϒδΣΫτͷ؅ཧΛ͢Δ͚ͩ merpay Android Engineers meetup 60

Slide 73

Slide 73 text

DX Improvements Controller example class SampleController : Controller() { private val input = SampleInput() private val viewModel = SampleViewModel(input, SampleRepo()) override fun onAttach(view: View) { super.onAttach() button.setOnClickListener { input.loadData.input() } viewModel.state .subscribe { state -> when (state.data) { is Loading -> { progressBar.isVisible = true } is Success -> { progressBar.isVisible = false } is Failure -> { progressBar.isVisible = false } } }.addTo(compositeDisposable) } } 61 merpay Android Engineers meetup

Slide 74

Slide 74 text

DX Improvements ViewDelegate usage class SampleController : Controller() { private val input = SampleInput() private val viewModel = SampleViewModel(input, SampleRepo()) private lateinit var viewDelegate: SampleContract.ViewDelegate override fun onAttach(view: View) { super.onAttach(view) viewDelegate = SampleViewDelegate.of(view, input) viewDelegate.setupButtonClick() viewDelegate.subscribeState(viewModel.state).addTo(compositeDisposable) } } 62 merpay Android Engineers meetup

Slide 75

Slide 75 text

DX Improvements ViewDelegate usage class SampleController : Controller() { private val input = SampleInput() private val viewModel = SampleViewModel(input, SampleRepo()) private lateinit var viewDelegate: SampleContract.ViewDelegate override fun onAttach(view: View) { super.onAttach(view) viewDelegate = SampleViewDelegate.of(view, input) viewDelegate.setupButtonClick() viewDelegate.subscribeState(viewModel.state)
 .addTo(compositeDisposable) } } 63 merpay Android Engineers meetup

Slide 76

Slide 76 text

DX Improvements ViewDelegate implementation class SampleViewDelegate private constructor( override val button: Button, override val progressBar: ProgressBar, override val input: SampleInput ) : SampleContract.ViewDelegate { override fun subscribeState(states: Observable) = state.subscribe { state -> when (state.data) { is Loading -> { progressBar.isVisible = true } is Success -> { progressBar.isVisible = false } is Failure -> { progressBar.isVisible = false } } } 64 merpay Android Engineers meetup

Slide 77

Slide 77 text

DX Improvements ϝϧϖΠ Android ͷઃܭ: MVVM + Redux ‣ ViewDelegate Λಋೖͯ͠ୡ੒Ͱ͖ͨ͜ͱ ✔View ͷؔ৺Λ"ঢ়ଶʹԠͨ͡ View ͷૢ࡞ͱঢ়ଶมԽͷτϦΨʔ”ʹݶఆ ✔Controller ͸ϥΠϑαΠΫϧ؅ཧʹूத ✔ViewDelegate ʹΑͬͯঢ়ଶʹԠͨ͡ View ͷૢ࡞ΛϢχοτςετՄೳʹ merpay Android Engineers meetup 65

Slide 78

Slide 78 text

DX Improvements Technical Debt: ٕज़తෛ࠴ ▸ ϝϧϖΠ Android ๊͕͍ٕ͑ͯͨज़తෛ࠴ 1. ݁߹౓ͷߴ͍ View ͱ௿͍ςετΧόϨοδ 2. ಠࣗφϏήʔγϣϯϑϨʔϜϫʔΫ merpay Android Engineers meetup 66

Slide 79

Slide 79 text

DX Improvements Multi-module ͰͷφϏήʔγϣϯ ▸ ଟ਺ͷ feature ϞδϡʔϧΛ΋ͭϚϧνϞδϡʔϧߏ੒ ▸ Feature A ͔Β Feature B ΁ͷφϏήʔγϣϯͷͨΊʹ࢓૊Έ͕ඞཁ ▸ ͢΂ͯͷ feature ϞδϡʔϧΛ஌͍ͬͯΔϞδϡʔϧͰφϏήʔγϣϯΛఆٛ merpay Android Engineers meetup 67

Slide 80

Slide 80 text

DX Improvements Multi-module ͰͷφϏήʔγϣϯ merpay Android Engineers meetup 68 OriginalController DestinationController Feature B Feature A

Slide 81

Slide 81 text

DX Improvements Multi-module ͰͷφϏήʔγϣϯ merpay Android Engineers meetup 69 OriginalController DestinationController Feature B Feature A

Slide 82

Slide 82 text

DX Improvements Multi-module ͰͷφϏήʔγϣϯ merpay Android Engineers meetup 70 OriginalController DestinationController Feature B Feature A ❌

Slide 83

Slide 83 text

DX Improvements Multi-module ͰͷφϏήʔγϣϯ merpay Android Engineers meetup 71 OriginalController DestinationController Feature B Feature A Navgigation OriginalNavigator

Slide 84

Slide 84 text

DX Improvements Multi-module ͰͷφϏήʔγϣϯ ▸ ॳظͷಠࣗφϏήʔγϣϯϑϨʔϜϫʔΫ ▸ Conductor ͷφϏήʔγϣϯ෦෼Λϥοϓͨ͠΋ͷ ▸ όοΫελοΫͳͲҰ෦ঢ়ଶΛಠࣗ؅ཧ͢Δ෦෼͕͋Δ ▸ ࣮૷ ▸ Controller ʹφϏήʔγϣϯ༻ͷϥϜμΛఆٛ ▸ ରԠ͢Δ Navigator ΫϥεͰϥϜμͷ࣮૷Λࢗ͢ merpay Android Engineers meetup 72

Slide 85

Slide 85 text

DX Improvements Conductor ʹ͓͚ΔφϏήʔγϣϯͷ࢓૊Έ class OriginalController : Controller() { fun onButtonClick() { router.pushController( RouterTransaction.with(DestinationController()) ) } } 73 merpay Android Engineers meetup

Slide 86

Slide 86 text

DX Improvements Conductor ʹ͓͚ΔφϏήʔγϣϯͷ࢓૊Έ class OriginalController : Controller() { fun onButtonClick() { router.pushController( RouterTransaction.with(DestinationController()) ) } } 74 merpay Android Engineers meetup ͜͜Λ͏·͘ந৅Խͭͭ͠ςετ͠΍͍͢ઃܭ͕ඞཁ

Slide 87

Slide 87 text

DX Improvements Navigation ͷ࣮ྫ: վળલ class OriginalController : Controller { var navigateFromOkButton: (() -> Unit)? = null } class OriginalNavigator : Navigator { override fun startController() { controller?.run { navigateFromOkButton = { next(DestinationController()) } } } } 75 merpay Android Engineers meetup

Slide 88

Slide 88 text

DX Improvements Navigation ͷ࣮ྫ: վળલ class OriginalController : Controller { var navigateFromOkButton: (() -> Unit)? = null } class OriginalNavigator : Navigator { override fun startController() { controller?.run { navigateFromOkButton = { next(DestinationController()) } } } } X merpay Android Engineers meetup

Slide 89

Slide 89 text

DX Improvements Navigation ͷ࣮ྫ: վળલ class OriginalController : Controller { var navigateFromOkButton: (() -> Unit)? = null } class OriginalNavigator : Navigator { override fun startController() { controller?.run { navigateFromOkButton = { next(DestinationController()) } } } } X merpay Android Engineers meetup

Slide 90

Slide 90 text

DX Improvements Good ▸ feature Ϟδϡʔϧͷػೳ࣮૷ͱφϏήʔγϣϯϩδοΫ͕෼཭Ͱ͖͍ͯΔ ▸ ؆୯ʹφϏήʔγϣϯͷϩδοΫΛࠩ͠ସ͑ΒΕΔ merpay Android Engineers meetup 76

Slide 91

Slide 91 text

DX Improvements Needs improvement ▸ ΠϯλϑΣʔε͕ͳ͍ ▸ ϥϜμͰ֤ Controller ʹఆٛ͢Δ͔͠ͳ͍ ▸ φϏήʔγϣϯͷϩδοΫΛϢχοτςετ͍͕ͨ͠…… ▸ ঢ়ଶΛಠࣗ؅ཧ͍ͯ͠Δ෦෼Λ͏·͘ϞοΫ͠ͳ͍ͱ͍͚ͳ͍ ▸ ϞοΫϥΠϒϥϦͷ spy ػೳ͕ͳ͍ͱݫ͍͠ merpay Android Engineers meetup 77

Slide 92

Slide 92 text

DX Improvements How to improve ▸ φϏήʔγϣϯΛΠϯλϑΣʔεͱͯ͠ఆ͍ٛͨ͠ ▸ ΦϒδΣΫτͱͯ͠ৼΔ෣ͬͯ΄͍͠ ▸ ঢ়ଶͷಠࣗ؅ཧΛ΍Ί͍ͨ ▸ Conductor ͕طʹ΍͍ͬͯΔ͜ͱΛࣗ෼͕ͨͪ΍Δඞཁ͸ͳ͍ ▸ ςετΛॻ͖΍͍ͨ͘͢͠ ▸ ্هͷ͜ͱ͕ୡ੒Ͱ͖ͨΒॻ͖΍͘͢ͳΔ͸ͣ merpay Android Engineers meetup 78

Slide 93

Slide 93 text

DX Improvements Multi-module ͰͷφϏήʔγϣϯ merpay Android Engineers meetup 79 OriginalController DestinationController Feature B Feature A Navgigation OriginalNavigator OriginalNavigation

Slide 94

Slide 94 text

DX Improvements Navigation ͷ࣮ྫ: վળޙ class OriginalController : Controller { val navigator: OriginalNavigation by lazy { /* … */ } } abstract class OriginalNavigation( controller: OriginalController ) : Navigation(controller) { abstract fun navigateToDestination() } class OriginalNavigator( controller: OriginalController ) : OriginalNavigation(controller) { override fun navigateToDestination() { next(DestinationController()) } } 80 merpay Android Engineers meetup

Slide 95

Slide 95 text

DX Improvements Navigation ͷ࣮ྫ: վળޙ class OriginalController : Controller { val navigator: OriginalNavigation by lazy { /* … */ } } abstract class OriginalNavigation( controller: OriginalController ) : Navigation(controller) { abstract fun navigateToDestination() } class OriginalNavigator( controller: OriginalController ) : OriginalNavigation(controller) { override fun navigateToDestination() { next(DestinationController()) } } X merpay Android Engineers meetup

Slide 96

Slide 96 text

DX Improvements Navigation ͷ࣮ྫ: վળޙ class OriginalController : Controller { val navigator: OriginalNavigation by lazy { /* … */ } } abstract class OriginalNavigation( controller: OriginalController ) : Navigation(controller) { abstract fun navigateToDestination() } class OriginalNavigator( controller: OriginalController ) : OriginalNavigation(controller) { override fun navigateToDestination() { next(DestinationController()) } } X merpay Android Engineers meetup

Slide 97

Slide 97 text

DX Improvements Navigation ͷ࣮ྫ: վળޙ class OriginalController : Controller { val navigator: OriginalNavigation by lazy { /* … */ } } abstract class OriginalNavigation( controller: OriginalController ) : Navigation(controller) { abstract fun navigateToDestination() } class OriginalNavigator( controller: OriginalController ) : OriginalNavigation(controller) { override fun navigateToDestination() { next(DestinationController()) } } X merpay Android Engineers meetup

Slide 98

Slide 98 text

DX Improvements Result: ੒Ռ ✔φϏήʔγϣϯΛΠϯλϑΣʔεͱͯ͠ఆ͍ٛͨ͠ ‣ ΠϯλϑΣʔε͕ఆٛͰ͖Δ࢓૊Έʹͳͬͨ ✔ঢ়ଶͷಠࣗ؅ཧΛ΍Ί͍ͨ ‣ Conductor ʹ೚͍ͤͯΔ ✔ςετΛॻ͖΍͍ͨ͘͢͠ ‣ φϏήʔγϣϯϩδοΫͷςετ͕ॻ͖΍͘͢ͳͬͨ merpay Android Engineers meetup 81

Slide 99

Slide 99 text

DX Improvements Result: ੒Ռ ✔ςετΧόϨοδͷ޲্ ‣ ϢχοτςετͰݕূͰ͖ΔྖҬ͕ͻΖ͕͓͔ͬͨ͛ merpay Android Engineers meetup 82

Slide 100

Slide 100 text

DX Improvements Caveat: ςετΧόϨοδͷ਺ࣈͱ͏·͘෇͖߹͏ ‣ ΧόϨοδͷ਺ࣈ͕͕͋ͬͨ͜ͱͷҙຯΛߟ͑Δ ‣ ҙຯͷ͋ΔςετΛॻ͍ͨ݁Ռͳͷ͔Ͳ͏͔ ‣ ΧόϨοδͷ਺ࣈ͕͕͋Ε͹Α͍Θ͚Ͱ͸ͳ͍ merpay Android Engineers meetup 83

Slide 101

Slide 101 text

DX Improvements Caveat: ςετΧόϨοδͷ਺ࣈͱ͏·͘෇͖߹͏ ‣ ViewDelegate ‣ State ʹԠͨ͡ View ͷૢ࡞Λݕূ͢Δ͜ͱʹҙຯ͕͋Δ ‣ Navigation ‣ ద੾ͳը໘ͷݺͼग़͠Λݕূ͢Δ͜ͱʹҙຯ͕͋Δ merpay Android Engineers meetup 84

Slide 102

Slide 102 text

DevOps ͷվળ merpay Android Engineers meetup

Slide 103

Slide 103 text

DX Improvements Development Process/Workflow: ։ൃϓϩηεɾϫʔΫϑϩʔ ▸ ։ൃϓϩηεɾϫʔΫϑϩʔͷ՝୊ 1. ࣌ؒͷ͔͔Δ CI 2. ϑΟʔυόοΫ͕ݟͮΒ͍ίʔυղੳπʔϧ 3. ࣌ؒͷ͔͔Δεςοϓ͕ෳ਺͋Δ౷߹खॱ ‣ ೔ʑͷ։ൃΠςϨʔγϣϯͷ଍͔ͤʹͳͬͯ͠·͏ཁҼΛղܾ͍ͯ͘͠ merpay Android Engineers meetup 86

Slide 104

Slide 104 text

DX Improvements Development Process/Workflow: ։ൃϓϩηεɾϫʔΫϑϩʔ ▸ ։ൃϓϩηεɾϫʔΫϑϩʔͷ՝୊ 1. ࣌ؒͷ͔͔Δ CI 2. ϑΟʔυόοΫ͕ݟͮΒ͍ίʔυղੳπʔϧ 3. ࣌ؒͷ͔͔Δεςοϓ͕ෳ਺͋Δ౷߹खॱ ‣ ೔ʑͷ։ൃΠςϨʔγϣϯͷ଍͔ͤʹͳͬͯ͠·͏ཁҼΛղܾ͍ͯ͘͠ merpay Android Engineers meetup 87

Slide 105

Slide 105 text

DX Improvements ࣌ؒͷ͔͔Δ CI ▸ Ұճͷ git push Ͱಈ࡞͢Δ CI ͕ऴΘΔ·Ͱ ▸ ͍͍ͩͨ30෼ ▸ ͢΂ͯͷεςοϓΛஞ࣮࣍ߦ͍ͯͨ͠ ▸ Checkout → Environment Set up → Verify → Assemble → Save Cache merpay Android Engineers meetup 88

Slide 106

Slide 106 text

DX Improvements ࣌ؒͷ͔͔Δ CI ▸ ݸʑͷεςοϓͰ΋ඞཁҎ্ʹ͕͔͔͍࣌ؒͬͯͨ ▸ Ωϟογϡͷ෮ݩ: 4෼͘Β͍ ▸ SDK ͷηοτΞοϓ: 1෼൒͘Β͍ ▸ Ϗϧυ: 6෼ऑ͘Β͍ ▸ ੒Ռ෺ͷอଘ: 4෼൒͘Β͍ ▸ Ωϟογϡͷอଘ: 8෼൒͘Β͍ merpay Android Engineers meetup 89

Slide 107

Slide 107 text

DX Improvements ࣌ؒͷ͔͔Δ CI ▸ εςοϓͷฒྻԽ ▸ Verify ͱ Assemble ͷಉ࣌ฒߦ ▸ ςετͷ࣮ߦํ๏ͷ޻෉ ▸ ෆඞཁͳॲཧͷ Spark Joy ▸ SDK ͷΞοϓσʔτ ▸ ڊେͳΩϟογϡͷอଘͱ෮ݩ merpay Android Engineers meetup 90

Slide 108

Slide 108 text

DX Improvements ࣌ؒͷ͔͔Δ CI ▸ Verify ͱ Assemble ͷಉ࣌ฒߦ ▸ ͜Ε͚ͩͰ͔ͳΓૣ͘ CI ͕ճͤΔΑ͏ʹͳͬͨ merpay Android Engineers meetup 91

Slide 109

Slide 109 text

DX Improvements ࣌ؒͷ͔͔Δ CI ▸ ςετͷฒྻ࣮ߦ ▸ ςετΛॻ͖΍͍͢࡞Γʹͨ݁͠Ռɺ
 Ϣχοτςετͷςετέʔε͕രൃతʹ૿͑ͨ ▸ Gradle ͷෳ਺ϓϩηεͰͷ࣮ߦͰ΋δϦශʹͳ͖ͬͯͨ ▸ CI ͷઃఆͰίϯςφΛෳ਺ىಈ͠ɺίϯςφ͝ͱʹҟͳΔςετΛಉ࣌ʹ࣮ߦ ▸ ref: https://tech.mercari.com/entry/2019/09/03/000000 merpay Android Engineers meetup 92

Slide 110

Slide 110 text

DX Improvements ࣌ؒͷ͔͔Δ CI ▸ ςετͷฒྻ࣮ߦ ▸ ςετΛॻ͖΍͍͢࡞Γʹͨ݁͠Ռɺ
 Ϣχοτςετͷςετέʔε͕രൃతʹ૿͑ͨ ▸ Gradle ͷෳ਺ϓϩηεͰͷ࣮ߦͰ΋δϦශʹͳ͖ͬͯͨ ▸ CI ͷઃఆͰίϯςφΛෳ਺ىಈ͠ɺίϯςφ͝ͱʹҟͳΔςετΛಉ࣌ʹ࣮ߦ ▸ ref: https://tech.mercari.com/entry/2019/09/03/000000 merpay Android Engineers meetup 93

Slide 111

Slide 111 text

DX Improvements ࣌ؒͷ͔͔Δ CI ▸ ςετͷฒྻ࣮ߦͷઃఆ merpay Android Engineers meetup 94

Slide 112

Slide 112 text

DX Improvements ࣌ؒͷ͔͔Δ CI ▸ ςετͷฒྻ࣮ߦͷઃఆ merpay Android Engineers meetup 95

Slide 113

Slide 113 text

DX Improvements ࣌ؒͷ͔͔Δ CI ▸ ςετͷฒྻ࣮ߦͷઃఆ ▸ Gradle ͰϚϧνϞδϡʔϧߏ੒ͩͱɺCircleCI ͷ CLI πʔϧ͕࢖͍ͮΒ͍ ▸ ࣗ෼Ͱίϯςφ͝ͱʹͲͷςετΛ࣮ߦ͢Δ͔ܭࢉ͢Δ merpay Android Engineers meetup 96

Slide 114

Slide 114 text

DX Improvements ࣌ؒͷ͔͔Δ CI ▸ ςετͷฒྻ࣮ߦͷઃఆ ▸ ϞδϡʔϧͰ෼ࢄ merpay Android Engineers meetup 97

Slide 115

Slide 115 text

DX Improvements ࣌ؒͷ͔͔Δ CI ▸ Ϗϧυ؀ڥͷίϯςφԽ ▸ Docker Λ࢖ͬͯ CI ▸ Ϗϧυʹඞཁͳ΋ͷ͸͢΂ͯΠϝʔδʹݻΊ͓ͯ͘ ▸ Android SDK ΛຖճΞοϓσʔτ͠ͳͯ͘΋Α͍ ▸ Πϝʔδͷόʔδϣϯ؅ཧ΋ՄೳʹͳΔ merpay Android Engineers meetup 98

Slide 116

Slide 116 text

DX Improvements ࣌ؒͷ͔͔Δ CI ▸ Ωϟογϡͷ؅ཧ ▸ Gradle ͕΋͍ͬͯΔΩϟογϡ͕ͱʹ͔͘େ͖͍ ▸ Ωϟογϡ͢΂͖σΟϨΫτϦ͚ͩΩϟογϡ͢Δ ▸ ~/.gradle/caches ▸ ~/.gradle/wrapper merpay Android Engineers meetup 99

Slide 117

Slide 117 text

DX Improvements ࣌ؒͷ͔͔Δ CI ▸ Ұճͷ git push Ͱಈ࡞͢Δ CI ͕ऴΘΔ·Ͱ ▸ ͍͍ͩͨ10෼ merpay Android Engineers meetup 100

Slide 118

Slide 118 text

DX Improvements Development Process/Workflow: ։ൃϓϩηεɾϫʔΫϑϩʔ ▸ ։ൃϓϩηεɾϫʔΫϑϩʔͷ՝୊ 1. ࣌ؒͷ͔͔Δ CI 2. ϑΟʔυόοΫ͕ݟͮΒ͍ίʔυղੳπʔϧ 3. ࣌ؒͷ͔͔Δεςοϓ͕ෳ਺͋Δ౷߹खॱ ‣ ೔ʑͷ։ൃΠςϨʔγϣϯͷ଍͔ͤʹͳͬͯ͠·͏ཁҼΛղܾ͍ͯ͘͠ merpay Android Engineers meetup 101

Slide 119

Slide 119 text

DX Improvements ϑΟʔυόοΫ͕ݟͮΒ͍ίʔυղੳπʔϧ ▸ Android Lint ΍ KtLint ͳͲ ▸ CI Ͱಈ͔͍ͯ͠Δ͕ɺ݁Ռ͕ CI ͷϩάग़ྗʹ͔͠ग़ͳ͍ ▸ ຖճ CI ͷը໘Λ։͍ͯϩά͔ΒࢦఠΛ୳͠ग़͍ͯͨ͠ merpay Android Engineers meetup 102

Slide 120

Slide 120 text

DX Improvements ϑΟʔυόοΫ͕ݟͮΒ͍ίʔυղੳπʔϧ ▸ GitHub ͷΠϯϥΠϯίϝϯτͰίʔυղੳͷࢦఠΛݟ͑ΔԽ͢Δ ▸ danger πʔϧͷಋೖͰղܾ ▸ ݟ͑ΔԽͨ͠΋ͷ ▸ Android Lint ͱ KtLint ͷܯࠂ ▸ ࣦഊͨ͠Ϣχοτςετ ▸ apk ͷղੳ݁Ռ merpay Android Engineers meetup 103

Slide 121

Slide 121 text

DX Improvements ϑΟʔυόοΫ͕ݟͮΒ͍ίʔυղੳπʔϧ ▸ ϚϧνϞδϡʔϧߏ੒ಛ༗ͷରԠ ▸ Ϟδϡʔϧ͝ͱʹࢄΒ͹ͬͨϨϙʔτϑΝΠϧͷऩू ▸ ࣗ෼Ͱ XML Λ͔͖ूΊͯɺͻͱͭʹ߹ମͯ͠ॻ͖ग़͢ ▸ ref: https://tech.mercari.com/entry/2019/09/03/000000 merpay Android Engineers meetup 104

Slide 122

Slide 122 text

DX Improvements Development Process/Workflow: ։ൃϓϩηεɾϫʔΫϑϩʔ ▸ ։ൃϓϩηεɾϫʔΫϑϩʔͷ՝୊ 1. ࣌ؒͷ͔͔Δ CI 2. ϑΟʔυόοΫ͕ݟͮΒ͍ίʔυղੳπʔϧ 3. ࣌ؒͷ͔͔Δεςοϓ͕ෳ਺͋Δ౷߹खॱ ‣ ೔ʑͷ։ൃΠςϨʔγϣϯͷ଍͔ͤʹͳͬͯ͠·͏ཁҼΛղܾ͍ͯ͘͠ merpay Android Engineers meetup 105

Slide 123

Slide 123 text

DX Improvements ࣌ؒͷ͔͔Δεςοϓ͕ෳ਺͋Δ౷߹खॱ ▸ ϝϧϖΠ͸ϝϧΧϦΞϓϦͷػೳͷҰ෦ ▸ ϝϧϖΠͷػೳ͕ϝϧΧϦΞϓϦʹ౷߹͞ΕΔ·Ͱ 1. ϝϧϖΠϦϙδτϦͰػೳ։ൃ 2. λάΛଧͬͯ੒Ռ෺ (aar) ΛσϓϩΠ 3. ϝϧΧϦϦϙδτϦͰ੒Ռ෺ͷόʔδϣϯΛߋ৽ 4. ϝϧΧϦΞϓϦΛϏϧυ merpay Android Engineers meetup 106

Slide 124

Slide 124 text

DX Improvements ࣌ؒͷ͔͔Δεςοϓ͕ෳ਺͋Δ౷߹खॱ ▸ ϝϧϖΠ͸ϝϧΧϦΞϓϦͷػೳͷҰ෦ ▸ ϝϧϖΠͷػೳ͕ϝϧΧϦΞϓϦʹ౷߹͞ΕΔ·Ͱ 1. ϝϧϖΠϦϙδτϦͰػೳ։ൃ 2. λάΛଧͬͯ੒Ռ෺ (aar) ΛσϓϩΠ 3. ϝϧΧϦϦϙδτϦͰ੒Ռ෺ͷόʔδϣϯΛߋ৽ 4. ϝϧΧϦΞϓϦΛϏϧυ merpay Android Engineers meetup 107

Slide 125

Slide 125 text

DX Improvements ࣌ؒͷ͔͔Δεςοϓ͕ෳ਺͋Δ౷߹खॱ ▸ ϝϧϖΠͷػೳηοτΛϥΠϒϥϦͱͯ͠ఏڙ͍ͯ͠Δ͕…… ▸ API ͳͲͷϞσϧ͚ͩͰͳ͘ɺը໘ͷ࣮૷·ͰؚΜͰ͍Δ ▸ ಠཱͨ͠ΞϓϦͰ͸ͳ͘ɺϝϧΧϦΞϓϦͰ࢖͏΋ͷ ▸ ը໘ͷ࣮૷͸ϝϧΧϦϦϙδτϦͰߦͬͨ΄͏͕खॱ͕؆ུԽͰ͖Δ merpay Android Engineers meetup 108

Slide 126

Slide 126 text

DX Improvements ࣌ؒͷ͔͔Δεςοϓ͕ෳ਺͋Δ౷߹खॱ ▸ ϦϙδτϦͷ౷߹ ▸ Ongoing… merpay Android Engineers meetup 109

Slide 127

Slide 127 text

Wrap up merpay Android Engineers meetup

Slide 128

Slide 128 text

DX Improvements Wrap up ▸ DX = Developer eXperience: ։ൃମݧ ▸ ೔ʑͷ։ൃ͕εϜʔζʹਐΊΒΕ͍ͯΔ͔Ͳ͏͔ ▸ Կ΋͠ͳͯ͘΋ DX ͸ѱ͘ͳΔ͜ͱ͕͋Δ ▸ νʔϜͱͯ͠ DX ͷվળʹܧଓతʹऔΓ૊Έଓ͚Δ͜ͱ ▸ ৺ཧత҆શੑ ▸ ໨ઢɾೝࣝ߹Θͤ merpay Android Engineers meetup 111

Slide 129

Slide 129 text

DX Improvements Keishin Yokomaku (@KeithYokoma) / Merpay, Inc.