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
Engineering joy: Building the celebration syste...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
LINEヤフーTech (LY Corporation Tech)
PRO
July 01, 2025
Technology
65
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Engineering joy: Building the celebration system on the Home tab of the LINE app on Android
LINEのホームタブでの祝祭アニメーションの技術アーキテクチャを深く掘り下げ、Androidの核となる構成要素がいかにして日常の瞬間を大規模な魔法の祝祭に変えるかを探ります。
LINEヤフーTech (LY Corporation Tech)
PRO
July 01, 2025
More Decks by LINEヤフーTech (LY Corporation Tech)
See All by LINEヤフーTech (LY Corporation Tech)
Scaling Beyond the Exabyte: Lessons from Hadoop Integration and Operations at LY Corporation
lycorptech_jp
PRO
0
52
多層防御と最⼩権限で実現する、安全なAIエージェント設計パターン
lycorptech_jp
PRO
1
250
PM領域でのAI Agentの活用
lycorptech_jp
PRO
0
290
AI駆動開発を組織で促すために
lycorptech_jp
PRO
7
9.5k
検索技術知識0のエンジニアが広告検索システムを内製化して運用するまで
lycorptech_jp
PRO
1
380
No More Log Digging 〜AIを一次調査係にする アラートレビュー改善〜
lycorptech_jp
PRO
0
180
実践!既存 Project への AI-Driven Development 適用〜一ヶ月で Project 唯一のフロントエンドエンジニアを作り出せ〜
lycorptech_jp
PRO
1
510
AIが実装を自走する時代の認知負債との戦い
lycorptech_jp
PRO
3
1.3k
AIと1000本ノックしてたどり着いた、最速のプロダクト開発 ~toC向けAIエージェントUXを、動く選択肢とAIキャパシティで設計する~
lycorptech_jp
PRO
1
240
Other Decks in Technology
See All in Technology
AIに丸投げしないトイル削減 / Eliminating Toil Without Leaving It All to AI
kohbis
4
1.1k
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
2.5k
Deploying a Full-Stack Bun-Native Framework on Cloudflare Workers
7nohe
0
130
OpenTelemetry eBPF Instrumentationの舞台裏 / Behind the Scenes of OpenTelemetry eBPF Instrumentation
ymotongpoo
3
950
2026-09-11 【Snowflake World Tour Tokyo 2026】Snowflakeを起点に、AI Agentが自律稼働し続ける未来へ / Driving AI Agents with Snowflake
civitaspo
0
280
OpenTelemetryのメトリクスをCloudWatchに送ってPromQLで見てみた
ota1022
0
120
AI時代だからこそ、スケールしないことをやろう
yutashigemura
1
130
2026-09-09 【sigma_ucj#1】Sigma を IaC 管理したい! / IaC for Sigma
civitaspo
0
110
WAF 運用改善の承認サイクル/SRE_BizReach_MIXI_1
visional_engineering_and_design
2
420
日経電子版を支えていく Kasane Design System/fec_fukuoka
nikkei_engineer_recruiting
0
570
深夜のクラウド懺悔室 1:29:300 or 1:0:0
kazzpapa3
1
230
enechainの内製セルフサービスプラットフォーム
hiyosi
0
150
Featured
See All Featured
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
Rails Girls Zürich Keynote
gr2m
96
14k
First, design no harm
axbom
PRO
2
1.3k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Marketing to machines
jonoalderson
1
5.8k
GraphQLとの向き合い方2022年版
quramy
50
15k
My Coaching Mixtape
mlcsv
0
310
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
260
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
250
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
490
Designing for Performance
lara
611
70k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Transcript
&OHJOFFSJOH+PZ #VJMEJOH-*/&T"OESPJE$FMFCSBUJPO4ZTUFNBU4DBMF -:$PSQPSBUJPO -*/&"QQ%FW 5VBO 5VOB
"OESPJE4PGUXBSF&OHJOFFS 8PSLJOHPO-*/&T)PNFUBCGFBUVSFT 1BTTJPOBUFBCPVUCVJMEJOHEFMJHIUGVMVTFS FYQFSJFODFT "CPVUNF
4IPXDBTF 5IF$IBMMFOHF 4ZTUFN"SDIJUFDUVSF0WFSWJFX *NQMFNFOUBUJPO%FFQ%JWF #VJMEJOH#MPDLT4ZOFSHZ 3FTVMUT*NQBDU 2VFTUJPOT%JTDVTTJPO "HFOEB
#JSUIEBZ$ISJTUNBT $FMFCSBUJPOT -*/&"QQ)PNFUBCEVSJOH
5IF$IBMMFOHF 1SFDJTJPO5JNJOH &WFOUTNVTUUSJHHFSFYBDUMZXIFOJOUFOEFE TVSWJWJOHBQQSFTUBSUT 3FTPVSDF.BOBHFNFOU &GGJDJFOUIBOEMJOHPGDFMFCSBUJPOBTTFUTBDSPTTNJMMJPOTPGEFWJDFT &EHF$BTFT
/FUXPSLGBJMVSFT BQQUFSNJOBUJPOT NVMUJQMFDPODVSSFOU DFMFCSBUJPOT
0VS4PMVUJPO 3FMJBCMF.BHJD #VJMEJOH#MPDLT 1IBTF"SDIJUFDUVSF
4ZTUFN"SDIJUFDUVSF0WFSWJFX
#VJMEJOH#MPDLT'PVOEBUJPO 3PPN%BUBCBTF 3FMJBCMFMPDBMTUPSBHFXJUISFBDUJWFRVFSJFT 8PSL.BOBHFS 1SFDJTFTDIFEVMJOHBDSPTTBQQMJGFDZDMF ,PUMJO'MPX 3FBDUJWF6*VQEBUFTBOETUBUFNBOBHFNFOU
1IBTF+PVSOFZ &WFOU %JTDPWFSZ 3FTPVSDF "DRVJTJUJPO 4IPX5JNF $MFBO6Q 3FDFJWFFWFOU OPUJGJDBUJPO %PXOMPBEFWFOU
NFUBEBUB %PXOMPBEBOEWBMJEBUF SFTPVSDFT %JTQMBZFGGFDUTBU UIFEFTJHOBUFEUJNF $MFBOVQSFTPVSDFT 4DIFEVMFOFYU PDDVSSFODF .BJOUBJOSFBEJOFTT EVSJOHJEMFQFSJPET
,FZ%FTJHO1SJODJQMFT EBZQSFQBSBUJPOCVGGFSFOTVSFTSFMJBCMFEFMJWFSZ $MFBSTFQBSBUJPOPGDPODFSOTCFUXFFOQIBTFT *OEFQFOEFOUFSSPSIBOEMJOHJOFBDIDPNQPOFOU 6TFSDFOUSJDUJNJOHXJUIHSBDFQFSJPET
*NQMFNFOUBUJPO%FFQ%JWF +PVSOFZ5ISPVHI"MM'PVS1IBTFT
1IBTF&WFOU%JTDPWFSZ $MJFOU TJEF 4FSWFS QVTIFE scheduledTime = showTime - 5
days retryUntil = showTime + 1 day 8PSL.BOBHFS {showTime} .FUBEBUB%PXOMPBE8PSLFS {showTime}
1IBTF3FTPVSDF"DRVJTJUJPO .FUBEBUB 'FUDIJOH "TTFU %PXOMPBE retry retry %POF
3PCVTU*NQMFNFOUBUJPO // Metadata Download Worker: Fetch event configurations if (retryUntil
< now) { return failure() } val event = fetchEventMetadata(eventId) // error -> retry saveEventMetadata(event) // error -> retry scheduleAssetDownload(event) // success -> next step .FUBEBUB%PXOMPBE8PSLFS'FUDIFWFOUDPOGJHVSBUJPOT
3PCVTU*NQMFNFOUBUJPO // Asset Worker: Download and validate celebration assets if
(retryUntil < now) { return failure() } val asset = downloadAsset(event) // error -> retry validateAsset(asset, event.checksum) // error -> retry fileStorage.extractAndSave(eventId, asset) // error -> retry // success scheduleShowtime() scheduleCleanup() "TTFU8PSLFS%PXOMPBEBOEWBMJEBUFDFMFCSBUJPOBTTFUT
1IBTF3FTPVSDF"DRVJTJUJPO .FUBEBUB 'FUDIJOH "TTFU %PXOMPBE retry retry %POF 4DIFEVMJOH 4IPXUJNF
4DIFEVMJOH $MFBOVQ WorkManager 3PPN%#
1IBTF4IPX5JNF 1&/%*/( 3&"%: '6--@4$3&&/@ &''&$5@$0.1-&5& % "MM#VJMEJOH#MPDLT6OJUF
&MFHBOU4JNQMJDJUZ // WorkManager: One simple state change eventRepository.updateEventState(eventId, READY) //
Everything else happens automatically: // Room → Flow → UI updates seamlessly
1FSGFDU$PMMBCPSBUJPO 8PSL.BOBHFS5SJHHFSTUIFQSFDJTFNPNFOUXJUIPOFMJOFPG DPEF 3PPN3FBDUJWFEBUBCBTFJOTUBOUMZOPUJGJFTBMMPCTFSWFST 'MPX)BOEMFTDPNQMFYQSJPSJUZ UJNJOH BOE6*DPPSEJOBUJPO
BVUPNBUJDBMMZ
1IBTF$MFBO6Q EBZHSBDFQFSJPE QSFWFOUTJOUFSSVQUJPOGPSMBUFVTFST $PNQSFIFOTJWFSFNPWBM PGBTTFUTBOENFUBEBUB 3FDVSSJOHFWFOUT BVUPNBUJDBMMZSFTDIFEVMFOFYUPDDVSSFODF
&GGJDJFOU3FTPVSDF.BOBHFNFOU
1IBTFNBQ 1IBTF 1IBTF retry 1IBTF 1IBTF
#VJMEJOH#MPDLT4ZOFSHZ $PNQMFY4UBUF.BOBHFNFOU.BEF4JNQMF
5IF1PXFSPG*OUFHSBUJPO 8PSL.BOBHFSTDIFEVMFT 3PPNTUPSFTRVFSJFT 'MPXSFBDUT 6*VQEBUFT
3FBM*NQBDU$PNQMFY-PHJDJO4JNQMF$PEF // All three building blocks working together: val displayableEventFlow
= combine( homeEventEffectDao.getDisplayableEventsFlow(), // Room: reactive queries homeTabVisibilityFlow // Flow: UI state tracking ) { events, isHomeVisible -> events.takeIf { isHomeVisible } // Timing: only when visible ?.maxByOrNull { it.priority } // Priority: personal > cultural } // Worker updates Room → Room triggers Flow → Flow updates UI displayableEventFlow.collect { event -> showEffect(event) }
8IBU5IJT"DIJFWFT $PNQMFYDPPSEJOBUJPOCFDPNFTEFDMBSBUJWFQSPHSBNNJOH .VMUJQIBTFTUBUFUSBOTJUJPOTIBOEMFEBVUPNBUJDBMMZ &SSPSSFDPWFSZBDSPTTQIBTFT XJUITJOHMFSFUSZTUSBUFHZ 3FBDUJWF6*VQEBUFTFMJNJOBUF
NBOVBMTUBUFTZODISPOJ[BUJPO 3FTVMU$PNQMFYDFMFCSBUJPOPSDIFTUSBUJPO ˠ4JNQMFSFBDUJWFEFDMBSBUJPOT
3FTVMUT*NQBDU
1FSGPSNBODF"DIJFWFNFOUT DFMFCSBUJPOEFMJWFSZ 4VDDFTTSBUF JNQBDU "QQTUBSUVQ ;FSP EVSJOHJEMFQFSJPET 3FTPVSDFTGPPUQSJOU -PX
"VUPNBUJDSFDPWFSZ GSPNOFUXPSLGBJMVSFTBOEBQQDSBTIFTPSSFTUBSUT 5FDIOJDBM&YDFMMFODF PGCVJMEJOHCMPDLTGPSDPNQMFYTUBUFNBOBHFNFOU 4FBNMFTTJOUFHSBUJPO TJNQMJGJFTRVBMJUZBTTVSBODF *OEFQFOEFOUQIBTF UFTUJOH
1FSGFDUUJNJOH DSFBUFTHFOVJOFTVSQSJTFNPNFOUT 6TFS&YQFSJFODF FOTVSFTCJSUIEBZTBSFOUNJTTFECZIPMJEBZT 1FSTPOBMQSJPSJUZ FOIBODFFNPUJPOBMJNQBDU $VMUVSBMBXBSFOFTT FOIBODFFNPUJPOBMJNQBDU 4NPPUIBOJNBUJPOT
,FZ5BLFBXBZT
"SDIJUFDUVSF-FTTPOT 4USBUFHJDQSFQBSBUJPO EBZCVGGFS QSFWFOUTMBTUNJOVUF GBJMVSFT 1IBTFJTPMBUJPO FOBCMFTJOEFQFOEFOUFSSPSIBOEMJOHBOEUFTUJOH
#VJMEJOHCMPDLTZOFSHZ MFWFSBHFT"OESPJETTUSFOHUITFGGFDUJWFMZ 6TFSDFOUSJDEFTJHO USBOTGPSNTUFDIOJDBMDPOTUSBJOUTJOUP EFMJHIUGVMFYQFSJFODFT
*NQMFNFOUBUJPO*OTJHIUT &BSMZSFTPVSDFBDRVJTJUJPO FOTVSFTSFMJBCMFDFMFCSBUJPOEFMJWFSZ 3FBDUJWFTUBUFNBOBHFNFOU UISPVHI'MPXTJNQMJGJFTDPNQMFY6* DPPSEJOBUJPO 8PSL.BOBHFSTDIFEVMJOH
DPPSEJOBUFTQSFDJTFQIBTFUSBOTJUJPOT BOESFUSZMPHJD 3PPNTSFBDUJWFRVFSJFT QSPWJEFSFBMUJNFTZTUFNTUBUF BXBSFOFTT
5IBOL:PV
&OHJOFFSJOHKPZ#VJMEJOHUIFDFMFCSBUJPOTZTUFN POUIF)PNFUBCPGUIF-*/&BQQPO"OESPJE IUUQTUFDICMPHMZDPSQDPKQFOFOHJOFFSJOHKPZCVJMEJOHUIFDFMFCSBUJPOTZTUFNPOUIF IPNFUBCPGUIFMJOFBQQPOBOESPJE ,PUMJO'MPX%PDVNFOUBUJPO IUUQTLPUMJOMBOHPSHEPDTGMPXIUNM 3PPN%BUBCBTF%PDVNFOUBUJPO
IUUQTEFWFMPQFSBOESPJEDPNUSBJOJOHEBUBTUPSBHFSPPN 8PSL.BOBHFS%PDVNFOUBUJPO IUUQTEFWFMPQFSBOESPJEDPNUPQJDMJCSBSJFTBSDIJUFDUVSFXPSLNBOBHFS 3FGFSFODFT