ホームお問い合わせプロフィール未経験→就職転職合格率年収の相場ブラック企業判別定時帰りする方法

Web系プログラミング言語を選ぶ『基準』を考えてみた

2016年11月21日に投稿 → に更新 勉強法 アフィリエイトリンクを含みます

Web系プログラミング言語というとクライアントサイドはHTML、CSS、JavaScriptと決まっていますが、サーバーサイドの言語は主要なものだけでも、けっこうな数があります。

  • LL言語(ライトウェイト言語 = 軽量なスクリプト言語) = PHP, Ruby, Python, PerlなどのLAMPのPに当たる言語
  • コンパイルした中間言語がVMで動く言語 = Java, C#
  • 新世代言語 = Go, node.js, Scala

どのような基準でプログラミング言語を選べばいいのかについて考えてみましょう。

新世代言語の必要性

新世代言語の特徴の一つは並列性です。node.jsの場合、シングルスレッドノンブロッキングIOという特徴的なアーキテクチャが採用されています。ほとんどの言語はブロッキングIOが基本で、ノンブロッキングを基本にしているnode.jsはとてもユニークな存在です。

IOが発生してもIOが終わるのを待たす(待つことをブロックと言う)、別リクエストの処理に移るので、シングルスレッドで同時アクセスをさばけるというアーキテクチャです。

これを実現するためにコードの書き方が特殊になります。IO結果をコールバック関数で受け取る書き方をするんです。

node.jsでファイルを読み込むコードの例です。

var fs = require('fs');
fs.readFile('file1.txt', 'utf8', function (err, data1) {
	//引数data1に'file1.txt'の読込結果が入っている
});

これだけ見ると、「コールバック関数書けばいいだけならかんたんじゃん」って思いますが、ファイルを複数読む場合にコールバック関数がネストして読みにくくなります。

var fs = require('fs');
fs.readFile('file1.txt', 'utf8', function (err, data1) {
	//引数data1に'file1.txt'の読込結果が入っている
	
	fs.readFile('file2.txt', 'utf8', function (err, data2) {
		//引数data2に'file2.txt'の読込結果が入っている
		
		fs.readFile('file2.txt', 'utf8', function (err, data2) {
			//引数data3'file3.txt'の読込結果が入っている
		});
	});
});

「やってらんねーーーーー!!?」ってなりますよね。

でも、こう書かないとシングルスレッドで同時アクセスをさばけないから仕方ありません。

とはいえ、このようなコールバック地獄にならないための仕組み(yeildやPromise)があります。

var fs = require('fs');
var data1 = yield fs.readFile('file1.txt', 'utf8');
var data2 = yield fs.readFile('file2.txt', 'utf8');
var data3 = yield fs.readFile('file3.txt', 'utf8');

yeildの場合上記のように書けます(動作確認はしてないので、こんなイメージのコードで書けるという程度に認識してください)。

私がnode.jsを使ってた2013~14年にはyeildがなかったので、コールバック地獄なコードを書いてました。かなりしんどかったのですが、しんどいコードを書いていたおかげで、PHPやRubyなどのようなふつうのコード(ブロッキングIOのコード)を書くのがめっちゃ楽に感じられるようになりました。

しんどいコードを書いてまでシングルスレッドノンブロッキングIOをしたい理由はワーキングメモリーの節約です。

マルチスレッドだと、スレッドが起動される度に各スレッド用のワーキングメモリーが確保されます。

マルチスレッドにはC10K問題という有名な問題点があります。CはクライアントのことでKはキロバイトのK、つまり1000倍って意味です。

C10K問題とは

クライアントが10000を超えると、CPUに余力があってもメモリーがいっぱいになってしまってそれ以上の同時アクセスをさばけない

という問題です。

10000の同時アクセスを並列でさばこうとすると10000のスレッドを起動します。すると10000のワーキングメモリーが確保されます。それによってメモリーがいっぱいになってしまうということです。

これがシングルスレッドだと、「ワーキングメモリーは一つだけなのでメモリー的には余裕だぜ」となるわけです。

そんなわけでnode.jsはプログラマーとしては書くのがしんどい修行になる言語であり、アーキテクトにとってはメモリーの少ないサーバを有効活用するアーキテクチャとして捉えることができます。

なので、並列処理時のメモリー効率を高めたいならnode.jsっていう選択ができます。

こういう風に技術的特性によって言語を選択する場合もあれば、もっと単純に「仕事を得やすい言語」という観点で選ぶこともできます。

仕事の需要で選ぶ場合

業務システム開発だったらJava、C#、PHPあたりがよく使われています。この中でも圧倒的に案件数が多いのはJavaです。

Webサービスやゲームやスマホアプリのバックエンドならば、PHP, Ruby, Javaが多いです。

Javaって業務システムのイメージが強いけれど、サービス系でもけっこう使われています。

私が参加した2社のスマホゲーム開発案件はどちらもサーバーサイドはJavaで実装されてました。フレームワークはSpringMVCが使われていました。

ECサイト開発に参加した際にもJavaが使われてました。私が元々Javaエンジニアだったので、Javaを使った案件に入りやすかったというのもありますが、ゲーム開発では、私はクライアントサイド(Unity, C#)を担当していたので、サーバーサイドがJavaだったのは私のスキル特性とは関係ありません。

そんなわけで仕事でつぶしが利きやすいのはJavaなのかなぁと思います。個人的にはJavaってコードが冗長であまり好きじゃないんですけどね。需要の安定感は抜群です。

趣味の開発で使う場合

「趣味で使うなら、好きなの使えばいいじゃん」なんですけど、全く制約がないわけではありません。

ちょっとしたWebサービスを開発して、安いレンタルサーバで動かしたいという場合、使用するプログラミング言語は、レンタルサーバで動作する言語に限定されます。

多くのレンタルサーバはPHP, Ruby, Python, Perlをサポートしていますが、多くの場合、PHP以外はCGIモードでの動作となっているので、フレームワークを使った開発ができません。

CGIってリクエストが来る度にプロセスが起動されます。フレームワークが動作するためには数多くのプログラムをロードする必要があるので、CGIだとそれらの読み込みがリクエストごとに発生するので、動作が重くて使い物にならないんです。

なので、CGIモードのRubyでRuby On Railsを動かそうとすると激重になります。

よって、フレームワークを使ったWebサービスをレンタルサーバで動かしたいとなると、選択肢はPHPだけなんです。

VPSやクラウド、専用サーバを借りれば、好きな言語を使えるので、目的に応じて使い分けたらいいでしょう。

  • 「環境構築めんどくさいなぁ」 → PHPを選択してレンタルサーバで動す
  • 「Ruby使いたい!でも環境構築もできるだけ楽なのがいい!」 → Herokuというクラウドサービスを使えばいい

といった風に、目的に合ったサービスを見つけられます。

つまり、自分の目的にあった言語を選べばいいんです。

目的によって選ぶ言語は決まる!

目的が就職・転職することであれば、応募先企業で使われている言語を選びます。

レンタルサーバでちょっとしたものを動かしたいという目的ならPHPになるし、メモリーの少ないサーバで大量アクセスをさばきたいということであればnode.jsを選ぶという風に目的によって、選ぶ言語は決まります。

ですから、「流行っているから!」とか「これから来そう!」っていう理由で選ぶよりも、「自分の目的は何か?」これを考えることが一番です!