登壇者の自己紹介

川原友希氏(以下、川原):「Kotlinと Flutterを愛であう会 for Android開発」のセッションを始めます。まずは登壇者を紹介します。では、まず山田さんお願いします。

山田淳登氏(以下、山田):はい。山田です。MIXIで今は「TIPSTAR」というアプリをAndroid開発していて、Android側のテックリード、チームのマネジメントなどをやっています。本日はよろしくお願いします。

では次にoidyさん、お願いします。

追田泰宏氏(以下、追田):はい。追田と申します。社内だと「oidy」と呼ばれることが多いです。Androidアプリの開発はだいたい10年ぐらい前からやっていて、その時はKotlinではなくてJavaで開発していたんですが、2018年頃からKotlinで開発し始めて、2023年あたりからFlutterのプロジェクトにジョインして、最近はFlutterでアプリを作っていることが多いので、Flutter歴はだいたい1年未満ぐらいという感じです。よろしくお願いします。

川原:お願いします。最後に久野ちゃんお願いします。

久野文菜氏(以下、久野):はい、久野です。久野は学生の頃にiOSアプリをずっと開発していて、2021年にミクシィ(現MIXI)に入社してからはFlutterを使ってアプリ開発をするようになりました。今でも新規事業でFlutterを使ってアプリを開発しています。なので、Flutter歴は3年ぐらいになります。今日はよろしくお願いします。

川原:では、本日モデレーターを務めます。川原と申します。私は新卒でtoCサービスの開発をしていたのですが、今では新卒採用全般を担当しています。本日はこのメンバーでお話ししていきます。よろしくお願いします。

川原:ではまず、KotlinとFlutterについて簡単にお話しします。MIXIでは、Flutterは新規事業系で利用するケースが多くて、Kotlinは「家族アルバム みてね」や「TIPSTAR」、「minimo」など、さまざまなサービスで利用しています。KotlinもFlutterもAndroidアプリの開発ができますが、Kotlinは言語になっていて、Flutterはフレームワークになっています。

Flutterがクロスプラットフォーム開発ができることは有名かなと思いますが、Kotlinも近年ではクロスプラットフォーム開発ができるようになっています。本日はKotlinやFlutterの良いところとか違い、愛でたいところを、Android開発に焦点を当てて、エンジニアたちの座談会形式でお送りするセッションとなっています。

KotlinによるAndroidアプリ開発で特に重宝している機能は?

川原:ではさっそく、「KotlinとFlutterの愛でポイントを探る10の質問」をやっていきます。1つ目、「KotlinによるAndroidアプリ開発で特に重宝している機能は何でしょうか?」。こちらは歴の長い山田さんからお願いします。

山田:よろしくお願いします。先ほどの自己紹介では忘れていたのですが、Android開発は13年ぐらいやっています(笑)。

しばらくやっていて重宝しているところなのですが、Kotlinといえばコルーチンを使えることがかなりいいことかなと思っていて、Android開発はリソースの開放や、ライフサイクルの意識などをしなきゃいけないのですが、そういった管理が簡単にできる点がいいのかなと思います。追田さんは、どうですか?

追田:そうですね。他だと特に最近思ったのは、バージョンカタログという機能が便利で、それを使えるようになったのが2023年ぐらいだと思います。そこから徐々に開発環境側でもサポートが強化されてきて、最近ではどんどん使いやすくなって、今だと導入しやすいのかなと思います。

川原:ありがとうございます。

Kotlinによる開発で感じた強みと課題と、Flutterによる開発での異なる点

川原:いろいろあるので次にいきますね。では次、「Kotlinによる開発で感じた強みと課題と、Flutterによる開発での異なる点」について聞けたらと思います。ではここは両方経験しているoidyさんからお願いします。

追田:そうですね。もともとKotlinで開発していたのですが、その時はGoogleが作っている公式のライブラリが充実していて、開発ガイドなども丁寧に作られていて、公式のライブラリを使えばだいたいアプリが作れる感じだったので、それが便利だったかなと思います。

逆にFlutterのほうはサードパーティのライブラリを使いこなす必要があって、いかにうまいことそのサードパーティのライブラリを使うかが重要になるという点が大きく異なるかなと思います。久野さんは何か……。

