Windows アプリ開発ほぼ未経験だった私が Windows アプリの技術選定をやってみた話

以前に Windows アプリ開発ほぼ未経験の私が、Windows の技術選定を任されました。
任された理由としては、部署外含めて社内に Windows アプリ開発の経験者が私以外にいなかったためです。
正直びっくりでしたが、これは成長のチャンスだと思い引き受けることにしました。
ほぼ未経験の状態でどうやったのか、備忘録として残しておきます。

# 当時のスキルセット、状況

- Windows Form 系のアプリの運用保守を 4 ヶ月程度
  - 数年前なのでほぼ忘れている
- C#の業務経験は 1 年弱（上述の Windows アプリと Unity）
- ライブラリの比較調査など調査タスクの経験あり
- 業務委託で参画
- 部署外含めて社内に Windows アプリ開発の経験者不在
  - 技術的にアドバイスできる方が不在

# やったこと

## 要件項目の確認、洗い出し

まずはここから始まりました。主にビジネス側へのヒアリングになります。
このフェーズが一番重要で、要件を満たせなければそもそも開発する意味がないですし、それがそのまま選定基準になるからです。
認識違いの無いように気をつけましょう。

## 非要件項目の洗い出し

要件以外にも、以下のような非要件項目を洗い出しておくのも重要です。

- 言語
- 学習コスト
- セキュリティ
- 拡張性
- etc

## 要件を極力満たすかどうか、プラットフォームごとに比較する

各要件を確認したら、それを選定条件としてそれぞれ満たせるかを調べます。
Windows アプリを開発するにあたって複数のプラットフォームが存在するため、プラットフォームと各要件の比較表を作成します。
評価方法として、○、×、△ のように何段階かで評価すると比較しやすくて良いでしょう。
そして、評価理由をエビデンスとして残しておくと、あとで振り返るときにわかりやすくなるのでさらに良いです。
一例としては以下のような感じです。

|            | Win32                                                              | Windows Form                                                                                                             | WPF                                                                                               | UWP                                                       | Xamarin                                               | Unity                                 | Electron                    |
| ---------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | ----------------------------------------------------- | ------------------------------------- | --------------------------- |
| 概要       | https://docs.microsoft.com/ja-jp/windows/win32/desktop-programming | https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/getting-started-with-windows-forms?view=netframeworkdesktop-4.8 | https://docs.microsoft.com/ja-jp/dotnet/desktop/wpf/getting-started/?view=netframeworkdesktop-4.8 | https://docs.microsoft.com/ja-jp/windows/uwp/get-started/ | https://docs.microsoft.com/ja-jp/xamarin/get-started/ | https://unity.com/ja                  | https://www.electronjs.org/ |
| 言語       | C++                                                                | C#, Visual Basic                                                                                                         | C#, Visual Basic                                                                                  | C#, Visual Basic, C++, JavaScript                         | C#                                                    | C#                                    | JavaScript, HTML, CSS       |
| 学習コスト | ×<br>未経験のため。                                                | ○<br>言語、プラットフォーム経験あり。                                                                                    | △<br>言語経験あり。                                                                               | △<br>言語経験あり。                                       | △<br>言語経験あり。                                   | ○<br>言語、プラットフォーム経験あり。 | ×<br>未経験のため。         |
| 要件 1     | △                                                                  | ○                                                                                                                        | ×                                                                                                 | ○                                                         | ○                                                     | ○                                     | ○                           |
| 要件 2     | ○                                                                  | ○                                                                                                                        | ○                                                                                                 | ×                                                         | ○                                                     | ○                                     | △                           |
| 要件 3     | ○                                                                  | ○                                                                                                                        | ×                                                                                                 | ○                                                         | △                                                     | ○                                     | ○                           |

## サンプルアプリの作成、検証

ネットの情報だけだと実際どんな感じなのか、本当に正しいのかがわかりません。
簡易的なサンプルアプリを作成して検証することで、より情報の精度が上がりますし、あわよくば実装した内容をその後のアプリでそのまま使い回すこともできます。

## 落としどころを決める

あれは大丈夫だろうか、これは大丈夫だろうかと将来のことを考えるともっと調べねばと不安がよぎります。
ですが落としどころを決めないと、どこまでも調査できてしまい、いつまでも決まらなくなります。
期間を決めるのもありです（私の場合は納期の都合もあったので 1 ヶ月ちょっとくらいでした）。

## 便利なライブラリが無いか探しておく

調査のついでに便利なライブラリが無いかメモしておくとより良いです。
理由としては極力開発工数を削減できるようにするためです（あわよくば有名なライブラリを使っての開発実績もできる）。
ボイラープレートコードを極力省き、本来の開発に集中できるよう準備しておきましょう。

## .NET について知る

Windows アプリ開発にあたって、`.NET`の知識が必須です。例えば`.NET Framework`か`.NET Core`かで対象となるプラットフォームが異なります。
以下の記事にまとめましたので、参考にしてみてください。
[.NET 系のフレームワークの概要についてそれぞれ調べてみた - Qiita](https://qiita.com/hiesiea/items/342ffdb1860358daf63f)

## 勉強になった情報はアウトプットしておく

勉強になった情報をアウトプットしておくと後で見返すことができますし、目に見える実績にもなります。
技術選定の過程で以下の記事をアウトプットしました。

- [Serilog を使って UWP アプリでログを出力できるようにする - Qiita](https://qiita.com/hiesiea/items/a0aed8486521606409cf)
- [RestSharp を使って Digest 認証を試してみた - Qiita](https://qiita.com/hiesiea/items/41c618db8302ff1e6131)
- [RestSharp を使ってファイルのダウンロードを試してみたが、公式のやり方ではうまくいかなかった話 - Qiita](https://qiita.com/hiesiea/items/17778f55e592dec203ad)
- [コピペで簡単！NLog をすぐに使えるようにしたい人へ - Qiita](https://qiita.com/hiesiea/items/f45e06d7c09dcd6577cf)
- [EF Core でマイグレーションを実行する際に発生しうるエラーとその対処法 - Qiita](https://qiita.com/hiesiea/items/947de641945a5bf95a34)
- [EF Core のマイグレーションがすごい便利だった - Qiita](https://qiita.com/hiesiea/items/4ea2aa545395338475e7)

# まとめ

技術選定はなかなか経験できないフェーズなので、理由はどうあれ経験できてラッキーでした。
未経験でも他での開発経験がそれなりにあれば、わりとどうにかなります。
ただモダンだからではなく、相対的に比較しながら一番要件を満たせるものを探すことが重要と考えます。
やり方の大枠は他にも応用が聞くはずなので、参考になれば幸いです。