ちょっと気になる隣の技術畑

第12回クロスプラットフォームとネイティブ技術

本コーナーでは技術へのタッチポイントを増やすことを目標に、各分野で活躍されている方をお迎えします。今回はFlutterをテーマにアプリ開発でクロスプラットフォームを選ぶ基準やネイティブとの違いなど、クロスプラットフォームの技術的特徴を交えながら菊池さんと紹介します。

話し手 菊池紘 Kikuchi Hiroshi

【話し手】
菊池紘 Kikuchi Hiroshi

㈱ LayerX エンジニア。コミュニティカンファレンス FlutterKaigi主宰。専門はモバイルアプリ開発。前職(㈱ Diverse)時代からFlutterを使った開発に注力。
Twitter @kikuchy
GitHub kikuchy

Flutterとの出会い

日高: それでは、さっそくですが自己紹介をお願いします。

菊池: 現在は㈱LayerX所属のエンジニアとして働いています。モバイルに限らず、フロントエンド、バックエンドと幅広くやっています。あとはFlutterKaigiという技術者向けのカンファレンスを主宰しています。

日高: 菊池さんがFlutterと出会ったきっかけは何だったのでしょうか。

菊池: 前職でのアプリ開発がきっかけですね。2018年ごろと記憶しています。

日高: 最初に触ったアプリ開発プラットフォームがFlutterだったのですか?

菊池: いえ、それ以前はAndroidのアプリ開発をメインにしつつiOSも触っていて。両方のOSでネイティブアプリを作っていました。

日高: ネイティブアプリの開発者のバックグラウンドを持ったうえでFlutterを使ってみたと。実際に触ってどうでしたか。

菊池: 当時の印象はUIUser Interfaceも含めてワンソースで対応できる点が衝撃的でしたね。今ではほかのフレームワークでも見られる特徴ですので現在の事情は少し異なりますが。

日高: 2018年ごろのアプリ開発はロジックとUIが一定の距離をおいて管理されていたと私も記憶しています。AndroidはXMLファイルで、iOSではStoryboardを使ってという具合で。

菊池: それがFlutterではUIの描画まで統合されているわけですから驚きました。現在では増えてきた考え方ですが、クロスプラットフォームの歴史を振り返ってみても当時のアプローチはWebViewを表示するCordova、さらにさかのぼるとTitanium MobileやXamarinなどネイティブのUIコンポーネントを利用する手法が一般的だったと思います。

日高: クロスプラットフォーム上でロジックは共有するけど、UIはネイティブのものを表示するアプローチですね。当時のネイティブはUIを分離していたので、それを利用しようと考えるのは自然な発想だったのかなと。

菊池: そのような中でFlutterは、クロスプラットフォーム上でUIも提供する選択肢を提示していました。

クロスプラットフォームを使う条件

日高: Flutterの導入経緯についてはいかがでしょう。苦労はありましたか?

菊池: 導入は開発効率を求めた結果と言えるかもしれません。

日高: アプリ開発の生産性という意味でしょうか。

菊池: そういう背景もあります。アプリ開発者が足りていなかったと一言で済ませることもできますが、実際はもう少し複雑です。

日高: コードを書くことだけが課題ではなかったと?

菊池: 長く続いていたサービスでしたので気が付けばAndroidとiOSでアプリの機能が違っていたり、サービスの仕様そのものが複雑化していたりとメンテナンスが大変になっていました。さらに開発者が入れ替わって正しい知識も伝わりにくい状況でした。

日高: AndroidとiOS、両方で機能をリリースし続けるのには体力もいります。

菊池: 仕様を掘り起こして開発しつつ、プラットフォーム間の差を埋めて品質を高めなきゃと考えたときに、とても少人数ではできないなという状況でしたね。機能や納期、品質など技術課題の取捨選択を迫られたとき、Flutterは生産性を確保するのに良い選択でした。

日高: クロスプラットフォームならではのメリットに聞こえますね。

菊池: 少ない開発者で事業を成長させようとした場合、Flutterの良さが活きてきます。Flutterで使われるDart言語は当時、今ほど使い勝手の良い言語というわけでもなかったので習熟に時間が必要でしたが、慣れてしまえばスムーズでした。

どこに優位性があるのか

