Android版Misocaの技術選択

f:id:komatatsu:20180705160422p:plain こんにちは @k0matatsu です。
Android版Misocaアプリがとうとうリリースされましたね。
やっとスタートラインに立てたことが本当に嬉しいです。

2009年に日本で初めてAndroid端末が販売されたのが9年前です。
それからAndroid界には様々な変化がありました。
そんな中で今から全く新規にアプリを書き起こすのは楽しかったです。

言語

JavaとKotlinの両方を使っています。
iOSと違ってAndroidはKotlinへの移行を促されているわけではないですし、それぞれ良い面があると思うのでJavaを禁止するようなことはしていません。
プログラムの内容や言語の特性、書く人間の好みでJavaとKotlinどちらを使うか選んでいます。

非同期処理

非同期処理にはkotlinx.coroutinesを利用しています。
前職などではRxJavaが非同期処理にも使われていたのですが、非同期処理以外で使う場面がほとんど思い浮かばなかったですし、too muchかなと思って避けました。

kotlinx.coroutinesはまだv1.0になってないのですが、うまく行かなかったら別の方法に切り替えようと思って導入に踏み切りました。
async/awaitは回りくどくなくてよく馴染みます。

Kotlin Android Extensions

悩ましいParcelizeを解決するために、Kotlin Android Extensionsを利用しました。
Parcelizeはexperimentalな機能なのでどうしようか迷っていたのですが、Kyashさんでも利用されているとのことで、エイヤッと導入しました。 *1

今の所特に問題なく動いているのでこれもこのまま行けそうです。

一方で、Kotlin Android Extensionsのメイン機能であるViewとのBindingは全く利用していません。
xmlではスネークケースを利用しているため、コードの中にキャメルケースとスネークケースが混在するのを避けたかったためです。

CI

社内にすでにあったJenkinsを利用しています。
ファーストリリースに向けてアプリ自体の開発に比重をおいていたので、まだあまり洗練された状態にはできていませんが、dangerを使ってlintの結果をPRにフィードバックしたり、PRごとにapkをアップロードしたりと、一通りの機能は揃えました。
lintやcheckstyleを機械的にチェックすることで、うっかり良くないコードが入ってしまうのを防いでいます。
これらはコードベースが大きくなってから適用するのはめちゃめちゃ大変なので早い段階で導入しました。

lintはdanger-android_lintktlintを使っていて、ルールは一部カスタマイズしています。

そのほか

API Clientにはretrofit2を使っています。安定ですね。
DIは今の所使ってないのですが、これから必要になりそうなのでToothpickを選択肢として考えています。
リリースはもちろんApp Bundle形式を採用しています。

これからの課題

そんなわけで結構エッジよりな構成になったのではないかなと思っております。
まだAACも導入できていないですし、開発が佳境に入ったところでjetpackの発表があったため正直全然追いつけていません。
ひとまずLiveDataから導入を試みているのですが、Android専任のエンジニアは私一人なので中々手が回っていないというのが実情です。

おわりに

過去の遺産やしがらみのない状況で、自由な裁量の元あれこれ考えながら開発を勧めて行くのは非常にエキサイティングな体験でした。
ユーザーに価値を届けるのは我々の責務ではありますが、どうせなら楽しく開発したい!そんな思いで日々開発を進めています。
Misocaでは一緒にモバイル開発をしてくれる戦友を募集しています。
良い部分をあげるとキリがないのでぜひ一度オフィスに遊びに来ていただいて雰囲気を感じて貰えればと思います。

www.wantedly.com

*1:konifarさんはKyashのエンジニアの方です