LIFULL Creators Blog

LIFULL Creators Blogとは、株式会社LIFULLの社員が記事を共有するブログです。自分の役立つ経験や知識を広めることで世界をもっとFULLにしていきます。

LIFULL における Kotlin Multiplatform(KMP)

こんにちは。エンジニアの菊地です。

今回は LIFULL HOME'S アプリでおこなっている Kotlin Multiplatform(以下、KMP)の 導入についてご紹介させていただきます。

LIFULL HOME'S アプリでは、2022年10月頃に KMPの導入の検討を開始しました。他の技術を含めて KMP 発表当時から簡単な調査や検討は行われていましたが、ちょうどこの頃に KMP が β版となったことにより本格的にプロダクトへの導入を検討することが可能となりました。

KMP とは

簡単に説明すると、Kotlin で書かれたコードを Android / iOS 両方で実行できるようにする技術になります。

KMP にする対象は?

LIFULL HOME'S アプリでは、下記の図にある Business / Domain、Data / Core の領域で KMP の導入をおこなっています。

導入するにあたって

KMP の導入にあたり、既存の LIFULL HOME'S アプリ(Android、iOS)とは別リポジトリで開発を行い、ライブラリとしてそれぞれ取り込んでもらう形を取りました。

ちなみに、LIFULL HOME'S アプリ(Android、iOS)で使用する社内ライブラリなどは別リポジトリで OS 別に存在しており、それらもゆくゆくは KMP に集約されるという構想になっています。

Compose Multiplatform の存在

LIFULL HOME'S アプリ(Android、iOS)では、UI 部分について Jetpack Compose(Android)や Swift UI(iOS)の導入をしていますが、全ての UI について移行できているわけではありません。

そのためコスト面を最適化するために Compose Multiplatform などもこのタイミングで検討することはできましたが、KMP と UI については分けて進めることができるため、現段階では Jetpack Compose(Android)や Swift UI(iOS)といったネイティブの部品を使うという選択をおこなっており、UI 部分は順次 Jetpack Compose(Android)、Swift UI(iOS)への移行を進めています。

どんな課題があったか

ドメイン知識の壁

LIFULL HOME'S は Android および iOS 向けのアプリのみを提供しているわけではなく、PC 向けやスマートフォン向けの Webサイトとしても提供されています。

取り扱っている物件の情報は LIFULL が提供しているものではなく、物件の情報を提供いただいて掲載しているものとなるため、物件を探しているサービスの利用ユーザーに対して提供する部分の開発だけではなく物件を掲載してくれているクライアント向けのシステムを含めて知識として知っておく必要があります。

LIFULL HOME'S アプリの開発・運用をしているだけではこれらを把握することは正直難しい部分もあるのですが、部署を横断して連携するようなシステムの開発となった際にはどうしてもこのドメイン知識が必要となってきます。LIFULL HOME'S アプリの開発をしたいのに、アプリ外のドメイン知識が少ないことで開発コストが膨れ上がってしまったり、意図せずバグを生んでしまう可能性もあったりしてアプリ開発の難易度が上がってきてしまっていました。

長年の積み重ね(技術的負債)

LIFULL HOME'S アプリは 2009年12月の iPhoneアプリの最初のリリースからこれまで長年にわたり運用しているため、蓄積された機能やノウハウと同じだけ負債も溜まっていました。

技術的な負債については、日々の運用業務の中で改善活動をおこなっているおかげもあり、負債が増え続けてどうしようもなくなるというような状態とはならずに運用ができています。

ただし今後も LIFULL HOME'S アプリの運用が同じようにできるとは限らず、どこかのタイミングで開発に割くコストよりも改善に割くコストの方が膨れ上がる可能性があり続けるため、さまざまなリスクが考えられました。

参考までに検討の中で挙がったリスクは下記のようなものです。

  • 新しい機能を提供する際に、様々な負債と付き合い続けてきたがために先に負債を返済しないと開発に取り掛かれなくなり、ユーザーへの価値提供が遅れてしまう
  • チームメンバーの入れ替わりにより、ドメイン知識を持つ人が減るとどうしてこうなっているのか?がわからないままメンテナンスせざるを得なくなる
  • 開発規模が大きくなればなるほどメンテナンスする量も増えてしまうため、機能開発ではなくメンテナンスをし続ける人員が出てきてしまう

どのサービスでも運用していく上で避けて通れないことばかりでありますが、サービスを健全に運営し成長させ続けていくためには向き合わなければならないことになるため、何か方法がないか?とずっと KMP 以外の選択肢も含めて検討を続けてきました。