日高: 日本ではFlutterがよく使われている印象を受けているのですが、支持されている理由は何だとお考えでしょう。

菊池: ひとつ誤解がないようにお伝えしたいところがあって。個人的にはクロスプラットフォーム自体がそこまで大きな支持を集めている印象がないんですよ。

日高: それはどういう意味ですか。

菊池: 市場全体から見たらまだ一部で使われている状況だと考えるのが適切ではないでしょうか。当然、有効なアプリ開発の手段の一つですし、今後も発展していくと思いますが。

日高: 意外な回答です。Flutterではどのような利用シーンが成立しそうですか。

菊池: すでにアプリの資産があって開発者がいるのであれば積極的に採用する理由はないですよね。切迫した事情がない限りはDart言語で書きなおすという選択は取りにくいはずです。

日高: 裏を返すと新規サービスがターゲットになり得るというお話でしょうか。

菊池: 一部がなり得る認識です。すでにiOSやAndroidアプリ開発経験があるならFlutterを使うメリットは薄いと思います。もちろん新規サービスをFlutterで開発するケースも実際にありますし、Flutterの採用実績もよく見聞きします。

日高: 正直、厳しめのコメントだと思いました。私の印象ではFlutterは受け入れられていると感じていたので。ただ仰っていることはよく理解できます。

菊池: 強みをもう少し具体的に知ってもらう必要があって、それはFlutterが持つ良い部分とほかのクロスプラットフォームと比較して競争優位である部分の2つだと思うんです。

日高: それは何でしょうか。

菊池: 前者のFlutterの良い部分はコミュニティの存在です。Flutterの開発そのものがユーザー(開発者)に向いて行われていると感じます。

日高: Flutterの開発体制はGoogleが主導していますね。

菊池: はい。Flutterの開発チームはDart言語の仕様や文法を変えてアプリ開発という用途にあわせています。Dart言語は、もともとはJavaScriptの置き換えを狙ったものでWebがターゲットでした。現在はほぼFlutter専用です。

日高: クロスプラットフォームでのアプリ開発需要に応じて言語をアップデートしている。

菊池: このようにFlutterの開発チームがコミュニティに向いているという点は大きな要素です。言語への仕様追加や破壊的変更はコミュニティに寄り添って考えないとできない決断ですし、これ以外にもマテリアルデザインにいち早く対応したり、パフォーマンスを向上させたり、アプリ開発での生産性を強く意識しています。

日高: パフォーマンスなどのプラットフォームにしかできない改善に注力してくれるのはうれしいです。

菊池: 後者の、ほかと比べて競争優位である点は、最初のポジション取りが良かったことが挙げられます。

日高: 先ほど挙がった以外のクロスプラットフォームだとReact Nativeが登場したのも2015年ごろで同時期ですよね。

菊池: Flutterに優位性があったと感じているのは、モバイルアプリのフレームワークであることに注力していた点でしょう。ただFlutterも使いにくいケースはあるので「ほかと比べて下手を打たなかった」と表現したほうが適切かもしれません。

難易度を下げる技術選択

日高: モバイルアプリ向けという表現はどう受け取ればよいでしょうか。クロスプラットフォームの性質上、どうしても特徴が似てしまうはずですし、大きな違いになりにくいと思うのですが。

菊池: たとえばReact NativeはWeb技術を使ってアプリが作れるという意味でモバイルアプリに閉じていない技術スタックですよね。

日高: ええ、Web技術者にもフレンドリーですし新たに覚えるべき学習コストも減りますよね。

菊池: それはメリットでもあるんですが、どっちつかずにもなりやすい。Webの技術をフォローしている開発者は、やはりWebのことが好きだからやっているはずなんです。アプリへの興味は大きくなかったのではと。

日高: わかります。そのプラットフォームが好きだから開発者をしているという側面は誰しもが持っているので共感できます。

菊池: 私もWebの力を信じていますが、アプリとWebには技術的・思想的な隔たりがあるのも現実です。

日高: つまりWeb技術を取り入れることで難易度が上がるケースもあって、解決したい課題に対してクロスプラットフォームの選択やアプローチを間違えると、うまくいかない可能性が上がるかもと。

聞き手 日高正博
画像

