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
コルーチンを使って処理の見通しをよくする
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
horitamon
October 05, 2022
Programming
2
2.4k
コルーチンを使って処理の見通しをよくする
https://droidkaigi.jp/2022/timetable/365129
horitamon
October 05, 2022
Tweet
Share
More Decks by horitamon
See All by horitamon
Kotlin Multiplatformで考えるクリーンアーキテクチャ
horitamon
0
300
スタートアップ企業のフェーズ転換期を乗り越えるためのリアーキテクト戦略
horitamon
0
590
ActでGithub Actionsの動作確認をする
horitamon
0
1.3k
Bitrise Pipelinesを使って リリース作業を効率化する
horitamon
0
70
解決むずかったバグ3選
horitamon
0
480
「OK Google」でアプリの機能を呼び出してみる
horitamon
0
1.6k
Other Decks in Programming
See All in Programming
車輪の再発明をしよう!PHP で実装して学ぶ、Web サーバーの仕組みと HTTP の正体
h1r0
0
130
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
700
Agentic AI: Evolution oder Revolution
mobilelarson
PRO
0
190
GoのDB アクセスにおける 「型安全」と「柔軟性」の両立 - Bob という選択肢
tak848
0
230
へんな働き方
yusukebe
5
2.7k
メタプログラミングで実現する「コードを仕様にする」仕組み/nikkei-tech-talk43
nikkei_engineer_recruiting
0
200
Vuetify 3 → 4 何が変わった?差分と移行ポイント10分まとめ
koukimiura
0
150
AI 開発合宿を通して得た学び
niftycorp
PRO
0
150
今からFlash開発できるわけないじゃん、ムリムリ! (※ムリじゃなかった!?)
arkw
0
120
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
770
技術検証結果の整理と解析をAIに任せよう!
keisukeikeda
0
130
20260313 - Grafana & Friends Taipei #1 - Kubernetes v1.36 的開發雜記:那些困在 Alpha 加護病房太久的 Metrics
tico88612
0
220
Featured
See All Featured
How to Think Like a Performance Engineer
csswizardry
28
2.5k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
110k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.6k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.2k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
64
53k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Optimising Largest Contentful Paint
csswizardry
37
3.6k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Paper Plane
katiecoart
PRO
0
48k
Scaling GitHub
holman
464
140k
Transcript
コルーチンを使って 処理の見通しをよくする リアルタイム放送の品質を向上し、 保つために horitamon • 2022 年 10月 5
日 @DroidKaigi2022
自己紹介 堀 多聞 - horitamon Androidエンジニア5年目 2020/9〜 Voicy 品質改善チーム Twitter:
@horitamon
音声プラットフォーム - Voicy さまざまなパーソナリティのトークを楽しめるサービスを提供
Voicyのアプリ 聴くアプリ「Voicy」と 収録するアプリ「Voicy Recorder」 ふたつをAndroid/iOSともに展開
こんなことで 困ったこと、 ありませんか?
None
ぱっと見 何してるのか わからん😇 (追えばわかるけども)
コールバック内コールバック
帰らぬ人となったメソッド分割 呼び元のメソッドの役割が不明瞭 (行数増えると分けがちだけど)
LiveDataでUIへ処理完了を通知 これすなわち呼び元のメソッドが 分断されているということ
ぱっと見startLiveの結果が isSucceededStartから来るとは わからない🤔
コードの 見通しが悪くて 不具合の原因が わからない…! • エラーログが無いので読むしかない … • コールバックやメソッド分割でどの 処理がどの順番で進むのか
わかりづらい… • 原因が見つからないし、 直すにしてもどこを直せば… →不具合の解決に時間がかかる
そんなときに、 コルーチン
コルーチン =スレッド操作 だけじゃない! • コルーチンってスレッド操作をやり やすくするんじゃないの? →それだけじゃない! • コールバックを減らせるという 可読性の面での利点がある
今日伝えること 1. コルーチンの「中断」 2. コルーチンで コードの見通しを良くする 3. リアルタイム放送の品質を向上し 保つためにしたこと
コルーチンとは
コルーチンとは ざっくり言うと 並行実行のデザインパターン スレッド切り替え、バックグラウンド処理といった 非同期実行するコードを簡略化できる 全体をつかむには 過去のDroidKaigiでとてもわかりやすい発表があります Understanding Kotlin
Coroutines: コルーチンで進化するアプリケーション開発 @mhidaka
https://developer.android.com/kotlin/coroutines/ coroutines-adv?hl=ja loginをメインスレッドから呼ぶと makeLoginRequestが完了するまで スレッドをブロックしてしまう🤔
https://developer.android.com/kotlin/coroutines/ coroutines-adv?hl=ja 💡処理を簡単にI/Oスレッドへ移せる
コルーチンの 中断
https://developer.android.com/kotlin/coroutines/ coroutines-adv?hl=ja そもそもスレッドをブロックしないでほしい😠
https://developer.android.com/kotlin/coroutines/ coroutines-adv?hl=ja 💡makeLoginRequestを suspend関数にする 呼び元のコルーチンを中断し 結果が出たら再開する
💡止めるのではなく中断する →結果が返ってくるまではメインスレッドが使える Main I/O System Coroutine launch Coroutine withContext Coroutine
return suspend
https://developer.android.com/kotlin/coroutines/ coroutines-adv?hl=ja 💡makeLoginRequestはsuspend関数 コルーチンを中断し 結果が出たら再開する
https://developer.android.com/kotlin/coroutines/ coroutines-adv?hl=ja 💡実行スレッドをブロックせず 中断するだけ メインセーフティ✨ 今回このコルーチンの 「中断」が活躍します
コルーチンで コードの見通しを良くする
例:生放送 Voicyが提供する リアルタイム放送機能 リスナーからのお便りに答えたり リスナーにゲストとして トークに参加してもらったり リアルタイムな交流が可能
問題のコードを コルーチンで書き換える ※もちろん擬似
None
コールバックで結果を受け取っている LiveRepository#getByLiveIdを コルーチンを使って表してみる
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.c oroutines/suspend-coroutine.html 💡コルーチンを「中断」しつつ 「継続」するためのオブジェクトを提供する
suspendCoroutineも suspend関数 →呼び元のコルーチンを中断
結果を返してコルーチンを再開
💡同期処理っぽい書き方に →コールバックが減らせる
💡やってることが一目でわかる • 生放送情報の取得 • 生放送データを開始状態にする • 画像URL取得
開始処理の結果が まだちょっと追いづらい…
ぱっと見startLiveの結果が isSucceededStartから来るとは わからない🤔
成功/失敗をBooleanで返すメソッドに
💡生放送の開始処理の成功/失敗を 返すメソッドになった
💡見通しUP! ・生放送の開始処理の成功/失敗を 返すメソッドであることがわかる ・処理の順番がすぐわかる
💡見通しUP! startLiveの結果を受け取る箇所が すぐわかる
生放送が開始しない不具合が発生! ↓ エラーハンドリング追加まで やってみる 見やすくなった コードから 問題点を 解決していく
・setLiveStartedが完了しないと次へは進まない ・liveがnullの場合もsetLiveStartedへ進んでしまう →止まるポイントがすぐわかる
liveがnullのときは失敗を返す
見通しが良くなると 品質を落としているポイントが コードからわかるようになる さらに 問題点を探してみる
この処理をしなくても setLiveStartedへ 進むことは可能 →余計な待ち時間がある
💡並列実行で 処理スピードUp
リアルタイム放送の 品質を向上し 保つためにしたこと
Voicyの Qualityチーム 既存機能の品質向上を担う • 2022年から開発チーム編成を変更 • 変更前のチームでリリースした 機能の保守責任が曖昧に • 2021年リリースの生放送で
障害発生 • 対応の流れでQualityチームが発足 • リリース済み機能の不具合対応や ユーザーからの問い合わせに対応
Voicy server 音声通信 ・放送データ ・お便り イベント 通信 ・放送開始 ・データ更新 3つの通信経路を
同時性を保って管理 生放送の構成
見通しが悪くて どこが問題なのか なかなかわからない…!
生放送を開始する流れ 1. 放送データを「予約中」から「放送中」に更新 2. 生放送開始イベントを通知 3. 音声を接続する 4. 放送データの取得、更新 ◦
放送データを作成 ◦ 自身のユーザーデータ取得 ◦ アイコン画像取得 ◦ お便りブロックユーザー一覧取得 etc… 順番は…? 失敗した ときは…? よ〜〜〜く読まないと把握できない😇
そもそもやってることが複雑 • 3つの双方向通信 • 通信の同時性を保つ • たくさんのセットアップ処理 開発していくうちにさらにどんどん複雑に • 技術調査、実装、仕様調整を繰り返す
• 複数人で同時並行で開発する なぜ見通しが悪いコードに…?
すぐ直すのではなく 一度立ち止まってでも コードの見通しを 良くする • このままだと 調査も修正も時間がかかる • よくわからないまま修正して さらに不具合を生むリスク
→問題を解決し 問題を生まないために まず見通しを良くする
リファクタで 価値をストレートに 届ける リファクタは 直接的な解決策ではない しかし不具合が減らしやすく 増えにくくなる ユーザーが感じる品質課題が減る →価値ある機能が ストレートに届くようになる
コルーチンで非同期処理を同期的に書き直すと コードの見通しが良くなる • 処理の順番が追いやすくなり、全体の見通しが良くなる • 不具合原因を見つけやすくなり コードからさらなる課題を見つけやすくなる リファクタはユーザーにとっても価値がある • 不具合解決のスピードが上がり、リスクも減る
• 価値ある機能がストレートに届く まとめ
参考 • Understanding Kotlin Coroutines: コルーチンで進化するアプリケーション開発 @mhidaka • Using Kotlin
Coroutines in your Android App • Android での Kotlin コルーチン | Android Developers • Coroutines guide | Kotlin
Voicy のエンジニアが テックや開発組織について いろいろ語っています DroidKaigi登壇メンバーの アフタートークも予定! voi-chord配信中!
Voicyで音声の未来を切り開く仲間を募集中! 対面でも、Twitter DMでも詳しくお話しします @horitamon
Thank you!