リソースの問題

LIFULL HOME'S アプリでは、アプリチームとして Android および iOS アプリの開発をおこなっていますが、基本的にはそれぞれがメインとなる OS を持って業務をおこなっているため、Android チームと iOS チームの2つのチームでアプリチームが成り立っています。

普段の開発ではアプリのプラットフォームが別なのでそれぞれのチームで個別で進められていきます。アプリとしては同じサービスとなるため共通となる API等の開発ももちろん行いますが、そこに割くリソースの割合はそこまで大きくはありません。

この時、チーム間でこれまでの経験の差などにより、どちらかの OS の開発が遅れてしまうといった際にもう一方のチームのリソースは空きがあるのに知識がないため、手伝うことができずどちらか一方のチームだけ残業が増えたりといったことが起きていました。

テストなど分担できるようなものは問題がないのですが、Android と iOS を横断して開発している人は少ない(一部いる)ため、チームとしてリソースの最適化が難しいという課題を長年抱えておりました。

この状態になってしまうと、どちらもしっかりと仕事をしているのに同じアプリチーム内で極端に業務量に差があるように見えてしまうため、健全な開発はしにくくなってしまいます。

なぜ KMP を選んだのか

まず選択肢としては KMP 以外も含めて検討を繰り返してきました。Web ベースにしてしまうことも検討されたことはありますし、近年では有力な候補として Flutter で書き直すという検討もありました。

ではなぜそれらの候補の中から KMP を選んだか?についてですが、いくつかの理由があります。

自社開発のアプリチームが存在している

仮に Flutter に移行した場合を検討した際に下記のようなことが懸念事項としてありました。

  • ネイティブアプリエンジニアから Flutter へは実質的なスキルチェンジが必要となるため、それぞれのキャリアにも影響がある
  • Flutter にしたとしてもコアとなる部分はネイティブコードを理解する必要が出てくる

LIFULL では社内で開発チームを持ってアプリを作っているので、これまでの運用に培った運用のノウハウなどのかけがえのない経験やネイティブアプリのコードが書けるエンジニアもチームには揃っています。

その資産(ノウハウや人)をチームとして活かしていくことを考えると、Flutter ではなく KMP を選び、ネイティブアプリを書きたいエンジニアが書ける環境を残した方が良いと判断しました。

コードの共通化

開発効率を向上させるためには、サービスとしては共通なのに OS 毎で実装してしまっているビジネスロジックやライブラリを共通化する必要がありました。これは開発だけでなくメンテナンスコストも含めて純粋にコストの削減につながります。

これは KMP に限らず解決する手段はありますが、Android エンジニアが Kotlin の知識をそのまま活用して開発することができるというメリットが大きいと考えました。

ドメイン知識のハードルを下げることができる

LIFULL HOME'S のアプリを開発・運用していく上で悩まされることの一つとして膨大な量のドメイン知識の問題があります。

この問題について、ドメイン知識が必要となるビジネスロジック部分などの開発に経験豊富なメンバーを当てて開発を行いライブラリとして提供することで、経験が浅い若手がドメイン知識のハードルを気にすることなく UI 部分の開発などが行えるようになると考えました。

UI 部分の自由さ

今回のような KMP の導入の仕方であれば、UI については Jetpack Compose(Android)、Swift UI(iOS)といったネイティブで提供されるものをエンジニアが自由に選択できるというメリットがあり、ネイティブエンジニアの楽しみを奪うことがありません。

新技術への挑戦のしやすさ

Flutter などでも新しい技術は早い段階で導入が行われますが、安定性などを考慮するとネイティブに軍配が上がります。

LIFULL HOME'S アプリでは、かざして検索といった AR を駆使した機能などを比較的早い段階で導入してリリースすることがあるため、そういった観点でもビジネスロジックのみを共通化できる KMP の方が向いていると考えました。

lifull.com

エンジニアのキャリア

LIFULL HOME'S のアプリチームでは、全社で利用する共通的な API を呼び出すために自分達のチームで管理しているマイクロサービスとなる API を運用しています。このマイクロサービスの開発を行うためには共通的な API を理解する必要があり、ドメイン知識が必要となってきます。 これまではアプリエンジニアのキャリアとして、アプリを作りながらある程度慣れてくるとドメイン知識が必要となるマイクロサービスの開発を行うということがあり、調査だけでなく理解するのも一苦労となるため、結果としてアプリを作りたいのにサーバーサイドの開発に時間がかかるようになってしまうということがありました。

