みんなが知ってるあのサービス、実はゆめみが作ってます。そんなゆめみの開発の裏側をご紹介いたします。
開発体制・開発フロー
ゆめみでは、20〜30のクライアントのリポジトリを約30名のAndroidエンジニアがメンテナンスしています。⼀部のプロジェクトを除き、コードはGitHub(Enterprise Cloud)で管理しており、社内のAndroidエンジニアはどのAndroidプロジェクトのコードでも閲覧できるようになっています。
ゆめみは、品質の担保や知⾒の共通を⽬的に、プルリクエストをきちんとレビューする⽂化を⼤切にしています。プロジェクト内のレビュアーの他に、プロジェクトを横断したテックリードによるコードレビューを⾏っています。
CI/CDは以前はBitriseを利⽤していましたが、最近はGitHub Actionsを利⽤することが多くなっています。最近のCI/CDへの取り組みについてはスライド「GitHub Actionsで構築するAndroidアプリのCI/CD」をご覧ください。
現在では、ほぼすべてのメンバーがフルリモートで働いており(コロナ収束後もフルリモートの⽅針です)、コミュニケーションはSlackやZoom、oViceを活⽤しています。
アーキテクチャ
全体的にJetpackライブラリの導⼊が進んでいることから、JetpackのViewModel/LiveData/Flowを利⽤したMVVMの構成とすることが多いです。FluxやMVI等の構成としているプロジェクトは、今のところありません(⼀部の古いプロジェクトではMVPの構成ですが、MVVMへの置き換えを進めています)。MVVMを採⽤している理由は、次のとおりです。
- Jetpackライブラリの進化に容易に追随するため
- 社内メンバーがプロジェクトを移動する際の学習コストの最⼩化
ただ今後は、Jetpack ComposeがAndroidアプリ開発で広く利⽤されることが想定されますので、それに合ったアーキテクチャを模索している段階です。
利⽤⾔語
古くからメンテナンスしているプロジェクトでまだJavaのコードが残っていることはあるものの、コードはほぼKotlinで書いています。Javaのコードも積極的にKotlinに置き換えを進めています。⾮同期処理はKotlin Coroutinesを利⽤しています。
コード規約は社で独⾃なものは特に定めず、Kotlin標準を社内標準とし、それに合わせた社内共通のコードフォーマッタを⽤意しています。CIで利⽤するLinterにはktlintを採⽤しています。
利⽤ライブラリ
利用ライブラリは、GoogleのJetpackライブラリとKotlin系のライブラリ(Parcelize、Serializationなど)を中⼼にしており、画⾯遷移には主にNavigation Componentを利⽤しています。
DIライブラリは以前はKoinを利⽤することが多かったのですが、最近のプロジェクトではDagger Hiltを採⽤することが多いです。複雑なRecyclerViewの構築ではEpoxyを利⽤することもあります。
画像ローダーには以前はPicassoやGlideを利⽤していましたが、最近はCoilを使っています。
データの永続化については、⼀部の古いプロジェクトではRealmやOrmaを利⽤していますが、多くのプロジェクトではRoomを採⽤しています。
サーバとの通信はRESTが中⼼ですのでRetrofitとOkHttpを利⽤していますが、Retrofitの代替としてKtorなどのKotlin Multiplatform向けのライブラリの活⽤も検討しているところです。
どのようなアプリを作っているか
サーバサイドとREST APIで通信するスマートフォン向けのアプリ(Google Playで公開するアプリ)が最も多いですが、タブレット端末向けのアプリや、Bluetooth等を⽤いて特定のハードウェア機器と連動するようなアプリを作ることもあります。
以下は当社が公開している開発事例(⼀部)です。
- NTTドコモ |「dmenuニュース」アプリ(ストレスのないUXの提供)
- 高島屋|アプリを経由したリアル店舗への送客と購買体験の向上
- マイナビ|「マイナビ転職アプリ」ご担当者様インタビュー 多様な視点を持ったチームで挑む、新たなユーザー体験づくり
- エイベックス・エンタテインメント|“音声のAR体験”を可能にする「CEATEC2019」向けデモアプリ開発
YUMEMI.apkの運営
AndroidやKotlinに関する技術の発信や知⾒の共有の場として、「YUMEMI.apk」を定期的に開催しています。前回は2021年9月10日に第5回を開催しました。
今後も定期的に開催していきますので、ぜひ参加ください。
今後、取り組んでいきたいこと
組織に関して
ワーキンググループ活動の活性化
ゆめみでは開発プロジェクトの他に、技術獲得や組織運営を⽬的とした複数のワーキンググループが存在します。このワーキンググループはここ最近⽴ち上がったものが多いので、本格的に活動をこれから開始していきます。
Androidエンジニアの育成
育成ワーキンググループで研修課題の充実化を進めており、新卒の⽅がスムーズに実際のプロジェクトに参画できるような環境の整備を進めています。ゆくゆくは新卒の⽅だけではなく、中途の⽅の育成にも拡⼤していき、リードエンジニア相当のメンバーの割合を増やしていく予定です。さらに、研修課題の⼀般公開化を進めていきます。他の企業様にも使⽤していただけるように改善していき、業界全体の技術⼒やプロジェクト推進⼒の底上げなどにも貢献できたらと考えています。
AndroidやKotlinに関する情報発信
YUMEMI.apkや各種カンファレンス・勉強会、各メンバーのブログ記事等を通して、社内の知⾒を積極的に公開することで、業界全体へ貢献していきます。
技術に関して
Jetpack Composeの導⼊
⼀部のプロジェクトにはJetpack Composeを導⼊し始めていますが、全体として実プロジェクトにはまだ本格的には導⼊していない状況です。今後、社内で知⾒をためるとともに、Jetpack Composeのような宣⾔的UIに相応しいアーキテクチャを模索していきます。
さらに、Jetpack Composeの導⼊にあわせて、デザインシステムやデザイナーとの連携⼿順の整理、ワークフローの⾃動化、デザインのカタログ化などに取り組んでいきたいと考えています。
⾃動化の推進
すべてのプロジェクトではないのですが、OpenAPI Generatorによるコードの⾃動⽣成を⾏っています。各プロジェクトへ適⽤するとともに、その他のワークフローについても⾃動化を推進していきます。
テストカバレッジの向上
テストコードが書かれているプロジェクトは増えてきました。引き続きカバレッジの向上を⽬指していきます。
KMM(Kotlin Multiplatform Mobile)
KMMについては、まだ実プロジェクトへの導⼊実績はありませんが、社内でワーキンググループを⽴ち上げ、調査と検証を進めています。
Flutter
Flutterについては、まだ数は少ないですが実プロジェクトへの導⼊実績があります。Androidネイティブに加えて、Flutterの採⽤事例も今後拡⼤していきます。
採⽤について
現在、積極的に新卒・中途のAndroidエンジニアを採⽤しています。また、在校⽣に向けて、通年インターンを実施しています。コーディング試験はGitHubで公開していますので、興味のある⽅はぜひご覧ください。
ゆめみの求⼈
最新の求⼈情報をご確認ください。
ゆめみの社内制度
「ゆめみオープン・ハンドブック」として公開しています。
著者紹介
久須 裕之、岡山 達哉
Androidエンジニア。クライアント向け開発を始め、社内のAndroidグループの組織課題への取り組みや採用を担当する。