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
コルーチンを使って処理の見通しをよくする
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
horitamon
October 05, 2022
Programming
2.4k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
コルーチンを使って処理の見通しをよくする
https://droidkaigi.jp/2022/timetable/365129
horitamon
October 05, 2022
More Decks by horitamon
See All by horitamon
Kotlin Multiplatformで考えるクリーンアーキテクチャ
horitamon
0
330
スタートアップ企業のフェーズ転換期を乗り越えるためのリアーキテクト戦略
horitamon
0
610
ActでGithub Actionsの動作確認をする
horitamon
0
1.5k
Bitrise Pipelinesを使って リリース作業を効率化する
horitamon
0
74
解決むずかったバグ3選
horitamon
0
520
「OK Google」でアプリの機能を呼び出してみる
horitamon
0
1.7k
Other Decks in Programming
See All in Programming
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
4
2.5k
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
170
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
0
1.3k
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
4
1.2k
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
320
Java 27新機能 / Java 27 new features
kishida
2
140
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
4.5k
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
7.1k
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
550
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
170
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
240
Featured
See All Featured
Technical Leadership for Architectural Decision Making
baasie
3
570
Typedesign – Prime Four
hannesfritz
42
3.2k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Speed Design
sergeychernyshev
33
2.1k
Building AI with AI
inesmontani
PRO
1
1.2k
Building Applications with DynamoDB
mza
96
7.2k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
910
Skip the Path - Find Your Career Trail
mkilby
1
230
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
520
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
The Curious Case for Waylosing
cassininazir
1
510
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!