久野:すみません、Kotlinは実はまだチュートリアルぐらいしか触ったことはないのですが、Flutterもチュートリアルでアプリを作れて。Kotlinもチュートリアルがちゃんと用意されていて、どっちも気軽にアプリを作れるという点では一緒だなと思ったのですが、Flutterのほうで最初に作れるアプリはカウンターアプリで、Kotlinだとテキスト表示だけなのですが、Flutterだとちゃんとボタンがあって。カウントアップされてみたいな感じで、最初から何か動くものが出来上がる点だと、ちょっとだけFlutterのチュートリアルは良いなと思いました。

FlutterによるiOS開発からAndroid開発の両方を経験して感じた違い

川原:では次にいきますね。次は「FlutterによるiOS開発からAndroid開発。両方経験してどんな違いを感じましたか?」。これは久野さんにお願いします。

久野:そうですね。実はiOS開発の前に大学1年生ぐらいの時にJavaを使ってAndroid開発をしたことがあったんですが、分厚い本を読みながらじゃんけんアプリを作ろうとした時に、まず「Android Studio」を入れて、カクカクの中、重くて動かないとか、Javaで冗長にめちゃくちゃ書かないといけないのに、出来上がったのはじゃんけんでパーが出せるだけみたいな感じのアプリが出来上がりました。

その時から「Androidアプリ開発は正直めちゃくちゃ難しいのでは?」と思っていたのですが、Flutterを使ってiOSアプリだけじゃなくてAndroidも一緒に動くものが作れるというのになってから、「Android開発も実はiOS開発と一緒で、そんなに難しくないんじゃない?」と心の壁を壊してくれた感じがありました。

山田:でも、なんかアレですね。Android開発に入る時期が悪かった感じがしますね。

久野:いや、マジでそれはそう(笑)。

山田:Javaしか……。

久野:Javaしか知らない時期に入っちゃった。

山田:Kotlinがあって、あとはJetpack Composeがある状態だと、また変わってきたかもしれないですよね。

久野:そうなんですよね。Jetpack Composeは宣言的UIがあって、それで簡単にUIが作れるような感じの時に入っていたら違ったかもしれないですが、もし一緒の感じでJavaで書いて挫折したことがあったら、Flutterから入ると書きやすいかもしれないです。

川原:ありがとうございます。愛でポイントが徐々にちょっとずつ出てくるのはいいですね。趣旨に沿っていると思います。

KotlinとFlutterのパフォーマンスの違い

川原:ここまでは、準備していた質問になるのですが、ここから先は、KotlinとFlutterの違いというところに対してもう少し詳しく聞いていこうかなと思っています。

みなさんがアプリを作る時に開発者として一番気にかけることは、やはりパフォーマンスかなと思います。そのあたりを聞いていこうかなと思います。「アプリのパフォーマンスを比較して、どんな違いがKotlinとFlutterにありますか?」。どうですか?

追田:そうですね。パフォーマンスを気をつけるにあたって、UIが再利用される回数をいかに抑えるのかが大事になるのは、FlutterであってもKotlinであっても共通しているかなと思っていて。それを実現する方法が少し異なっていますね。

Kotlinだと、data classというのを使ってその画面の状態を表現したり、あとはdata classにアノテーションを付けて再描画の回数を減らすようなことがあるのですが、FlutterだとDartはdata classがないので、Freezedというサードパーティのライブラリを使って同じようなことをするとか、あとはウィジェット、UIを作る時にFunctional WidgetじゃなくてClass Widgetを使ったほうがいいとか、そういうやるべきノウハウがちょっと違うというのはあるかなとは思います。

久野:確かに。大前提を話していなかったのですが、Kotlinで開発するとAndroidのViewの上で描画されて、FlutterだとネイティブViewを使わずにFlutterエンジンが描画します。そのパフォーマンスに大きな差があるかなと思って見ていたのですが、実はAndroid開発した上ではそんなに差が気にならない。

逆にブラーエフェクトというすりガラスみたいなiOSだとよく見かけるのですが、そういうのをやろうとすると、パフォーマンスはやはりFlutter側が落ちるのですが、Android開発ではあまりパフォーマンスの差は気にならなかったなという思いがあります。

追田:確かに。普通のアプリを作る上では体感的にどちらが優れているかがわからないぐらいなので、これは好みでいいのかなという感じですね。

川原:そこまで違いはないものなんですね?

久野:Androidは。

川原:Androidは。なるほど(笑)。

KotlinとFlutterの保守性の違い

