$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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  6. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. コードの
    見通しが悪くて
    不具合の原因が
    わからない…!
    ● エラーログが無いので読むしかない

    ● コールバックやメソッド分割でどの
    処理がどの順番で進むのか
    わかりづらい…
    ● 原因が見つからないし、
    直すにしてもどこを直せば…
    →不具合の解決に時間がかかる

    View Slide

  13. そんなときに、
    コルーチン

    View Slide

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

    View Slide

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

    View Slide

  16. コルーチンとは

    View Slide

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

    Understanding Kotlin Coroutines:
    コルーチンで進化するアプリケーション開発 @mhidaka

    View Slide

  18. https://developer.android.com/kotlin/coroutines/
    coroutines-adv?hl=ja
    loginをメインスレッドから呼ぶと
    makeLoginRequestが完了するまで
    スレッドをブロックしてしまう🤔

    View Slide

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

    View Slide

  20. コルーチンの
    中断

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  29. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  42. 生放送が開始しない不具合が発生!

    エラーハンドリング追加まで
    やってみる
    見やすくなった
    コードから
    問題点を
    解決していく

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  49. Voicyの
    Qualityチーム
    既存機能の品質向上を担う
    ● 2022年から開発チーム編成を変更
    ● 変更前のチームでリリースした
    機能の保守責任が曖昧に
    ● 2021年リリースの生放送で
    障害発生
    ● 対応の流れでQualityチームが発足
    ● リリース済み機能の不具合対応や
    ユーザーからの問い合わせに対応

    View Slide

  50. Voicy server
    音声通信
    ・放送データ
    ・お便り
    イベント
    通信
    ・放送開始
    ・データ更新
    3つの通信経路を
    同時性を保って管理
    生放送の構成

    View Slide

  51. 見通しが悪くて
    どこが問題なのか
    なかなかわからない…!

    View Slide

  52. 生放送を開始する流れ
    1. 放送データを「予約中」から「放送中」に更新
    2. 生放送開始イベントを通知
    3. 音声を接続する
    4. 放送データの取得、更新
    ○ 放送データを作成
    ○ 自身のユーザーデータ取得
    ○ アイコン画像取得
    ○ お便りブロックユーザー一覧取得
    etc…
    順番は…?
    失敗した
    ときは…? よ〜〜〜く読まないと把握できない😇

    View Slide

  53. そもそもやってることが複雑
    ● 3つの双方向通信
    ● 通信の同時性を保つ
    ● たくさんのセットアップ処理
    開発していくうちにさらにどんどん複雑に
    ● 技術調査、実装、仕様調整を繰り返す
    ● 複数人で同時並行で開発する
    なぜ見通しが悪いコードに…?

    View Slide

  54. すぐ直すのではなく
    一度立ち止まってでも
    コードの見通しを
    良くする
    ● このままだと
    調査も修正も時間がかかる
    ● よくわからないまま修正して
    さらに不具合を生むリスク
    →問題を解決し
     問題を生まないために
     まず見通しを良くする

    View Slide

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

    View Slide

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

    View Slide

  57. 参考
    ● Understanding Kotlin Coroutines:
    コルーチンで進化するアプリケーション開発 @mhidaka

    ● Using Kotlin Coroutines in your Android App


    ● Android での Kotlin コルーチン | Android Developers

    ● Coroutines guide | Kotlin


    View Slide

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

    View Slide

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

    View Slide

  60. Thank you!

    View Slide