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

      2016/12/21

Web系プログラミング言語というと主にサーバーサイドの言語を指すと思いますが、主要なものだけでも、結構な数があります。

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

このような多数の選択肢の中でどのような基準でプログラミング言語を選べばいいのかについて考えてみます。

新世代言語の必要性

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

IOが発生しても処理がブロックせず、別リクエストの処理に移れるので、シングルスレッドで同時アクセスをさばけるというものです。

そのためには、コードの書き方が特殊で、IO結果をコールバック関数で受け取る書き方をします。

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

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

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

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

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

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を選ぶという風に目的によって、選ぶ言語は決まります。

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

プログラミング初心者におすすめのサービス
1. 講師から対面で学びたい派なら

プログラマカレッジをおすすめします。ProEngineerという転職エージェントが運営しているプログラミングスクールです。20代限定なんですが、無料で受講できて、修了後、就職支援もしてくれるんです。最高過ぎですよ、これ!!就職の紹介料を企業からもらえるのでスクールを無料にできるんでしょうね。すばらしいシステムだと思います!

30代以上の方には

プログラマカレッジは20代限定なので30代以上の方にはWebスクをおすすめします。受講料の返金保証がついているし、毎日11時〜23時まで通い放題なのでとてもいいと思います!

2. 自宅で学びたい派なら

「就職保証付き」オンライン就職予備校をおすすめします。Javaエンジニアコースでは就職保証がついているのでプログラマーとして就職したい方にはぴったりです。Javaエンジニアの求人ってめっちゃ多いし、求められる技術レベルもそこまで高くないのでちゃんとした教育プログラムなら就職保証できるだろうなとJavaエンジニア経験者の私も思います。

3. つまづいた時に質問したくなったら

プログラマー専用の質問サイトteratailをおすすめします。 つまづいた時にteratrailで質問すれば教えてもらえます。

これらのサービスを活用すれば、全くの初心者からでもプログラミングをばっちり出来るようになると思います!レッツトライです!

 - 勉強法