「クロスプラットフォーム開発ツール」というモノに興味を持ったころの話

そういえば、ずっと*1書きかけだった、こんなタイトルの記事があったのだけれど、なぜか書き進められずに放置していた。

だが、最近ずっと取り組んでいるFlutterがらみのネタも溜まってきたので少し昔に思いを馳せながらなにか書いてみようと思い立った。

時は2018年にさかのぼる

スマホ」というモノを持つようになってかなりの年数が経ちました。とは言うものの、確か持ち始めたのは(DocomoBlackberryが最初ですが)2010〜11年頃だったかと思います。その後、メインで使っていたauの回線もスマホにし、それ以来ほぼ(初期の頃にガラケーに戻していた頃もあったのですが)スマホを持って行動しています。

スマホ以前、といってもまだ20世紀の頃の話(笑)ですが、「PDA(パーソナルデータアシスタント)」というモノに興味があって、高校を卒業した頃あたりから所有していました。ザウルスとかそんな感じのやつですが懐かしいですねぇ。

若い頃にPDAを通過しているからこそ、「スマホ」でスケジュールの管理とかメールの送受信など、非常に便利に使っているなぁ、と、ユーザとしては感じますが、プログラマ・エンジニアという商売柄、開発もしたいと思いますし、実際にやっているわけですが、どの*2プラットフォームでも一つの「言語」で開発できる、という「クロスプラットフォーム開発」に最近興味津々です。

昔、といっても10年くらい前は、どちらでも使える開発といえばHTMLやJSを組み合わせて作る「ハイブリッドアプリ」という開発手法がありました。結局思ったほどパフォーマンスが出なかったりしていたようで*3、なんとなくネイティブ言語での開発をするのが本番環境で、プロトタイプとしてハイブリッドで、みたいな風潮になっていたように思います。

で、ハイブリッドアプリで「失敗した*4Facebookが開発を続けてきた「React Native」に代表される、クロスプラットフォーム開発ツールが徐々にアツくなってきた、というのは皮肉といえば皮肉ですが。

そして2023年…

2023年現在、クロスプラットフォーム開発環境として名前が挙がるのが、Flutter、React Native、Xamarinと言ったところ。ほかにもスマホ文脈から少し外れる気もするけれど*5Unityとか。

この中でFlutterだけが独自の言語(Dart)を使っているけれど、基本は既存の開発言語で開発ができる。XamarinやUnityはC#、React NativeはJavaScriptフレームワーク化されているのでそれを呼び出せば簡単に作れるよ、というお話(FlutterもDartからフレームワークを呼び出している)。

