レガシー化したおじさんが.NET5までキャッチアップする

# この記事について
この記事および関連記事は.NETの進歩に置いていかれてレガシー化したおじさんが.NET5までのテクノロジーにキャッチアップするために学習した内容を記録します。
私と同じように時代に取り残されたおじさんが時代についていくための助けになればと思います。

# レガシー化したおじさん
私の前提知識はこんな感じ。

・言語はC#。2008年頃からたまに仕事で使用。
・Windowsアプリケーション開発(WindowsForms)経験あり。
・ASP.NET MVC5でWebシステム開発もちょっとだけ仕事でやった事ある。
・.NET Core？WPF？UWP？なにそれなにそれおいしいの？

# 学習方針
キャッチアップするといっても、闇雲に学習していては効率が悪い。そこで学習方針を立てる事にした。
方針は下記。

・まず最新のロードマップを入手する。
・最新のロードマップと、今私が持っている知識の差異が学習すべき範囲。
・ただし、今後必要になりそうな技術のみ学習する。消える予定の技術は学習しない。

## 最新のロードマップ
というわけで、.NETが今後どこに向かっているのか、ロードマップを入手することにした。
調べたところ、.NETは今後[.NET5](https://devblogs.microsoft.com/dotnet/introducing-net-5/)というプラットフォームに統合されるようだった。
[日本語解説記事](https://www.publickey1.jp/blog/20/netnet_5net_frameworknet_corexamarin3.html)
[再統合された .NET:.NET 5 に関する Microsoft の計画](https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2019/july/csharp-net-reunified-microsoft%E2%80%99s-plans-for-net-5)

>マイクロソフトは現在、主に3種類のフレームワークを提供しています。Windows向けの「.NET Framework」、当初はおもにサーバアプリケーション向けとして登場し現在はデスクトップアプリケーションなどにまで範囲を広げたオープンソースの「.NET Core」、そしてモバイル向けの「Xamarin」です。

ふむふむなるほどね。
統合って言われても、.NET Framework以外の統合される技術自体を知らないんですが。。

## 学習範囲の決定
というわけでロードマップを元に、アプリケーション開発(Windows/モバイル)に関係する下記の技術について学習することにした。

|技術|コメント|
|---|---|
|WPF|リッチなUIを作れるフレームワーク。XAMLやMVVMなどは他の技術にも使われているので押さえておくべき。|
|UWP|Windows用アプリを作るためのプラットフォーム。UIだけでなく、いろいろ便利なAPIセットが追加されている。(昔WinRTって言われてたやつ)|
|Xamarin|.NETでマルチプラットフォーム開発を行うためのプラットフォーム。.NET6以降に載る予定の次世代UIフレームワーク[.NET MAUI](https://forest.watch.impress.co.jp/docs/news/1254643.html)はXamarin.Formsベースの模様。|
|.NET Core|OSSでクロスプラットフォームな.NET実装。今後はこいつが.NET5に統合されて生き残ることになる。|
|.NET5|.NET Frameworkは今後機能追加されず、.NET5に統合される。|

ちなみに、ロードマップに出てきた中で、今回学習しない技術は下記です。
時間と熱意があればやりたい。

|技術|コメント|
|---|---|
|AI(ML.NET)|分野としては興味ある。でもMS製品普及するかな…|
|IoT|同上|
|Unity|ゲームが作りたくなったらやる|

### 学習内容、メモ

## WPF

結構がっつり勉強した。

|項目|実施内容、感想|
|---|---|
|[Windows 10 アプリケーションの開発](https://docs.microsoft.com/ja-jp/learn/paths/develop-windows10-apps/)|WPFでのアプリ開発をかるく一通り学習できた。<br>WindowsFormsとWPFとUWPの三通りの実装をして比較することで、それぞれの違いをなんとなく掴むことができた。|
|[C#WPFの道【XAMLに慣れる編】: WindowsFormsプログラマーがWPFを書く方法](https://www.amazon.co.jp/gp/product/B07NCZWPFG/)|Kindle unlimitedで読みながら写経。<br>デザイナーを使わずにXAMLをガリガリ書いていくスタイル。<br>WPFで使えるコントロールを色々触って覚えながらXAMLと仲良くなれた。おすすめ。|
|[C#のWPFでPRISMを使ってMVVMで実装する方法](https://www.amazon.co.jp/dp/B087X4C7W2)|Kindle unlimitedで読める。Prismを使ってのMVVM実装を実践。Prismを使ってMVVMで実装する練習にはなったが、あまりフレームワーク自体の解説は少ないように感じた。ここで学習した内容を使って実際に何か作りながら覚えるのがいいかも。|


## UWP

これはサラっとやった。


|項目|実施内容、感想|
|---|---|
|[Windows 10 アプリケーションの開発](https://docs.microsoft.com/ja-jp/learn/paths/develop-windows10-apps/)|UWPでのアプリ開発をかるく一通り学習できた。WindowsFormsとWPFとUWPの三通りの実装をして比較することで、それぞれの違いをなんとなく掴むことができた。|

## Xamarin

モバイルは仕事では開発したことないが、趣味で何か作りたくなった時のためにも学習しておくのがいいかなあと思い、実施。
思ったよりボリュームがでかかったが、演習もすべて実施した。

|項目|実施内容、感想|
|---|---|
|[Xamarin.Forms を使ってモバイル アプリを構築する](https://docs.microsoft.com/ja-jp/learn/paths/build-mobile-apps-with-xamarin-forms/)|iOS/Android用アプリをC#(Xamarin)で一通り開発体験できた。思った以上にほとんど共通コードで書けそう&ネイティブに寄った処理を書きたい場合もラッパーが用意されている模様。簡単なアプリなら作れそうなので、後で作ってみる。|
|[Xamarin.Forms アプリをカスタマイズして高度な機能を追加する](https://docs.microsoft.com/ja-jp/learn/paths/customize-your-xamarin-forms-apps/)|モバイルアプリのカスタマイズというタイトルでありながら、設計パターンについての解説が多く、良いコースだった。特に下記は勉強になった。<br>[・Xamarin アプリのクロスプラットフォーム設計パターンを調査する](https://docs.microsoft.com/ja-jp/learn/modules/explore-cross-platform-design-patterns/)<br>⇒DIについての解説。プラットフォーム依存部分の注入について、ファクトリパターン、サービスロケータパターン、IoCコンテナパターンでそれぞれ実装することで学習できる。モバイルに限定した話じゃないけどいい内容だった。<br>[・Xamarin.Forms のデータ バインディングを使って UI とコードを分離する](https://docs.microsoft.com/ja-jp/learn/modules/separate-your-ui-and-code-with-xamarin-forms-data-binding/)<br>[・Xamarin.Forms 用の MVVM ViewModel を設計する](https://docs.microsoft.com/ja-jp/learn/modules/design-a-mvvm-viewmodel-for-xamarin-forms/)<br>⇒MVVMの実践。これもモバイルに限定した話ではないが、MVVMを理解するにはいい内容だった。|

## .NET Core

VisualStudioで新規プロジェクト作成してアプリケーション開発する分には学習すべき点はなかった。
.NET Frameworkで作った既存のプロジェクトを.NET Coreに移行するとか、もっとどっぷり浸かると色々障害が出てくると思われる。
ただし、ASP.NET CoreはASP.NETとは別物になっているようなので、別途学習する必要あり。

|項目|実施内容、感想|
|---|---|
|[.NET Coreでサンプルを作ってビルドした](https://github.com/nendo-code/MyMemorandums/tree/master/PrismApplicationSample)|と、言っても、プロジェクト作成時に.NET Frameworkの代わりに.NET Coreを指定しただけ。かんたん。（と言っていいのだろうか。。）|

## .NET5

プレビュー版を入れて実施。

|項目|実施内容、感想|
|---|---|
|[.NET5でサンプルを作ってビルドした](https://github.com/nendo-code/MyMemorandums/tree/master/dotnet5sample)|これも.NET Core同様。ほかにもWindowsFormsとUWPでもビルドしてみたが、そんなに変化なし。|


## 周辺知識

キャッチアップ中に興味を持った周辺知識について学習した内容

|項目|実施内容、感想|
|---|---|
|[C#でドメイン駆動開発とテスト駆動開発を使って保守性の高いプログラミングをする方法](https://www.amazon.co.jp/dp/B078ZF79CL)|Kindle unlimitedで読める。ドメイン駆動開発について知っておくとナウくてかっこいいかと思い、写経して実行しながら学習。<br>大まかにMVVMでの実装と、ドメイン駆動開発での実装について理解ができた気がする。TDDは元から実践してるので、特にコメントなし。|
|[Domain Driven Design（ドメイン駆動設計） Quickly 日本語版](https://www.infoq.com/jp/minibooks/domain-driven-design-quickly/)|エリック・エヴァンスのドメイン駆動設計の要約版。そのうち本物版も読む。高いけど。。|

## 感想

学習すればするほどわからない部分が出てきて学習範囲が広がっていくので大変だった。
キャッチアップはまとめてやるのではなく、コツコツ随時やるべきだなぁ。

XAMLはFormsのデザイナーでペタペタ部品貼るスタイルよりは好き。できれば今後新しいプロジェクト等あれば使っていきたいが、はたしてその時使えるメンバーが揃うかどうか…
MVVMも個人的にはかなりしっくり来たが、使えるメンバーが(ry
学習コストが課題かと思われる。

個人開発とかちょっとしたツール作成は今後WPF(+規模によってはMVVM)でやって経験を積む。
UWPはもうちょっと様子見。。(先があるのかないのか不安な感じなので)
あとは今後Xamarin.FormsでiOS/Anddroidアプリリリースまでやってみる予定。