川原:もう1個です。開発している時に大事にしているのが、パフォーマンスと、あとはやはり保守性ですよね。サービスだと保守性を大事にしているかなと思うのですが。ここの違いはどうですか? 山田さんから。

山田:はい。ではチームビルディング的なところでの違いみたいな話になってくるのですが、それぞれネイティブで開発していると、各サービスにAndroid開発のチームとiOSの開発のチームを用意しなきゃいけないのですが、Flutterで開発していると、Flutterの開発チーム1つで済むみたいな話があったりします。

ですが、人材的なところで、AndroidとiOSそれぞれだと採用がしやすかったり、Flutterはまだ新しいものになるので、市場に「できるよ!」という人が少なかったりもして、(それぞれ)メリット・デメリットがあるかなと思います。

川原:別角度で保守性のところはあったりします?

久野:バグとかが出た時にすぐに修正できる、新機能を追加しやすいのも保守性だと大事かなと思うのですが、Flutterではホットリロード、ホットリスタートという仕組みがあって、Rを押すとすぐさまコードが反映されるという仕組みがあるので、そういう観点でもすぐに直したり、すぐに機能を足して出すといったサイクルが小さく回せるのはいいのかなと思います。

山田:ただ、最近のAndroidでもホットリロードは実装されていて、普通のAndroid Viewで開発していても一応サポートはあります。Composeを使っていればけっこう強力なサポートがあって、実機でのチェックもホットリロードができるし、あとは、アニメーションを見る時とかはIDE上でアニメーション再生できたりもします。

久野:アニメーションを見ることができるの、すごいですよね。

川原:(先ほど)話した時にも言っていたのですが、保守性は技術的な側面もあれば人間的な側面もあると思うので、やはり両方一長一短な部分があったりするんですかね。ありがとうございます。

KotlinとFlutterの生産性の違い

川原:では次の質問にいきます。パフォーマンス、保守性ときて、あとやはり生産性ですね。KotlinとFlutterで生産性の違いはありますか?

久野:あります!

(一同笑)

FlutterはiOSも書けるし、なんならWeb、Windows、Macとかも全部書けるので、普通に考えてその2倍の速度になります。

iOSとAndroidを一気に開発できるから生産性はだいぶ上がるのと、Flutterだともともとマテリアルデザインに沿ったウィジェットを用意してくれていたり、「よく使うやろ」みたいなGoogleアイコンを用意してくれていたりするので、MVP(Minimum Viable Product)みたいな感じで、小さくユーザーに何か当てたいみたいなものを作る時に、ガッと生産性高く作ることができるのかなと思います。

川原:お二人はどうですか?

追田:最初にお話があったとおり、Kotlinでも最近だとマルチプラットフォームアプリ、それこそiOSアプリもUIから作れたりします。でも始まったばかりというか、歴史が浅くて、まだライブラリのサポートも薄かったりするので、そのあたりがちょっと課題にはなるかなと思います。

あと、採用的な面でも、Kotlinマルチプラットフォームの経験がある人はおそらくあまりいないと思うので、そこもちょっと苦労するところかなと思いますね。

山田:先ほどチラッと「本当にパッとMVPだけを作るんだったらFlutterのほうがいい」という話は聞いたのですが、途中で例えばAndroidのネイティブ側のViewを挟まなきゃいけなくなった時などは、けっこう苦労するみたいな話も。

久野:そうなんですよ。ネイティブにしか生えていないセンサーを使いたいとか、あとはiOSでたまにあるのが、iOSのマップを表示したいとかで、ネイティブのViewを表示させたいみたいな時は、やはりその分の知識が必要になるのもあるし、そのネイティブのAPIを呼んで、返ってきたものをFlutter Viewで描画する。

もしくはそのネイティブ Viewの仮想Viewの上に、FlutterがAndroidのネイティブ Viewとして表示する、描画するなどをすると、パフォーマンスがめちゃくちゃ落ちるので。知識も必要だしパフォーマンスも悪くなるから、ネイティブにしかないような際どいことをするんだったら、ネイティブをちゃんと最初から作るほうがいいかなと思います。

だけど、MVPなどを作るだけだったら、そこまで触れることないかなと思うのですよね。ユーザーのペインを確かめるぐらいだったら、最初はFlutterでもぜんぜん今はいいのかなという感じです。

川原:いいですね。ありがとうございます。

(次回につづく)