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

ABEMA モバイルアプリにおけるリアーキテクチャの取り組みと展望 / Mobile App Rearchitecture in ABEMA

ABEMA モバイルアプリにおけるリアーキテクチャの取り組みと展望 / Mobile App Rearchitecture in ABEMA

CA BASE NEXT 2021/05/28
https://ca-base-next.cyberagent.co.jp/sessions/abema-mobile-rearchitecture/

ABEMAでは、2019年からAndroidチームとiOSチームの隔たりが無くなり、Nativeチームとして再編されました。それを背景に、AndroidアプリとiOSアプリの設計も共通化することを目指して、またそれぞれのプラットフォームで負債化した実装の改善を目指して、両プラットフォーム横断でのリアーキテクチャが始まりました。技術的な課題の解決を目的として始まったリアーキテクチャですが、Kotlin Multiplatformの導入など新たな技術的挑戦に繋がっただけでなく、仕様から設計・実装を導くICONIXプロセスを取り入れる試みや、ABEMAにおける"ユビキタス言語"の確立を目指す用語集プロジェクトなど、エンジニア以外の職種をも巻き込んだ様々な取り組みへと広がっていきました。このLTでは、リアーキテクチャに至るまでの経緯、現在進行中の取り組み、そして将来的な展望までをご紹介します。

2f2c7576c7b5d763ad12f342b9afc3a1?s=128

Akio Yasui

May 27, 2021
Tweet

