404ニキのBlog@hatena

Microsoftの技術について取り扱うブログです。開発ツールとAzureがメイン、あとは興味のある内容

C# に対する誤解をひも解く

ちまたでは以下のような記事が話題になっていると聞いて読んでみたら誤解が多いかなと思ったのでいくつか紐解いていくことにする。

C#はやめとけと言われるのはなぜ?C#エンジニアが人気な理由とキャリアアップの方法を解説 | エンジニアスタイル

誤解されていると思われているところを列挙していきます。

他の言語に比べて独自の優位性が少ない

まず、某記事では優位性、あるいは特筆すべき独自の強みが少ないという観点について説明されています。

この「優位性とは何か」ですが、某記事では機能の豊富さとフレームワークを中心に比較しています。(以下、該当箇所を抜粋)

JavaScriptはフロントエンド開発においてよく使用される言語であり、ReactやVue.jsといった強力なフレームワークがあります。また、Pythonは使いやすさやライブラリの豊富さが強みであり、データサイエンスや機械学習の分野で広く使用されています。つまり、JavaScriptやPythonはそれぞれの分野で独自の優位性を持っているため、多くのプロジェクトで選ばれています。

一方、C#は主にMicrosoftの環境で使われることが多く、特にWindowsアプリケーションの開発に強みがあるものの、他のOSやプラットフォームでは同様の強みを発揮しにくいという点がデメリットとされています。

確かにJavaScriptやPythonには強力なフレームワークがあり、大変便利であることは否めません。多くの案件にも採用されていることでしょう。

しかし、「それぞれの分野で独自の優位性を持っているため、多くのプロジェクトで選ばれています」というとC# もそうです。

古くから業務用のアプリケーションにはC# が使われており、今でも一部ではまだまだ現役です。 独自の優位性を持つということであれば、C# には強みがあるということです。

他のOSにおいて強みを発揮しにくい

例えば、モバイルアプリ開発においては、Swift(iOS)や Kotlin(Android)がそれぞれのプラットフォームに最適化されており、クロスプラットフォーム開発にはFlutterやReact Nativeが選ばれることが多い傾向にあります。

という記載がありますが、これはそもそも比較対象が良くないです。

なお、C#で書いたものが他の言語同様に動くかどうかという話であれば、それは共通言語ランタイムが解決しています。 現代においては.NET Runtimeと呼ばれているものです。

ただし、モバイル向けの言語と比較した際は見劣りするかもしれません。しかしそれは言語のコンセプトが違うという理由で片付けられることであり、C# に限った話ではありません。

Windows以外のOSとの互換性や柔軟性に欠ける

これは大きな誤解であり、認識が古いと言わざるを得ません。 前述のとおり、.NET Runtimeによってプラットフォーム間の互換性問題は解消されています。

また、某記事では以下のような記載があります。

一方、JavaやPythonなどの他のプログラミング言語は、クロスプラットフォームでの開発が得意であるため、OSに依存しないアプリケーションの開発が可能です。Javaで開発されたアプリケーションは、JVM(Java Virtual Machine)上で動作するため、同一のコードベースでWindows、Linux、macOSなどの異なるOS上で実行できます。Pythonも同様に、幅広いOSでの動作をサポートしており、クロスプラットフォームのスクリプトやアプリケーションの開発に適しています。

Javaが実行されるのはOSではなくランタイム上です。Pythonはインタプリタ上で実行されます。 Pythonについてはプログラムにして配布することも可能ですが、その場合はPythonのプログラム本体を埋め込んだプログラムを配信する必要があります。

また、容量が大きくなりがちであり、ユーザーに対してうまいことソフトウェアデリバリーするのにはそれなりのスキルが要求されます。

たしかにC#のクロスプラットフォーム対応についてはまだまだ足りない部分も多いかもしれません。しかし、「Windowsに特化した」は語彙が強すぎます。

C#はコンパイルが必要

いいえ。コンパイルをしなくても今のC# は実行できます。 現代においては、プロジェクト内でdotnet runを実行することで動作を確認できます。

なぜこのような話が出てしまったのかを考えるとたしかに昔はコンパイルで動かすのが当たり前の言語でした。

フォームアプリケーションなどの用途ではビルドコンパイルしてからソフトをデリバリーするというのがC# の通例です。

なお、現代のC# はワンライナーで動作が可能です。つまり、明示的なエントリーポイントを必要としません。Mainを書く必要はなく、Pythonなどの言語と同様に1行書いたら動作します。

ここから下に書くものは言語関係なくあるものだと認識しているのでまとめて書きます。

C#のスキルを求める企業が多い

多い少ないかはわかりません。 ただ、従来の業務アプリケーションだけでなく、Webアプリケーションにおいても使われているため、求めるところは多いと思います。

未経験でも歓迎してもらえる企業がある

これは言語に限った話ではなく、企業にどれだけの甲斐性があるかが重要です。

ひとつ言えるのは古くから業務用アプリケーションがあって保守を任せるような場合においては歓迎はされないでしょう。 某記事にも記載がありますが、歴史の長い言語であるため、古いシステムがまだまだ存在する可能性があります。

それらを継続的に保守するとなると未経験では難しいと考えられます。

ただし、実務経験者で関連の技術に知見のある人は歓迎されるかもしれません。

リモート案件が多く自由度の高い働き方ができる

これも企業によります。C# なのでなおさら逆というパターンもありえます。

様々なキャリアパスを選べる

某記事では以下のように説明されていますが、C# にはWebアプリケーションを開発するための技術が存在します。コンパイルが必要なものに限ってはいけません。 また、ASP.NETについて説明していますが、Blazorについても説明すべきです。

まず、C#はWindowsのアプリケーション開発に強いため、デスクトップアプリケーション開発者としてのキャリアパスが考えられます。企業の内部システムや業務用ソフトウェアの開発において、業務効率化や自動化に携わるエンジニアとしての役割を果たせるでしょう。Windows Presentation Foundation(WPF)やWindows Formsを使用して、よりよいユーザーインターフェースを持つアプリケーションの開発も可能です。

もろもろ

下請けかどうかやITへの理解が低いかどうか

→言語関係なく、合わないならいかないほうがいい

教育体制が整備されていない企業

→ 受け身でみっちり学習しないとダメというのであれば、長くやっていくのは難しい。 短期的に見てメンターが必要というのはわかりますが、ずっとメンター依存というのは成長しないので教育体制を基準に企業選びはしないほうがいい。

※ただし、業務のための教育や必要なレクチャーをする体制はとても重要

ここで説明しているのは 業務に関係のない技術面、スキル面の話であり、たしかに業務に関しても教育体制がないのも異常なのでそういうのは避けたほうが良いです。

まとめ

まだまだ誤解が多いC# および.NETですが、誤解を正せば、とても良い言語に感じると思います。

疑問なのは同じ企業が開発した言語なのにTypeScriptは良くてC# がダメな理由はよくわからないなと思いました。