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
43
スタートアップ企業のフェーズ転換期を乗り越えるためのリアーキテクト戦略
horitamon
0
490
ActでGithub Actionsの動作確認をする
horitamon
0
900
Bitrise Pipelinesを使って リリース作業を効率化する
horitamon
0
55
解決むずかったバグ3選
horitamon
0
330
「OK Google」でアプリの機能を呼び出してみる
horitamon
0
980
Other Decks in Programming
See All in Programming
いまから追い上げる、Jetpack Compose トレーニング
nyafunta9858
0
250
dRuby 入門者によるあなたの身近にあるdRuby 入門
makicamel
4
350
ドメイン駆動設計を実践するために必要なもの
bikisuke
3
330
2024 컴포즈 정원사
jisungbin
0
150
KSPの導入・移行を前向きに検討しよう!
shxun6934
PRO
0
130
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
320
私のEbitengineの第一歩
qt_luigi
0
440
いつか使える ObjectSpace / Maybe useful ObjectSpace
euglena1215
2
130
null or undefined
susisu
22
6.2k
『ドメイン駆動設計をはじめよう』中核の業務領域
masuda220
PRO
5
970
Go Code Generation at newmo / 2024-08-27 #newmo_layerx_go
genkey6
0
550
New Order in Cascade Sorting Order
mugi_uno
3
2.6k
Featured
See All Featured
Visualization
eitanlees
142
15k
Automating Front-end Workflow
addyosmani
1365
200k
How to train your dragon (web standard)
notwaldorf
85
5.6k
Robots, Beer and Maslow
schacon
PRO
157
8.1k
GitHub's CSS Performance
jonrohan
1029
450k
5 minutes of I Can Smell Your CMS
philhawksworth
202
19k
Designing for Performance
lara
604
68k
How to Think Like a Performance Engineer
csswizardry
16
950
The Invisible Side of Design
smashingmag
295
50k
No one is an island. Learnings from fostering a developers community.
thoeni
18
2.9k
How to Ace a Technical Interview
jacobian
275
23k
Building a Modern Day E-commerce SEO Strategy
aleyda
36
6.8k
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!