本稿は、Course Reportのブログ記事を了解を得て日本語翻訳し掲載した記事になります。
本記事は、TurnToTechのAditya Narayan氏によってに投稿されました。
AndroidとiOSの両方のモバイルアプリを構築したいとき、各OSのネイティブ言語(Androidの場合はJava、iOSの場合はSwift / Objective-C)を学ぶべきでしょうか?それとも、ハイブリッドフレームワークのReact Nativeを使用するためにJavaScriptを学ぶべきでしょうか?
あなたがすでに持っているコーディングスキル、アプリを開発する目的、そしてプロジェクトの長寿など、考慮に入れるべきことは多くあります。
この記事では、ニューヨークのTurnToTechのCEOでありモバイルブートキャンプを主催するAditya Narayan氏が、「React Nativeとネイティブアプリでの開発の違い」について掘り下げます。
React Nativeとは
Reactは最初、JavaScriptを使用してWebのインターフェースを構築するためのソフトウェアとして登場しました。
Facebookによって開発されたこと、特にWeb開発者に人気が高いこと以外は、ツールやベストプラクティスを備えた他のフレームワークと基本的に変わりません。
フレームワークにはそれぞれに利便性があるものですが、Reactの利便性は「インターフェースはデータの関数である」というシンプルな考えに基づいてUI開発にクリーンなスタイルをもたらすことです。
React Nativeが登場したのは約2年前ですが、モバイルのUI開発にも同じ考えをもたらしました。つまりWeb開発のコンセプトをモバイル開発の世界に持ち込んだのです。
React Nativeは、PhoneGapやCordovaなどのフレームワークと同じカテゴリに分類されますが、これらよりも技術的に優れていると私は思います。
なぜ開発者は、React Native vs ネイティブアプリ開発のどちらかから選ぶのか?
主な理由は2つあります。
- React Nativeには大きなメリットがあります。React Nativeでアプリを一度開発すると、iOSとAndroidの両方にデプロイ(展開)できることです。このフレームワークは2つのプラットフォームに対応しています。 AndroidとiOSのネイティブアプリ開発はかなり異なっていて効率が悪いため、このメリットは非常に大きいでしょう。第一に、使用する言語がかなり異なります。iOSの場合は「Objective-Cと/またはSwift」、Androidの場合は「Java」を使用します。またAPIも異なります。たとえば、GPSを使用する方法も、アニメーションを作成する方法も、ネットワーク呼び出しの方法も異なるのです。
- Web開発者にとって、React Nativeはモバイル開発の学習効果が上がりやすい、魅力的な選択です。React Nativeを使用したアプリのコード記述は、JavaScriptをコア言語としてCSSのUI関連タグを加えたHTMLによるWeb開発スタイルと似ていると、Web開発者は思うことでしょう。またツールとアーキテクチャも、Web開発者にとって馴染み深いものです。たとえば、Chromeをデバッグに使うことができます。DOMの概念もあります。これと比較すると、iOSやAndroidのネイティブアプリ開発は、Web開発と全く似ていないため、なぜWeb開発者にとってReact Nativeが魅力的であるかお分かりいただけるでしょう。
React Nativeでアプリケーションを構築する方法
どのプラットフォームに依存するアプリを開発するとしても、次の3つについての知識が必要です。
- プラットフォームごとのプログラミング言語の選択
- ツール
- API
React Nativeの場合、プログラミング言語は、JavaScriptまたはJSX(JavaScriptとHTMLタイプの構文が混在する、JavaScriptに似た言語)が必要です。
ツールとしては主に、「テキストエディタ」、「Chromeのデバッガ」、「構築・テストのためのその他のツール」が必要です。そしてAPIについては学ぶべきことが多くあります。APIは多くの場合、OSに依存します。
たとえば、今日のスマートフォン上の動作として実装できることはすべて、APIによってプログラム可能な範囲に限定されます。
しかし、このことには課題もあります。React Nativeで利用するAPIは、あなたにとって何でも実装できる万能なものではないかもしれません。
また、Web開発に関するいくつかの知識は、React Nativeの前提条件になるといえます。今までWebに触れたことがなくてもReact Nativeを始めることはできますが、根底にあるアーキテクチャについておそらくほとんどを理解できないと思います。
実際にアプリを構築する時までには、JavaScript、CSS、HTML、オブジェクト指向プログラミングについて学んでおく必要があります。
iOS / Androidのネイティブアプリを構築する方法
iOSのネイティブアプリの開発に使用する言語は、Objective-CまたはSwiftです。Androidの場合の言語はJavaです。
それぞれのプラットフォームのIDE(XcodeまたはAndroid studio)を使用する必要があり、このときIDE(総合開発環境)、デバッガ、ビルドシステムがどう機能するかについても学習することをおすすめします。
React NativeはWeb開発のためのソフトウェアに起源があり、Webの考えが多く取り入れられています。
一方、iOSとAndroidのネイティブアプリ開発においてはそのような傾向はなく、これらは純粋にネイティブアプリのためのプラットフォームであり、これらに特有のことを学習しなければなりません。
もっとも、どちらか1つを習得すると、もう1つの学習ははるかに容易になります。
最後にフレームワークですが、おそらく、iOS/Androidのネイティブアプリ開発またはReact Nativeの習得に要するのと同じくらいの努力量が必要になります。すべてをプログラミングで構築する方法を学ぶ必要があります。
しかし、React Nativeだけでは、iOSまたはAndroidで利用可能なすべてのAPIをサポートすることは難しいでしょう。
より簡単なのはReact NativeそれともiOS / Android?
JavaScriptは、Java、Objective-C、Swiftとは対照的に、学習しやすくてデバッグも簡単です。しかし、この手軽さにはデメリットもあります。 JavaScriptは堅牢な言語ではなく、書いたコードに多くのエラーが隠れていても気づきにくいことがあります。
一方、Objective-C / Swift / Javaは、多くの潜在的なエラーを、コード実行前に取り除くことができる「コンパイル時の型チェック」という仕組みを持っているという意味で、堅牢な言語です。
Swiftは明らかに非常にモダンな言語ですが、Objective-CとJavaもモダン化し続けていて、モダンな言語に求められる機能性やパフォーマンスに関しても決して不十分ではありません。しかし、Google検索すればすぐ分かるように、JavaScriptにはさまざまな欠陥があります。
よって、学習そのものはReact Nativeの方が簡単です。
しかし、JavaScriptの欠陥が伴うおそれがあります。また、クロスプラットフォームなフレームワークを利用する場合は必ず、いわゆる「一度書いたら、どこでもデバッグする必要が出てくる」という問題に対処しなければなりません。
どちらを学習するべきか
もしあなたがアプリ開発を予定していて、いつかアプリ開発者の仕事を探したい場合には、さまざまな理由からiOSまたはAndroidのネイティブ言語を強くおすすめします。
またReact Nativeを学ぶという選択肢もあります。これは興味深いテクノロジーですが、いくつか警告があります。
- すべての開発者は、強い型付けの、コンパイラ型の、オブジェクト指向言語を習得する必要があります。そしてJava /Objective-C / Swiftはいずれもこれに最適な選択です。あなたが望むかどうかにかかわらず、いずれとにかくJavaScriptは学ぶことになります。
- React Nativeは、AppleとGoogleのどちらかにも正式にサポートされていません。これはつまり、OSやAndroidから新しいアナウンスメントが公表されても、React Nativeで完全には動作しない可能性があることを意味します。たとえば、iOS 10iMessageアプリの新機能が追加されたとアナウンスされた時点では、React Nativeによってそのようなアプリのコードを書く方法はなかったと思います。こういうケースでは、iOSのネイティブアプリの開発方法を習得している必要があるのです。また現在でも、React Nativeを使ってApple Watchアプリを開発できるかどうかさえ定かではありませんが、ネイティブ開発を学んでおけば何の問題もないでしょう。
- 第三に、プロジェクトの寿命を念頭に置く必要があります。FacebookのParseサービス停止の例を思い出してください。現在のところ、React Nativeは健全に運営されていて、いくつかの主要企業もこれを支持しています。しかし、React Nativeをサポートしていない一方で、 今後もiOSとAndroidを長くサポートすることが予測されるAppleやGoogleとは異なり、Facebookやその他多くの企業にとっては、永久にReact Nativeのサービスを提供し続ける理由はないかもしれません。
SwiftとReact Nativeは両方とも新しい言語です。ドキュメントが優れているのはどちらですか?
新しい言語であるにもかかわらず、Swiftはドキュメントが非常に優れています。今のところ、私は誰かがSwiftのドキュメントの欠点について不満を述べるのを聞いたことがありません。
React Nativeの公式ドキュメントも、とても優れています。Facebookは、通常のドキュメントに加えて、役立つヒントやコードサンプルを数多く提供しています。
コミュニティの大きさとStack Overflowに関しては、Swiftの方が恵まれていると思います。Swiftの方が1年ほど早く登場したこと、iOSアプリのコードを書くためのより簡単な代替言語としてAppleが公開したこと、あらゆる機会にAppleが宣伝していることがその理由であるといえます。
しかし、SwiftとReact Nativeそれぞれについての質問数を比較するとしたら、膨大な数を数えなければなりません。そのため、今のところはSwiftとReact Nativeは選択肢として優劣をつけがたいというのが私の考えです。
SwiftはメインストリームのiOS開発用言語であり、React Nativeは専門性がまだ低く、小規模なサブセットに利用するには開発者にとって魅力的です。
クロスプラットフォーム開発者にとって最適な選択はどれですか?
クロスプラットフォーム開発者とは、iOSとAndroidの両方のアプリを構築する人のことです。
次の点に留意する必要があります。
- 典型的なモバイルアプリには、主要な2つのコンポーネントがあります。アプリとサーバーサイドのバックエンドです。ネイティブまたはハイブリッド、iOSまたはAndroidのどちらを選択するかにかかわらず、バックエンドは開発の50%以上を占めることもよくあります。よって、プラットフォームの選択はプロジェクトの50%には影響しないのです。
- 仮に、あなたがiOSとAndroidのネイティブアプリを開発するとします。最初のプラットフォーム(仮にiOS)で開発するときには時間がかかるかもしれませんが、2回目以降はより速くなるでしょう。というのも、アーキテクチャを正しくして、クラスの抽象化を正しく行い、コンポーネントのレイアウトを正しく実装して、変更が生じたときにはコードのリファクタリングを行えば、コードを打つ時間がより少なくて済むからです。
- ハイブリッドプラットフォームを利用する場合、バグや依存性など、レイヤー追加による問題にも対処する必要があります。どちらの問題も、ネイティブプラットフォームについて既にある問題に加えて、React Nativeにおいて広まるでしょう。
- また、オープンソースのC / C ++のプロジェクトやネイティブゲームエンジンなど、既存のコードを活用したい場合、――React Nativeによってもこれらを活用することができますが、最初にあなたが学習を後回しにしていたであろうネイティブコードも書く必要があります。そしてこのような活用を実現する時点で初めて、深いレベルのネイティブ開発知識を得ることができるでしょう。
- 最後に、React Nativeを使用しているさまざまなアプリ(Facebook、Instagram、Airbnb)が話題になることが多いですが、これらのアプリそのものはiOSやAndroidのエキスパートによって書かれたものです。
結論
結論として、あなたの開発するアプリが十分にシンプルな場合や、iMessageなどの比較的新しい機能を組み込む必要がない場合や、既存のC・C++コードを組み込む必要がない場合や、精巧なアニメーションを必要としない場合などには最初にReact Nativeから始めても十分です。
また、もしあなたの開発するアプリがかなり複雑で、あなたがiOSやAndroidのプロで、Web開発の経験がいくらかある場合にも、React Nativeはあなたの取り組むべき問題をすべて解決できる可能性が高いため、良い選択となるかもしれません。
しかし、あなたが初めて開発を行う場合、まず最初に1つのプラットフォームでそのネイティブ言語を使用してアプリをローンチすることをおすすめします。
上手く行ったら、次に他のプラットフォームにも手を広げましょう。これは、Instagramが実践したローンチ手法でもあります。
TechAcademyでは初心者でも最短4週間でオリジナルアプリが作れるiPhoneアプリ開発オンラインブートキャンプ、Androidアプリ開発オンラインブートキャンプを開催しています。
現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間でオリジナルアプリを開発することが可能です。