見出し画像

プログラミング初心者が「C#かJavaから始めたら良い」と思う理由。

■はじめに

こんにちは、C#好きのJava屋をやってるカレーエンジニア(謎)です。

Twitterで 初心者ならC#かJavaから始めた方が良いと思う って話を(過去何度か)していて、そう言えばあまりハッキリと理由を纏めた事がなかったので「纏めたほうが良いかな?」って呟いたら需要があったので今コレを書いてます。
ちなみに、いつもどおり「缶コーヒー奢ったら聞けた話」の温度感なので120円の有料記事で投稿していますが、全文無料エリアになっています。
まぁ、缶コーヒー奢ってもいいなと思ったら、読んだ後に投げ銭してくれても良いのよ。

あ、なお、想定しているのは「システム開発で必要になるであろう知識を、じっくり時間を掛けてでもしっかり土台を作るために」っていうイメージです。
ハンターハンター的に言えば「ゆっくり起こす念能力」って感じ。なので、「手っ取り早く稼ぐには」とか「ググッテコピペデイッセンマン」とかそういうのがお望みの方は絶賛炎上中のオンラインサロンにでも行って、乱暴に念能力起こして貰って、どうぞ。

■オススメだと思うルート

Twitterで言った通りですが、こんな感じのイメージ。

もう少し補足すると。

VisualStudioをインストールして、C#/WindowsFormプロジェクトでのプログラミングを学ぶ。
なんか適当に自分用の便利ツールとか作ればいいよ。
●多分、最初ツール作ったら不便な所やイケてない所が出て来ると思うので、そのへんを改造する。
改造作業を通して高度なプログラミング技法だったり、細かい仕組みの部分を理解していけば良いと思う。
●頃合いを見てJavaにも手を出して、SpringBootとか触ってWebアプリケーション、特にREST APIについて学べば良いと思う。
なお、この辺は良書の多いエリアになるのでEffectiveJavaWebを支える技術あたりを読むのが良いと思う。まぁでも最初から技術書を買うのって割と心理的ハードルが高いと思うので初心者は一旦置いといていいと思う。取り敢えず一回手を出してみて「改めて学び直したいな」と思った時に買えばいいんじゃないかな。ぼくはいつもそうしてます。

ということで、ぼくの中でのベストと思うルートは「C#(Windows)から入ってJava(Web)を目指す」かなと思ってる。
システム開発を「インフラ+アプリケーション+データベース」と考えた場合、アプリケーションのエリアに関してはこれでわりとシッカリした土台を作れると思う。

■初心者にとって重要なこと

初心者・初学者にとって何が大事かって考えた場合、大体この辺になると思うんですよね。

●無料でできる。
●導入が楽である。
●面倒な設定や追加ライブラリなんか無しにすぐ試せる・動かせる。
●(出来れば日本語の)情報が豊富である。
●学べる範囲が広い。
●まずは静的型付けのコンパイル言語で基礎を固めて欲しい。(希望)

要するに「取っ掛かりの心理的ハードルが低い事」が非常に重要だと思うんですよね。なので無料なのはほぼほぼ必達要件で、導入のし易さってのもかなり重要なファクタになるかと。
そのうえで、学べる範囲が広いことが望ましい。学ぶことが増えた時にイチイチあれこれ環境を変える必要があるとこれまた宜しくないので。

この観点から、長い事ぼくはC#/WindowsForm一択と考えていました。時代は進歩するもので、最近はJava+SpringBootも素晴らしいので初手の選択肢としてアリだなぁと思ってます。
結果として、前述の通り「C#(Windows)から入ってJava(Web)を目指す」というルートが一番良いんじゃないかなぁと思うに至りました。

ぶっちゃけ、C#で十分に市場案件があればC#一択でも良いかなって気持ちもあるんですが、まぁ現時点での状況を鑑みるとやっぱJavaまで手を伸ばしておいた方が色々と好都合かなと。
複数言語触っておくに越したこともないしね。

で、真面目にプログラミングの土台を作るという観点で言えば、ふわっとしたスクリプト系の言語じゃなく、ある程度ルールのシッカリした静的型付けのコンパイル言語で基礎を作って欲しいなと思う次第。

■もっと詳しく

それではもう少し深堀りしていきます。

C#が最強にオススメだと思うのは、VisualStudioがIDEとして優れており、且つインストーラが存在するので初心者にとって導入が簡単だからです。
Javaはどうしてもこの辺、最初の環境構築の煩雑さという意味で数段負けている(いた)と思います。今でこそSpringBoot(SpringToolSuite)という素晴らしいものがあるので初期導入の煩雑さは改善されたと思いますが、昔は色々と酷かったと思います。ぶっちゃけかなりの初心者殺し要素だと思う。
まぁ、プロのエンジニアを目指すんだったらそんな所で躓いて貰っちゃ困るって話もあると思いますが。

で、WindowsFormプロジェクトをオススメしているのは幾つか理由があって。

