個人的に C# が向かないと思うこと

先日 @okazuki さんが [C# で出来ること一覧](https://qiita.com/okazuki/items/e3a8e23f9ac2a10d8fde) を書いていて、とても同意だった。C# 10年以上やってきて、その成長には満足しているし、対応ソリューションやプラットフォームは凄いものがあると思っています。

しかしこの記事では、あえて C# が逆に向かないことが何かを考えてみました。

**あくまで個人の見解であり、同意できないことがあることは事前に同意してきます**
**C# Love なので、非常にバイアスがあります**
**他の言語そこまで知らないので、どの言語がいいという話はありません**
**普段 C# か Node.js で開発しているので、そもそも C# に向かないことを自分がやっていないだけというオチはあるかも**

# Hello World までが遠い

LINE イベントや外部ハッカソンなど、Microsoft の外で活動する際、C# は Hello World までの時間が Node.js や Python に比べて時間がかかります。理由はいくつかありますが、以下の通り:

**IDE が必須**
メモ帳でもできる!!とかいうのは詭弁(またはHENTAI)で、IDE 必須です。他の言語も同様であり、Visual Studio Code があるから良いよねという意見もありますが、本当に C# の威力を発揮するなら Visual Studio が欲しいので、ここで時間がかかります。VSCode もとても良いけどね！

追記: Web API やコンソールアプリなど作るだけなら Visual Studio Code 最高！リアルタイムテストとかエミュレーターでごにょごにょやり出すと、VS 欲しい！です。

追記: そしてさらに、レベルがあがると VSCode すら不要だと。。。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「Hello World までが遠い」なるほど？ <a href="https://t.co/oLrdunclzm">pic.twitter.com/oLrdunclzm</a></p>&mdash; mattn (@mattn_jp) <a href="https://twitter.com/mattn_jp/status/1242253443328126977?ref_src=twsrc%5Etfw">March 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


**Runtime**
.NET Framework/.NET Core/Xamarin/Unity など用途によって色々あるのが強みでもあり、複雑さを増している感があります。.NET 5 が解決してくれることを期待しつつ。尚、耳に挟んだ情報では Python もたまに 2 か 3 か問題がある模様。

補足: ここで Python2/3 の話を上げたのが、互換性の問題でコードのコピペで動かないと聞いたからです。C# でもランタイムによってアルアルなので、違ったら教えてください。
補足: C# の面白さと難しさって言語仕様だけでなく、サポートする実行環境が多いが故のライブラリ差異にも起因するんだなぁと改めて実感。なんど UWP のサンプルを WPF で動かそうとしたか。。。

**コード量**
最近は少なくなりましたが、```Console.Write("Hello World");``` 以外のコードがそこそこあり、まだオブジェクト指向であるが故にスコープで失敗しがちです。これはオブジェクト指向言語全般に言えるでしょう。

**Windows**
C# の問題ではありませんが、個人的にイベントやハッカソンで C# を選択する場合、Windows ユーザーが比較的多い場合で、ここにも隠れた課題が。

- まだ Windows 7 ですー (別にいいんだけど、ハードが弱いことも多い)
- 会社の PC で制限があってツールはいらなーい
- VPN とセキュリティソフトが悪さ？してー

などなど IDE 入れることすらままならない時が散見されます。

# Hello World の後も壁がそこそこある
Hello World を超えて次に進撃した場合にも、C# ならではの壁があります。

**VS のテンプレートがリッチ**
これはとても良い事だけど、初心者に対する敷居をすこし上げている気もします。過保護かな。。Node.js/express のように、とりあえず get だけ書こうねーという気楽さが足りない一方で、ユニットテストとか初めからついてきて最高とも言えますが、作成直後、ユニットテストプロジェクトがまず消される事件現場に何度も遭遇したことがあります。

**サンプルが多様すぎる**
C# は歴史は中堅どころですが、進化している言語なので、時期によりサンプルの書き方が大幅に異なります。これは他の言語でも当然言えるはずですが、数年離れると何書いてるかわからないから、ギャル語 (死語ですいません）のようだといわれたこともあります。(async/await、Linq、Generic、ラムダ、var の頃)

ただし、他言語のいい所は取り入れているので記述方式などに特殊さはあまりないと思っています。

**実行環境の壁がある**
C# は色々できる反面、実行環境が (まだ？) 1 つではありません。.NET Core/Framework、UWP、WPF など、フレームワークや実行環境が異なると、コピペで動かないものもあり、混乱を呼びます。C# というキーワードだけでなく、ラインタイムを意識する必要があるので、コピペ職人泣かせです。(職人までくると逆に大丈夫か)
また同じ Windows アプリでもものによって使える API が異なるため、同じく動かないコードがあります。こちらも極力解消するよう [Microsoft は日々頑張っています](https://devblogs.microsoft.com/dotnet/introducing-net-5/)。

# データクエリ

実は Spark でも動く我らが C#! ([.NET for Apache® Spark™](https://dotnet.microsoft.com/apps/data/spark) を参照)
そしてデータクエリは Entity Framework が(賛否両論含めて)ある！

だが基本データ操作は SQL Server なら T-SQL がいいし、それぞれ専用のものがあるので、C# あればデータクエリも完璧だぜとは言い難いです。これは他の言語も同様だと認識してます。違ったら教えてください。

# 機械学習

ML.NET はじめました！なんですが、サンプルなど色々考えると、現状モデル読み込みと実行する時に、C# で出来るからアプリが C# でも安心！くらいの感じで、モデル開発中は Python やら R などをよく使います。サンプルも多いですし実行環境も多いので。この分野はこれからかな？

# マイクロソフト製品が対応していない場所での利用

適材適所のため、MS もなんでもかんでも C#/.NET ではありません。Power BI のカスタムビジュアルや SharePoint Framework、PowerApps Component Framework などは Node.js です。そこに無理やり C# を使って Javascript コード生成をねじ込むのは、ベテランとツールを持っている人だけがやる事でしょう。

いまでは TypeScript もありますので、型問題はある程度解決です。

# 関数型プログラミング

C# はオブジェクト指向型のため向きません。F# をどうぞ。

# スクリプト処理

Linux/Windows に限らず様々な自動化でスクリプトを書きますが、Windows であっても PowerShell で書きます。PowerShell は C# 実行できるとか、モジュールが C# で書ける！とかそういうのは関係なく、スクリプト処理に向く言語ではないと思います。

また az コマンドなど各種 CLI があるものは、当然そのまま使うので、わざわざ C# でラップして呼び出すようなことは（特に要件が無い限り）しません。

補足: [dotnet-script](https://github.com/filipw/dotnet-script) なる C# でスクリプト実行する面白いライブラリがあることをコメントで教えていただきました。Azure Function ぽくていいかも！
そして[C#でもスクリプト実行したい！](https://qiita.com/Midoliy/items/a033b763399c242dc5c5)も併せてどうぞ。

# Arudino や micro:bit

C# をねじ込む必要はありません。専用の言語と IDE でどうぞ。

# コンソール環境のみで開発

無理ゲーです。そんなことする理由は不明ですが、開発はコンソールでしかしない！vim 最高！と言われたら C# を推すことはしていません。

# まとめ

とりあえず色々思いついたことをつらつらと書いてみましたが、基本的には短期イベントの際に、経験者が少ない場合はお勧めしてません。

もし向いてないリストをもっと昔に書いたら、リストはこんなものでは無かったでしょう。

モバイル開発できない -> Mono と Xamarin
Windows でしか動かない -> .NET Core
ブラックボックスだ -> オープンソース化
ビルドから実行が遅い -> Roslyn
C# はそのうち終わる -> いわれ続けてもうじき 20 年。ありがとう。
クライアントサイドがごにょごにょ -> Blazor
その他山ほどの不満 -> フィードバックとして日々進化

結論: C# は投資に値する良い言語です。（趣旨と違