こんにちは、Androidチームの若宮(id:D_R_1009)です。 先日、JasperというOSSライブラリをリリースしました!
今回は開発目的やモチベーション、今後の方針などを記したいと思います。
Jasperとは
スタディプラス Androidアプリ内で利用しているUIパーツをベースに開発した、UIコンポーネントライブラリです。 2019年3月時点ではJasper-BottomNavigationViewのみとなりますが、今後ゲージやグラフなどのパーツを追加する予定です。
Jasperを作成した理由について
遡ること2016年、Androidアプリは大規模なリニューアルを行いました。 ありがたいことにGoogle Play「ベストオブ2015」・Google Play「ベストオブ2016」を受賞するなど、高く評価していただいています。
2016年以後も順調に機能開発、メンテナンスを続けております。 しかしながら基本的に既存機能に新たな機能を付け足す方向で開発を進めた結果、コード全体を見渡すと現在の時流に合わない実装が散見されるようになってきました。
この傾向は特に独自のUIカスタムビューに現れています。 一般にUIカスタマイズを追求していくと、Viewクラス内でCanvasの利用を行なったり、FrameLayoutを親クラスとして複数のViewを重ねがちです。 これらの手法はやりたいことに対する柔軟性が高い一方、メンテナンスのしやすさや高い描画パフォーマンスを保つ点において、開発者の技量に大きく依存していきます。
Jasperはこの問題に対する、一つの試みとなります。 開発にあたり、次の3つの目標を立てました。
- 多くの人の目を通してUIコンポーネントの質を高める
- 様々な要望を想定することでAPI設計を洗練させる
- 依存関係をクリーンな状態に保つ
多くの人の目を通してUIコンポーネントの質を高める
当然の話になりますが、OSSとしてライブラリを公開すると、全てのコードを一般公開することとなります。 結果として、スタディプラス社外の人にレビューをしてもらうこと以上に、スタディプラス社内のメンバーのコードを書く意識を引き上げると感じています。
社内にのみ開かれたコードベースを触っていると、どうしてもコードに対して妥協する余地が残ってしまいます。 コードに対して、満足いくまで検討することが難しい状況な場合もあります。また歴史的な経緯により、「後ほど検討する」こととして開発を進めることもあります。
OSSとして開発することで、より純粋に「より良いコードとは何か」を考えながら開発が進められると考えています。 これは開発チームにとって、コードの技術を高める非常に良いきっかけになるのではないでしょうか。
様々な要望を想定することでAPI設計を洗練させる
UIコンポーネントの開発において、個人的に一番難しいのはAPIの設計ではないかと考えています。
とりわけどういったケースでどういった表現を許容するか、その検討に時間を取られる印象があります。 必要性に駆られて開発をスタートする際は、開発目的に沿った設計であればまず十分と判断できます。 しかし将来的な機能の拡張やinterfaceによる抽象化など、一歩踏み込んだ設計は難しい設計に分類されると思います。
OSSで開発を進めていくと、将来的には「社外のケースにおいて必要となる」条件が生まれてきます。 また、開発やレビュー時にそういったケースを考慮に入れなければなりません。 そうなると自然と検討が必須となるケースが増えることとなるでしょう。
直接的にか間接的にかは明らかではありませんが、このステップはAPIの設計を少しずつ洗練させていくと考えています。
依存関係をクリーンな状態に保つ
既存のアプリからUIコンポーネントを外部へ切り出そうとすると、当然アプリ内部の依存グラフを整理することとなります。 この結果として、クラス間の関係性がライブラリ内で完結するようになります。
すでに開発をしているBottomNavigationBarでは、AndroidSDKのMenuクラスをそのまま読み込めるよう開発しました。 このための実装は一苦労だったのですが、この結果としてJasper独自のMenuオブジェクト開発を避けることができました。
依存関係については、ライブラリ間のスイッチングコストを抑える点でも役に立ちます。 特に2019年はSupport LibからAndroidXへの移行が必須となるため、AndroidSDKとKotlinへの依存のみで開発を進める予定です。
動作だけではなく、依存関係も軽量に開発を進めていければと考えています。
Jasperの今後
スタディプラスのAndroidアプリ内で使うUIコンポーネントは、可能な限りJasperとして実装していく予定です。 このためスタディプラスのAndroidアプリを開発する限り、Jasperのメンテナンスを続けていくこととしています。
2019年はまず既存のコンポーネントをOSS化すること、そしてandroidxのサポートに取り組む予定です。 機能追加や拡張についても順次取り組みたいと考えていますが、まずはUIコンポーネントライブラリとして立ち上げたいなと考えています。
スタディプラスではすでにJinraiというライブラリを公開しています。 社内ですでにOSSを開発し利用する先例があるため、Androidチームもその流れに乗ってやりきっていこうと話し合っています。
Jinraiの紹介はこちらの記事をご参照ください。
終わりに
Jasperについて、長々と書き連ねてしまいましたがいかがだったでしょうか。 もし関心を持っていただけましたら、ぜひGithubやGitterからご連絡ください。issueなどもお待ちしております。
また、スタディプラスでは一緒にJasperだけでなくスタディプラスを開発してくれるエンジニアを募集しています。 ご興味がありましたら、ぜひこちらからご連絡いただければ幸いです。