KMP の導入にあたりマイクロサービスに集約されていたビジネスロジックを KMP に移行していくため、マイクロサービスの開発の負荷を減らすこともでき、何よりビジネスロジックを作るのはアプリ側となるため、純粋にアプリ側の開発をする機会が多くなりました。

そして何よりも、これまでは難しかった片方の OS のアプリチームの手が空いているのにもう片方の OS のアプリチームのタスクを手伝うことができないといった課題について、KMP 部分でビジネスロジックの開発を請け負うことや、設計周りが共通化されることで相談やレビューもしやすくなるというメリットも生まれてきており、Android エンジニアや iOS エンジニアという枠組みではなく純粋にネイティブアプリエンジニアとしてのキャリアを模索することができるようになりました。

KMP 導入における課題

iOS エンジニアの Kotlin に対する恐怖心

Android と iOS のどちらの経験もあると Swift がかければ Kotlin もそんなに怖がることないと思うのですが(あくまで個人的な感想です)、やはり未知の環境での開発に急に移行するとなると不安の声はありました。

こちらについては、KMP 導入を進める際に私が先行して調査などもしていたため、Android エンジニアと iOS エンジニアそれぞれから KMP 開発に人員を当ててもらい、開発しやすいところからお試しで体験してもらうといった形で慣れていってもらいました。

実際に、Kotlin の経験がなかった iOS エンジニアも特に違和感なく KMP の開発ができるようになっています。

プラットフォームごとに考慮が必要なことが意外とある

これは KMP で開発を進めていくと、プラットフォームごとにそれぞれのコードを書く必要が出てきた場合や、KMP として提供するライブラリをネイティブ側で取り込んで使おうとした際に躓くケースがいくつかありました。

ですが、LIFULL よりも先に KMP の導入をおこなっている方々が多くいるため、先人の知恵をお借りしてあまり苦労せずに切り抜けることができました。

移行する対象が膨大

当たり前ですが長年の積み重ねでアプリ内に存在するビジネスロジックは膨大なものになっています。これを開発サイクルをできるだけ止めずに移植していくのを考えるというのが非常に大変でした。

LIFULL HOME'S アプリでは、Android 側のロジックを優先的に移植していき、iOS では機能開発する際に取り込めるものがあれば取り込んで徐々に KMP を導入するという形をとっています。

そのため、ビジネスロジックについては Android の方が先に KMP への移行が完了する見込みですが、KMP を導入した機能の開発は iOS 側で行なわれることが多く相互的に補完することができています。

まとめ

今回は、LIFULL HOME'S アプリにおける Kotlin Multiplatform の導入についてご紹介させていただきました。

LIFULL では長年運用されている LIFULL HOME'S アプリにおいて様々な課題に対する一つの答えとして、KMP を導入するという選択を行いました。

完全な移行はこれからでまだまだ時間がかかりますが、KMP 導入という判断を行ったことでチーム内でこれまで Android と iOS でビジネスロジックは同じであるにも関わらず、それぞれのプラットフォーム向けに開発やテストを行う必要があること、膨れ上がった負債についてのメンテナンスコストは仕方のないことなど、半ば諦めながら開発をおこなってきたところが解決できる兆しが見え、やりたかったことができるようになるのではないか?という感覚をチームのみんなが持つようになりました。同じような課題で悩まれている方々や KMP の導入を検討している方々に対して、選択肢の一つとして KMP を検討しても問題ないと自信を言える状況になっています。

またこのタイミングでこれまでやれていなかったこと、やりたかったことも併せて検討してやっていこうというチーム内の雰囲気も出てきているため、さらに様々な改善が行われていくことになると思います。

KMP 導入により様々な課題の解決が見えてきていますが、UI であったりテストであったり、運用面の改善含めてまだまだやることはたくさんあるため、継続的に検討を行い続けることでチームとしてサービス開発・運用を楽しみながら成果が出せる環境作りを進めていこうと思います。

最後に、LIFULL では LIFULL HOME'S アプリの KMP 導入を一緒にしてくれる仲間を募集しております。ご興味ある方はぜひご応募ください。

hrmos.co

※ 今回、ご紹介した LIFULL HOME'S アプリはこちらになります

賃貸物件検索 ホームズ 不動産・部屋探しHOME'S

賃貸物件検索 ホームズ 不動産・部屋探しHOME'S

  • LIFULL Co., Ltd
  • ナビゲーション
  • 無料
apps.apple.com

play.google.com