Upgrade to Pro — share decks privately, control downloads, hide ads and more …

アプリをさらに成長させるための技術戦略 / Tech Strategy for Boosting App Growth

Shohei Kawano
February 07, 2019

アプリをさらに成長させるための技術戦略 / Tech Strategy for Boosting App Growth

アプリ開発に携わるエンジニアは、多かれ少なかれ担当アプリの成長のために仕事をしています。エンジニアリングやその他の方法をもちいてアプリを成長させたり、その成長をより加速させることは、アプリ開発を担当するエンジニアの大切な仕事です。

4−5人以上で開発するような大きいアプリケーション、かつ歴史が長く数年前からのコードも共存するようなアプリのメンテナンスにおいて、開発者の人数が増えた場合でも開発スピードを落とさず、さらにより多くのユーザーにアプリを利用してもらうための機能追加が容易にできるような内部構造にしておくことは、アプリを成長させるためにはもはや必要不可欠であるといえます。

このプレゼンテーションでは、アプリを成長させるために業務の中で行ったAndroid技術の選定やAndroidチーム内での取り組み(ペアプロ・モブプロ・お集まり会・もくもく木曜日)を含め、クオーターや半期目線で立てた技術戦略(テスタブル化・テストカバレッジ・Kotlin化率)について紹介し、どのようにアプリの成長や、開発スピードの向上につながったか(またはつながらなかったか)を成功事例・失敗事例を踏まえて振り返りました。振り返ったのち、今までやってきたことを踏まえ、今後アプリをさらに成長させるためにこれから行いたいことについて、紹介をしました。

-

* 「エンジニアがオーナーシップを持ってプロダクト改善に向き合う!マジマッチチャレンジという取り組みについて」
https://developers.cyberagent.co.jp/blog/archives/18812/

* 【タップル誕生】会員数が400万人を突破! マッチング数は国内最大規模の延べ1億2,000万組に
https://couplingunion.com/news/1033/

*
マッチングエージェント、オンライン恋活・婚活マッチングサービスの国内市場調査を実施 ~オンライン恋活・婚活マッチングサービス市場は2017年に208億円 アプリサービスが成長をけん引、2022年には577億円に拡大~
https://www.cyberagent.co.jp/news/detail/id=13691

* マッチングアプリの利用意向度は1年で約30ポイント増加
https://www.cyberagent.co.jp/news/detail/id=22647

* 趣味でつながる恋活サービス「タップル誕生」 恋活・婚活マッチングアプリの中で国内1位を獲得
https://couplingunion.com/news/1162/

* 株式会社マッチングエージェント | MatchingAgent, Inc.
https://www.matchingagent.co.jp/

Shohei Kawano

February 07, 2019
Tweet

More Decks by Shohei Kawano

Other Decks in Technology

