$30 off During Our Annual Pro Sale. View Details »

コルーチンを使って処理の見通しをよくする

horitamon
October 05, 2022

 コルーチンを使って処理の見通しをよくする

horitamon

October 05, 2022
Tweet

More Decks by horitamon

Other Decks in Programming

Transcript

  1. コルーチンを使って 処理の見通しをよくする リアルタイム放送の品質を向上し、 保つために horitamon • 2022 年 10月 5

    日 @DroidKaigi2022
  2. 自己紹介 堀 多聞 - horitamon Androidエンジニア5年目 2020/9〜 Voicy 品質改善チーム Twitter:

    @horitamon
  3. 音声プラットフォーム - Voicy さまざまなパーソナリティのトークを楽しめるサービスを提供

  4. Voicyのアプリ 聴くアプリ「Voicy」と 収録するアプリ「Voicy Recorder」 ふたつをAndroid/iOSともに展開

  5. こんなことで 困ったこと、 ありませんか?

  6. None
  7. ぱっと見 何してるのか わからん😇 (追えばわかるけども)

  8. コールバック内コールバック

  9. 帰らぬ人となったメソッド分割 呼び元のメソッドの役割が不明瞭 (行数増えると分けがちだけど)

  10. LiveDataでUIへ処理完了を通知 これすなわち呼び元のメソッドが 分断されているということ

  11. ぱっと見startLiveの結果が isSucceededStartから来るとは わからない🤔

  12. コードの 見通しが悪くて 不具合の原因が わからない…! • エラーログが無いので読むしかない … • コールバックやメソッド分割でどの 処理がどの順番で進むのか

    わかりづらい… • 原因が見つからないし、 直すにしてもどこを直せば… →不具合の解決に時間がかかる
  13. そんなときに、 コルーチン

  14. コルーチン =スレッド操作 だけじゃない! • コルーチンってスレッド操作をやり やすくするんじゃないの? →それだけじゃない! • コールバックを減らせるという 可読性の面での利点がある

  15. 今日伝えること 1. コルーチンの「中断」 2. コルーチンで コードの見通しを良くする 3. リアルタイム放送の品質を向上し 保つためにしたこと

  16. コルーチンとは

  17. コルーチンとは ざっくり言うと 並行実行のデザインパターン スレッド切り替え、バックグラウンド処理といった 非同期実行するコードを簡略化できる 全体をつかむには 過去のDroidKaigiでとてもわかりやすい発表があります 
 Understanding Kotlin

    Coroutines: コルーチンで進化するアプリケーション開発 @mhidaka
  18. https://developer.android.com/kotlin/coroutines/ coroutines-adv?hl=ja loginをメインスレッドから呼ぶと makeLoginRequestが完了するまで スレッドをブロックしてしまう🤔

  19. https://developer.android.com/kotlin/coroutines/ coroutines-adv?hl=ja 💡処理を簡単にI/Oスレッドへ移せる

  20. コルーチンの 中断

  21. https://developer.android.com/kotlin/coroutines/ coroutines-adv?hl=ja そもそもスレッドをブロックしないでほしい😠

  22. https://developer.android.com/kotlin/coroutines/ coroutines-adv?hl=ja 💡makeLoginRequestを  suspend関数にする  呼び元のコルーチンを中断し  結果が出たら再開する

  23. 💡止めるのではなく中断する →結果が返ってくるまではメインスレッドが使える Main I/O System Coroutine launch Coroutine withContext Coroutine

    return suspend
  24. https://developer.android.com/kotlin/coroutines/ coroutines-adv?hl=ja 💡makeLoginRequestはsuspend関数  コルーチンを中断し  結果が出たら再開する

  25. https://developer.android.com/kotlin/coroutines/ coroutines-adv?hl=ja 💡実行スレッドをブロックせず  中断するだけ  メインセーフティ✨ 今回このコルーチンの 「中断」が活躍します

  26. コルーチンで コードの見通しを良くする

  27. 例:生放送 Voicyが提供する リアルタイム放送機能 リスナーからのお便りに答えたり リスナーにゲストとして トークに参加してもらったり リアルタイムな交流が可能

  28. 問題のコードを コルーチンで書き換える ※もちろん擬似

  29. None
  30. コールバックで結果を受け取っている LiveRepository#getByLiveIdを コルーチンを使って表してみる

  31. https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.c oroutines/suspend-coroutine.html 💡コルーチンを「中断」しつつ  「継続」するためのオブジェクトを提供する

  32. suspendCoroutineも suspend関数 →呼び元のコルーチンを中断

  33. 結果を返してコルーチンを再開

  34. 💡同期処理っぽい書き方に →コールバックが減らせる

  35. 💡やってることが一目でわかる • 生放送情報の取得 • 生放送データを開始状態にする • 画像URL取得

  36. 開始処理の結果が まだちょっと追いづらい…

  37. ぱっと見startLiveの結果が isSucceededStartから来るとは わからない🤔

  38. 成功/失敗をBooleanで返すメソッドに

  39. 💡生放送の開始処理の成功/失敗を  返すメソッドになった

  40. 💡見通しUP! ・生放送の開始処理の成功/失敗を  返すメソッドであることがわかる ・処理の順番がすぐわかる

  41. 💡見通しUP!  startLiveの結果を受け取る箇所が  すぐわかる

  42. 生放送が開始しない不具合が発生! ↓ エラーハンドリング追加まで やってみる 見やすくなった コードから 問題点を 解決していく

  43. ・setLiveStartedが完了しないと次へは進まない ・liveがnullの場合もsetLiveStartedへ進んでしまう →止まるポイントがすぐわかる

  44. liveがnullのときは失敗を返す

  45. 見通しが良くなると 品質を落としているポイントが コードからわかるようになる さらに 問題点を探してみる

  46. この処理をしなくても setLiveStartedへ 進むことは可能 →余計な待ち時間がある

  47. 💡並列実行で  処理スピードUp

  48. リアルタイム放送の 品質を向上し 保つためにしたこと

  49. Voicyの Qualityチーム 既存機能の品質向上を担う • 2022年から開発チーム編成を変更 • 変更前のチームでリリースした 機能の保守責任が曖昧に • 2021年リリースの生放送で

    障害発生 • 対応の流れでQualityチームが発足 • リリース済み機能の不具合対応や ユーザーからの問い合わせに対応
  50. Voicy server 音声通信 ・放送データ ・お便り イベント 通信 ・放送開始 ・データ更新 3つの通信経路を

    同時性を保って管理 生放送の構成
  51. 見通しが悪くて どこが問題なのか なかなかわからない…!

  52. 生放送を開始する流れ 1. 放送データを「予約中」から「放送中」に更新 2. 生放送開始イベントを通知 3. 音声を接続する 4. 放送データの取得、更新 ◦

    放送データを作成 ◦ 自身のユーザーデータ取得 ◦ アイコン画像取得 ◦ お便りブロックユーザー一覧取得 etc… 順番は…? 失敗した ときは…? よ〜〜〜く読まないと把握できない😇
  53. そもそもやってることが複雑 • 3つの双方向通信 • 通信の同時性を保つ • たくさんのセットアップ処理 開発していくうちにさらにどんどん複雑に • 技術調査、実装、仕様調整を繰り返す

    • 複数人で同時並行で開発する なぜ見通しが悪いコードに…?
  54. すぐ直すのではなく 一度立ち止まってでも コードの見通しを 良くする • このままだと 調査も修正も時間がかかる • よくわからないまま修正して さらに不具合を生むリスク

    →問題を解決し  問題を生まないために  まず見通しを良くする
  55. リファクタで 価値をストレートに 届ける リファクタは 直接的な解決策ではない しかし不具合が減らしやすく 増えにくくなる ユーザーが感じる品質課題が減る →価値ある機能が  ストレートに届くようになる

  56. コルーチンで非同期処理を同期的に書き直すと コードの見通しが良くなる • 処理の順番が追いやすくなり、全体の見通しが良くなる • 不具合原因を見つけやすくなり コードからさらなる課題を見つけやすくなる リファクタはユーザーにとっても価値がある • 不具合解決のスピードが上がり、リスクも減る

    • 価値ある機能がストレートに届く まとめ
  57. 参考 • Understanding Kotlin Coroutines: コルーチンで進化するアプリケーション開発 @mhidaka
 • Using Kotlin

    Coroutines in your Android App 
 
 • Android での Kotlin コルーチン | Android Developers 
 • Coroutines guide | Kotlin

  58. Voicy のエンジニアが テックや開発組織について いろいろ語っています DroidKaigi登壇メンバーの アフタートークも予定! voi-chord配信中!

  59. Voicyで音声の未来を切り開く仲間を募集中! 対面でも、Twitter DMでも詳しくお話しします @horitamon

  60. Thank you!