Xamarin 最近どうよ？

[「ネイティブアプリ開発者は絶滅危惧種なのか？」への感想文 - ナカザンドットネット](https://blog.nkzn.info/entry/2019/04/16/163743)

や

[Office 365, MS teams, Skype, @code, and the edge debug protocol are being rewritten in js instead of C++ with special MS tooling : programming](https://www.reddit.com/r/programming/comments/8qqhlz/comment/e0ll1dt/)

への反応で、「最近 Xamarin 生きてんの？」という声がちらほら聞こえたので書いてみました。

もともとの 「ネイティブアプリ開発者は絶滅危惧種なのか？」 という問いには、「緩やかにそうなっていくでしょうね」 という冒頭の記事を書かれた @Nkzn さんとほぼ同じアンサー[^3]  なので、この話題を Xamarin と絡めたらというネタで書きます。

[^3]: ポジションも React を Xamarin に置き換えればほぼ同じだわｗ

## マイクロソフトなのになんで React 使ってんの？Xamarin は？

Office も Teams も Skype も、全て Web アプリも含めての rewrite 構想だったのでしょうね。
Webを含めるという戦略も当然だし、Xamarin は **Webアプリはカバーしない** ので、至極当然の選択です、以上です。

## 近年のマイクロソフト

ここ数年のマイクロソフトは、軸足を完全に Azure、つまりサーバーサイドに移していて、クライアントサイドのプラットフォーム(Windows)で覇権を取ることはあきらめたように見えます。

フロントエンド技術への注力で目立つものは、

* TypeScript [^1]
* Xamarin
* HoloLens

[^1]: 言語という意味では C# もガンガン進化してます

くらいで、いわゆる「Windows向けアプリケーション」を開発するための、

* WPF(Windows Platform Foundation)
* UWP(Universal Windows Platform)

といった領域の新機能はあまり目立ちません。

## クロスプラットフォームな .NET 開発/実行環境である .NET Core

一方でマイクロソフトは、サーバーサイドというか、 **Windows 以外のプラットフォームで .NET 資産を使えるようにする** ことに注力し続けていて、それが **.NET Core** です。

* [.NET Core について | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/core/about)

.NET Core は **本当にクロスプラットフォーム** で、 Linux や mac で同じバイナリが動作します。
AWS の Lambda も .NET Core をサポートしているし、[Dockerコンテナ](https://hub.docker.com/_/microsoft-dotnet-core) も普通に用意されています。

「は？オレ今まで .NET 使ってないから関係ねーし」と言われればそれまでですが、この先ずっと同じ言語を使って働いていくとも限らないですし、選択肢が増えるのは良いことです。

## マイクロソフト自身が「脱Windows」している

個人的にもっと象徴的だなあと思ったのが SQL Server on Linux です。

* [SQL Server on Linux の概要 - SQL Server | Microsoft Docs](https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-overview?view=sql-server-2017)

MS の RDBサーバーである SQL Server は当然 Windows OS 専用でしたが、それすら Linux 版を作ってしまいました。

このように、マイクロソフト自身が Windows を捨てる準備を着々としているように感じられます。

## Xamarin は最近どうなのよ？

さて、ネイティブアプリ開発が PWA に喰われ、クロスプラットフォームなネイティブアプリ開発は Flutter に押されと、オワコン説もささやかれる Xamarin ですが、Xamarin の最近の動向を書いてみます。

そもそもブランドとしての Xamarin とは、

* Android や iOS の API を .NET 向けにラップした Xamarin Native(Xamarin.Android や Xamarin.iOS)
* ↑を利用した、Android/iOS/etc共通のUI/アプリケーションフレームワークである Xamarin.Forms [^2]

[^2]: もはやこちらが「Xamarin」として認知されているのが現状ですが、そうでは無いことをご理解いただきたく。

に大別されます。

Xamarin Native は縁の下の力持ちというか、Android,iOSそれぞれのSDKのバージョンアップに追従して粛々とバージョンアップをし続けていて、それだけでとても価値があります。逆に言えば、ここでは皆が驚くような新機能は今後も出てこないでしょう。

Xamarin.Forms が、Flutter や ReactNative と直接の競合関係になる箇所です。
Flutter の「Materialで美麗なアプリを爆速で」とか、ReactNativeの「WebもAndroidもiOSも」に比べると弱いですが、機能追加はしています。最近だと、

* FlexLayout - FlexBox みたいなやつ、というかそれ
* Xamarin.Forms Visual - Flutter よろしく Android/iOS で Material な見た目を実現できるやつ

Xamarin.Forms Visual は実現方法は違えど、対Flutterとしては効果が期待できそうな雰囲気を感じます(目的はそれかは知らない)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8227/a8b8ddda-5a6b-26e6-4de6-32c26ad0cc15.png)

↑ [Visual Challenge Conquered! | Xamarin Blog](https://devblogs.microsoft.com/xamarin/visual-challenge-conquered/) より

## 今後私は Xamarin と、あるいはネイティブアプリとどう向き合って行くのか？（持論)

Xamarin に関しては、徐々にシェアは減っていくのでしょうが、ぽんぽこ風に言えば「それでもどっこい生きている」でしょうか。意外としぶといんですよ、.NET が死ななければ Xamarin も死なないし。

私自身は、「PWAファースト」な考えをしています。
最近は [Glide](https://www.glideapps.com/) という **Spreadsheet から PWA が自動生成できる** サービスに注目していて、そう言えばこれは Xamarin からスピンアウトした人達が作っているサービスでした。

* [コーディング不要でスプレッドシートから簡単にモバイルアプリを作れるGlide  |  TechCrunch Japan ](https://jp.techcrunch.com/2019/02/13/2019-02-12-glide-helps-you-build-mobile-apps-from-a-spreadsheet-without-coding/)

スピンアウトした彼らは、ネイティブアプリからPWA移行の急先鋒と言えるのかも知れないですが、この Glide に注目している理由を、冒頭の @Nkzn さんのブログから引用します。

> BtoBでお客さんが「アプリが欲しい」と言った場合に、実はそれは素朴なWebアプリでいい要件だったり、少し込み入ってもPWAの範囲でなんとかなるものは、意外と多いのではないでしょうか（肌感覚です）。

こういう肌感覚を私も持っていて、Glide ってまさにこういうニーズにぶっ刺さるんじゃないかな、と感じるからです。
Salesforce みたいなツールを導入するコストは無い、業務は EXCEL で回っているみたいな中小企業さん向けのソリューションですね。
Glide がそのまま使えるケースは限られるでしょうが、開発の参考にする価値は大いにあるなあと。

PWA の次の選択肢として検討するのが「ガワネイティブ」ですね。
[DroidKaigi 2019 の私の発表](https://droidkaigi.jp/2019/timetable/70891) で、「再考！ガワネイティブ」という章を設けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8227/cb00b1f2-fa5c-c98f-930f-9131762ec570.png)

これの意図するところは、

* プレゼンテーション層は PWA(というか Web)
* デバイス連携はネイティブ

とすることで、現状 Web では苦手な機能を部分的にネイティブにやらせることで、いいとこ取りが簡単にできるじゃん？というものです。

で、このデバイス連携箇所をネイティブで作る際、Xamarin（Xamarin Native）が活躍します。
例えば 「カメラで画像を撮影して Android の TensorFlow Lite や iOS の CoreML で解析してその結果を返す」 という一連の処理をそれぞれ実装して、抽象化されたAPIを定義し、それを JavaScript と連携させて PWA から呼び出す、ということは、現状もっとも作りやすいのは Xamarin と .NET です。
Flutter や ReactNative や Cordova などはどうしてもネイティブとのブリッジが面倒です。その面倒さは API をラップしている Xamarin Native にはほぼありません(何度言っているのだろうこのセリフ)。
ただ、Kotlin Multiplatform がもっと進化したら置き換えられる可能性はあります、期待しています。

## おわりに

まとめると、

* モバイルネイティブアプリ開発者は徐々に絶滅危惧種になっていくと思う
* Xamarin はそれでもどっこい生きている(く)
* 10年後のことは誰にもわからない

モバイル "ネイティブ" アプリ開発案件の数は減っていくと思っていて、その中のクロスプラットフォームアプリ開発ツールと領域でも Flutter や RN、Kotlin MPP とパイを取り合う構図なので、Xamarin へのニーズも徐々に減っていくと思います(クロスプラットフォームはモバイルに限った話ではない、という話ならそれは Xamarin ではなく ".NET" ですし)。

一方で .NET の利用シーンは増えている(Azure, ゲーム(Unity), HoloLens など)ので、「周りがほとんど .NET だった時にモバイルアプリが必要になったら Xamarin」という選択にはなると思います。JavaScript はほぼどこでも使えるようになっているし、Kotlin もそうなりつつあります。Dart はまだ未知数という感じでしょうか。

Android Dev Phone 1 を $400 で買って、自分で書いたアプリケーションがその端末で動いたとき、めちゃくちゃ感動したし、なんだかものすごい未来が来る予感がして、実際(概ね)そうなったわけですが、その10年前と同じ感動と予感が得られる「何か」をずっと探していて、そのために、スマホアプリに限らずいろいろなテクノロジーに手を出しています。たぶんこれからもそうして生きていくと思います、それが楽しいです。