Transcript

  1. None
  2. 2019೥౓৽ଔೖࣾ iOSΤϯδχΞ גࣜձࣾAbemaTV NativeνʔϜ ҆Ҫ ӯஉ Akio Yasui @akkyie

  3. ໨࣍ Contents ໨࣍ Contents ໨࣍ Contents ໨࣍ Contents ໨࣍ Contents

    1. ϦΞʔΩςΫνϟʹࢸΔഎܠ 2. ࢓༷ʹج͍࣮ͮͯ૷͢Δ
 3. ͜Ε͔ΒͷऔΓ૊Έ 4. ·ͱΊ
  4. 1. ϦΞʔΩςΫνϟʹࢸΔഎܠ

  5. • 2019೥10݄ AndroidνʔϜͱiOSνʔϜ͕౷߹͞ΕɺNativeνʔϜʹ • ΤϯδχΞ͕ঢ়گɾر๬ʹԠͯ͡ϓϥοτϑΥʔϜؒΛߦ͖དྷ͠΍͘͢͢Δ • ڞ௨͢Δ࢓༷΋ଟ͍ͷͰɺPM΍ଞνʔϜʢαʔόʔαΠυ΍෼ੳɾQAνʔϜͳͲʣͱͷ
 ίϛϡχέʔγϣϯΛޮ཰Խ͢Δ Android/iOSνʔϜͷ౷߹ Native

    iOS Android Web Consume r Electronics
  6. ͳͥϦΞʔΩςΫνϟ͕ඞཁͳͷ͔ • ࢓༷ͷڞ௨ԽΛ໨ࢦ্͢ͰɺAndroid/iOSͷઃܭࠩҟ͕՝୊ͱͯ͠ද໘Խ • ࢓༷Λຬͨͨ͢ΊͷϩδοΫ͕ɺ֤ϓϥοτϑΥʔϜݻ༗
 ͷϩδοΫ͔Β໌֬ʹ෼཭͞Ε͍ͯͳ͍
 → ίʔυΛ௥Θͳ͍ͱݱঢ়ͷਖ਼֬ͳ࢓༷͸೺ѲͰ͖ͳ͍
 • ڞ௨ͯ͠Flux͸࠾༻͍͕ͯͨ͠ɺ֤ίϯϙʔωϯτͷ


    ੹຿΍୯Ґ͕Ұக͍ͯ͠ͳ͍
 → ಉ͡࢓༷Ͱ΋ඞͣ͠΋ಉ͡Α͏ʹ࣮૷Ͱ͖ΔͱݶΒͳ͍
 → ࣮૷ͷதͰڞ௨Խ͢΂͖࢓༷ʹϏδωεϩδοΫΛ໌֬Խ͢Δඞཁ ؔ࿈εϥΠυʰAbema iOS Architectureʱ
 https://speakerdeck.com/to4iki/abema-ios-architecture Footnote
  7. • ࢓༷ʹରԠ͢Δ࣮૷ͱͦΕҎ֎ͷ෦෼Λ໌֬ʹ෼཭͍ͨ͠
 → Clean ArchitectureͳͲΛϕʔεʹͨ͠ΞʔΩςΫνϟ • AndroidɾiOSΤϯδχΞ2໊͕ͣͭϦΞʔΩςΫνϟʹܞΘΓɺઃܭͷࠎࢠΛ࡞੒ • NativeνʔϜશମʹڞ༗͠ɺεϓϨουγʔτͰٙ໰΍ҙݟΛΧδϡΞϧʹืΔ ϦΞʔΩςΫνϟͷ։࢝

    Clean Architecture ୡਓʹֶͿιϑτ΢ΣΞͷߏ଄ͱઃܭ. Robert C. Martin(ஶ), ֯੐య, ∁໦ਖ਼߂(༁). ΞεΩʔυϫϯΰ. ҙݟΛืͬͨεϓϨουγʔτ
  8. • ࠷௿ݶकΔ΂͖ΞʔΩςΫνϟΛϨΠϠʔͱͦͷґଘؔ܎ͱͯ͠ఆٛ • ͦΕͧΕͷϨΠϠʔͷதͰ͞Βʹ1~3ݸఔ౓ͷϞδϡʔϧΛ࡞੒ • ͦΕͧΕͷݴޠͰϞδϡʔϧʢύοέʔδ΍ϑϨʔϜϫʔΫʣ͕࣋ͭػೳɾಛ௃͕ҟͳΔͨΊ ࢓༷Λ໌֬ʹ͢ΔΞʔΩςΫνϟ ؔ࿈εϥΠυʰABEMAͷϦΞʔΩςΫνϟʱ(iOSʹ͓͚Δ۩ମྫ)
 https://speakerdeck.com/kokihirokawa/abemafalseriakitekutiya Repositor

    y (Interface) UseCase UI ABEMAͷ αʔϏεͱͯ͠ͷ஌ࣝ (“υϝΠϯϞσϧ”) ΞϓϦͷػೳ࢓༷ PFݻ༗ͷ࣮૷΍ σʔλ؅ཧͷͨΊͷ࣮૷ Repository ϦΞʔΩςΫνϟޙͷϨΠϠʔߏ੒ Domain
  9. • ڞ௨ͷ࢓༷ΛͲ͜ʹ࣮૷͢Δ͔͸ܾ·͕ͬͨɺͦ΋ͦ΋ʮڞ௨ͷ࢓༷ʯͱ͸ʁ • ΞϓϦ͸ଟ͘ͷػೳͱෳࡶͳ࢓༷Λ͍࣋ͬͯΔ • UIɺAPIɺಈը࠶ੜɺϩάૹ৴ɺABςετɺ…
 • ֤ػೳΛఆٛ͢Δ࢓༷ͷ͏ͪɺ
 Կ͕ڞ௨ͷ࢓༷ͰԿ͕ͦ͏Ͱͳ͍ͷ͔ •

    ࠓ·Ͱ͸ػೳ͝ͱʹ୲౰͢ΔΤϯδχΞͱPM͕
 ܦݧతʹ෼ྨ͍ͯͨ͠ • ݁ہͷͱ͜ΖԿ͕ “υϝΠϯ” ΍ “Ϣʔεέʔε”ʹ
 ͋ͨΔͷ͔ʁ
 ࢓༷Λ໌֬ʹ͢ΔΞʔΩςΫνϟ Repositor y (Interface) UseCase UI ABEMAͷ αʔϏεͱͯ͠ͷ஌ࣝ (“υϝΠϯϞσϧ”) ΞϓϦͷػೳ࢓༷ PFݻ༗ͷ࣮૷΍ σʔλ؅ཧͷͨΊͷ࣮૷ Repository ϦΞʔΩςΫνϟޙͷϨΠϠʔߏ੒ Domain
  10. 2. ࢓༷ʹج͍࣮ͮͯ૷͢Δ

  11. • ۀ຿ͷ஌ࣝΛίʔυͯ͠දݱ͠ɺઃܭͷࠜװͱ͢Δ → υϝΠϯۦಈઃܭʢDDDʣΛࢀߟʹͨ͠υϝΠϯϞσϦϯάΛߦ͏
 • ΞϓϦʹٻΊΒΕΔػೳʹػೳཁٻ͔Β࢓༷Λఆٛ͠ɺ
 ਫ਼ࠪ͠ͳ͕Βઃܭɾ࣮૷ʹམͱ͠ࠐΉ → ICONIXϓϩηεʢϢʔεέʔεۦಈ։ൃʣΛऔΓೖΕͯ
 ͜Ε·Ͱ΋ܦݧతʹߦΘΕ͍ͯͨϓϩηεΛ࠶ݱՄೳʹ͢Δ

    ࢓༷ʹج͍࣮ͮͨ૷ͷͨΊͷऔΓ૊Έ ΤϦοΫɾΤϰΝϯεͷυϝΠϯۦಈઃܭ. Eric Evans(ஶ), ࠓؔ߶(؂༁), ࿨ஐӈܡ, ຀໺༞ࢠ(༁). ᠳӭࣾ . ࣮ફυϝΠϯۦಈઃܭ ΤϦοΫɾΤϰΝϯεཱ͕֬ͨ͠ཧ࿦Λ࣮ࡍͷઃܭʹԠ༻͢Δ. Vaughn Vernon(ஶ), ߴ໦ਖ਼߂(༁). ᠳӭࣾ . Ϣʔεέʔεۦಈ։ൃ࣮ફΨΠυ ΦϒδΣΫτࢦ޲෼ੳ͔ΒSpringʹΑΔ࣮૷·Ͱ. Doug Rosenberg, Matt Stephens(ஶ), ࡾՏ ३Ұ(؂༁), ࠤ౻ ཽҰ, ધ໦ ݈ࣇ(༁). ᠳӭࣾ.
  12. • ʮABEMA༻ޠूʯΛ࡞੒͢ΔϓϩδΣΫτΛ։࢝ • “ϢϏΩλεݴޠ” ͷߏஙΛ໨ࢦ͢
 ׳༻తʹݺ͹Ε͍ͯΔػೳͷ໊લ΍ɺͦ͜ʹؚ·ΕΔ֓೦Λٞ࿦͠ͳ͕Β౷Ұ͍ͯ͘͠ • ຖिఆظతʹɺ༗ࢤͷPMɾσβΠφʔɾΤϯδχΞ͕ࢀՃ͢ΔऔΓ૊Έͱͯ͠։࠵த • ༻ޠू͸ABEMAͷσβΠϯγεςϜʮconteʯͷҰ෦ʹνʔϜͷࢿ࢈ͱͯ͠ҭ͍ͯͯ͘

    υϝΠϯϞσϦϯά 
 ※ ະϦϦʔεͷػೳʹؔ͢Δ৘ใؚ͕·ΕΔͨΊɺܾఆͨ͠༻ޠͷ෦෼͸෬ࣈʹ͍ͯ͠·͢ ؔ࿈εϥΠυʰconte - ABEMA's Design Systemʱ https://www.slideshare.net/ygoto3q/conte-abemas-design-system
  13. • ʰϢʔεέʔεۦಈ։ൃ࣮ફΨΠυʱͰઆ໌͞Ε͍ͯΔϓϩηε • ࣄۀతʹΞϓϦʹٻΊΒΕΔػೳʹػೳཁٻ͔Βɺγʔέϯε΍
 Ϋϥεͷఆٛͱ͍ͬͨৄࡉͳઃܭ·Ͱஈ֊తʹམͱ͠ࠐΜͰ͍͘
 • ৽نػೳͷҰͭΛର৅ʹɺNativeνʔϜͷΤϯδχΞͰࢼݧతʹ࣮ફத • ϓϩηεΛҰपͨ࣌͠఺ͰKPTܗࣜͰৼΓฦΓ΋࣮ࢪ ICONIXϓϩηε

    ※ ICONIXϓϩηε͸NativeνʔϜҎ֎ͷνʔϜʢCEνʔϜʣͰ΋ಉ࣌ฒߦతʹݕূத ػೳཁٻ υϝΠϯϞσϦϯά Ϣʔεέʔε
 ϞσϦϯά ϩόετωε෼ੳ ৄࡉઃܭ (ςετέʔε)
  14. 3. ͜Ε͔ΒͷऔΓ૊Έ

  15. • ϦΞʔΩςΫνϟʹΑΓɺ࣮૷Λڞ௨ԽͰ͖Δ෦෼΋໌֬ʹͳͬͨ • υϝΠϯʹαʔϏεͷ஌ࣝͳͷͰɺཧ૝తʹ͸શͯͷϓϥοτϑΥʔϜͰڞ௨ͳ͸ͣ • ϢʔεέʔεʹΞϓϦͷػೳͳͷͰɺϢʔβʔͷγφϦΦ΍ετʔϦʔ͕ڞ௨͍ͯ͠Ε͹
 ͍ۙ΋ͷʹͳΔ͸ͣ
 → Kotlin Multiplatformͷಋೖ΁

    • ͨͩ͠υϝΠϯɾϢʔεέʔε͸ٞ࿦தͷ෦෼΋
 ଟ͍ͨΊɺҰ୴APIΫϥΠΞϯτ͔Βࢼݧతಋೖ • ଞϓϥοτϑΥʔϜʢWebɺCEʣͰ΋ݕূத ࣮૷ͷڞ௨Խ ؔ࿈εϥΠυʰABEMAͷKotlin Multiplatformʱ
 https://speakerdeck.com/takahirom/abemafalsekotlin-multiplatform Android iOS Web TV ドメイン 共通 ユースケース
  16. • ίϯϙʔωϯτ͝ͱͷ੹຿Λ໌֬Խ͢Δ͜ͱͰɺ
 ςετͰ୲อͰ͖Δൣғ΋໌Β͔ʹͳͬͨ • ΞϓϦͷ඼࣭Λ୲อ͢ΔͨΊʹ͸༷ʑͳཻ౓Ͱͷςετ͕ඞཁ • Ϣχοτςετɺ݁߹ςετɺड͚ೖΕςετɺ…
 → NativeνʔϜͱͯ͠ͷςετϙϦγʔΛ࡞੒ •

    Ϣχοτςετͷ໾ׂ΍QAΤϯδχΞʹΑΔखಈςετͱͷ੗Έ෼͚ͱ͍ͬͨ
 νʔϜ͝ͱɾΤϯδχΞ͝ͱͷܦݧଇΛ໌จԽ • ςετͷ֊૚͝ͱʹϙϦγʔΛ࡞͍ͬͯ͘ • ·ͣ͸શମͷςετϙϦγʔͱɺϢχοτςετϙϦγʔΛ࡞੒ → ݁߹ςετ΍ࣗಈԽ͞ΕͨE2EςετͳͲͷಋೖ΁ ςετϙϦγʔ
  17. • ΞϓϦʹυϝΠϯϞσϧ͸ඞཁͳͷ͔/ଘࡏ͢Δͷ͔ • جຊతͳσʔλͷྲྀΕ͸ʮAPIϨεϙϯεˠυϝΠϯϞσϧˠදࣔσʔλʯͱͳΔ • APIϨεϙϯεΛදࣔ͢Δ͚ͩͷΑ͏ͳը໘΋ଟ͍ • APIϨεϙϯεʹؚ·ΕΔ৘ใ͕ɺରԠ͢ΔϞσϧͷ৘ใશͯΛؚΉͱ͸ݶΒͳ͍
 • ΫϥΠΞϯτͱαʔόʔͰͦΕͧΕυϝΠϯϞσϧΛ͍࣋ͬͯΔͷ͔ɺ


    ΫϥΠΞϯτ͸ʮϓϨθϯςʔγϣϯ૚ʯʹ͗͢ͳ͍ͷ͔ • ͲͪΒ͔͕ద੾Ͱ͋Δͱ͍͏ΑΓ͸ɺ͓ޓ͍ͷมԽͷεϐʔυ΍ɺͦΕͧΕͷνʔϜͷ
 Ϧιʔεɾؔ܎ੑΛ౿·͑ͨαʔϏεશମͱͯ͠ͷઃܭ͕ඞཁͳͷͰ͸ͳ͍͔ • Ҿ͖ଓ͖ٞ࿦த… ΞϓϦͷυϝΠϯϞσϧ
  18. 4. ·ͱΊ

  19. • νʔϜͰٞ࿦͠ͳ͕ΒΞϓϦͷϦΞʔΩςΫνϟΛਐΊ͍ͯΔ • ٕज़తͳ՝୊ղܾͷͨΊͷϦΞʔΩςΫνϟ͕ɺ
 ૊৫શମΛר͖ࠐΜͩऔΓ૊Έ΁ͱͭͳ͕ͬͨ • ༻ޠूɺICONIXϓϩηεݕূɺKMMಋೖɺςετϙϦγʔɺ… ·ͱΊ ϦΞʔΩςΫνϟ KMMಋೖ

    ༻ޠू υϝΠϯϞσϧͷඞཁੑ ڞ௨෦෼ͷ໌֬Խ ςετϙϦγʔ ICONIXϓϩηε ࢓༷ʹج͍ͮͨઃܭ ςετͷ֊૚Խ
  20. • νʔϜͰٞ࿦͠ͳ͕ΒΞϓϦͷϦΞʔΩςΫνϟΛਐΊ͍ͯΔ • ٕज़తͳ՝୊ղܾͷͨΊͷϦΞʔΩςΫνϟ͕ɺ
 ૊৫શମΛר͖ࠐΜͩऔΓ૊Έ΁ͱͭͳ͕ͬͨ • ༻ޠूɺICONIXϓϩηεݕূɺKMMಋೖɺςετϙϦγʔɺ…
 • ϦΞʔΩςΫνϟΛ௨ͯ͡ɺཧ૝తͳΞϓϦͷ
 ઃܭɾ࣮૷͸ٕज़͔Β

    “͚ͩ” Ͱ͸ಋ͔Εͳ͍ͱؾ͍ͮͨ • “ͲΜͳαʔϏεΛͲΜͳνʔϜͰͲΜͳϓϩηεͰ࣮૷͍ͯ͘͠ͷ͔”
 ʹ΋޲͖߹͏ඞཁ͕͋Δ
 • औΓ૊Έ͸Ҿ͖ଓ͖ൃ৴͍͖ͯ͠·͢ 💪 ·ͱΊ ΞϓϦ ઃܭɾ࣮૷ αʔϏε νʔϜ ٕज़
  21. None