菊池: その点、Flutterはアプリ開発に特化していたので技術選択のミスマッチが起きにくかったのかもしれません。

日高: 開発者はモバイルアプリにどんな技術を使うかクロスプラットフォームを含めて選択肢を持っていますが、その検討で間違いにくいのであれば、たしかに強みでしょうね。

菊池: Web技術者がアプリ開発に転向するとしてもネイティブ技術を学んだほうが近道だったというケースも十分考えられますよね。Flutterはアプリ開発者の課題を解決できる落としどころだったのではと想像しています。

日高: アプリ開発者が使いたいと感じるクロスプラットフォームだから支持されたのではという推測ですね。おもしろい発想だと思います。すでにモバイルアプリを知っているなら生産性も高めやすい。

菊池: クロスプラットフォームは問題を単純にも複雑にもしますからね。Flutterはバランスが取れていたのではないでしょうか。

写真1 FlutterKaigiのオフライン開催の準備を意欲的に行っています
写真1

Flutterとコミュニティ

日高: ここまで登場時の背景や技術選択を中心にうかがいました。Flutterの将来像についても教えていただけますか。

菊池: 今後もFlutterのコンセプトを活かすような使い方がされるとよいと感じています。少人数で開発工数が足りないようなシーンで効率良くアプリを作れるところに寄与できていれば。

日高: FlutterやDart言語の進化も、そのような生産性向上にフォーカスしているのでしょうか。

菊池: たとえばGoogle I/O 2023[1]ではDart 3.0の正式リリースが発表されました。このDart 3.0からはRecord型とパターンマッチ構文を導入しています。

日高: 余計な記述を減らしてコードを書きやすくする変更ですね。

菊池: 同じくGoogle I/O 2023で発表があった内容としてはFlutter 3.10からはiOS向けのレンダリングエンジンをImpellerへ変更しています[2]。これまで使用していたSkiaに比べて描画パフォーマンスが向上してiOS上での120FPSでの描画、3Dレンダリングへの対応など改善が期待できます。Android向けの対応も予定されています。

日高: このあたりは順当な機能強化ですね。アプリ開発者が少ないとOSごとのチューニングは難しいですし。

菊池: ええ、当初モバイルアプリをターゲットに始まったFlutterですが現在ではWebやデスクトップや組込み機器などマルチプラットフォーム対応も進んでいます。Dart 3ではWebAssemblyとRISC-Vへの対応も予定していて、それぞれWebと組込み機器向けの動作を意図しています。

日高: このあたりはFlutterに限らない話かもしれません。.NETやKotlin Multiplatformなどのマルチプラットフォーム対応言語でのトレンドですよね。時代にあわせてユースケースも広がっている。

菊池: モバイルだけでなくWebやデスクトップでもリッチなUIを提供したいという場合はFlutterも有力な選択肢です。これまでの実績を踏まえたうえで今後も開発者の課題を解決していくというFlutter開発チームの姿勢はプラットフォームが増えても変わらないと思います。

日高: このあたりはコミュニティ向けの開発イベントの多さからも伝わってきます。

菊池: そうですね、コミュニティが活発であれば開発者も集まりやすいですし。

日高: Flutterのコミュニティでは技術ブログなど発信も多く感じます。日本語で学べる情報もありがたいです。

菊池: Webの情報はどうしても新旧がありますがDart言語のバージョンアップで書き方が変わった場合でも、互換性には注意が払われていますよ。

日高: その分野の初心者にはうれしいです。コンパイルエラーなど言語の更新時には知識が求められますし。

菊池: Nullセーフティ導入後のDart言語なら基本的に下位互換性が保たれていますし、それ以前のコードでもコンパイル時に危ない使い方があれば警告などで教えてくれます。

日高: モバイル分野はアップデートが多く、常にキャッチアップが求められます。日々の発信の多さが学びやすさや知識の質を担保することにつながります。

菊池: 実は私が主宰するFlutterKaigiも2023年11月に技術者カンファレンスを予定しています。オフライン開催で初心者から上級者まで楽しんでもらえるよう準備を進めています。

日高: クロスプラットフォームのコミュニティだからこそ幅広くネイティブ技術を知れる側面もありますし、カンファレンスも盛り上げていきたいですね。本日はありがとうございました。

おすすめ記事

記事・ニュース一覧