滅入るんるん

何か書きます

C#を学ぶ際に壁になりそうなこと

C#大好きマンとして日々C#の布教に努めてまいっていますが、C#を布教にする際の壁、つまりC#を勉強する際の壁についてちょっと書いておこうかなと思います

Android-JavaからC#の沼に浸かってしまった身としてJava視点に近くなると思いますがご了承ください。

1つ目:機能数の多さ

はい、そうです。C#の機能多すぎるんです。(それがいいんですけどね) 機能が多いほど書き手は簡単にプログラムを書くことができますが、初学者は習得するのが難しくなります。

Javaと比べると大雑把に下のような感じの機能が増えますね

  • ラムダ式(Java 7以前と比べて)
  • 構造体
  • プロパティ
  • 拡張メソッド
  • オペレーターのオーバーロード
  • 参照渡し
  • LINQ(Java 7以前と比べて)
  • async/await

いくつかJava8で代替機能が追加されてたりしますが一般に普及してるJava(7か6と自分が勝手に思ってる)と比べると大雑把に挙げてもこんなにあるんですよ。

その中でも特にLINQとasync/awaitが厄介(誉め言葉)。 C言語でちょっとしたプログラムを書いて…Javaでちょっとしたオブジェクト指向を学んで…って感じの初学者にこの2つはプログラムを組む際の概念をぶち壊すほどの威力があると思います。 for文やwhile文でちまちま組んでたプログラムがLINQでほんの1行で終わったりとか、ThreadやExecutorServiceとかでCallback地獄に苦しみながら非同期処理していたのがasync/awaitで解放されたりとか。。。するんですけど、どうプログラムが動くか想像しずらかったり。

正直、プログラム書けさえしたらいいやってタイプの人にはC#の機能の多さには苦痛で仕方ないと思います。その反面、知識欲の塊の人とかには一度C#を知ってしまったら満足する他の言語になかなか出会えなくなると思います。

2つ目:関連技術の多さ

これはC#に限ったことではない、と言いたくなる人がいるかと思いますが、まぁその通りかもしれませんね。 ただ、アプリケーション方面に関していえば関連技術は多いと言っていいと思います。

アプリを作る際、JavaなどであればアーキテクチャはMVC, MVP, MVVMなどいろんな選択肢があります。だから、書き手の知識量にあったアーキテクチャ選択ができるのですが、C#ではMVVM発祥のフレームワーク関係とあって、MVVM前提の構造になっています(バインディング機構とか)。そのため、MVPの思想を理解しつつMVVMの思想に染まり、Model層ではDDDやDIの概念なども取り入れたりします。つまりは勉強するアーキテクチャ設計が多いというわけです。

さて、MVVMと関連して切っても切れないものがあります。そう、ReactiveExtensionsです。Rxと言えばわかる方も多いでしょう。RxJavaとかRxSwiftとかのRxです。もともとはMVVMと同じく.NET発祥の技術です。他の言語では便利にするためにRxを採用すると思いますが、MVVMはRxありきのアーキテクチャです。もちろんRxも理解しないといけません。

そのRxですが、概念はLINQから来てます。そう先ほど書いたLINQです。プロジェクトによっては難易度高いからLINQは使うなとかいうどう考えてもクソな案件があるみたいですが、RxとなるとそのLINQから逃げれません。おとなしくLINQは理解しておきましょうね~~ということです。

ここまで関連技術の多さについて書いていきましたが、1つのものをつくるということに集中したら学ばなくてもいい技術はたくさんできます。が、C#を勉強するからにはすべて理解しておきたいところ。。。僕も理解したいです(願望)

3つ目:知り合いにC#erがいない(少ない) or 知見が比較的少ない

1つ目・2つ目のことによって周りにC#がいなかったり少なかったりしませんか?僕は周りにC#erがいませんでした(大学までは)。プログラミングしてる人がいてもみんなJavaやPHPやPythonとかなんですよね。C#使う人がいてもそれはUnity使いだったり。UnityのC#は周回遅れなので.NETのC#使いと話題が合いません(たぶん)。

周りにC#erがいないということはそれだけ初学者にはハードルが高くなります。そのためネットでグーグル大先生に頼ることになりますが、情報の量はJavaなどに比べると少しばかり劣ってしまいます。まぁ人口差ですよね。それに加えてC#はできることが多いです。できることが多いということは、そのできること1つあたりの情報は分散して減ってしまいます。Xamarinとかの情報が少ないのはそういうことです。

これも、知識欲がない人には厳しい世界かもしれません。

4つ目:言語や環境の進化が早い

C#は進化の早い言語です。早いって言っても、機能追加が多いという意味のほうが正しいかもしれません。Javaが6から9になるまでいったいいくつの革新的な機能がC#に追加されたのだろうか。数えてないのでわかりませんが(笑) Javaのように言語の進化が停滞してるのに慣れているとC#の進化にはついていけないと思います。

また、C#をとりまく環境の進化も早いです。大学入る前に情報系の大学で学んだことは卒業するころには古くなってると聞きましたが、実際そのような感じで大学入ってからXamarinが無償化されたり.NET Coreや.NET Standard Libraryが出てきたり、大学入る前のC#を取り巻く環境とかなり変わっています。そろそろ大学卒業なので、大学入って4年近くですが、ここまで環境が変わると環境の移り変わりに合わせれる人でなければC#界で生きて行くのは厳しいかもしれません。

そして、この進化の速さがまた知見が少ない原因にもなっていきます。(これはこれから僕もたくさん記事を書いて貢献していかないとなぁと思います)

おわりに

といった感じに多々C#を学ぶ際の障壁を挙げてみましたが、あながち間違ってはいないかと思います。「人が言語を選ぶのではなく、言語が人を選ぶのだ。」と名言じみたものを勝手に考えてしまいましたが、そういう性質は否定できません。 ですが!!学び終えたらそのあとは天国(個人的な主観)が待ってるので、ぜひともC#の世界へ!!!(闇の勧誘)