本当は各開発環境の比較とかしたいところなんだけど、私自身はUnityを少し触ったことがあるくらいで、かつ「C」を冠する言語(C/C++/C#)にはどうもアレルギーがあるらしく、深く語れないので「クロスプラットフォーム開発には何を選ぶべきか」という問いには答えられない。

Flutterに関してはリリース当時、そしてこの記事の元ネタを書いた(≒前段のネタ)、2018年ころからずっと追いかけて(コードを)書き続けているので、ある程度知見も経験も貯まってきている。そんな立ち位置から思うことを書き進めてみたい。

スマホのアプリ」

2018年頃にはすでにスマホは世にあふれていた。

当時私が持っていたのは確かiPhoneXだったような記憶がある。Android(多分isai Beat LGV34)とiPhone5Sの2台持ちだったのを1台にまとめ*6スマホアプリ開発用にAndroidは残せたのでiOSを購入しようと決めた、と言う経緯だったような。

そのiPhoneXに代表される、スマホの大画面化の流れは、スマホで動画を見たりゲームをしたりというエンタメ系アプリが増えてきたことが一因と言われているが、ほかにもいろんな種類のアプリが当時からあり、スケジュール管理やチャット、メッセージングアプリなど、普段の生活が便利になるアプリはそれこそ数多あった。

フリーランスとして独立して4年くらいになり、すでにネイティブアプリ(Java/Obj-C)のコーディングも一通り学んでいたので*7アプリ開発自体は経験済み、という感じだったのだが、当時から、

全く同じアプリをネイティブで作るの大変だよなぁ

と思っていた。

例を挙げれば枚挙にいとまなし、だが、当時ハマっていたPokemon Goを例にとれば、UI/UXはiOS版もAndroid版も全く同じなのだが、仮にこれをフロントエンド(≒アプリ本体)をネイティブ言語だけ書き、同じUI/UXを求められるとしたら相当の技術力が求められるはず。実際のところは推測でしかない(Nianticは開発言語に関しては言及していない)が、ポケゴリリース直後に予想していた人たちは、おそらくフロントエンドはUnityメインではないか、と考えているようだ。

qiita.com

話を戻すが、当時からOS共通で開発ができるプラットフォームは存在し、デメリットはそれなりにあるにせよ(特に非ネイティブであることに起因するパフォーマンスの低下)、よりUI/UXに重きを置いたアプリづくりにシフトしていったのもこの頃だろう。事実、UI/UXに関して言えばスキュモーフィズム(リッチデザイン)からフラットデザインに転換され、認知度も高まってきたのもこの頃だろう*8

Flutterをなぜ選んだのか

私は2018年頃からFlutterを触っていたらしい。

racchie.hatenablog.com

2017年にアルファ版が、2018年の12月に1.0がリリースされているので、まだベータ版の頃から触っていることになる。

だが、なぜFlutterだったのか。

当時はすでにReact Nativeもリリースされており、またポケゴの話でも出てきたUnityもリリースされていたが、少なくともUnityに関しては自分の作りたいモノとの乖離が大きすぎること*9と、開発言語の好みの問題で若干挫折気味だった。

React Nativeに関しては、JavaScriptでの開発となるのでそれほど学習にかかるコストはかからないはず、とは考えていたが、仕組みを聞いても今一つピンとこなかったことを覚えている。当時はあまりJavaScript、と言うよりもDOM(Document Object Model)に関する知識が少なかったこともあるが、アプリ自体のパフォーマンス面で疑念があった、というのもある。

他にもいろいろとあったが、ニュース記事などでFlutterのベータリリースの記事を見て、なにかピンと来たのだろう。ネイティブにコンパイルされ、ルックアンドフィールもそれぞれのOSで一緒、みたいな感じ。「覚えるならコレかもしれん」と考えたはずだ。

もう一つ、実際に触ってみて思ったことは、フロントエンドとバックエンドを同じコードベースで書けることがとても便利だと思ったこと。

AndroidJava/Kotlinで書く場合もiOSをObj-C/Swiftで書く場合も*10、フロントエンドとバックエンドは書き方が異なる。

iOSの場合は同じ言語ではあるが、Storyboardを使ってUIを作り込むほうが一般的で、そのUIパーツとバックエンドを紐づけることをUI上で行ったりするのがなんとなくまどろっこしく感じていたし、Androidに至ってはバックエンドのJavaっぽい書き方とフロントエンドのxml形式でアタマの切り替えが必要で、その当時はかなり難易度が高いと感じていた*11

コードベースでUIもバックエンドも書けるし一つのファイルで全部完結するし*12、しかも開発ツールですぐに反映できる(Hot Reload機能)のは当時すごく魅力的だったような記憶がある。

2023年の今思うこと

2018年当時にわりと熱狂的に「うっひょー!たのしーぜー!」と書いていたのだけれど、その裏で思っていたのは、「結局ネイティブアプリには勝てないかもしれないし、今後のことは分からない(いつ開発中止になるかわからない)」という気持ちで、やっぱり枯れた技術もきちんと覚えなければ、とその後はJavaPHPでの開発に携わってきたし、技術よりも「サービス」に重きを置いて開発するようになってきたこともあって、以前の熱狂も冷めつつある。

それが「学び」を止めたか、と言えばそうでもなく、ある程度作りたいモノ(≒サービス)が見えてくると、そのモノをどうやって実装していこうか、という別の次元の学びにつながってきたように感じる。

今やスマホは老若男女問わず誰もが持っている*13ガラケーが駆逐されるとは思っていないが、誰もが持っている携帯電話(スマホ)にアプリは必須であり、アプリ開発の需要は今後も高まるはずだ。

問題は、その開発言語だが、依然として、と言うよりもネイティブでの開発は当然需要があるはずで、Javaに関してはスマホだけでなくWebアプリでもまだ需要はある。iOSに関してはSwiftの需要もかなり高い。

クロスプラットフォーム開発はどうか、と言うと、React NativeもFlutterもそこそこ需要があるらしい。世に出て5年以上も経過し、開発者人口も増えているし、クロスプラットフォーム開発言語でリリースされているアプリも数多あるのだろう。メンテナンス(既存改修)だけでなく新規開発も案件としても増えてきた印象がある。

今後Flutter以外のクロスプラットフォーム開発言語を積極的に覚えていこうとは実は考えておらず、必要に応じて習得しましょうか、くらいな気持ちではいるが、需要が高くなっていくことに関しては注視していきたい。

逆にFlutterについては「もう少し極めてみたい」という気持ちが最近湧き始めた。2022年に少し学び直しをしたのだが、5年前のFlutter(Dart)からは相当な進化を遂げており、定期的に学び直しをして新しい作り方を覚えていかないといけない、と言うことも痛感した*14

もっとも、Flutterに限らずすべての言語が進化しているので学び直しは重要なのだが。

*1:仕事ブログを書き始めた頃から

*2:スマホのアプリに関してはAndroidiOSバイスの2つに絞られる、と基本的には定義しています。シェアはとてつもなく少ないがWindowsモバイルとかBlackberryとかPalmOSとかがあるのだから云々、という話は、シェアが圧倒的に少ないので普段考えないようにしています。そこに入り込んだところで商売にならないでしょうしね...。

*3:Facebookのアプリがハイブリッドだったのをネイティブアプリに書き換えたのが2012年の話で、確かその頃は「ハイブリッドアプリのレスポンスが悪いのでネイティブで書き換えた」とザッカーバーグ氏がコメントした、と記憶しています。

*4:実際にはそうじゃないですがそう捉えられているように思います。

*5:ユースケースの違いもあるのかもしれないですが

*6:iPhoneのバッテリー膨張による買い替えと回線費用の削減目的がメインの理由

*7:独立直後の仕事のない頃に一通りアプリの作り方を学び、その時の経験が今のJava講師案件につながっていたりする

*8:フラットデザインが採用され始めたのは2013年ごろから

*9:基本Unityはゲームエンジンだが私はゲームを作りたいわけではない

*10:つまりネイティブで書く場合

*11:今は各言語に習熟しているのでそれほどでもないが、Flutterに慣れるとやっぱり「まどろっこしい」

*12:もちろん今はできるだけビューとロジックを分けて書くようにはしているが

*13:2021年の調査でスマホ保有率は90%越えという調査もある

*14:一例としてNull-Safetyの概念がある