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でファイルを読み込むコードの例です。

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

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

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

とはいえ、このようなコールバック地獄にならないための仕組み(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. 教室で学びたい派なら

ゼロスクは35歳以下限定で、無料で受講できて、修了後、就職支援もしてくれるプログラミングスクールです。最高過ぎですよ、これ!!

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

TechAcademyの無料コースは20代限定でプログラミングのリモート学習 + 就職支援が無料で受けられるサービスです。なんといっても無料だし、就職に必要なスキルが身につけられるという意味でもやってみて損はないでしょう。

30代以上の方には

TechAcademyの無料コースは20代限定なので30代以上の方にはTechAcademyのJavaコースをおすすめします。Javaは求人が多くプログラマーとして就職したい方にはぴったりです。

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

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

4. エンジニア未経験の人でも利用できる転職エージェント

ワークポートは未経験の人の転職活動も支援してくれますし、全国の求人を扱っているので地方在住の方にもご利用いただけます。お給料をもらいながら社内研修でプログラミングを学べる会社が狙い目です。

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

 - 勉強法