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
horitamon
October 05, 2022
Programming
2
2.1k
コルーチンを使って処理の見通しをよくする
https://droidkaigi.jp/2022/timetable/365129
horitamon
October 05, 2022
Tweet
Share
More Decks by horitamon
See All by horitamon
Kotlin Multiplatformで考えるクリーンアーキテクチャ
horitamon
0
27
スタートアップ企業のフェーズ転換期を乗り越えるためのリアーキテクト戦略
horitamon
0
460
ActでGithub Actionsの動作確認をする
horitamon
0
840
Bitrise Pipelinesを使って リリース作業を効率化する
horitamon
0
53
解決むずかったバグ3選
horitamon
0
320
「OK Google」でアプリの機能を呼び出してみる
horitamon
0
910
Other Decks in Programming
See All in Programming
Clean Architecture by TypeScript & NestJS
ryounasso
0
150
Advanced App Shrinking Techniques
cbeyls
2
150
Harnessing Large Language Models for Training-free Video Anomaly Detection
tereka114
1
1.3k
From Spring Boot 2 to Spring Boot 3 with Java 22 and Jakarta EE
ivargrimstad
0
1.9k
MIERUNE BBQにおけるユーザー中心設計()
mierune
PRO
1
110
The rollercoaster of releasing an Android, iOS, and macOS app with Kotlin Multiplatform | droidcon Berlin
prof18
0
110
開発部に不満を持っていたCSがエンジニアにジョブチェンしてわかった「勝手に諦めない」ことの大切さ
sakuraikotone
28
16k
SDCon2024: Enabling DevOps and Team Topologies thru architecture: architecting for fast flow
cer
PRO
0
780
AWS CDKにおける「再利用性」を考える / aws-cdk-reusability
gotok365
6
1.3k
入社1ヶ月でここまでやった!Findy Toolsインフラ支援の最適化
rvirus0817
6
1.4k
Rustのweb開発を助ける 便利なツール紹介
yuki0418
1
190
iOSアプリでクリップボードにコピーしたことをユーザーに伝えるちょうど良いフィードバックを探す
ski
0
100
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
23
1.9k
Fontdeck: Realign not Redesign
paulrobertlloyd
79
5.1k
Principles of Awesome APIs and How to Build Them.
keavy
124
16k
For a Future-Friendly Web
brad_frost
173
9.2k
How STYLIGHT went responsive
nonsquared
93
5k
Imperfection Machines: The Place of Print at Facebook
scottboms
262
13k
What the flash - Photography Introduction
edds
65
11k
How GitHub Uses GitHub to Build GitHub
holman
471
290k
Music & Morning Musume
bryan
43
5.9k
How to name files
jennybc
67
96k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
26
2.1k
Rails Girls Zürich Keynote
gr2m
93
13k
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!