プログラミング言語はWindows系とLinux系どちらを学ぶべき?
タイトルを見て、ほとんどの人は「Linux系のがいいに決まってんじゃん!」と思われたかもしれません。
「Windowsの仕事よりもLinux系の仕事の方が多い」
「Linux系の技術のほうがオープンだし広く使われている」
などの理由によるものだと思います。
確かに仕事ではLinux系の技術を使うほうが多いと思います(会社にもよりますが)。
とはいえ、ここ数年、マイクロソフトの技術の利用範囲が広がってきていて、状況が変わってきています。自分の仕事体験を踏まえて詳しく紹介します。
Contents
ここ20年位のプログラミング言語の変遷
私がプログラミングを始めたのは1998年に情報処理の専門学校に入学してからです。
当時の授業はマイクロソフトのプログラミング言語である
- Visual C++
- Visual Basic
が中心でした。現在主流のJavaやPHP、Ruby、Pythonなどはカリキュラムに入っていなかったんです。
卒業後SIerに就職したのですが、結局Visual C++、Visual Basicを使った仕事は一度もありませんでした。
C言語を使った仕事はありましたが、Windowsアプリケーションを開発するのではなく、Unix上で動くC言語のバッチプログラムを作るものでした。
私が就職したのが2000年なので、ちょうど時代の流れがPCのデスクトップアプリケーションからWebアプリケーションへと移り変わる時期でした。
それまではVisual BasicでWindowsアプリケーションを開発してサーバ側をC++で作るみたいなC/S(クライアント・サーバシステム)というものが主流だったので、専門学校のカリキュラムもそれに合わせていたのでしょう。
そんな時期だったので、私の場合、学校で習ったプログラミング言語はほとんど仕事で使うことはなかったわけです。
とはいえ、ちょっとした作業を自動化するExcel VBA(Visual Basic for Aplication)などでVisual Basicの知識を活かすことはできました。
それに、プログラミングの基本は言語が変わっても同じなので、専門学校で学んだ知識は活きています。
このように、自分の仕事体験からしても、「仕事面ではWindows系よりもLinux系の技術を学んだほうがいいに決まってんじゃん」というのは正しいと考えられます。
そんな私ですが、2000年から仕事を始めて14年経った2014年に、Microsoftの主力プログラミング言語であるC#を使った仕事をすることになりました。
C#はWindowsだけのものではない
私が参加したのはWindowsアプリケーション開発ではなく、スマホゲームの開発です。
Unityというゲームエンジンは、C#を使って比較的かんたんに3Dゲームを開発できます。
UnityはMicrosoftの技術ではありません、Unity Technologiesという会社が開発したゲーム開発プラットフォームです。
なぜ、Microsoft以外の会社が作ったプラットフォームでC#が使われているのかというと、.NETのオープンソース版である「Mono」があるためです。
MonoはWindows以外のプラットフォームで動きます。Linux上でも動きますし、Unityのような独自の環境にも組み込むことができます。
なので、C#は今やWindowsに限ったものではなく、オープンな技術なんです。
今やMicrosoftの方がクロスプラットフォーム?
スマホアプリにおいてもXamarinというプラットフォームを使うことで、C#で書いたコードをWindowsアプリだけでなく、iOSやAndroid用にビルドできます。つまりはクロスプラットフォームなんです。
Unityも同様で、Unity上で開発したコードはiOS用にもAndroid用にもビルドすることができます。
iOS用アプリの開発言語であるSwiftやObjective-Cで書いたコードはiOSでしか動きません。
同様にJavaで書いたAndroidアプリのコードはAndroid上でしか動きません。
ところが、UnityやXamarinで開発したC#のコードは様々なプラットフォームで動かすことができます。
以前はMicrosoftの技術はクローズドでWindows上でしか動かないものでしたが、モバイル環境においては、AppleやGoogleの技術の方がよっぽどクローズドです。
その原因はMicrosoftがモバイル開発で遅れを取ったからだと考えられます。スマートフォンOSのシェアはAndroidとiOSで二分しており、Windowsのシェアは微々たるものです。
そのため、Microsoftはモバイル開発プラットフォームにおいてオープンでクロスプラットフォームな戦略を取っているのでしょう。
ですから、サーバーサイドの分野ではLinux系の技術であるJava, PHP, Ruby, Pythonのような技術を学んだほうがいいでしょうけれども、モバイルアプリの分野ではC#を学んでクロスプラットフォーム開発をするのも良い選択です。
とはいえ、スマホアプリ開発においてXamarinを採用している会社はまだまだ少数派です。AndroidアプリはJavaやKotlinで開発して、iOSアプリはSwiftで開発している会社がほとんどです。
それぞれのプラットフォームに合わせたUIを作り込みたいので、それぞれのネィティブ言語で開発しているという状況なんです。
それに比べてスマホゲーム開発は状況が異なります。
Unityを使ったクロスプラットフォーム開発が主流になっています。大ヒットしたポケモンGOもUnityで開発されています。
そんなわけでスマホゲームの分野ではUnityとC#がホットなんです。
C#はLL言語のような楽しさがある!
C#は言語としても優れていて静的型言語でありながら、LL言語のように簡潔に書ける工夫がなされています(varによる型推論やプロパティ、インデクサなど)。
例えば、JavaでArrayListの操作をするには
ArrayList a = new ArrayList(); a.get(0); //ゼロ番目の要素を取得
と書くのに対して、C#では
var a = new ArrayList(); a[0]; //ゼロ番目の要素を取得
のように配列にアクセスするのと同じシンタックスで書くことができます。これがインデクサです。分かりきっている型の表記を省略できるのがvarによる型推論です。
連想配列も同じです。Javaだと
HashMap a = new HashMap<String, String>(); a.get("abc"); //キーがabcの要素を取得
と書くところをC#なら
var a = new Dictionary<string, string> (); a["abc"]; //キーがabcの要素を取得
のように書けます。RubyやPHPの連想配列と同じ表記ができるんです。
簡潔できれいなコードを書ける構文が用意されていると、きれいにコードを書こうというモチベーションが高まります。
これは、犯罪発生率の「割れ窓理論」と通じます。
「汚いコードを書く」という”犯罪”を減らす方法
ある犯罪率が高い都市では、窓ガラスがたくさん割られていて、日に日に街は荒れていきました。
そんな状況を改善しようと、窓ガラスをすべてキレイに張り替えた所、犯罪発生率が大幅に減ったそうなんです。
その後、一枚でも窓ガラスが割られて、それを放置していると、窓ガラスは次々と割られて犯罪発生率が再び上がったそうなんです。
つまり、人は窓ガラスが割られているのを見ると、「もう一枚くらい割ったっていいじゃないか」という気持ちが湧いて実際に割ってしまいやすくなるということです。
部屋の汚さも同じで、引っ越したばかりで部屋が整理整頓されているうちはきれいに使おうとしますが、だんだん散らかってくると、どうでもよくなってきますよね。
ソースコードも同じです。Javaで冗長なコードを書かれているのを見ると、「じゃあ、おれも冗長なコピペコード書いたっていいや」と思いやすくなってしまいます。
ですから、言語に簡潔で美しい構文が用意されていることは、きれいなコードを書くための強力な仕組みなのです。
そして、そんな優れた構文を持つC#はWindowsだけでなく、.NETのオープンソース版であるMonoによってUnityやXamarinなどの様々なクロスプラットフォーム環境が用意されています。Linux系言語に引けを取らない学ぶ価値がある言語だと思います。