Transcript

  1. ΞϓϦΛ͞Βʹ੒௕

    ͤ͞ΔͨΊͷٕज़ઓུ
    Shohei Kawano
    @shaunkawano

    View Slide

  2. Shohei Kawano

    @shaunkawano


    MatchingAgent, Inc.

    (CyberAgent, Inc.)

    Android Developer
    ࣗݾ঺հ

    View Slide

  3. ɾٕज़ઓུ·ͰͷྲྀΕ
    ɹɾ͜Ε·Ͱͷʮλοϓϧ஀ੜʯͷ੒௕
    ɹɾAndroidΞϓϦͷมભ
    ɾAndroidٕज़ઓུ
    ɾৼΓฦΓͱ͜Ε͔Β
    ໨࣍

    View Slide

  4. ٕज़ઓུ·ͰͷྲྀΕ

    View Slide

  5. ͜Ε·Ͱͷ
    ʮλοϓϧ஀ੜʯͷ੒௕
    ٕज़ઓུ·ͰͷྲྀΕ

    View Slide

  6. ͜Ε·Ͱͷʮλοϓϧ஀ੜʯͷ੒௕
    w೥ɹɹɹɹɹɹɹઃཱ
    w೥J04ɾ"OESPJE൛ʮλοϓϧ஀ੜʯ


    ٕज़ઓུ·ͰͷྲྀΕ

    View Slide

  7. https://www.cyberagent.co.jp/news/detail/id=22365
    ٕज़ઓུ·ͰͷྲྀΕʮλοϓϧ஀ੜʯͷ੒௕

    View Slide

  8. https://www.cyberagent.co.jp/news/detail/id=21321
    ٕज़ઓུ·ͰͷྲྀΕʮλοϓϧ஀ੜʯͷ੒௕

    View Slide

  9. https://www.cyberagent.co.jp/news/detail/id=22647
    ٕज़ઓུ·ͰͷྲྀΕʮλοϓϧ஀ੜʯͷ੒௕

    View Slide

  10. ٕज़ઓུ·ͰͷྲྀΕʮλοϓϧ஀ੜʯͷ੒௕

    View Slide

  11. ઈࢍ੒௕தʂ
    ٕज़ઓུ·ͰͷྲྀΕʮλοϓϧ஀ੜʯͷ੒௕

    View Slide

  12. ٕज़ઓུ·ͰͷྲྀΕ
    "OESPJEΞϓϦͷมભ

    View Slide

  13. View Slide

  14. ٕज़ઓུ·ͰͷྲྀΕ"OESPJEΞϓϦͷมભ
    wϦϦʔεd
    wd
    wd
    wd
    wd
    wdݱࡏ

    View Slide

  15. ٕज़ઓུ·ͰͷྲྀΕ"OESPJEΞϓϦͷมભ
    wϦϦʔεd
    wd
    wd
    wd
    wd
    wdݱࡏ
    ্ཱͪ͛ϑΣʔζ
    ্ཱͪ͛ˠٸ੒௕ϑΣʔζ
    վળϑΣʔζ
    ελϯμʔυԽϑΣʔζ

    View Slide

  16. ϦϦʔεd
    ٕज़ઓུ·ͰͷྲྀΕ"OESPJEΞϓϦͷมભ

    View Slide

  17. ϦϦʔεd
    w্ཱͪ͛ϑΣʔζ
    wػೳ௥Ճ
    wෆ۩߹मਖ਼
    wಋೖɿ+BWB "OESPJE"OOPUBUJPOT
    ٕज़ઓུ·ͰͷྲྀΕ"OESPJEΞϓϦͷมભ

    View Slide

  18. d
    ٕज़ઓུ·ͰͷྲྀΕ"OESPJEΞϓϦͷมભ

    View Slide

  19. d
    w্ཱͪ͛ˠٸ੒௕ϑΣʔζ
    wϞμϯͳϥΠϒϥϦͷಋೖɾஔ͖׵͑
    wωοτϫʔΫ·ΘΓͷϥΠϒϥϦͷ࡮৽
    wಋೖɿ0L)UUQ 3FUSPpU #VUUFS,OJGFͳͲ
    ٕज़ઓུ·ͰͷྲྀΕ"OESPJEΞϓϦͷมભ

    View Slide

  20. d
    ٕज़ઓུ·ͰͷྲྀΕ"OESPJEΞϓϦͷมભ

    View Slide

  21. d
    wվળϑΣʔζ
    wΞϓϦͷঢ়ଶ؅ཧͷදݱํ๏ͷ໛ࡧ
    w%JBMPHදࣔपΓͷϩδοΫͷվम
    wϝοηʔδͱ͍ͬͨओཁը໘ͷվम
    ٕज़ઓུ·ͰͷྲྀΕ"OESPJEΞϓϦͷมભ

    View Slide

  22. d
    ٕज़ઓུ·ͰͷྲྀΕ"OESPJEΞϓϦͷมભ

    View Slide

  23. d
    wελϯμʔυԽϑΣʔζ
    w$MFBO"SDIJUFDUVSFΛҙࣝͨ͠.77.
    wμΠΞϩάදࣔपΓͷϩδοΫΛҰՕॴʹ·
    ͱΊΔ
    wಋೖ,PUMJO %BHHFS %BUB#JOEJOH
    ٕज़ઓུ·ͰͷྲྀΕ"OESPJEΞϓϦͷมભ

    View Slide


  24. ٕज़ઓུ·ͰͷྲྀΕ

    View Slide

  25. ʮٕज़ΛތΕΔʯ૊৫΁
    ٕज़ઓུ·ͰͷྲྀΕ

    View Slide

  26. ٕज़ΛތΕΔ૊৫ͱ͸
    wཧ૝ͷνʔϜͬͯͲΜͳνʔϜʁ
    wͲΜͳٕज़Λ࢖͍͍ͬͯͨʁ
    wٕज़ΛތΕΔνʔϜͬͯͲΜͳνʔϜʁ
    ٕज़ઓུ·ͰͷྲྀΕ

    View Slide

  27. ٕज़ઓུ·ͰͷྲྀΕ

    View Slide

  28. ٕज़ઓུ·ͰͷྲྀΕ

    View Slide

  29. ݱ࣮͔Βཧ૝·Ͱͷ

    ΪϟοϓΛઓུతʹຒΊΔ
    ٕज़ઓུ·ͰͷྲྀΕ

    View Slide

  30. ݱ࣮͔Βཧ૝·Ͱͷ

    ΪϟοϓΛઓུతʹຒΊΔ
    ઈࢍ੒௕தͷΞϓϦΛ͞Β
    ʹ੒௕ͤ͞ΔͨΊͷઓུ
    ٕज़ઓུ·ͰͷྲྀΕ

    View Slide

  31. ٕज़ઓུʹ͍ͭͯ

    View Slide

  32. wϦϦʔεd
    wd
    wd
    wd
    wd
    wdݱࡏ
    ্ཱͪ͛ϑΣʔζ
    ্ཱͪ͛ˠٸ੒௕ϑΣʔζ
    վળϑΣʔζ
    ελϯμʔυԽϑΣʔζ
    ٕज़ઓུʹ͍ͭͯ

    View Slide

  33. wϦϦʔεd
    wd
    wd
    wd
    wd
    wdݱࡏ
    ্ཱͪ͛ϑΣʔζ
    ্ཱͪ͛ˠٸ੒௕ϑΣʔζ
    վળϑΣʔζ
    ελϯμʔυԽϑΣʔζ
    ٕज़ઓུͷࡦఆɾਪਐ
    ٕज़ઓུʹ͍ͭͯ

    View Slide

  34. wϦϦʔεd
    wd
    wd
    wd
    wd
    wdݱࡏ
    ্ཱͪ͛ϑΣʔζ
    ্ཱͪ͛ˠٸ੒௕ϑΣʔζ
    վળϑΣʔζ
    ελϯμʔυԽϑΣʔζ
    ٕज़ઓུʹ͍ͭͯ
    ٕज़ઓུͷࡦఆɾਪਐ

    View Slide

  35. d
    ٕज़ઓུʹ͍ͭͯ

    View Slide

  36. d
    ωΠςΟϒٕज़ઓུͷࡦఆͱ࣮ߦ
    ʰϢʔβʔମݧʹίϛοτ

    Ͱ͖Δ؀ڥߏஙʱ
    ٕज़ઓུʹ͍ͭͯ

    View Slide

  37. ʰϢʔβʔମݧʹίϛοτͰ͖Δ؀ڥߏஙʱ
    w࢓༷ܾΊ͔ΒϦϦʔε·Ͱͷ࣌ؒΛ୹ॖ
    wΤϯδχΞͷ਺͕૿͑ͯ΋εϐʔυ͕མͪͳ͍
    Α͏ʹ
    ٕज़ઓུʹ͍ͭͯd

    View Slide

  38. wϦϦʔεd
    wd
    wd
    wd
    wd
    wdݱࡏ
    ্ཱͪ͛ϑΣʔζ
    ্ཱͪ͛ˠٸ੒௕ϑΣʔζ
    վળϑΣʔζ
    ελϯμʔυԽϑΣʔζ
    ٕज़ઓུʹ͍ͭͯ
    ٕज़ઓུͷࡦఆɾਪਐ

    View Slide

  39. wϦϦʔεd
    wd
    wd
    wd
    wd
    wdݱࡏ
    ্ཱͪ͛ϑΣʔζ
    ্ཱͪ͛ˠٸ੒௕ϑΣʔζ
    վળϑΣʔζ
    ελϯμʔυԽϑΣʔζ
    ٕज़ઓུʹ͍ͭͯ
    ٕज़ઓུͷࡦఆɾਪਐ

    View Slide

  40. dݱࡏ
    ٕज़ઓུʹ͍ͭͯ

    View Slide

  41. ωΠςΟϒٕज़ઓུΛվΊɺ
    ʰސ٬Ձ஋Λ࠷଎Ͱࢢ৔ʹ౤Լ͢Δʱ
    ٕज़ઓུʹ͍ͭͯ
    dݱࡏ

    View Slide

  42. ωΠςΟϒٕज़ઓུΛվΊɺ
    ʰސ٬Ձ஋Λ࠷଎Ͱࢢ৔ʹ౤Լ͢Δʱ
    ٕज़ઓུʹ͍ͭͯ
    dݱࡏ

    View Slide

  43. View Slide

  44. #

    View Slide

  45. View Slide

  46. View Slide

  47. "OESPJEٕज़ઓུ

    View Slide

  48. w'MVYԽ
    wςελϒϧԽ
    wςετΧόϨοδ޲্
    w,PUMJOԽ
    "OESPJEٕज़ઓུ
    ٕज़ઓུʹ͍ͭͯd

    View Slide

  49. w'MVYԽ
    wςελϒϧԽ
    wςετΧόϨοδ޲্
    w,PUMJOԽ
    "OESPJEٕज़ઓུ
    ٕज़ઓུʹ͍ͭͯd

    View Slide

  50. d
    wελϯμʔυԽϑΣʔζ
    w$MFBO"SDIJUFDUVSFΛҙࣝͨ͠.77.
    wμΠΞϩάදࣔपΓͷϩδοΫΛҰՕॴʹ·
    ͱΊΔ
    wಋೖ,PUMJO %BHHFS %BUB#JOEJOH
    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུ'MVYԽ

    View Slide

  51. d
    wελϯμʔυԽϑΣʔζ
    w$MFBO"SDIJUFDUVSFΛҙࣝͨ͠.77.
    wμΠΞϩάදࣔपΓͷϩδοΫΛҰՕॴʹ·
    ͱΊΔ
    wಋೖ,PUMJO %BHHFS %BUB#JOEJOH
    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུ'MVYԽ

    View Slide

  52. ͳͥ.77.͔Β'MVY
    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུ'MVYԽ

    View Slide

  53. .77.ʹ͍ͭͯ
    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུ'MVYԽ

    View Slide

  54. .77.
    Repository
    View
    Remote
    Data Source
    Local
    Data Source
    ViewModel
    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུ'MVYԽ

    View Slide

  55. .77.
    Repository
    View
    Remote
    Data Source
    Local
    Data Source
    ViewModel
    w6*͔ΒϩδοΫΛҠߦͰ͖Δ
    w""$7JFX.PEFMˠը໘ճస࣌ͷσʔλ
    อ͕࣋༰қʹ
    wॻ͖ํΛύλʔϯԽ͠΍͍͢

    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུ'MVYԽ

    View Slide

  56. .77.
    Repository
    View
    Remote
    Data Source
    Local
    Data Source
    ViewModel
    w7JFX.PEFMΫϥε͕ංେԽ͕ͪ͠
    wը໘ؒͷσʔλͷड͚౉͠ɾ఻ൖΛ͍ͨ͠
    w%3:ͳίʔυΛ૿΍͍ͨ͠

    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུ'MVYԽ

    View Slide

  57. 'MVYʹ͍ͭͯ
    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུ'MVYԽ

    View Slide

  58. Action View
    Dispatcher Store
    Action Creator
    'MVY
    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུ'MVYԽ

    View Slide

  59. Action View
    Dispatcher Store
    Action Creator
    'MVY
    wσʔλͷྲྀΕΛ୯Ұํ޲ʹͰ͖Δ
    wςετ͕ॻ͖΍͍͢
    wσόοά͕͠΍͍͢
    w࠶ར༻ੑ͕ߴ͍

    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུ'MVYԽ

    View Slide

  60. .77.
    View
    ViewModel
    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུ'MVYԽ

    View Slide

  61. .77.
    View
    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུ'MVYԽ
    Store
    Action
    Creator
    ঢ়ଶ؅ཧ
    ৽σʔλऔಘ

    View Slide

  62. Action View
    Dispatcher Store
    Action Creator
    'MVY
    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུ'MVYԽ

    View Slide

  63. w'MVYԽ
    wςελϒϧԽ
    wςετΧόϨοδ޲্
    w,PUMJOԽ
    "OESPJEٕज़ઓུ
    ٕज़ઓུʹ͍ͭͯd

    View Slide

  64. w'MVYԽ
    wςελϒϧԽ
    wςετΧόϨοδ޲্
    w,PUMJOԽ
    "OESPJEٕज़ઓུ
    ٕज़ઓུʹ͍ͭͯd

    View Slide

  65. ςελϒϧԽʹ͍ͭͯ
    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུςελϒϧԽ

    View Slide

  66. ςετ͠ʹ͍͘ίʔυΛ

    ςετ͠΍͍͢ܗʹ
    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུςελϒϧԽ

    View Slide

  67. ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུςελϒϧԽ
    class SomeClass(
    ) {
    fun doSomeAction() {
    RestApi.getInstance()
    .getSomethingFromNetwork()
    .subscribeBy(
    onComplete = { thenDoThisAction() },
    onError = { onError() }
    )
    }
    }

    View Slide

  68. ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུςελϒϧԽ
    class SomeClass(
    ) {
    fun doSomeAction() {
    RestApi.getInstance()
    .getSomethingFromNetwork()
    .subscribeBy(
    onComplete = { thenDoThisAction() },
    onError = { onError() }
    )
    }
    }
    ςετ͍ͨؔ͠਺

    View Slide

  69. ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུςελϒϧԽ
    class SomeClass(
    ) {
    fun doSomeAction() {
    RestApi.getInstance()
    .getSomethingFromNetwork()
    .subscribeBy(
    onComplete = { thenDoThisAction() },
    onError = { onError() }
    )
    }
    }
    ΠϯελϯεΛϞοΫ͢Δ͜ͱ͕Ͱ͖ͳ͍☁

    View Slide

  70. ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུςελϒϧԽ
    class SomeClass(
    ) {
    fun doSomeAction() {
    RestApi.getInstance()
    .getSomethingFromNetwork()
    .subscribeBy(
    onComplete = { thenDoThisAction() },
    onError = { onError() }
    )
    }
    }

    View Slide

  71. class SomeClass(
    private val api: RestApi
    ) {
    fun doSomeAction() {
    api
    .getSomethingFromNetwork()
    .subscribeBy(
    onComplete = { thenDoThisAction() },
    onError = { onError() }
    )
    }
    }
    ٕज़ઓུʹ͍ͭͯd"OESPJEٕज़ઓུςελϒϧԽ

    View Slide

  72. w'MVYԽ
    wςελϒϧԽ
    wςετΧόϨοδ޲্
    w,PUMJOԽ
    "OESPJEٕज़ઓུ
    ٕज़ઓུʹ͍ͭͯd

    View Slide

  73. w'MVYԽ
    wςελϒϧԽ
    wςετΧόϨοδ޲্
    w,PUMJOԽ
    "OESPJEٕज़ઓུ
    ٕज़ઓུʹ͍ͭͯd

    View Slide

  74. wΤϯδχΞ໨ઢͷ࢓༷ॻ
    w૝ఆ͍ͯ͠ͳ͔ͬͨڍಈͷ࡯஌
    w2"ϑΣʔζ୹ॖ
    ςετΧόϨοδ޲্
    ٕज़ઓུʹ͍ͭͯd

    View Slide

  75. View Slide

  76. w'MVYԽ
    wςελϒϧԽ
    wςετΧόϨοδ޲্
    w,PUMJOԽ
    "OESPJEٕज़ઓུ
    ٕज़ઓུʹ͍ͭͯd

    View Slide

  77. w'MVYԽ
    wςελϒϧԽ
    wςετΧόϨοδ޲্
    w,PUMJOԽ
    "OESPJEٕज़ઓུ
    ٕज़ઓུʹ͍ͭͯd

    View Slide

  78. ,PUMJOԽ
    ٕज़ઓུʹ͍ͭͯd

    View Slide


  79. ,PUMJOԽ
    ٕज़ઓུʹ͍ͭͯd
























    View Slide

  80. wϦϦʔεd
    wd
    wd
    wd
    wd
    wdݱࡏ
    ্ཱͪ͛ϑΣʔζ
    ্ཱͪ͛ˠٸ੒௕ϑΣʔζ
    վળϑΣʔζ
    ελϯμʔυԽϑΣʔζ
    ٕज़ઓུʹ͍ͭͯ
    ٕज़ઓུͷࡦఆɾਪਐ

    View Slide

  81. wϦϦʔεd
    wd
    wd
    wd
    wd
    wdݱࡏ
    ্ཱͪ͛ϑΣʔζ
    ্ཱͪ͛ˠٸ੒௕ϑΣʔζ
    վળϑΣʔζ
    ελϯμʔυԽϑΣʔζ
    ٕज़ઓུʹ͍ͭͯ
    ٕज़ઓུͷࡦఆɾਪਐ

    View Slide

  82. "OESPJEٕज़ઓུ
    w'MVYԽ
    wςετΧόϨοδ޲্
    wϚϧνϞδϡʔϧԽ
    ٕज़ઓུʹ͍ͭͯdݱࡏ

    View Slide

  83. "OESPJEٕज़ઓུ
    w'MVYԽ
    wςετΧόϨοδ޲্
    wϚϧνϞδϡʔϧԽ
    ٕज़ઓུʹ͍ͭͯdݱࡏ

    View Slide

  84. ϚϧνϞδϡʔϧԽ
    app
    ٕज़ઓུʹ͍ͭͯdݱࡏ"OESPJEٕज़ઓུϚϧνϞδϡʔϧԽ

    View Slide

  85. feature:contact
    app
    feature:dating feature:setting … …
    ϚϧνϞδϡʔϧԽ
    ٕज़ઓུʹ͍ͭͯdݱࡏ"OESPJEٕज़ઓུϚϧνϞδϡʔϧԽ

    View Slide

  86. ϚϧνϞδϡʔϧԽ
    feature:contact
    app
    feature:dating feature:setting … …
    wࠩ෼Ϗϧυ͕ૣ͘ͳΔ
    winternal modifierʹΑΔείʔϓͷ࠷
    খԽ
    wػೳ։ൃΛΑΓ҆શʹ

    ٕज़ઓུʹ͍ͭͯdݱࡏ"OESPJEٕज़ઓུϚϧνϞδϡʔϧԽ

    View Slide

  87. ϚϧνϞδϡʔϧԽ
    feature:contact
    app
    feature:dating feature:setting … …
    wࠩ෼Ϗϧυ͕ૣ͘ͳΔ
    winternal modifierʹΑΔείʔϓͷ࠷
    খԽ
    wػೳ։ൃΛΑΓ҆શʹ

    ٕज़ઓུʹ͍ͭͯdݱࡏ"OESPJEٕज़ઓུϚϧνϞδϡʔϧԽ

    View Slide

  88. ػೳ։ൃΛΑΓ҆શʹ
    ٕज़ઓུʹ͍ͭͯdݱࡏ"OESPJEٕज़ઓུϚϧνϞδϡʔϧԽ

    View Slide

  89. app
    ٕज़ઓུʹ͍ͭͯdݱࡏ"OESPJEٕज़ઓུϚϧνϞδϡʔϧԽ
    ػೳ։ൃΛΑΓ҆શʹ

    View Slide

  90. app debugging
    debugImplementation
    ٕज़ઓུʹ͍ͭͯdݱࡏ"OESPJEٕज़ઓུϚϧνϞδϡʔϧԽ
    ػೳ։ൃΛΑΓ҆શʹ

    View Slide

  91. app debugging
    feature:future-
    feature
    debugImplementation implementation
    ٕज़ઓུʹ͍ͭͯdݱࡏ"OESPJEٕज़ઓུϚϧνϞδϡʔϧԽ
    ػೳ։ൃΛΑΓ҆શʹ

    View Slide

  92. app
    feature:future-
    feature
    implementation
    ٕज़ઓུʹ͍ͭͯdݱࡏ"OESPJEٕज़ઓུϚϧνϞδϡʔϧԽ
    ػೳ։ൃΛΑΓ҆શʹ

    View Slide

  93. "OESPJEٕज़ઓུ
    w'MVYԽ
    wςελϒϧԽ
    wςετΧόϨοδ޲্
    wϚϧνϞδϡʔϧԽ
    w,PUMJOԽ
    ٕज़ઓུʹ͍ͭͯdݱࡏ

    View Slide

  94. ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Β

    View Slide

  95. ٕज़ઓུશମͷৼΓฦΓ
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Β

    View Slide

  96. wΤϯδχΞશһͰͷ໨ඪ
    wΤϯδχΞ͔Βͷ՝୊ײΛνʔϜશମ΁ڞ༗
    wݩʑվળʹ཰ઌతͳϝϯόʔʹޫΛ͋ͯΔ

    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  97. wࢦඪͱͯ͠௥͏,1*͕ଟ͗ͨ͢
    wߴ͗͢Δ໨ඪΛܝ͍͛ͯͨ
    wਐḿͷՄࢹԽ͕Ͱ͖͍ͯͳ͔ͬͨ

    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  98. wࢦඪͱͯ͠௥͏,1*͕ଟ͗ͨ͢
    wߴ͗͢Δ໨ඪΛܝ͍͛ͯͨ
    wਐḿͷՄࢹԽ͕Ͱ͖͍ͯͳ͔ͬͨ

    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  99. 'ॏཁ,1*ͱ஫ྗϙΠϯτº

    View Slide

  100. 'ॏཁ,1*ͱ஫ྗϙΠϯτº

    View Slide

  101. wࢦඪͱͯ͠௥͏,1*͕ଟ͗ͨ͢
    wߴ͗͢Δ໨ඪΛܝ͍͛ͯͨ
    wਐḿͷՄࢹԽ͕Ͱ͖͍ͯͳ͔ͬͨ

    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  102. wࢦඪͱͯ͠௥͏,1*͕ଟ͗ͨ͢
    wߴ͗͢Δ໨ඪΛܝ͍͛ͯͨ
    wਐḿͷՄࢹԽ͕Ͱ͖͍ͯͳ͔ͬͨ

    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  103. View Slide

  104. w༏ઌ౓ߴλεΫº
    w'MVYԽ཰ΛഒʹɺςετΧόϨοδΛഒʹ
    w͞Βʹ͸ތΕΔ%9վળ΋΍Γ·͠ΐ͏ʂ
    '௨ৗͷࢪࡦͷ࣮૷ʹϓϥεͰɺ

    View Slide

  105. w'$.ରԠͱ͍ͬͨ༏ઌ౓ߴλεΫº
    w'MVYԽ཰ΛഒʹɺςετΧόϨοδΛഒʹ
    w͞Βʹ͸ތΕΔ%9վળ΋΍Γ·͠ΐ͏ʂ
    '௨ৗͷࢪࡦͷ࣮૷ʹϓϥεͰɺ

    View Slide

  106. վળத
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  107. վળத
    w໨తΛ໌֬ʹهड़͓ͯ͘͠
    w਺ΛߜΔ
    wPSͰ͸ͳ͘ɺෳ਺ஈ֊ͷ໨ඪΛ
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  108. View Slide

  109. wߴ͗͢Δ໨ඪΛܝ͍͛ͯͨ
    wࢦඪͱͯ͠௥͏,1*͕ଟ͗ͨ͢
    wਐḿͷՄࢹԽ͕Ͱ͖͍ͯͳ͔ͬͨ

    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  110. wͲΕ͘Β͍ਐΜͰ͍Δͷ͔Θ͔Βͳ͍
    wʮਐḿ͍ͯ͠Δؾ͕͠ͳ͍ʜʯ
    wʮؾ߹ʯυϦϒϯʹͳΓ͕ͪ

    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  111. ٕज़ઓུͷεϐʔυΛՄࢹԽ
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  112. w'MVY
    wςετΧόϨοδ
    w,PUMJO
    wϞδϡʔϧ਺
    ܭଌͱՄࢹԽ
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  113. w'MVY
    wςετΧόϨοδ
    w,PUMJO
    wϞδϡʔϧ਺
    ܭଌͱՄࢹԽ
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  114. 'MVY
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓܭଌͱՄࢹԽ

    View Slide

  115. Action View
    Dispatcher Store
    Action Creator
    wઃܭಠࣗͷཁૉ͕গͳ͍
    wσʔλͷྲྀΕΛ୯Ұํ޲ʹͰ͖Δ
    wςετ͕ॻ͖΍͍͢
    wσόοά͕͠΍͍͢
    w࠶ར༻ੑ͕ߴ͍

    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Β'MVYԽ

    View Slide

  116. w·ͩʮओྲྀʯͳΞʔΩςΫνϟͰ͸ͳ͍ʁ
    w੍໿͕গͳ͍෼ɺͦͷଞͷ࣮૷खஈ͸ݸਓґଘ
    wྫ
    "DUJPO$SFBUPSPS4UPSFͲͪΒʹॲཧ
    Λॻ͘
    wϖΞϓϩɾϞϒϓϩ
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Β'MVYԽ

    View Slide

  117. wʮओྲྀʯͳΞʔΩςΫνϟͰ͸ͳ͍ʁ
    w੍໿͕গͳ͍෼ɺͦͷଞͷ࣮૷खஈ͸ݸ
    ਓґଘ
    wྫ
    "DUJPO$SFBUPSPS4UPSFͲͪΒʹ
    ॲཧΛॻ͘

    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Β'MVYԽ
    wυΩϡϝϯτԽ
    w͓ू·Γձ౳Ͱٞ࿦

    View Slide

  118. wʮओྲྀʯͳΞʔΩςΫνϟͰ͸ͳ͍ʁ
    w੍໿͕গͳ͍෼ɺͦͷଞͷ࣮૷खஈ͸ݸ
    ਓґଘ
    wྫ
    "DUJPO$SFBUPSPS4UPSFͲͪΒʹ
    ॲཧΛॻ͘
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Β'MVYԽ
    wυΩϡϝϯτԽ
    w͓ू·Γձ౳Ͱٞ࿦

    View Slide

  119. View Slide

  120. wʮओྲྀʯͳΞʔΩςΫνϟͰ͸ͳ͍ʁ
    w੍໿͕গͳ͍෼ɺͦͷଞͷ࣮૷खஈ͸ݸ
    ਓґଘ
    wྫ
    "DUJPO$SFBUPSPS4UPSFͲͪΒʹ
    ॲཧΛॻ͘
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Β'MVYԽ
    wυΩϡϝϯτԽ
    w͓ू·Γձ౳Ͱٞ࿦

    View Slide

  121. wʮओྲྀʯͳΞʔΩςΫνϟͰ͸ͳ͍ʁ
    w੍໿͕গͳ͍෼ɺͦͷଞͷ࣮૷खஈ͸ݸ
    ਓґଘ
    wྫ
    "DUJPO$SFBUPSPS4UPSFͲͪΒʹ
    ॲཧΛॻ͘
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Β'MVYԽ
    wυΩϡϝϯτԽ
    w͓ू·Γձ౳Ͱٞ࿦

    View Slide

  122. View Slide

  123. View Slide

  124. View Slide

  125. w'MVY
    wςετΧόϨοδ
    w,PUMJO
    wϞδϡʔϧ਺
    ܭଌͱՄࢹԽ
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  126. w'MVY
    wςετΧόϨοδ
    w,PUMJO
    wϞδϡʔϧ਺
    ܭଌͱՄࢹԽ
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  127. 5FTU$PWFSBHF

    View Slide

  128. w'MVY
    wςετΧόϨοδ
    w,PUMJO
    wϞδϡʔϧ਺
    ܭଌͱՄࢹԽ
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  129. w'MVY
    wςετΧόϨοδ
    w,PUMJO
    wϞδϡʔϧ਺
    ܭଌͱՄࢹԽ
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  130. ,PUMJO

    View Slide

  131. w'MVY
    wςετΧόϨοδ
    w,PUMJO
    wϞδϡʔϧ਺
    ܭଌͱՄࢹԽ
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  132. w'MVY
    wςετΧόϨοδ
    w,PUMJO
    wϞδϡʔϧ਺
    ܭଌͱՄࢹԽ
    ٕज़ઓུͷৼΓฦΓͱ͜Ε͔Βٕज़ઓུશମͷৼΓฦΓ

    View Slide

  133. .PEVMFT

    View Slide

  134. lͱΓ͋͑ͣϨΠϠʔΛ੾ͬͯΈΔz

    View Slide

  135. View Slide

  136. app

    View Slide

  137. tapple-resource
    app
    tapple-data tapple-base

    View Slide

  138. tapple-resource
    app
    tapple-data
    feature:??
    tapple-base

    View Slide

  139. wʮͱΓ͋͑ͣͭϞδϡʔϧԽͯ͠ΈΔʂʯ
    wGFBUVSFϞδϡʔϧΛ࡞ΔͨΊʹղܾ͢΂͖ґଘ
    ؔ܎ͳͲʹ໨͕͍ͬͯͳ͔ͬͨ

    View Slide

  140. wʮͱΓ͋͑ͣͭϞδϡʔϧԽͯ͠ΈΔʂʯ
    wGFBUVSFϞδϡʔϧΛ࡞ΔͨΊʹղܾ͢΂͖ґଘ
    ؔ܎ͳͲʹ໨͕͍ͬͯͳ͔ͬͨ

    ʮ͜ͷػೳΛGFBUVSFʹ

    ੾Γग़͢ʹ͸Ͳ͏ͨ͠ΒΑ͍͔ʁʯ

    View Slide

  141. View Slide

  142. wʮͱΓ͋͑ͣͭϞδϡʔϧԽͯ͠ΈΔʂʯ
    w·ͣϨΠϠʔ͝ͱʹ੾ͬͯͦͷ͋ͱͲͷGFBUVSF
    Λ੾Δ͔ผ్ߟ͑Α͏ͱ͍ͯͨ͠

    ʮ͜ͷػೳΛGFBUVSFʹ

    ੾Γग़͢ʹ͸Ͳ͏ͨ͠ΒΑ͍͔ʁʯ
    ΍Δ͜ͱ͸ҰॹͰ΋ɺ

    ϚΠϧετʔϯ͕ܾ·Δͱਐḿ͠΍͍͢

    View Slide

  143. ͱ͸͍͑ɺࢪࡦ࣮૷ͷεϐʔ
    υΛམͱͣ͞ʹ಺෦վળΛ
    ͠ଓ͚ͯ΋ɺ؇΍͔ͳ੒௕
    ͔Β͸ൈ͚ग़ͤͳ͍ʢ͔΋ʣ

    View Slide

  144. ٕज़ઓུΛਪਐ͢Δ࢓૊Έ࡞Γ

    View Slide

  145. View Slide

  146. View Slide

  147. w'MVYԽ
    wϞδϡʔϧԽͷͨΊͷ݁߹ղফ
    w৽Ϟδϡʔϧ࡞੒ɺͳͲͳͲ
    wීஈɺ΍Γ͍ͨͱࢥ͍ͬͯͨ͜ͱ΋΋ͪΖΜ0,
    w FH4XBHHFS"1*%PDɺ1BHFS%VUZಋೖɺͳͲ

    View Slide

  148. wΈΜͳͰ΍Δ͜ͱͰ͍͖ͬʹ͢͢Μͩ
    wٕज़ઓུͷਪਐʹΑΔվળͰࢪࡦ͕ૣ͘ਐΜͩͱ͍
    ͏࿩΋

    View Slide

  149. ͱ͸͍͑ɺʮ಺෦վળʯͩ
    ͚ʹनΘΕ͍ͯͯ΋࢓ํ͕ͳ
    ͍

    View Slide

  150. ΤϯδχΞ͔Βࣗൃతʹ
    ϢʔβʔϝϦοτΛߟ͑ɺ
    ࣮૷͢Δػձ

    View Slide

  151. View Slide

  152. ࣗ෼ͨͪͰɺϢʔβʔͷͨΊʹ
    ͳΔ΋ͷΛߟ͑ͯ࡞Δʂ

    View Slide

  153. ·ͱΊ
    ͜Ε͔Β

    View Slide

  154. wཧ૝ͱݱ࣮ͷΪϟοϓͷೝࣝΛ߹ΘͤΔ
    w΍Γ͸͡ΊͨΒܭଌΛ͢Δ
    wখ͘͞͸͡ΊΔɻ੎͍ʹ೚ͤͳ͍
    wখ͞ͳ੒ޭ͔ΒɺνʔϜͰتͿ
    ·ͱΊ͜Ε͔Β

    View Slide

  155. wࢼߦࡨޡʹऴΘΓ͸ͳ͍
    wΑΓྑ͍ܧଓతͳ಺෦վળ΍ٕज़౤ࢿͷ࢓૊Έ
    w"OESPJEͷ࿮Λ௒͑ͨઓུ

    ɹFH#''
    ·ͱΊ͜Ε͔Β

    View Slide

  156. View Slide

  157. ΞϓϦΛ͞Βʹ੒௕

    ͤ͞ΔͨΊͷٕज़ઓུ
    Shohei Kawano
    @shaunkawano

    View Slide