C#はオワコンなのか?

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

最近の界隈

転職サイトや案件サイトを見ていると、やはり多いのはJavaScript(TypeScript)とPHP。PythonやRubyも特にweb系の案件では見ますね。

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

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

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

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

C#の特徴

C#はC++の系譜であり、扱い辛い部分を改良したもの。そのため特にWindows系ではかなりOSに近い部分の機能も簡単に使用できたりします。またJavaからも多大な影響を受けており、スクリプト言語にはない様々な特徴が存在します。

強い型付言語

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

オブジェクト指向に忠実

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

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

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

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

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

また、カプセル化だとかDIだとかもC#で書いているとすごく意識しやすいです。

コンパイルが必要

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

わかりやすいTryCatch機構

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

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

シンプルでわかりやすいですよね。とてもベーシックな書き方ができます。例外を種類によって分けたい時もcatch句が増えるだけですし、Exceptionクラスを継承することで自作の例外を作成することが可能です。

数値や日付が素直

見落としがちですが、JSやPHPでは日付けの扱い方や小数点の計算に癖があったりします。

例:小数点計算がずれる、+1 month….

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

特にC#のdecimal型とDateTime型は他の言語と比較しても扱いやすいです。JSやPHPではそもそも外部パッケージを導入する必要があります。

またC#の数値や日付型はNull非許容型であり、意図しない挙動を防ぐことが可能です。

リッチな機能群

C#は継続的にバージョンアップされており、他の言語で開発された「今時な書き方」が出来る機能もしっかり追加されてきています。昔からあるプロジェクトはさておき、新規に作成したプロジェクトであれば、教科書的なオブジェクト指向とスクリプト言語的な直感的ロジックを組み合わせることが出来たりして、結構楽しいです。

C#についてよく聞く話

Q. Windowsじゃないと動かないんでしょ?
A. 一昔前はそうでした。今ではLinuxでも動きますし、ビルド先もマルチOSに対応したためAndroidやiOSのネイティブアプリ開発だって可能です。私はMacでいつも開発しています。

Q. 実行速度が遅い!
A. https://qiita.com/takeITeasy7/items/0e9a99a6c72a18ff3712
Goと張り合えますし、PHPやRubyも目じゃない。この辺はさすがコンパイラ型言語です。実装方法がまともなら遅いと思ったことは無いです。

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#だと非常に安心です。

いろんな側面

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

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

あと、デメリットになってしまいますが、結構ネットに散らばっている技術情報が玉石混合です。これは他の言語にも言えることではあるでしょうが、C#の場合現代の開発に合っていない十数年前の記事がヒットすることもザラです。あと動けばいい的なやる気のないコードも他の言語に比べて多い気がします。

情報の鮮度と、記事を書いている人が技術に向き合うタイプかどうかを意識しておくと地雷を踏む確率は下がります。

一方で、SOLID原則・DI・テスト等を意識した保守的で可読性の高いキレイなコードを書きたい人にはC#ほど打って付けな言語はないと個人的に感じています。

私自身C#で学んだ様々なコーディングに纏わる原理原則・基礎力を他の言語でも落とし込んでいけてますので、プログラマとしての基礎教養力を上げたいという方にもオススメです。

まとめ

今の時代、サービスの新規開発をしようと思った時にC#やJavaが一番に挙がってくることはあまりないかも知れませんが、JavaやC#がなぜ使われてきたのか?なぜ今も生きているのか?を考えてみるのもありだと思います。

タイトルとURLをコピーしました