●作ったものをすぐに動かして試せる。
Webアプリケーションと違い、サーバを用意してデプロイとかが必要ない。ビルドして動かすだけですぐに画面が出て来る。らくちん。
VisualStudio使ってれば、取り敢えずF5押してデバッグ実行ってやればポンと動く画面が出て来る。初っ端はまずこれくらいの楽さが必要。
●モジュール配布とか一般公開とか考えなければ、自分用の便利ツールを簡単に作って使えるので、趣味と勉強を兼ねるみたいな形に持っていきやすい。
仮に職業エンジニアとしてやって行くのを諦めたとしても「業務改善用のちょっとしたツールなら作れる」というのは価値ある技術資産になり得るし、だいたいどんな仕事をしていても役立つはず。
UIベースなのでプログラムが動いているという実感を掴み易い
初心者にとってはこれがメチャクチャ重要で、データ操作をするだけのCUIみたいなのは「何が起きてるのかイメージを掴み難くてイヤ」って人がかなり多い。
このため、REST API作ってJSONが返って来ても「何が楽しいの?」ってなりがちなので、やっぱりC#でWindowsFormから入るのが楽しさという点で優れてると思う。
●最悪なんかあっても(通信して何か変なことしない限りは)自分のPC上の出来事で済むので、気楽に失敗できる

こんなところ。

しかも、WindowsFormでデスクトップアプリを作って凝った事をしようとすると、ほぼ間違いなくマルチスレッド処理バッチ処理などをやりたくなるので、このへんで自然とプロセス・スレッド・マルチスレッドとスレッドセーフ性・シングルトンのあたりを学ぶ事になると思う。この辺は最終的にWebアプリケーション開発に行っても非常に重要な知識になるので絶対に学ぶべき所。
しかも、業務系の開発現場では意外と(理由はここでは深く触れないが・・・)この辺の知識がスっぽ抜けてるおっさんが多いのが実情だったりする。ので、この辺の領域を自然と学べるWindowsFormでデスクトップアプリを作るってのは、初学者の教材として非常に優れていると思う。

他にもファイル操作画像処理など、色々なものを扱い易い(言語標準ライブラリで出来ることが豊富かつ高度である)のもC#の非常に素晴らしい所で、追加でアレコレ持って来ないといけないという煩雑さが無いのも初心者に易しい所。

ほんで、こういう壁にぶつかるレベルでモノ作りしていけば、ある程度の高度なプログラミング技法だったり、デザインパターンだったりってものに興味が出て来ると思う。こうなって初めてクラス設計はどうするべきかとか、テスタビリティとは、保守性・可読性とは、みたいな事を考えるレベルに至る。
加えて、最初何も考えずに作っていたプログラムの問題点を言葉ではなく魂で理解できるようになるのが多分この辺のタイミングで、この段階にきたら過去作ったものをリファクタリングしてみるとコーディング面での良い勉強になると思う。

こうしていくと、取り敢えずデスクトップアプリ・コンソールアプリ・バッチプログラムあたりを作れるようになると思う。
その後、Javaを目指してSpringBootを学んでWebアプリケーションの方向を目指していけば良いんじゃないかなぁと思う。

■余談:C#からJavaに行く場合の注意点

ところで。
これは実際にぼくが通ったルートなんですけど、C#からJavaに行く場合(逆でもほぼ同じなんだけど)に注意したほうが良い事が幾つかあって。
細かい事まで挙げてくとキリが無いんですが。

●JavaにはC#の言う「静的クラス」が存在しない。ついでにいうと「インナークラス」あたりの意味合いが全く違う。
●Javaのジェネリックにはプリミティブをそのまま使えない。(改善提案が出ているがまだ正式採用されてない)
●Javaのジェネリックでは型情報が消去(Erasureという仕様)される。
●Javaの列挙体はオブジェクト(Enum)である。
(フィールドもメソッドも実装できるので注意が必要)
●C#のDictionaryとJavaのMapはよく似ているが、細かい所で違いがあるし思想が真逆っぽい。他にも「よく似ているけど細かい所が真逆」みたいな罠シリーズが多い。
●アクセシビリティのキーワードは同じだが細かい所で違いがあり、恐らく一番ハマるのはprivateやprotectedの範囲の違い。しかもJavaは「キーワードなし」が固有の意味を持つ。
●Javaの例外は検査例外とランタイム例外に分かれるが、C#は検査例外の仕様は踏襲しなかった。
(しかも昔のJavaはtry-catchまわりの構文が結構貧弱だったので検査例外まわりは結構めんどくさい)
●StreamAPIというのが増えたがLINQとは全然違う。

などなど、ホント、挙げてくとキリが無いんですが。

よく「C#はJavaをパクった後発言語だし、良く似てるから移行するのは簡単だよ」って言ってる人がいますが、ぼくはそうは思わないんですよね。
どっちかというと「C#とJavaは似て非なる所で罠が多いので、表面的な字面は似てるが中身が違う分タチが悪い」と思ってます。
「似てるから簡単だよ」って言ってるのは、実際には両言語を触ったことがない所謂エアプであるか、或いはどちらの言語も深くまで触ったことがなく簡単なレベルの所までしか理解してないか、このどちらかでしょう。

特に、C#からJavaというベクトルは基本的に「言語の提供機能が減る」ベクトルなので、多分苦労することが多いです。
(或いは、最近のバージョンになるまで導入されていなかったものが多い)

それでもやっぱりJavaを勧めるのには理由があって、何だかんだいって最初に優秀なライブラリが出て来るのはJavaであることが多いからなんだよなぁ、、、。
(最近は特定分野ではPythonで出て来ることが増えてると思いますが)

って事で、案件数だったり最新のライブラリの出方だったり、諸々の言語外の政治的事情を鑑みると、やっぱりJavaを触っておくべきだよなぁって思うわけです。
Javaを触っておけば、他のJVM互換言語へのルートも近くなりますし、そういう意味で「広がり」が作れるルートじゃないかなぁと思います。

思いの外、話が長くなったので今日はこのへんで。

ここから先は

0字

¥ 120

サポートも募集しております(。>﹏<。)良ければぼくに缶コーヒー代をくだしあ!!