C#はオワコンなのか?

世の中には沢山のプログラミング言語がある。そんな中であまり目立たないけど有用性抜群だと思っているのがC#です。
しかしあまり注目されることがないのも事実。業界歴2桁目前の自分が思うことを書いてみたいと思います。

最近の界隈

実務も踏まえて、今一番潮流に乗っている言語はJavaScript(TypeSceipt)だと思います。次点でPHP。説明する必要もない実績も歴史もピカイチな言語。

PythonやRubyも特にweb系の案件では要項として見ますね。

TypeScriptはちょっと毛色が違いますがこれらはスクリプト言語と呼ばれる種類で、気軽に扱いやすいことが特徴。コードがそのまま動くのです。また昔からwebといえばこの2つでした。採用数も多いので案件も多い。

なのでスクールもこれらが学べる物が多いです。

対してC#やJavaといった言語は昔ほど話題に上がらなくなったイメージ。言い換えれば言語的に成熟期を迎え、枯れた言語と言えるでしょう。

また、お堅い現場やかなり大規模な案件での採用が多い言語のため、所謂フリーランス向け案件が少ないのも利用が活発でないように見える原因の1つでしょう。

C#の特徴

C#はC++の系譜であり扱い辛い部分を改良したもの。様々な特徴が存在します。

強い型付言語

C#には強力な型システムが存在します。各変数は生成した時から型を持ち、「1」が数値なのか文字なのかわからなくなることはありません。

オブジェクト指向に忠実

最近はPHPやJSでもクラスのような概念が備わりましたが、あくまで「それっぽいもの」です。C#での開発に慣れている人間としては物足りないし保守性も下がってしまうように感じます。

public class User
{
   public string Name { get; set; } = "";
   public int Age { get; set; } = 0;

   public User(string name, in age)
   {
      Name = name;
      Age = age;
   }

   pubric string TalkMySelf(string targetName)
   {
      return targetName + "さん。こんにちは。私は" + Name + "です。";
   }
}

オブジェクト志向の教科書的な書き方ですよね。必要なもの、初期値、作用が一目で把握できます。

コンパイルが必要

デメリットにも繋がりますがC#はコンパイルしないと動きません。文法エラーがあるとそもそもコンパイルが通らないのです。しかしその分、型システムとコンパイルエラーのおかげでPHPやJSのように「処理を動かさないと文法エラーがわからない」という状態にならないのです。

わかりやすいTryCatch機構

C#には優秀な例外制御機能が存在します。

try
{
   ...何らかのExceptionが発生する処理
}
catch(Exception e)
{
   ...エラー時処理
}
finally
{
   ...処理成功時も失敗時も必ず通る処理
}

シンプルでわかりやすいですよね。とってもベーシックな書き方ができます。

数値や日付が素直

見落としがちですが、JSやPHPでは日付けの扱い方や小数点の計算に癖があったりします。例:小数点計算がずれる、+1 month….

C#では正確に計算する場合にはdecimal型がありますし、DateTime型は直感的に日付を操作できるメソッドを沢山持っています。

またこれらはNull非許容型であり、意図しない挙動を防ぐことが可能です。

C#についてよく聞く話

Q. Windowsじゃないと動かないんでしょ?
A. 一昔前はそうでした。今ではLinuxでも動きますし、AndroidやiOSに対してネイティブアプリ開発だって可能です。

Q. 実行速度が遅い!
A. https://qiita.com/takeITeasy7/items/0e9a99a6c72a18ff3712
Goと張り合えるなら問題無い?実装方法がまともなら遅いと思ったことは無いです。

Q. Microsoftの犬になるんでしょ?
A. 確かにVisualStudioの有償版が必要なパターンもある(一定規模以上のチームでWinForms開発とか)。けど企業規模によっては無料版で事足りるし、web系ならvsCodeでも一応開発可能。DBもSQLServer以外だって使える。macやLinuxでも全然開発出来る。あと数年前からC#やランタイムがオープンソース化されたので、開発者に寄り添おうとしている感じは伝わる。

C#の使いどころ

良いところばかり書き連ねましたが、だからと言って全てにC#がフィットするとは思っていません。シチュエーション毎に考察します。

winアプリ開発(◎)

メインフィールドですよね。WPF? UWP? WinFormsでいいんです。

Android/iOS開発(○)

実案件に耐えうるものも全然作れます。ただ、kotlinやSwiftで作れるならそっちで作ってもいいと思いますし、クロスプラットフォームを意識するならFlutterの方を自分は選びます。主要メンバーがC#エンジニアなら使うかなという感じ。

フロントエンド開発(○or△)

開発者の経験的に絶対C#がいい!という理由があるならC#でしょうが、Reactやvueが強すぎですよね。情報量、関連パッケージを考えるとC#は選択肢から外れる気がします。

サーバサイド開発(○)

個人的にはサーバ側に厳密な型システムを導入できることは大きなメリットだと思います。.NETがオープン化したので動作環境に悩むこともなくなり、なかなか良い選択肢だと感じます。

いろんな側面

まずC#はお堅い開発で使われることが多いです。基幹システムや複雑な処理が伴う中規模BtoCサービス等。というのも歴史的にCOBOLからの移行先にJava or VB or C#という構図があったんですね。大規模はJava、中小企業はVB or C#を選定というのを個人的には感じてます。

上記のことから、フリーランス案件もJavaほどはないです。PHPやRubyみたいにグロース中というのもあまりない気がします。一方で責任や経験を求められるが単価も高めみたいなものを見かけます。個人的な感想ですが。。

まとめ

今の時代、新規開発をしようと思った時はとりあえずnode.jsやPHP、Rubyが一番に出てくると思いますが、JavaやC#がなぜ使われてきたのか?今も生きているのかを考えてみるのもありだと思います。