Radiotalk Tech Blog

Radiotalk株式会社のエンジニアが知見や取りくみについてを共有するテックブログです。

2020年のRadiotalk Androidアプリの開発現場

こんにちは、Androidアプリエンジニアの牧山(@_rmakiyama)です!

RadiotalkのAndroidアプリは、2018年のリリースから約2年が経ちました。この間に、Kotlin Coroutinesが正式版になったりJetpackがどんどん充実してきたりと、Android開発の事情も大きく変化していきました。それに合わせてRadiotalkのAndroidアプリ(以下Radiotalkアプリ)も少しずつ変化をしていっています。今回はそんなRadiotalkアプリの2020年時点での開発現場についてまとめます。
スタートアップ企業でどのような開発が行われているかのイメージが少しでも持っていただけたら嬉しいです。

アーキテクチャ

Radiotalkアプリではマルチモジュールを採用しています。 機能ごとでのモジュール分割を採用しています。別途特別なモジュールとして、Radiotalkのトークや番組など、主要なドメイン操作に関する機能をクライアントとして切り出し、処理を共通化させています。

f:id:radiotalk-tech:20201222224246p:plain

それぞれのモジュールは、MVVM + レイヤードアーキテクチャを採用して実装しています。

f:id:radiotalk-tech:20201222224418p:plain

少し変わっているところでいうと、UseCaseと名前のついているクラスがアプリケーションロジックとリポジトリパターンの責務を持つ実装にしている部分です。
ひとつのUseCaseにはひとつのパブリックメソッドを定義し、ユースケースに合わせてローカルとリモートのデータのやり取りをし、必要に応じてViewModelが求めるデータを返却します。

詳細はまた別の機会にということで割愛しますが、開発当初はRxJavaを全面採用していたところをKotlin CoroutineやLiveData、最近だとFlowを採用したりと、会社としてのフェーズとAndroid開発環境の進化とともにアーキテクチャも少しずつ変えていっています。まだまだチームも小さいので、開発者が責任を持ちながらも楽しく開発できることを第一に考え、積極的に新しい技術も取り入れています。

これからは、チームが大きくなったときのことを想定し、さらにスピードアップできるようなりアーキテクチャも考えています。

開発体制

Androidエンジニアはリリース当初からフルタイムだと私のみで、業務委託だとiOS/Androidを両方できる方にジョインしてもらっているため、1.5人くらいのリソースで開発しています。

タスクについては、ライブ配信などの大型施策、KPIを伸ばすためのグロース施策、UI/UXのカイゼンや不具合修正などの改善施策の大きく3つに分かれています。
大型施策は基本的にフルタイムの社員が取り組みますが、それ以外を放置してしまうとサービスとしての質が落ちてしまうので、グロース施策や改善施策についても業務委託の方と協力しながらオーナーシップを持って優先度をつけてバンバン取り組んでいます。

開発環境

MAD scorecardはこちらになります!

f:id:radiotalk-tech:20201222224429p:plain

Android Studio

現在は安定版の最新を使っていますが、betaやalphaも場合によっては使っていた経緯もあります。
これに関しては、リリースされる機能によって開発者体験が向上することをチームで合意が取れれば使っていこうという方針です。

minSdkVersion

21です。これについてはminSdkVersionを上げる基準はまだ明確化できていません。
コンテンツをストックできるサービスでもあるため、慎重に検討しつつ、23に上げるタイミングをはかっています。

Android App Bundle

対応済みです。NDKを扱うSDKもあるため早めに対応をし、かなりアプリサイズの削減ができています。

Jetpack Libraries

積極的に採用しています。主要なものだと、ViewModel/LiveData/WorkManager/Room/Dagger Hilt/Material Componentsなどを使っています。採用できていなものとしてはNavigationがあります。

CI/CD

CIはGitHub Actionsを使っています。プルリクエストに対するktlintの実行と、特定ブランチへのマージをフックにFirebase App DistributionへのAPKのアップを行っています。また、UI崩れがないかというヘルチェックの一環で1日1回Firebase Test Labを走らせています。

QAやリリースのフローは手動で行っているので、折を見て自動化していきたいです。

ドキュメント管理とプロジェクト管理

ドキュメント管理にはKibelaを使っています。施策の素案や詳しい仕様のまとめから、自己紹介や運用ガイドライン、アイデアなど様々なドキュメントを残す文化になっています。

小さいチームなので、タスク管理はスプレッドシートと口頭ベースで行っていました。コロナでのリモート勤務も長引き、少し課題感があったためアイデアベースで提案したところ、Clubhouseというプロジェクト管理ツールを使っています。

f:id:radiotalk-tech:20201222224546p:plain

その他のライブラリ

その他、プロジェクト内でよく使っているライブラリを一部紹介します。

  • ExoPlayer
    • 音声の再生周りを任せています。
  • Groupie
    • RecyclerViewを扱いやすくするライブラリです。好んで使っています。
  • Flipper
    • debugツールです。今年から導入しました。
  • Retrofit/OkHttp/Moshi
    • 通信はsuspend関数で呼び出しています。
  • Glide
    • Coilが気になっていますが今はGlideを全面的に利用しています。
  • MockK
    • テスト時のモックに使っています。
    • 恥ずかしながら最近徐々にテストを書き始めています。
  • RxJava
    • 非同期処理はCoroutines、値の監視はLiveData/Flowに置き換えています。
    • 今のところ、新規の部分で使う予定はなく消す予定です。
  • Kotpref
    • SharedPreferencesを扱いやすくするライブラリです。好んで使っています。
    • DataStoreの動向は横目で見ていますがまだ導入していません。

まとめ

今回は、RadiotalkのAndroidアプリの開発現場についてざっくりと紹介しました! スタートアップでの開発現場が少しでもイメージしていただけたら幸いです。プロダクトを成長させ、最速でユーザーに価値を提供させるためにも、開発現場の改善も日々行っていきます!

今回詳しく説明できなかった部分でもっと聞きたい部分がありましたら、ぜひカジュアルにお話しましょう!気軽に私にDMをするでもOKです!

meety.net

また、RadiotalkではAndroidエンジニアの採用も進めています!
書ききれない部分でカオスな面もあります。一緒にオーナーシップを持ってプロダクトの成長と開発現場のアップデートを推し進めてくれるエンジニアを絶賛募集中です! もしちょっとでも興味がある人は、Wantedlyからまずはカジュアル面談でお話しましょう!

www.wantedly.com