Androidアプリ開発における技術顧問としての役割 #DroidKaigi 2018

Androidアプリ開発における技術顧問としての役割 #DroidKaigi 2018

2018/2/9
#DroidKaigi 2018 でお話した「Androidアプリ開発における技術顧問としての役割」の資料です

Cb22bcbee04e5a2fb897d703e794ca8f?s=128

Tatsuya Arai

February 22, 2018
Tweet

Transcript

  1. AndroidΞϓϦ։ൃʹ ͓͚Δٕज़ސ໰ͱͯ͠ ͷ໾ׂ DroidKaigi 2018 @cutmail

  2. ͢Δ࿩ • ٕज़ސ໰ͱͯ͠νʔϜΛͲ͏ཱͯ௚͔ͨ͠ • ٕज़ސ໰ͱͯ͠ձࣾʹͲ͏ߩݙ͢Δ͔ • ௚ۙͷϓϩδΣΫτͰԿΛ࠾༻͔ͨ͠

  3. ͠ͳ͍࿩ • MVVMɺMVP….ͳͲͷઃܭͷ࿩

  4. ࣗݾ঺հ

  5. ࣗݾ঺հ • @cutmail • ߥҪ ୡ࠸ • ϐοΫΞοϓגࣜձࣾ ٕज़ސ໰ •

    Android / iOS / GAE / Go
  6. ΞδΣϯμ • ٕज़ސ໰ͱ͸ • ٕज़ސ໰ͱͯ͠΍͍ͬͯΔ͜ͱ • ٕज़ސ໰ͱͯ͠AndroidΞϓϦ։ൃͰ΍͍ͬͯ Δ͜ͱ • ·ͱΊ

  7. ٕज़ސ໰ͱ͸

  8. ٕज़ސ໰ͱ͸ • ٕज़ऀͷ໾৬Ͱٕज़ࢦಋऀ • ٕज़ͷಛఆྖҬͷΞυόΠβʔ • ૊৫ʹର͢ΔΞυόΠβʔ

  9. ٕज़ސ໰ͱͯ͠ ΍͍ͬͯΔ͜ͱ

  10. ٕज़ސ໰ͷ࢓ࣄ • ։ൃମ੍ͷཱͯ௚͠ • ٕज़޿ใ • ࠾༻ • ࣾ಺ͷ੍౓࡞Γ •

    ٕज़ͷબఆ
  11. ։ൃମ੍ͷཱͯ௚͠

  12. %..άϧʔϓ ϐοΫΞοϓ ωΫετΧϨϯγʔ ͦͷଞ
 άϧʔϓձࣾ

  13. CHIPS

  14. None
  15. ։ൃνʔϜମ੍ • PM 1ਓ • σβΠφʔ 1ਓ • αʔόʔ 2ਓ

    • iOS 2ਓ • Android 1ਓ
  16. ϓϥοτϑΥʔϜ • iOS • AndroidʢະϦϦʔεʣ • Ұ෦Web

  17. ॳ೔

  18. ϓϩδΣΫτʹ
 ೖͬͯΈͨΒ

  19. ૑ۀظͷΑ͏ͳ։ൃ͕
 ߦΘΕ͍ͯͨ

  20. ޱ಄Ͱͷ΍ΓͱΓ

  21. ୭΋೺Ѳ͍ͯ͠ͳ͍
 ։ൃεέδϡʔϧ

  22. ಉ͡ํ޲Λ
 ޲͍͍ͯͳ͍

  23. ࣋ଓੑͷͳ͍։ൃ

  24. ϚΠϧετʔϯ͕ͳ͍

  25. ʮઓ৔͔ͳʁʯ

  26. Ͳ͏͔ͨ͠

  27. νʔϜϏϧσΟϯά

  28. ߹॓ͷ࣮ࢪ

  29. None
  30. None
  31. ߹॓ͷ࣮ࢪ • ΦϑΟεͱ͸͋͑ͯԕ͍৔ॴʹ͋͑ͯंͰ • ਺άϧʔϓʹΘ͔ΕͯंͰҠಈ • υϥοΧʔ෩ΤΫααΠζΛத৺ͱͨ͠ϫʔ Ϋγϣοϓ

  32. υϥοΧʔ෩ΤΫααΠζ • 3ͭͷ࣭໰Ͱ͓ޓ͍ͷ͜ͱΛ஌Γɺظ଴஋Λ͢Γ ߹ΘͤΔ • ࣗ෼ͷಘҙͳ͜ͱ • νʔϜϝϯόʔ͕ࣗ෼ʹظ଴͍ͯ͠Δͱࢥ͏͜ ͱ •

    ଞͷϝϯόʔʹظ଴͢Δ͜ͱ
  33. ݁Ռ

  34. ͓ޓ͍ͷظ଴஋Λ͢Γ͋Θͤ Δ͜ͱͰ

  35. νʔϜϝϯόʔͷ૬ޓཧղ͕
 ਐΜͩ

  36. νʔϜͷ݁ଋྗ͕ߴ·ͬͨ

  37. ։ൃମ੍ͷ੔උ

  38. ։ൃମ੍ͷ੔උ • 2िؒͷεϓϦϯτ • ελϯυΞοϓϛʔςΟϯά • ϓϩμΫτόοΫϩά • ίʔυϨϏϡʔͷಋೖ

  39. ֤ʑ͕͍࣋ͬͯΔλεΫͷ ݟ͑ΔԽ

  40. λεΫͷՄࢹԽ • TrelloΛಋೖ • EleganttͰΨϯτνϟʔτΛݟΕΔΑ͏ʹ

  41. ZenHubಋೖ • issue΍ϚΠϧετʔϯΛGitHub಺Ͱ׬݁Ͱ͖ ΔΑ͏ʹ • ͜ΕΛݟͳ͕ΒελϯυΞοϓMTGΛ࣮ࢪ

  42. None
  43. None
  44. ίʔυϨϏϡʔͷಋೖ

  45. ίʔυϨϏϡʔ࣌ʹϥϕϧΛ͚ͭΔ • [nits] : খ͍͞ࢦఠɻΠϯσϯτ΍typo • [IMO] : In My

    Opinion ࢲ͸͜͏ࢥ͏͚Ͳผʹ௚͢͜ͱ͸ඞ ਢͰ͸ͳ͍ • [COULD] : Ͱ͖Ε͹௚ͨ͠΄͏͕ྑ͍ • [MUST] : ௚ͦ͏ • [Q] : ࣭໰
  46. ίʔυϨϏϡʔͷ؍఺ • ͦ΋ͦ΋࢓༷Λຬ͍ͨͯ͠Δ͔ • iOS / AndroidͰۃ୺ʹ࢓༷͕ҧ͍ͬͯͳ͍͔ • ໋໊͕ద੾͔ •

    ςετ͕ॻ͔Ε͍ͯΔ͔ • ίϝϯτ͕ͳͯ͘΋ཧղͰ͖Δ͔ • ࣮ࡍʹಈ͔ͯ͠Έͯҧ࿨ײ͕ͳ͍͔
  47. ϦϦʔε಺༰Λ࢒͢ • GitHubͷϦϦʔεػೳΛ࢖ͬͯɺͦͷόʔ δϣϯʹԿΛϦϦʔε͔ͨ͠࢒͢ • Slack͔Βgit-pr-releaseΛ͚ͨͨΔΑ͏ʹͯ͠ ͍Δ • ։ൃҎ֎ͷϝϯόʔʹ͸ϦϦʔεϖʔδΛݟͯ มߋ఺Λ೺Ѳͯ͠΋Β͏

  48. ٕज़޿ใ

  49. ٕज़޿ใ • ࣾ಺Ͱ࢖͍ͬͯΔٕज़΍τϐοΫΛ֎ʹൃ৴ ͢Δ • ςοΫϒϩά • Πϕϯτ΁ͷڠࢍɺग़ల

  50. None
  51. %..άϧʔϓ ϐοΫΞοϓ ωΫετΧϨϯγʔ ͦͷଞ
 άϧʔϓձࣾ

  52. GAE/Go • TELLER શࠃCM์ө࣌΋GAEͷΦʔτεέʔ ϧͰ༨༟ • ύϑΥʔϚϯε͕མͪΔ͜ͱ΋ͳ͍ • ϩʔϧόοΫ΋όʔδϣϯΛ໭͚ͩ͢

  53. None
  54. None
  55. ࣾ಺Ͱ࢖ΘΕ͍ͯΔ
 ٕज़ελοΫΛ၆ᛌͯ͠
 هࣄԽ

  56. ֎෦΁ͷΞ΢τϓοτΛ
 ૿΍͢࢓૊ΈΛ࡞Δ

  57. Πϕϯτͷڠࢍ • ձࣾͷٕज़ελοΫʹ͋͏Πϕϯτʹڠࢍ͢Δ • ڠࢍۚͷ֬อ • ڠࢍ͢Δ͚ͩͰͳ͘ɺొஃ΋ґཔ͢Δ

  58. ΤϯδχΞ࠾༻ͷαϙʔτ

  59. ΤϯδχΞ࠾༻ͷαϙʔτ • ٕज़ϒϥϯσΟϯά • ଍Γ͍ͯͳ͍ਓࡐͷ੔ཧ/ൃ۷

  60. ٕज़ϒϥϯσΟϯά • ٕज़ϒϥϯσΟϯά͸࠾༻ϒϥϯσΟϯά • ֎͔Βͷݟ͑ํΛ౿·͑ͯ಺෦Λվળ͍ͯ͘͠ • ॏཁͳͷ͸ද໘͚ͩͰ͸ͳ͘ɺ݁Ռతʹ
 αʔϏε͕ྑ͘ͳΔ͜ͱ

  61. ଍Γ͍ͯͳ͍ਓࡐΛ໌֬Խ • ֤νʔϜ͕ࠓͲͷ৬छΛืू͍ͯ͠Δͷ͔ • Ϧιʔεঢ়گ͸ʁ • ืूཁ߲Λ࡞੒͢Δ • Ͳ͏͍͏εϖοΫͷਓ͕ඞཁͳͷ͔

  62. ੍౓࡞Γ

  63. ੍౓࡞Γ • 50%ϑϦʔϧʔϧ • ηϛφʔࢀՃ੍౓ • ϑϨϯυγοϓαϙʔτ • ͓ࢼ͠ब৬੍౓

  64. 50%ϑϦʔϧʔϧ • ۀ຿࣌ؒͷ50%ΛҎԼͷ׆ಈʹ͋ͯͯྑ੍͍౓ • OSS΁ͷߩݙ • ຊͷࣥච • Πϕϯτొஃɺͦͷ४උ •

    ࠾༻ʹؔΘΔ׆ಈશൠ
  65. ΧϯϑΝϨϯεࢀՃ੍౓ • ༗ྉͷ֎෦ηϛφʔ΍ΧϯϑΝϨϯεʹࢀՃ Ͱ͖Δ • DroidKaigiɺtry! Swift • ௚ۙͩͱGopherConɺKotlinConfʹϝϯόʔ ͕ࢀՃ༧ఆ

  66. ϑϨϯυγοϓαϙʔτ • ༏लͳ༑ਓͱͷ͝൧ͷඅ༻Λձ͕ࣾෛ୲ • 1ճʹ͖ͭ1ਓ1ສԁ·Ͱิॿ • ༏लͳϝϯόʔ͸༏लͳ༑ਓΛ஌͍ͬͯΔ͸ ͣ

  67. ͓ࢼ͠ब৬੍౓ • ҆৺ͯ͠ೲಘͯ͠ೖࣾͯ͠΋Β͏ͨΊʹɺస ৬લʹ࣮ࡍʹҰॹʹಇ͚Δ • 1೔~1िؒఔ౓ • ΋ͪΖΜใु΋͓ࢧ෷͍

  68. ࣾ಺Πϕϯτͷ։࠵ • ϞόΠϧڞ༗ձ • Goձ • ʮΈΜͳͷGoݴޠʯྠಡձ • ϐοΫΞοϓφΠτ

  69. ϞόΠϧڞ༗ձ • ϞόΠϧΞϓϦΤϯδχΞ͕ू·ͬͯίʔυΛ ಡΜͩΓɺ࠷ۙͷ։ൃτϐοΫʹ͍ͭͯ࿩͢ ৔ • DroidKaigiΞϓϦͷιʔείʔυϦʔσΟϯ άΛͨ͠Γ

  70. ϞόΠϧڞ༗ձ • ଞνʔϜͷαʔϏεͷίʔυΛಡΜͰɺઃܭ ʹ͍ͭͯ͋Ε͜Ε • ΞʔΩςΫνϟʹ͍ͭͯͷٞ࿦

  71. Goձ • αʔόʔΤϯδχΞ͕ू·Γɺ֤ϓϩδΣΫ τͷίʔυΛಡΜͩΓɺࠔ͍ͬͯΔ͜ͱ΍ɺ ϗοτͳτϐοΫ΍ઃܭʹ͍ͭͯ࿩͢৔ • ΞϓϦΤϯδχΞ΋ࢀՃOK

  72. ʮΈΜͳͷGoݴޠʯྠಡձ • 1ষͮͭ࣋ͪճΓͰղઆ • ΞϓϦΤϯδχΞ΋ࢀՃ • αʔόʔͷؾ࣋ͪΛཧղͯ͠
 ΋Β͏

  73. ϐοΫΞοϓφΠτ • ࣾ಺LTձ • ࢿྉ͸جຊతʹͳ͠Ͱ • ௕ͯ͘5෼ • ٕज़Ҏ֎ͷτʔΫ΋Welcome

  74. None
  75. Ϟνϕʔγϣϯ • ୯७ʹؾ͍ͮͨ͜ͱΛ൸࿐͍ͨ͠ • খωλΛൃදͰ͖ΔػձΛఏڙ͢Δ • νʔϜؒͰ࿩͢৔Λ࡞Δ • ·ͣ͸ࣾ಺Ͱ࿩͢ͷʹ׳Ε͔ͯΒ֎෦Ͱొஃ ͢Δಓےʹͯ͠΋Β͏

  76. ٕज़ސ໰ͱͯ͠ AndroidΞϓϦ։ൃͰ΍ͬͯ ͍Δ͜ͱ

  77. ٕज़ͷબఆ

  78. None
  79. CHIPSͰͷϥΠϒϥϦ • Kotlin • RxJava2 • Dagger2 • Android Architecture

    Component • Lifecycle • Room • Paging
  80. Handling Lifecycles • Activity΍FragmentͳͲͷίϯϙʔωϯτʹ ؔ͢Δ৘ใΛอ࣋͠ɺΦϒδΣΫτ͕؍ଌͰ ͖ΔΑ͏ʹ͢Δ

  81. Handling Lifecycles • CHIPSͰ͸Lifecycleͷมߋ࣌ʹExoPlayerͷڍ ಈΛม͑ͨΓ͢Δͷʹ࢖͍ͬͯͨΓ͢Δ

  82. Room • SQLiteʹΞΫηε͢Δந৅ԽϨΠϠʔΛఏڙ

  83. @Entity data class Task( @PrimaryKey val id: String, val name:

    String) { } @Dao interface TaskDao { @Query("DELETE FROM task") fun deleteAll() } Room
  84. Paging • RoomͳͲͷίϯϙʔωϯτͱγʔϜϨεʹ࿈ ܞͰ͖ΔϖʔδϯάϥΠϒϥϦ

  85. Paging • PositionalDataSource • RoomΛ࣮૷͍ͯ͠Ε͹ɺ˓͔Β˓݅औಘΈ ͍ͨͳΠϯλϑΣʔεΛࣗಈతʹੜ੒ͯ͘͠ ΕΔ https://developer.android.com/topic/libraries/architecture/paging.html

  86. جຊతʹGoogle΍ίϛϡχςΟ ओྲྀͷٕज़Λ࠾༻͍ͯ͘͠

  87. ͦͷଞϥΠϒϥϦ • Firebase Authentication • Firebase Performance • Retrofit2 •

    ExoPlayer • Glide
  88. CI؀ڥͷ੔උ • Bitrise • Danger • Android Lint • ktlint

    • Fabric betaͰࣾ಺഑෍ • ৗʹ࠷৽൛͕QAͰ͖Δମ੍ʹ
  89. Πϕϯτܭଌ؀ڥͷ੔උ • Firebase Analytics →BigQuery → CHATIO • ͲͷϓϩμΫτ΋͜ͷߏ੒ʹ

  90. None
  91. None
  92. ௚ۙͷࣄྫ

  93. ೝূΛஔ͖׵͑ͨ࿩

  94. ಠࣗೝূ͔Β
 Firebase Authentication΁ • ॳճىಈ࣌ʹήετϢʔβʔΛ࡞੒ • ݩʑ͸ಠࣗͷϩδοΫͰϢʔβʔ࡞੒ɺೝূ • ಠࣗOAuth࣮૷

  95. ಠࣗೝূ͔ΒFirebase Auth΁ firebaseAuthInstance.signInAnonymously() .addOnCompleteListener { task -> if (task.isSuccessful) {

    observer.onSuccess(task.result.user) } else { val cause = task.exception.toOption() .fold({ RuntimeException("unknown firebase auth error") }, { th -> th }) observer.onError(cause) } } ΞϓϦ͸FirebaseͷtokenΛαʔόʔʹ౤͛Δ͚ͩ
  96. ೝূ͸Firebase Auth ೝՄ͸ࣗαʔόʔͰ

  97. ೝূํ๏Λ૿΍͢৔߹͸ Firebase AuthenticationͰ
 ಠࣗೝূΛ࣮૷͢Δ https://firebase.google.com/docs/auth/web/custom-auth?hl=ja
 https://developers-jp.googleblog.com/2016/10/authenticate-your- firebase-users-with.html

  98. ӡ༻Λָʹ͢Δ ΞʔΩςΫνϟΛબ୒͢Δ

  99. ӡ༻ΑΓ΋αʔϏε։ൃʹ
 ूத͠Α͏

  100. αʔϏεͷίΞͳՁ஋ఏڙʹ
 ஫ྗ͢Δ

  101. ͜Ε͔Β΍Γ͍ͨ͜ͱ

  102. API Documentͷࣗಈੜ੒ • ιʔείʔυ͔Βࣗಈੜ੒ • ৽͍͠ΫϥΠΞϯτΞϓϦͳͲΛ࡞Δ࣌ʹඞ ਢ

  103. GAE/GoɺFirebaseΛ࢖ͬͨ αʔϏεج൫ͷ։ൃ • ϘΠϥʔςϯϓϨʔτ • ೝূ΍ϩάͳͲͷجຊతͳίϯϙʔωϯτΛ ໢ཏͨ͠αʔϏεج൫ • αʔϏεͷ্ཱͪ͛Λૣ͘Ͱ͖ΔΑ͏ʹ •

    ӡ༻΋ָʹ
  104. • iOS, AndroidͰڞ௨ͷίϯϙʔωϯτͱͯ͠ ੾Γग़ͤΔ΋ͷΛReact NativeԽ

  105. None
  106. ·ͱΊ

  107. ٕज़ސ໰ͷ࢓ࣄͱ͸ • ֎෦ɺ಺෦ଟذʹΘͨΔ • αʔϏε੒௕ͷͨΊʹɺ௕ظతͳ໨ઢͰٕज़Λ બఆ͢Δ • ࣾ಺Ͱ࢖ΘΕ͍ͯΔٕज़ελοΫΛັྗʹม͑ Δ •

    ձࣾͷΧϧνϟʔ࡞ΓʹӨڹ͢Δ
  108. ࠷ޙʹ

  109. ٕज़ސ໰͔ΒίʔϙϨʔτΤϯ δχΞϦϯά΁ • ΑΓ૊৫ͷ಺෦Λվળ͍ͯͨ͘͠Ίɺ
 ίʔϙϨʔτΤϯδχΞϦϯάࣨΛઃཱ • αʔϏεڞ௨ͷج൫ɺ؅ཧγεςϜɺશࣾʹ ඥͮ͘։ൃΛਐΊΔ

  110. ͝੩ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