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
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
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
440
AIエージェント時代のコードレビューを設計する
nogu66
6
2.7k
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
140
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
440
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
5
3.4k
Heart of Swift Concurrency
koher
0
900
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.1k
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
130
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
150
WebAssembly in Android Apps 〜 WASMはJNIの夢を見るか
keiji
1
110
Are APIs Still Relevant in the AI Era?
soyuka
0
260
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
160
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
280
Designing for Timeless Needs
cassininazir
1
480
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
830
Paper Plane (Part 1)
katiecoart
PRO
2
11k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
3
4.3k
For a Future-Friendly Web
brad_frost
183
10k
Embracing the Ebb and Flow
colly
88
5.2k
The Spectacular Lies of Maps
axbom
PRO
1
1k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
500
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!