Teachme Biz Android の現場と現状

Kazuto Seito
スタディスト Tech Blog
7 min readAug 6, 2020

--

こんにちは。開発部の清藤です。Teachme Biz Androidアプリの開発を担当しています。近々、Teachme Biz Androidアプリのリニューアルを行う予定なので、アプリ内で使用している技術を棚卸しをすると共に私が普段どのような環境でTeachme Biz Androidアプリを開発しているのか書いてみたいと思います。

作業環境

まずは作業環境についてです。昨今、COVID-19の影響でリモートワークに切り替える会社が増えてますが、弊社も同様にリモートワークへ移行しています。基本フルリモートで、開発端末の回収等どうしても出社が必要な時のみ出社するような働き方をしています。COVID-19収束後は、今の所COVID-19発生前の勤務体制(状況に応じてリモート勤務可)に戻る予定です。

全ての業務を自宅で行うことになった結果、開発業務は今まで通りですが、打ち合わせが対面からZoomまたはGoogle Meetに変更になりました。私の場合は、打ち合わせで部屋が見える可能性があるせい(おかげ?)で部屋を定期的に片付けるようになり恩恵を授かっています。

また、日々の業務で使用する開発マシンのスペックは下記のようになっています。

開発マシンのスペック

Android StudioとAndroidエミュレーター2台ぐらいなら快適に作業ができます。入社時に貸与されるマシンは選択制で、本記事執筆時点ではネイティブアプリ開発者はMacbook pro 16inchが推奨されています。(参考:https://github.com/Studist/pc-list

開発環境

次にTeachme Biz Androidアプリの開発時に使用している技術スタックについてご紹介します。

言語

Teachme Biz AndroidアプリではKotlinを積極的に採用しています。ただ、既存コードにはJavaで書かれたものが多いため、新機能の追加を中心に徐々にKotlin化を進めています。詳しくは過去の記事を参考にして頂ければと思います。

現在の言語比率は、本記事執筆時点で下記のようになっています。

Teachme Biz Androidリポジトリの言語比率

アーキテクチャ

Teachme Biz Androidアプリの初回リリースは2013年で、当初はMVCベースのアーキテクチャでした。リリースからしばらくしてGoogleからDataBindingやAndroid Architecture Componentの発表がありAndroidにMVVMアーキテクチャを導入するハードルが下がるといった出来事がありました。また、近年弊社ではDDDを取り入れる動きが加速しておりTeachme Biz Androidアプリでも一部機能ではドメイン層・アプリケーション層が存在します。

その結果、アプリ全体で見ると下記3つのアーキテクチャが混在する状態になりました。

  • MVC
  • MVVM
  • MVVM+クリーンアーキテクチャ

一部にはこれらに該当しないものもあり、アプリ全体での統一はまだまだこれからという状況です。アプリリニューアルを進めるにあたり、この点にも注力し、アプリ全体でMVVM+クリーンアーキテクチャに寄せていく予定です。

アプリの構成要素

Teachme Biz Androidアプリには様々な機能があり、多様なライブラリが使われています。ここでは技術的な観点からTeachme Biz Androidアプリがどのように構成されているかご紹介します。

通信処理

通信処理では基本的にRetrofitを利用しています。また、古くからある機能については自作通信クラスを使っている箇所もありますが、現在リニューアルに向けてRetrofitへ置き換える準備を進めています。

データベース

ライブラリは使っておらず、SQLiteOpenHelperを使ってCRUD処理を記述しています。アプリリニューアルでデータの永続化が不要になる可能性もあるので積極的にリファクタリングを行う予定はありませんが、将来的にデータの永続化が必要であればRoomを導入した方が効率的にコードを書けるのではと思っています。

非同期処理

非同期処理は下記のクラス・ライブラリを使用しています。

この中で一番使われているのはAsyncTaskですが、Android 11で非推奨となったので置き換えが必要です。置き換え先はコードがJavaで書かれているならRxJava、KotlinならCoroutinesが良さそうです。将来的には、全てのコードをKotlinに置き換えてCoroutinesで統一するのが望ましいと考えています。

DI

前提として、MVVMアーキテクチャを導入する上で、各層に単体テストを書きやすくしたりクラス間を疎結合に保つためにDIは必須だと考えています。DIを行うにあたり、弊社ではDaggerを採用しています。学習コストが高いことで有名なライブラリですが、DI用のファクトリクラスを自分で作るよりは効率的に実装できるのではと思い採用しました。最近では、Dagger Hiltという、よりAndroidフレンドリーな拡張も出てきているので今後はこちらに置き換えていくのが良いかもしれません。

テスト

単体テストではJUnit4・Mockitomockito-kotlinRobolectric、UIテストではEspressoを使用しています。また、単体テストはViewModel・Modelに対して記述しておりカバレッジをjacocoで計測しています。本記事執筆時点で、条件網羅率が23%となっています。

UIテストは実行コストが高いので、主要機能のハッピーパスのみ確認して致命的なデグレを防ぐようにしています。

CI

CircleCIを使っており、CI上で実行しているタスクは下記になります。

静的解析の結果はGoogleスプレッドシートに送り可視化しています。なかなか時間が取れず警告・エラーの解消が断続的になっているのがわかります。

Googleスプレッドシートで作った静的解析結果グラフ

アプリリニューアルに向けて

スタディスト のAndroidアプリエンジニアが普段どのような環境で働いているか伝わったでしょうか。少しでも伝わっていたら幸いです。

冒頭にも書いたとおり、Teachme Biz Androidアプリはリニューアルを予定しています。このリニューアルでは、ユーザにより良いUXを提供することに加え、品質の高いアプリ開発を継続的に進めていくためのコードベースの刷新も並行して行っていく予定です。しかし、現在弊社のAndroidアプリエンジニアは1人(自分だけ)で、問い合わせや不具合の対応を行いつつアプリリニューアルを進める必要があり、技術的負債の解消も限定的になる可能性があります。

このような状況から弊社ではAndroidアプリエンジニアを絶賛募集中です。一緒にアプリリニューアルを進めてもいいよという方がいれば是非下記から応募して頂けると嬉しいです。

--

--