LINE株式会社は、2023年10月1日にLINEヤフー株式会社になりました。LINEヤフー株式会社の新しいブログはこちらです。 LINEヤフー Tech Blog

Anko→Jetpack Compose移行の裏話。LINEスタンプメーカーの技術的負債解消のために

LINE株式会社およびヤフー株式会社は、2022年11月17日・18日の2日間にわたり、技術カンファレンス「Tech-Verse 2022」をオンライン(ライブストリーミング形式)にて開催しました。特別連載企画「Tech-Verse 2022 アフターインタビュー」では、発表内容をさらに深掘りし、発表で触れられなかった内容や裏話について登壇者たちにインタビューします。今回の対象セッションは「AnkoからJetpack Composeへ、LINEスタンプメーカー技術的負債解消の道のり」です。 

LINEスタンプメーカーは、LINEで使用・販売できる独自のスタンプを作成するアプリです。かつてLINEスタンプメーカーのAndroidアプリには、Kotlin DSLでUIを作成できるUIフレームワークのAnkoが採用されていました。しかし、AnkoがDeprecationになったことをきっかけとして、Jetpack Composeへの移行を行ったのです。その過程で開発者たちが直面した課題や移行戦略についての秘話を、LINE FukuokaのSticker Maker App Dev Teamに所属するAndroid DeveloperのPo-Hao Chenが解説します。

   

AnkoからJetpack Composeへの移行を成功させるための秘訣 

――今回のインタビューでは「Tech-Verse 2022」のセッションをふまえ、より深掘りした内容を伺います。セッション内では「既存のUIのコードには、直接的にDBを参照している箇所やWeb API呼び出しを行っている箇所があり、コンポーネントの責務の分離ができていなかったこと。そのため、Jetpack Composeへの移行に合わせて設計のリファクタリングを行ったこと」を解説されていました。改善案としてクリーンアーキテクチャを導入されていましたが、この施策においてシステム設計で工夫したことはありますか? 

おっしゃる通り、Anko時代に作られたUIのコードにはデータソースを直接参照している箇所がいくつもありました。レイヤーごとの責務が混在していることが、AnkoからJetpack Composeへの移行を行ううえで障壁になっていたんです。それを改善する目的で、コンポーネントの責務を綺麗に分割しやすいクリーンアーキテクチャを導入しました。 

 Androidアプリへのクリーンアーキテクチャ導入については、Googleがベストプラクティスを提唱しています。そしてベストプラクティスでは「アプリケーションのすべてのコードを、クリーンアーキテクチャの原則に基づいて適切にコンポーネント分割し、コンポーネントの役割を明確にすること」が謳われています。ですが、そのベストプラクティスをそのまま自分たちのAndroidアプリに適用すべきではないというのが、チームメンバーの共通認識でした。なぜなら、不必要にアプリケーションの設計が複雑になってしまう可能性があったからです。 

 そこで、シンプルな機能の場合はわざわざユースケースレイヤーを設ける必要はないだろうとか、複雑な機能あるいは再利用される可能性が高い機能の場合はユースケースレイヤーを設けたほうがいいだろうといった議論を、チーム内で重ねました。また、なるべくテストコードを書きやすい設計にし、アプリケーションの品質を向上させることも目指しました。 

――セッション内では「Anko LayoutsとJetpack Composeとでデータバインディングのタイミングが違うために問題が発生したこと」を解説されていました。この事例のように、ライブラリ移行の際に仕様の差異によるトラブルが生じることはよくあると思うのですが、Anko LayoutsとJetpack Composeの差異についての調査のために取り組まれたことがあれば教えてください。 

 Anko Layoutsの挙動は基本的に、XMLで記述する従来のAndroid Viewとほぼ変わりません。コードの書き方が違うだけで、内部構造としてはAndroid Viewと同じような仕組みで、命令的UIの概念に基づいています。一方、Jetpack Composeは宣言的UIの概念に基づいて作られており、設計思想そのものが異なっています。 

 そのため、ライブラリの移行を行う前の段階から、書籍やWebの記事を読んだり、チーム内で勉強会をしたり、Jetpack Composeの開発者にSNSで質問を投げたりと、Jetpack Composeに詳しくなるための調査を続けてきました。自分自身やチームメンバーのリテラシーを向上させることを意識しましたね。 

 ですが、移行を進める段階になると、実際にライブラリを使ってみなければ判明しないトラブルなどにも遭遇します。そうした場合にはチームメンバー同士で情報を共有して、同じ轍を踏まないようにしていました。エンジニアはどうしても、何か課題に直面したときひとりで頑張って解決しようとする傾向にあります。ですが、実際には複数で意見を出し合って考えるほうが、早く解決できますから。 

