Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Engineering joy: Building the celebration syste...
Search
LINEヤフーTech (LY Corporation Tech)
PRO
July 01, 2025
Technology
58
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)
検索技術知識0のエンジニアが広告検索システムを内製化して運用するまで
lycorptech_jp
PRO
1
300
No More Log Digging 〜AIを一次調査係にする アラートレビュー改善〜
lycorptech_jp
PRO
0
110
実践!既存 Project への AI-Driven Development 適用〜一ヶ月で Project 唯一のフロントエンドエンジニアを作り出せ〜
lycorptech_jp
PRO
1
450
AIが実装を自走する時代の認知負債との戦い
lycorptech_jp
PRO
3
1.2k
AIと1000本ノックしてたどり着いた、最速のプロダクト開発 ~toC向けAIエージェントUXを、動く選択肢とAIキャパシティで設計する~
lycorptech_jp
PRO
1
180
プライバシー保護の理論と実践
lycorptech_jp
PRO
1
320
Yahoo!ショッピングでのAI-DLCの取り組みについて
lycorptech_jp
PRO
2
790
Business ID Integration at LY Corporation : Phased Migration for a B2B authentication platform with Tens of Millions of Users
lycorptech_jp
PRO
0
78
LINE Messaging: From Active-Standby to Active-Active Multi-DC Architecture
lycorptech_jp
PRO
0
120
Other Decks in Technology
See All in Technology
Invisible to AI? Making TYPO3 Sites Quotable by AI Search Systems
wolfgangwagner
0
240
AI・HPC開発を支えるGPU環境の新しい選択肢 液冷GPUシステム「AquSys」の取り組み
gpuunite_official
0
130
AIで変わるエンジニアの働き方(仮)
naoinaoi
0
200
AIに持続⼒を与える 判断の⻑期記憶設計
eiei114
1
390
Sets in Go
ramalho
1
1.1k
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
9.3k
AIコーディングの次。コードレビューと理解負荷を解消して組織の開発生産性を高める
moongift
PRO
2
2.7k
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
20k
SO-101×VLAによる3色キューブのピック&プレース
abeja
0
220
案件に一番詳しいAIを Amazon Bedrock AgentCore で作る ― 知見が知見を生むチームへ / Compounding Knowledge with AgentCore
yusukeshimizu
1
160
DDDのエッセンスを取り入れたAIでの開発
ak2ie
0
160
【GCC2026】大規模言語モデルを活用した内製検索サービスの社内展開や業務活用
bandainamcostudios
PRO
0
340
Featured
See All Featured
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Designing Experiences People Love
moore
143
24k
How STYLIGHT went responsive
nonsquared
100
6.2k
For a Future-Friendly Web
brad_frost
183
10k
The Limits of Empathy - UXLibs8
cassininazir
1
610
Become a Pro
speakerdeck
PRO
31
6.2k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
540
Ruling the World: When Life Gets Gamed
codingconduct
0
300
A better future with KSS
kneath
240
18k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.8k
Believing is Seeing
oripsolob
1
190
Claude Code のすすめ
schroneko
67
230k
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