Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
モバイルアプリ開発の "標準"を探る #CookpadTechConf
Search
FUJI Goro
January 23, 2016
Technology
21k
12
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
モバイルアプリ開発の "標準"を探る #CookpadTechConf
FUJI Goro
January 23, 2016
More Decks by FUJI Goro
See All by FUJI Goro
ステートレスなLLMでステートフルなAI agentを作る - YAPC::Fukuoka 2025
gfx
7
2.1k
How to Boost Your Code with WebAssembly
gfx
2
3.2k
AssemblyScriptでライブラリコードの高速化をしてみる
gfx
5
3.4k
実践TypeScriptトークバトル
gfx
1
1.3k
歴史的経緯の説明 as code
gfx
7
2.9k
Elasticsearchによる 全文検索の実装 in Rails
gfx
6
9.9k
すばらしきGraphQLのSEKAIへようこそ
gfx
20
10k
マルチテナント・ウェブアプリケーションの実践
gfx
14
9.9k
How to choose the ORM on Android
gfx
1
4.5k
Other Decks in Technology
See All in Technology
正解のない研修に放り出されて / Being thrown into a training program with no right answers
ohnoeight
1
160
2026-10-24 JAWS JAWS-UG 茨城 #18 IAM Policy Autopilotってなにさ。terraform planからIAM Policyつくれるの? / What's IAM Policy Autopilot
masasuzu
0
180
CTO Night & Day Morning Session_AI-DLC:生成 AI 時代の開発プロセス変革
pikosan0000
0
110
推論基盤と Scale-Up Interconnect の現状と制約から俯瞰する技術動向
markunet
2
470
AIエージェントに 権限と鍵をどこまで渡すか
nrinetcom
PRO
2
120
AIコーディングを実践してきた1年を振り返る / Looking Back on a Year of Practicing AI Coding
takedatakashi
1
150
なぜAI時代に技術記事を書くのか?どう書くのか? 〜bunの場合〜
kworkdev
PRO
0
150
Claude Codeから見る、エンジニアの世界の変容とその先
oikon48
7
4.6k
Vue.jsのGitHubから学ぶ意思決定
yut0naga1_fa
1
320
dbt Semantic Layerで進めるenechainのデータ民主化
akizhou
1
280
Snowflake でできることが増えたら、 ABAC が必要になった
kaeton
0
110
ドメインエキスパートは いかにして AI を使って プロダクト開発をするか
tatsuyashiraishi
1
220
Featured
See All Featured
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
650
Abbi's Birthday
coloredviolet
4
10k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
320
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
GraphQLとの向き合い方2022年版
quramy
50
15k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
Test your architecture with Archunit
thirion
2
2.5k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
22k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
860
Transcript
ϞόΠϧΞϓϦ։ൃͷ ඪ४Λ୳Δ $PPLQBE5FDI$POG SE+BO '6+*(PSPHPSPGVKJ!DPPLQBEDPN
͡Ίʹ • ໊લ • FUJI Goro (GitHub: gfx, Twitter: @__gfx__)
• ෦ॺ • ٕज़෦ ϞόΠϧ։ൃج൫ • ۙگ • Ϛάωοτגࣜձࣾʹग़தʢ20159݄~ʣ
͜ͷτʔΫͷഎܠ • 20161݄ݱࡏɺΫοΫύουεϚϗλϒϨοτͳ ͲɺϞόΠϧͰͷΞΫηε͕աΛ͍͑ͯΔ • ͦΕΏ͑ʹϞόΠϧΞϓϦ։ൃͷن͕େ͖͘ͳͬͨ • ୯ҰͷAndroidΞϓϦɺiOSΞϓϦʹͷΈؔΘΔΤϯδ χΞ૬ରతʹগͳ͘ͳͬͨ •
ҰํͰʮΫοΫύουʯαʔϏεͷण໋͕҆͘ఆ ͯ͠։ൃɾӡ༻Ͱ͖Δ͜ͱ͕ٻΊΒΕΔ
ϞόΠϧ͔ΒͷΞΫηεͷ༁ • PC vs εϚϗ • ΞΧϯτ࣋ͪϢʔβʮεϚϗͷΈʯ͕8ׂ • ήετϢʔβͷ͏ͪʮεϚϗʯ7ׂ •
ΞϓϦ vs Σϒ • ΞΧϯτ࣋ͪϢʔβʮΞϓϦͷΈʯ͕6ׂ • ήετϢʔβͷ͏ͪʮΞϓϦʯ1ׂ
։ൃʹ͓͚Δʮඪ४ʯͱʁ • ʮඪ४తͳ։ൃʯΛʮޮՌͱίετͷόϥϯε͕Α ͘ೲಘײͷ͋Δ։ൃʯͱߟ͑Δ • ͭ·Γʮඪ४తͰͳ͍։ൃʯͱʮௐͯΘ͔Β ͳ͍ൿͷλϨ͕ଟ͘ɺཧෆਚʹײ͡Δ։ൃʯͱͳ Δ • ʮރΕٕͨज़ʯͷ͜ͱͱݶΒͳ͍ɻڥͷมԽʹ
͍͍ͭͯ͘͜ͱେࣄɻ
ΫοΫύουͷߟ͑Δ ඪ४తͳϞόΠϧΞϓϦ։ൃ w ৽ٕज़ͷಋೖ w $* 5FTU 2" w '54
৽ٕज़ͷಋೖ
͜͜Ͱ͍͏ʮ৽ٕज़ʯͱ • ϓϩάϥϛϯάݴޠʢe.g. Swiftʣ • ϑϨʔϜϫʔΫϥΠϒϥϦʢe.g. RxJavaʣ • ϓϩτίϧʢe.g. HTTP/2ʣ
• σʔλϑΥʔϚοτʢe.g. WebPʣ • ΞʔΩςΫνϟʢe.g. MVVM, Clean Architectureʣ • ͦͷଞιϑτΣΞɾαʔϏε
৽ٕज़Λಋೖ͢Δͱ͍͏͜ͱ • جຊతʹੵۃతʹ࠾༻͢Δํ • ͦΕ͕Ͳ͏͍͏Λղܾ͢Δͷ͔Λ͖ͪΜͱ໌Β ͔ʹ͢Δ͜ͱ • ʮ͏ਓಋೖऀ͚ͩʯආ͚Δ͖ࣄଶ • ৽ٕज़ಋೖͷࡍࣾษڧձϒϩάͳͲͰੵۃ
తʹܒ׆ಈΛߦͳ͍ͬͯΔ • cf. Android։ൃͰRxJavaΛνʔϜʹಋೖͨ͠
ಋೖࡁΈɾݕ౼தͷٕज़ • ಋೖࡁΈ • WebP, Shared Web Credentials, Smart Lock
for Passwords, Retrolambda, Dokumi, Pull-Request Builder • ݕ౼த • Swift, Kotlin, fastlane, Issue Tracking System, CI as a Service (Travis, CircleCI)
ྫ4XJGU • 201512݄ʹOSSԽ͞ΕͨiOS༻ͷϓϩάϥϛϯάݴޠ • ৽نͰSwiftΛͬͨΞϓϦ͋Γ • طଘͷObjective-CΛॻ͖͑ΔͷҰྫ͚ͩ͋Γ • Global Cookpad
iOS app • SwiftͷӨڹͰ࣮͞ΕͨObjective-Cͷ৽ػೳੵۃతʹ ͍ͬͯ͘ํʢͨͱ͑δΣωϦΫεʣ • AppleʹΑΓະདྷ͕ଋ͞Ε͍ͯΔ
ྫ,PUMJO • JetBrainsࣾͷ։ൃ͢ΔJVM༻ͷϓϩάϥϛϯάݴޠ • Android༻ͷϓϩάϥϛϯάݴޠͱͯ͠͞Ε͍ͯΔ • ߏจ (Java + Swift)
/ 2 ͱ͍ͬͨͱ͜Ζ • ݴޠ༷͔ͳΓΑ͘IDEͷαϙʔτे • ϥΠϯλΠϜͷϑοτϓϦϯτ1MBఔͱখ͞Ί • Javaͷࢿ࢈Λͦͷ··͑ͯίʔυྔJavaΑΓগͳ͍ • ͨͩ͜ΕʹΑͬͯʮԿΛղܾ͢Δͷ͔ʯ͖ͬΓͱ͠ͳ͍
$* 5FTU 2"
ϞόΠϧΞϓϦͷಛʢʣ • Ϣʔβʔ͕͏όʔδϣϯΛ੍ޚͰ͖ͳ͍ • Ϣʔβʔ͕ΞϓϦͷΞοϓσʔτΛ͢ΔͱݶΒͳ͍͠ɺ ࣮ࡍΞοϓσʔτΛ͠ͳ͍Ϣʔβ͍Δ • ʮΞοϓσʔτͷڧ੍ʯ͠ͳ͍ํͰ͖͍ͯΔ • Android৽͍͠ύʔϛογϣϯΛՃ͢ΔͱݦஶʹΞοϓ
σʔτ͕͕͞Δ • ύʔϛογϣϯΛՃ͢ΔͱࣗಈΞοϓσʔτ͕ޮ͔ͳ ͘ͳΔͨΊɻAndroid 6.0Ͱվળ͞Ε͕ͨະීٴ
ϞόΠϧΞϓϦͷಛʢʣ • ࣮ߦڥΛ੍ޚ͢Δ͜ͱͰ͖ͳ͍ • ͷεϖοΫ / OSͷόʔδϣϯ / ௨৴ڥ· ͪ·ͪ
• ΣϒΞϓϦΑΓࣦഊ͕ॏ͘ςετ͍͠ • ςετίʔυΣϒΞϓϦΑΓॻ͘ͷ͕͍͠ • ίʔυϨϏϡʔɾCIɾQAͳͲͷ࣭ཧ͕ॏཁ
$*+FOLJOT NVMUJTMBWFT • AndroidLinux/EC2 • iOSMac࣮ػ • Travis CI, Circle
CIͳͲݕ౼͕ͨ͠ະಋೖ • ίετʹରͯͦ͜͠·Ͱར͕ͳ͍ͱ͍͏அ • ڥΛ੍ޚ͍͢͠ͱ͍͏རΛͱ͍ͬͯΔ
"OESPJE$*Ϛγϯ ςετσόΠεͷมભ 1. EC2 + emulator 2. Macbook ProʢiOS CIͱಉ͡Ϛγϯʣ
+ ࣮ػ 3. ϋΠεϖοΫLinuxϚγϯ + ࣮ػ • εέʔϧΞοϓͰͦͦ͜͜շద 4. EC2 + emulator • ؆୯ʹεέʔϧΞτͰ͖ΔΑ͏ʹͨ͠ • ϨΠςϯγΑΓεϧʔϓοτΛͱͬͨ݁Ռ
1VMM3FRVFTU#VJMEFS • JenkinsͷpluginͰɺPR͝ͱʹCIΛىಈ͢Δ • master branchʹcommit / push͢Δͷېࢭ • Ϗϧυʴςετ͕ύε͠ɺϨϏϡʔΛ௨ͬͨΒϚʔδՄ
1VMM3FRVFTU#VJMEFS͕ߦ͏͜ͱ • Pull-Request Builder (+Dokumi) • ςετΛ࣮ߦͯ͠PRʹࣦഊϝοηʔδΛϙετ • ੩తղੳΛ࣮ߦͯ͠PRͷ֘ՕॴʹϝοηʔδΛϙετ •
ػցʹίʔυϨϏϡʔͤͯ͞ਓͷෛ୲ΛݮΒ͢ • ΞϓϦύοέʔδΛϏϧυʢapk, ipaʣ • ΞϓϦύοέʔδΛDeployGateʹΞοϓϩʔυ • ΤϯδχΞҎ֎Ͱ։ൃதͷ৽ػೳΛࢼ͘͢͠
6OJU5FTU2" • ςετΤϯδχΞ2ਓମ੍ • 2ਓڞίʔυΛॻ͚Δ • ςετίʔυϓϥοτϑΥʔϜ͝ͱͷඪ४ςετϑϨʔ ϜϫʔΫʢAndroid JUnit4, XCTestʣ
• ։ൃऀॻ͘͠ɺςετΤϯδχΞॻ͘ • AppiumπʔϧʹΑΔࣗಈԽ͞Εͨςετɺख࡞ ۀʹΑΔςετ࣮ࢪ
'BJMVSF5FBDIFT4VDDFTT
'BJMVSF5FBDIFT4VDDFTT • োϨϙʔτͷϑΥʔϚοτɿ • ʹ͍ͭͯνʔϜͰ͠߹͏͜ͱ • ͳͥͦͷΛൃੜͤͯͨ͞ͷ͔Λهࡌ͢Δ͜ͱ • ࠶ൃࢭࡦͱͦͷ࣮ࢪΛهࡌ͢Δ͜ͱ •
ʮؾΛ͚Δʯʮҙ͢Δʯͱ͍ͬͨओ؍తͳ ࢭࡦೝΊͳ͍
'54ࢥߟͷϑϨʔϜϫʔΫ • ͕͋Εࠜຊతʹղܾ͖͢ͱ͍͏Ձ؍ • ʮͳͥ͜ͷ͕ى͖ͨͷ͔ʯΛੳٕͯ͠ज़తͳ ղܾࡦʹམͱ͜͠Ή • ։ൃʹ͓͚Δʮඪ४ʯΛ࡞͍ͬͯ͘աఔͰ͋Δ
࣮ࡍͷ'54͔Β ͍͔ͭ͘ϐοΫΞοϓ
"OESPJEΞϓϦͰ 8JEHFU͕͋Δͱ͖ʹ Ξοϓσʔτ͢ΔͱϩάΞτ
$PPLQBE"QQ8JEHFU • AndroidͷϗʔϜʹஔ͚Δ খ͍͞ΞϓϦ • ىಈϑϩʔ͕ී௨ͷΞϓ Ϧͱҧ͏ʢ͜ͱ͕͋Δʣ
8JEHFU͕͋Δͱ͖ʹΞοϓσʔτ͢ΔͱϩάΞτ • WidgetΛؚΊͯز͔ͭͷύλʔϯͰىಈϑϩʔ͕গ ͚ͩ͠ҧ͏ • ΞϓϦέʔγϣϯͷىಈ࣌ ʢApplication#onCreate()ʣʹͯ͢ͷॳظԽΛߦ͏ ͱ͗͢ΔͷͰɺผͷͱ͜ΖʹΓ͚͍ͯͨ • ݁Ռɺ௨ৗͱҧ͏ىಈϑϩʔΛऔΔ߹ʹͯ͢ͷ
ॳظԽ͕Βͳ͍ঢ়ଶͩͬͨ
ղܾํ๏ • ॳظԽΛ Application#onCreate() Ͱߦ͏Α͏ʹͨ͠ • ͦͷࡍɺॳظԽϓϩηεΛݟͳ͓ͯ͠ߴԽͨ͠ • ͜ͷॳظԽεϓϥογϡεΫϦʔϯ͕ग़Δલͷ ͜ͱͳͷͰɺͦΕͳΓʹ࣌ؒΛͬͯߴԽ͢Δ
Ձ͕͋Δ • ʮؾΛ͚࣮ͭͯ͢Δʯোͷͱ
/ Ͱ"1*ΞΫηε ͯ͠αʔόʔͷෛՙ্͕ঢ
/ • ͋ΔϦιʔεʢͨͱ͑RecipeʣΛNݸऔಘͨ͋͠ ͱɺͦͷϦιʔεʹඥͮ͘ผͷϦιʔεʢͨͱ͑ UserʣΛऔಘ͠Α͏ͱͯ͠͞ΒʹNճͷAPIΛൃߦ ͯ͠͠·͍ύϑΥʔϚϯε͕ྼԽ͢Δ • RailsͰΑ͋͘Δ͜ͱͰɺbulletͱ͍͏N+1Λ ൃݟ͢Δઐ༻ͷgem·Ͱ͋Δ
J04ΞϓϦͰ/ ʹؾͮ͘ • ίʔυϨϏϡʔQA Λ௨աͯ͠ɺϦϦʔεޙʹAPI αʔόͷෛՙ͕ߴ·ͬͯൃ֮ • αʔόʔαΠυͷ࣮Α͘ͳ͔ͬͨͷͰͦͷվ ળͰ͋Δఔ͠ͷ͛ͨ •
ΞϓϦͷڍಈͦͷͷਖ਼ৗ͕ͩো͕͓͖Δͱ͍ ͏ঢ়گͩͬͨ
ղܾࡦɿνΣοΫϦετʹ߲ΛՃ • pull-requestʹಛఆͷϥϕϧΛ͚ͭΔͱɺͦΕʹԠ͡ ͨνΣοΫϦετ͕షΒΕΔΈ͕͋Δ • ͦΕΛ֦ுͯ͠νΣοΫͰ͖ΔΑ͏ʹͨ͠ • ߋʹΞϓϦ͔ΒͷϦΫΤετΛΩϟϓνϟͯ͠νΣο Ϋ͢ΔΈΛςετʹΈࠐΜͩ
1SP(VBSEͱͷઓ͍
1SP(VBSE • JavaͷόΠτίʔυͷͨΊͷminifyπʔϧ • γϯϘϧ໊ͷॖɺόΠτίʔυ࠷దԽɺϝλσʔλͷআɺσο υίʔυআɺಡԽͳͲΛߦ͏ • γϯϘϧ໊ͷॖͱσουίʔυআͰAPKαΠζΛখ͘͢͞Δޮ ՌΛظ •
ProGuardͦͷ্༷ɺΞϓϦͷػೳෆશΛඇৗʹى͍͜͢͠ • ͔͠͠APKαΠζͷॖখޮՌϝΨόΠτʹٴͿͷͰΘͳ͍ Θ͚ʹ͍͔ͳ͍
BTTVNFOPTJEFF⒎FDUT • σουίʔυআʹ͓͍ͯɺಛఆͷϝιου͕෭࡞ ༻Λ࣋ͨͳ͍ͱ͍͏ώϯτΛ༩͑ΔΦϓγϣϯ • ϩΨʔͷϝιουΛ "no side-effects" ͱ͢Δ͜ͱͰɺ Log.d()ͷݺͼग़͠ΛόΠτίʔυ͔ΒআͰ͖Δ
• ΫοΫύουΞϓϦͰ͜ΕͰϩάग़ྗΛ͍ͬͯ ͕ͨ…
ϦϦʔεϏϧυͰϩάग़ྗ • ͋Δόʔδϣϯ͔Βϩάग़ྗ͕ແޮԽ͞Εͳ͍ঢ়ଶ ʹͳ͍ͬͯͨ • ͦ͜Ͱ -assumenosideeffects Ͱ Log.d() Λআ͢Δ
͜ͱʹͨ͠ɿ BTTVNFOPTJEFF⒎FDUTa DMBTTBOESPJEVUJM-PH\NFUIPET^
"1*αʔόͷෛՙ૿େ • ΄Ͳͳͯ͘͠APIαʔόͷෛՙ͕ߴ·͖ͬͯͨ • ೝূϦΫΤετ͕աʹൃߦ͞Ε͍ͯΔΒ͍͠ • ΫοΫύουΞϓϦىಈ࣌ʹೝূΛߦ͏Α͏ʹͳͬ ͍ͯΔ • ೝূ͕͍ྃͯ͠ͳ͍ͱ͖ʹൃߦ͞Εͨͦͷଞͷ
APIίʔϧೝূ͕௨Δ·ͰͭΑ͏ʹͳ͍ͬͯΔ w w
"1*ίʔϧೝূ͕௨Δ·Ͱͭ w w • ͜ͷͪ߹Θͤʹ Object#wait() Λ͍ͬͯͨ • -assumenosideeffects class
Log { <methods>; } Ϋϥε ֊ΛḪͬͯద༻͞ΕΔ • LogΫϥεͷεʔύʔΫϥεͰ͋ΔObjectΫϥεͷશϝ ιου͕෭࡞༻ͳ͠ͱղऍ͞ΕΔʂ • ͜ͷΑ͏ͳܦҢͰ Object#wait() ͷݺͼग़͕͠όΠτίʔ υ͔Βআ͞Ε͍ͯͨ…
ͳͥϦϦʔε·Ͱؾ͔ͳ͔͔ͬͨ • APIίʔϧͷೝূ͕ͪյΕͨ݁Ռɺೝূ͕ͱ͓Βͣʹ APIίʔϧ͕͞ΕͯΤϥʔʹͳ͍ͬͯͨ • ͔͠͠ɺAPIΫϥΠΞϯτʹ࣮͞ΕͨࣗಈϦτϥΠػ ߏ͕͏·͘ಈ͍ͯ͠·͍ɺϦτϥΠ͢Δؒʹೝূ͕ͱ͓ͬ ͯଓ͘APIίʔϧ͕ޭͯ͠͠·͏ • ·ͨΞϓϦͷڍಈͦͷͷਖ਼ৗ͕ͩো͕͓͖Δͱ
͍͏ঢ়گ
"1*ݺͼग़͠ଟ͗͢ͷࠜຊղܾ • ΞϓϦ্ͰΦʔόʔϨΠදࣔ͢ΔϩΨʔΛͭ͘Γɺ status 4xx, 5xxͷAPIݺͼग़͠ΛͦͷϩΨʔͰه͢Δ Α͏ʹͨ͠ʢAndroid, σόοάϏϧυͰͷΈ༗ޮʣ • ͦͷޙɺ௨৴पΓͷτϥϒϧΦʔόʔϨΠϩΨʔ
ͷ͓͔͛Ͱ͍ͩͿॿ͔ͬͨ • ·ͨ௨৴ྔΛଌఆ͢ΔπʔϧΛͭ͘ΓɺQAʹऔΓೖ Εͨ
͓ΘΓ