クロスプラットフォーム開発「学習」ツールとしてのXamarin

# はじめに
本エントリーは [Xamarin その1 Advent Calendar 2017 15日目](http://qiita.com/advent-calendar/2017/xamarin)のエントリーです。

ここでは、Xamarinの「学習法」と「学ぶ意義」について書いていこうと思います。
Xamarinの学習法とその意義について、自社で若手向けにXamarin講座を開催したりするなかで個人的に考えて実践している（しようとしている）ことをベースに書いていくので、ツッコミなどございましたら容赦なくいただければと思います。
※技術的な話はほとんどありませんので、その点はご容赦ください。

特に、「Xamarinはネイティブ知識必須」と言われるなか、ネイティブの知識がないとXamarinをやってはいけない**わけではない**というあたりをうまく示せれば…と思います。

ちょうど、当カレンダーの前日14日目分として投稿された[＠hiro128_777](https://twitter.com/hiro128_777)さんの「[Xamarin 今そこにある危機](http://hiro128.hatenablog.jp/entry/2017/12/14/003633)」が、少し関連する内容かもしれません。

# Xamarinについて
## Xamarinとは
いまさら（特にこのAdvent Calendar上で）Xamarinについて説明するまでもないとは思いますが、XamarinはiOS/Android/Windows/MacなどさまざまなOSで動作するアプリケーションを開発できるクロスプラットフォーム開発ツールです。

## Xamarinのメリット
Xamarinのメリットは、やはりC#（もしくはF#）でさまざまなプラットフォームに対応したアプリケーションを作ることができる点でしょう。使うIDEもVisual Studioだけで済むというのも魅力です。

## 「銀の弾丸ではない」
これだけではメリットだらけに思えますが、「Xamarinを使うにはネイティブの知識が必要」と言われています。
XamarinはネイティブAPIの「薄いラッパー」を提供するものなので、ネイティブのAPIをほぼそのまま使うことができるのですが、結局その呼び出すネイティブのAPI、すなわち、iOSであればObjective-C/Swift、AndroidであればJava/Kotlinで通常記述するものについての理解が求められます。

そのため、C#だけで簡単にクロスプラットフォーム開発ができるというわけではないことから、「Xamarinは銀の弾丸ではない」と言われます。
これに関しては、たとえば

> Java も Swift も学んで C# で D.R.Y(Don’t Repeat Yourself) するのが Xamarin です
― [Xamarin(ザマリン) とはなんぞや](https://qiita.com/amay077/items/38ee79b3e3e88cf751b9)

など、さまざまなところで言われているとおりです。

# Xamarinはネイティブ経験者以外お断り？
では、ネイティブの知識がない人はXamarinをやってはいけないのでしょうか？
答えはNO。むしろ、**未経験者こそ積極的にやるべき**だと考えます。

以下、（ネイティブを含めた）モバイルアプリ開発未経験者がなぜXamarinをするべきなのか、また、どう学んでいけばいいのか、について述べます。

# Xamarin学習アプローチ
ここから書くのは、あくまでモバイル開発未経験の場合の学習アプローチです。

## ０．C#を学習する
Xamarinを使うための言語習得が前提として必要です。C#はある程度読み書きできるようになって置く必要があります。
WPFなど.NET開発経験があれば、よりスムーズに進められるはずです。

## １．Xamarin.FormsでAndroid/iOS/UWPに対応した簡単なアプリを作る
まずは簡単なものから作ってみます。Xamarinの入門書に載っているものや、
http://jxug.org/links.html
にある簡単なハンズオンなどをやってみるとよいと思います。

このとき、1つのプラットフォームで実行して満足するのではなく、必ず複数のプラットフォーム上で成果物を実行し、**それぞれのプラットフォームでのUI/UXの差異を実体験**しておくべきでしょう。

これは、Xamarin最大のメリットであるクロスプラットフォーム対応を実感できると同時に、単純に「感動を覚える」ことのできる体験だからです。
たとえば、メインの開発端末をWindowsで行い、Macをリモートでつないだ状態にしておけば、Androidはエミュレーターで、UWPはそのままWindows上で、iOSはRemorted Simulator（Mac上で動いているiOSシミュレーターをWindowsからリモートで覗く機能）で実行することができ、WindowsのPC上に3プラットフォームのアプリを並べることができます。
これは初めてクロスプラットフォーム開発をする人にとってはきっと壮観で、（特に自分で作ったアプリならばより）感動できるもののはずです。

![3つのプラットフォームを同時実行](https://qiita-image-store.s3.amazonaws.com/0/194664/4c514b54-080e-f67a-bc9b-a50dbccc29f6.png)


また、実際に表示される画面はそれぞれのプラットフォームのUI思想に合わせたかたちで実行されるため、各プラットフォームのUI/UXの差異と、Xamarin.Formsがそれに合わせた画面を同一コードから表示してくれることも体験できます。

いままでこの3種類の同時実行は、Remoted iOS SimulatorがVisual Studioの最上位エディションであるEnterpriseでしかできなかったため、Xamarinを触り始めた段階で体験することは難しいことでした。
しかし、Visual Studio 2017の15.5より、CommunityエディションでRemoted iOS Simulatorが使えるようになったため、この感動をより多くの人が味わうことができるようになりました。

Xamarinを始めた段階でこの体験をすることで、きっとXamarinの魅力に取りつかれるはずです（私はそうでした）。
Windows上で3プラットフォームのアプリが同時に起動しているさまをみれば、技術に興味のある人ならば、きっと「おおっ」と思うはずです。3つのプラットフォームの違いと、その違いを吸収し同時開発できるXamarinに、きっと興味を持ってくれるはずだと思うのです。こんなことを（少なくともここまでは）簡単に示せるのは、数あるクロスプラットフォーム開発ツールの中でも、現時点でおそらくXamarinだけなのではないでしょうか？

## ２．各プラットフォームのデザインガイドラインを学習する
各プラットフォーム差異を体験したら、それぞれのデザインガイドラインを見てみるべきでしょう。

### iOS
たとえば以下のサイトから公式のデザイン指針を学び取ります。
[Human Interface Guidelines](https://developer.apple.com/ios/human-interface-guidelines/overview/themes/) 
[ユーザインターフェイスのデザインのヒント](https://developer.apple.com/design/tips/jp/)

### Android
Androidはこちら。Material Designについて書かれています。
[デザイン | Android Developers](https://developer.android.com/design/index.html)
[Android デザインの原則](https://developer.android.com/design/get-started/principles.html?hl=ja)

### UWP
Windows10の新しいデザイン指針であるFluent Design Systemについて書かれています。
[ユニバーサル Windows プラットフォーム (UWP) アプリのデザイン - UWP アプリ開発者](https://developer.microsoft.com/ja-jp/windows/apps/design)

ここで、それぞれのプラットフォームの特徴を知り、実際のアプリ開発に活かしていくことを考えます。
また、Xamarin.Formsの各コントロールにおいてその特徴をどう押さえているかも合わせて見ておくと良いと思います。Xamarin.Formsで用意されている標準のコントロールは、各プラットフォームの最大公約数なので、そこまで種類はなく、一気に確認しておくと良いです。
それには、[こちら](http://blog.okazuki.jp/entry/2017/01/11/083800)からDL・購入できるMSかずきさんによる「かずきのXamarin.Forms入門」が、Xamarin.Formsの各コントロールの使い方がiOS/Androidでの実行結果とともに載っているため、大変参考になります。

各プラットフォームの差異と、Xamarinがそれに対しどうアプローチしているのか、は興味深いトピックなので、少なくともモバイル開発に興味がある開発者なら、楽しんで学習できるのではないかと思います。

## ３．作りたいものを作りたい方法で作る
ここまできたら、基礎的な考え方はおさえられたと思うので、作りたいものを作っていきましょう。
場合によっては、ここからXamarinネイティブにシフトしてもよいと思います。
Microsoft Azureをバックエンドにしてみたり、Visual Studio App CenterでモバイルDevOpsをやってみたり、もしくはXamarinそのものを深く勉強してみたりと、知識の幅を広げていきます。

また、Xamarinでは iOS/Android/UWP以外にもmacOSやTizen、Android Wear,
Apple Watch、Apple TVなどほかのプラットフォームに手を出すのもありです。それぞれ、iOSやAndroidとはまた違ったUI/UXの観点があり、おもしろいです。
（[Appleのデザインガイドのページ](https://developer.apple.com/design/jp/)からiOS/macOS/watchOS/tvOSの各ガイドラインへ飛べるので、読んでみるとまた勉強になると思います。
こういったネイティブのUI/UXの考え方も、Xamarin開発に必要なネイティブ知識のひとつでしょう。

さらに、開発しているうちに、必ず技術的な問題にぶつかると思いますが、そのときの調査ではネイティブ関連の情報にも触れていくことになります。「Xamarinにネイティブ知識が必要」の一部はこのことで、Xamarinで発生する技術上の課題はXamarin単体で解決できるものでなく、ネイティブ側のことをしっかり調べないと解決できないことも多いのです。
あわせて、作ったアプリを公開したい、となった場合も、ネイティブ同様の手順を踏む必要が出てきますので、ここでもネイティブ知識が必要にはなってきます。

しかし、決して**事前にネイティブの知識を持っていなければXamarinをやってはいけないということではない**のです。開発をしていく中で、意識して取り込んでいくべき知識です。

逆に、Xamarinに触れ、学び続けることで、その段階に応じてネイティブ知識を含めた幅広い知識とスキルが手に入るということになります。もちろん簡単なことではなく、長い道のりです。
ただ、スキルは、実戦でこそ身につくものです。「ネイティブの経験ないからXamarinできない」ではなく、Xamarinを通して「すべてを手に入れる」つもりでチャレンジしてみてもいいのではないでしょうか？

ここで述べた通り、Xamarinの学習を進めていくとXamarinとその周辺、ネイティブ関連のおもしろいことにたくさん出会えます。その意味で、Xamarinは**「魔法のツール」**だと思っています。

この過程の中で、Xamarinではなく、たとえばSwiftやKotlinによる純粋なネイティブ開発に興味をもって、そちらに注力しても問題ないと思います。
Xamarinを入り口に、これまで触れることのなかったプラットフォームの開発の世界に飛び込みやすくなる、ということもまた、Xamarinのメリットなのだと思います。
ネイティブ経験を積んだ後にXamarinに戻ってくれば、Xamarinの効果を最大限に活かせるようになっていることでしょう。


# 注意点
以上、理想的なことを書き連ねましたが、少々問題はあります。

## お金がかかる
まずはこれです。
Xamarinは無償化されましたし、Visual Studioも、個人利用であればCommunityエディションを無償で使えます。
しかし、Xamarinでクロスプラットフォーム開発を行うには、最低限、実機デバッグのためにMac、iOS端末、Android端末が必要です（WindowsはMac上で実行できますが、その逆はそうもいかないので）。
日本でのシェア率を考えると、普段PCはWindows、スマホはiPhoneを使っているという人も多いと思いますが、Xamarin開発においてこの組み合わせは都合がよくありません。
（自社でXamarin講座やった際も受講者でこの組み合わせの人の割合もかなり高かったです）

どうしても実機が必要ですし、iOS開発やるならMacは必須です。
Xamarin Live Playerなどもありますが、制約が多く、これだけでなんとかなるものではありません。
※Xamarin Live Playerの制約についてはこちらがわかりやすかったです。
[Xamarin Live Playerで出来ること、出来ないこと](https://qiita.com/saken649/items/acf4eb04e475b25b2880)

なので、入り口に立つために、これらはすべて揃えましょう。
最低限、実機デバッグするWin＋AndroidやMac＋iPhoneの組み合わせは用意すべきです。
Android端末なんかは、数千円で投げ売りされているものもあったりするので、そういったもので問題ないと思います（OSのバージョンやデバッグ可否などは事前に確認しておく必要はあります）。

何か新しいことをしようと思ったとき、そこにお金をかけることも大事です。
お金をかけたからこそ、その元を取るために頑張れる、という人もいると思います。
環境をケチってストレスをためながらやっていても長続きしなかったり、詰まってしまったりするものです。
最初にお金をかけて環境を整えることは、学習を始めるうえで大切な一歩なのではないでしょうか。

それでもどうしてもお金がない場合、WindowsでUWPを作りましょう。実機デバッグです。Androidはエミュレーターで。
Android実機がない人もいると思いますが、その場合多くはiPhoneユーザーであるケースが多いはずなので、Live Playerを使ってみましょう。逆に、Live Playerの制約に詳しくなれるはずです。

お金がたまったら、中古のMac Book Airでも買うといいのかなと思います（あまりに古かったりスペックが低かったりしない限り、リモートでビルド・デバッグするだけなら、気にならないレベルです）。

## 誰もがこのアプローチに向いているわけではない
ここで述べてきたアプローチを進めるためには、いろいろなことに興味を持って、自分で調べて自分で試せることが必要だと思います。クロスプラットフォーム開発には、その使うツールだけでなくネイティブ知識など幅広い知識が求められます。それを自分で吸収していける意欲と力が大切だと感じています。これができないと、続けるのは難しいかと思います。

もちろん、つまらない技術であれば技術力が高い人でも長続きしませんが、それを維持するための魅力が、Xamarinには充分あると思います。

# まとめ
「XamarinならC#だけ知っていればAndroid/iOS両対応のモバイルアプリ開発ができる」は、ある角度から見ると正しい、ということが言えます。
つまり、「XamarinならC#だけ知っていればAndroid/iOS両対応のモバイルアプリ開発**を始めること**ができ**、さらに開発を通してさまざまなネイティブ開発に関する知識を身に付けることができる**」と解釈すれば、それは正しいといえるのではないかと思います。

「Xamarinでの開発にはネイティブの開発知識が必要」と聞いて、ネイティブ未経験の人が「資格がない」「ハードルが高い」と思いXamarinを敬遠してしまってはもったいない…と思い、このエントリーを書きました。
むしろ未経験の人こそ、Xamarinをやってみたらいいと思うのです。

Xamarinはさまざまなプラットフォームのアプリ開発スキルを身に付ける入り口になり、**開発者自身をクロスプラットフォーム対応にする**きっかけを与えてくれる、素晴らしいツールだと思っています。

Cordovaなどのハイブリットアプリより勉強することは多いですが、その分おもしろいと思います。いまは知識が足りなくても、開発を進めながら少しずつ、必要な知識を蓄えて成長していけばよいと思います。

# おわりに
私自身、Xamarinをちゃんと触り始めたのは無償化のタイミングよりも遅くVisual Studio 2017リリースごろでした（VS2017新規です）。
2017からは開発環境を整えるのがスムーズになり、挫折することなく始められるようになりました（2015のときにちょっと触ってうまく動かず、時間がなくて放置してしまった過去がありました）。

最近でもVS2017のアップデートで（本文でも触れましたが）CommunityエディションでもRemoted iOS Simulatorが使えるようになったり、Xamarin Live Playerが正式に含まれたりなど、Xamarin開発環境も進化しています。.NET Standard対応など、Xamarin自体の進化もあります。
こういったことからも、Xamarinを学ぶハードルが下がりつつ、学習の意義は増していると思います。

今後、Xamarin人口がさらに増え、それぞれのプラットフォームでの開発がより盛り上がることを願います。