――Jetpack Composeの仕様を理解するために参考にした書籍やWebの記事などで、おすすめのものはありますか? 

私は『Jetpack Compose internals』という本をよく読んでいます。これは、Jetpack ComposeのUIに関することだけではなく、内部構造についても解説している本ですね。それから、初学者の場合はGoogleの「Codelabs」で学習するのも効果的です。他にも、Androidカンファレンスの「DroidKaigi」や記事投稿サイトの「Medium」などでJetpack Composeの情報をインプットすることも、効果的な学習につながります。 

 <Poさんの推奨する「DroidKaigi」や「Medium」のリンクはこちら> 

 

 ――これからAnkoからJetpack Composeへの移行をする読者に向けて、伝えておきたいことはあるでしょうか? 

先ほどの説明と重複しますが、従来のAndroid ViewとAnkoはいずれも命令的UIの概念に基づいており、扱うエンジニアのメンタルモデルに変化はありません。一方、Jetpack Composeは宣言的UIであるため、明確にメンタルモデルの切り替えが必要です。Googleが運営するAndroid Developers Japanブログに「Compose の考え方について」という良い記事があるので、ぜひこれを読んで宣言的UIの概念を学ぶことをおすすめします。 

アウトプットを続けチームをリードするエンジニアでありたい 

――セッションの発表内容から、ライブラリの選定や実装計画の立案、リリース戦略の策定といった、リサーチやプランニングの作業が良好に行われていることが伝わりました。リサーチやプランニングを成功させるためにチーム内で工夫していることや、その特徴がよく表れている他の事例があればご説明ください。 

 Sticker Maker App Dev Teamでは大きいプロジェクトが開始される前に、技術的な方針やプロジェクト方針をまとめたドキュメントを、プロジェクトをリードするメンバーが用意します。そして、テックレビューやプランニングレビューのミーティングを開催し、複数のメンバーからのレビューを受けます。テックレビューを行う際には各メンバーに理解してもらいやすいように、小規模なPoC(Proof of Concept:概念実証)のアプリケーションや機能を作ったうえでレビューに臨むことも多いです。 

 その特徴がよく表れている他の事例としては、Kotlinの採用が挙げられます。LINEスタンプメーカーのAndroidアプリは数年前にKotlinで作られましたが、当時はまだKotlinを採用している企業がそれほど多くありませんでした。当時(2016年末)、Googleはまだ正式にKotlinを推奨してないため、チームメンバー全員でKotlinについてドキュメントをまとめたり、PoCアプリを作って、Javaとの互換性やJavaライブラリーとの共存性を確認したり、そしてAndroidサポートバージョンの確認など、実現可能性を確信した上でぜひ導入しようという結論になったそうです。 

――Sticker Maker App Dev Teamにいたからこそ経験できたことはありますか? 

 Sticker Maker App Dev Teamは、LINE社内では比較的小規模なチームであるため、各種の意思決定をとてもスピーディーに行えます。そのおかげで、新しい技術を積極的に取り入れられる環境です。たとえば私たちは、RealmやRxJava、KotlinのCoroutineなどを早い段階に導入しています。  

――LINEスタンプメーカーの開発や運用に携わる面白さはどのような点ですか? 

 LINEスタンプメーカーはスタンプを作るためのアプリであり、基本的にクリエイターの方々が使用するものです。だからこそ、「ユーザーはいったいどのようにアプリを使うのだろう」と、想像力を働かせてユースケースを考えること自体が、非常に面白いです。なかには、思いもよらないLINEスタンプメーカーの活用法を実践するユーザーもいます。そんなときには、クリエイターの方々の持つ創作力のすごさを感じるとともに、アプリの活用の幅が広がったようで嬉しくなります。 

――最後に、Poさんのエンジニア個人としての今後の目標を教えてください。 

 私はLINEの採用面接を受けた際、面接官に「アウトプットできるエンジニアになりたい」という目標を伝えました。そして実際に、ミートアップのパネルディスカッションに参加したり、LINE Fukuokaが運営するPodcastの企画・収録をしたり、今回の「Tech-Verse 2022」に登壇したりと、積極的にアウトプットを続けてきました。特に「Tech-Verse 2022」は周囲の方々によるサポートのおかげもあり、本当に良い経験になったと思っています。これからも、各種のアウトプットに取り組みたいです。 

 また、今回のAnkoからJetpack Composeへの移行で、私は初めてチームをリードする立場になりました。今後も引き続き、仲間たちをリードできるようなエンジニアを目指していこうと思います。  

――これからの、さらなる活躍が楽しみです。今回はありがとうございました。