余談 - 傭兵は冷徹な稼業ときたもんだ。なぜ今またJavaなのか

ScalaのようでJavaだけど少しScalaなJSON API Scala 2013年6月21日
≪ 前の記事
warファイルを Tomcat上で動作させる
次の記事 ≫
JSON APIを PHPから呼び出して結果を表示する

本当のことを言うと、顧客はあなたがどんな技術を使ってそれを実装するかに興味などない

顧客に「サーバは弊社ホームページのものが既にあるので、そこで動くシステムを作って下さい」と言われたら大抵そのサーバは(Windowsでなければ) CentOSである。比較的お金をお持ちなお客様であれば RedHatの時もあるが、同じことだ。

※もしDebianを使っているとしたらそれは訓練されたお客様なので別の対応を要する

CentOSのクローン元である RedHat Enterprise Linuxはきわめて保守的な Linuxディストリビューションで、やみくもに機能を追加せず互換性を維持することに多大な注意が払われている。よって OSが標準で提供しているソフトウェアパッケージの種類は多くなく、最新のオープンソース技術を使いたければ必ずと言っていいほどソースコードを自分でコンパイルしてシステムにインストールする、いわゆる「野良ビルド」の作業が必要となる。

だが果たして、それが最新のイケテル技術だからといって、たかが自分の納品するアプリケーションを動作させるためだけに野良ビルドまでして顧客のサーバに導入すべきなのだろうか。なんといっても、標準状態の CentOSにはCコンパイラすら入っていないのだ(Windowsがそうであるように!)。それより一番の問題は、野良ビルドしたソフトウェアの保守は誰の責任になるのかだ。OSのリポジトリから標準提供されているコンポーネントであれば、その保守が誰の責任に属するかはそのOSの導入を決定した顧客自身が考える問題だが、野良ビルドしたコンポーネントについては誰がコストを割いて面倒を見るのか、という話である。宙に浮かせておいて良い問題ではない。

C#コンパイラなら入ってるという指摘があったため一部訂正

当社のような傭兵稼業への依頼はえてして「プログラムを作ってうちのサーバに載せて欲しい」であって、報酬もそれに見合ったものでしかない。つまりお客様はプログラムが動作する環境の面倒を見続けるため費用までくれるわけではない。費用をもらえず顧客が喜びもしないような余計な仕事が発生するのはビジネスとして失敗以外の何物でも無く、従って当社では、極力 OS標準のコンポーネントのみを動作環境として必要とするようにアプリケーションを設計し、責任の曖昧な部分を出さないように努めている。けだし報酬以上の仕事をしないのは傭兵のルールである。傭兵は言われたとおりにそこら辺の敵対勢力を手持ちの武器で蹴散らしてくればいいのであって、正規軍の手に余るような新兵器を導入配備したりなど勝手にするようではむしろ迷惑な話なのだ。

では野良ビルドを禁じた場合、CentOSではどのようなプラットフォームでWebアプリケーションを動かせるのだろうか。

最もポピュラーな選択肢はもちろん PHPだ。HTMLファイルと同じ場所に「置いたら即動く」。これがPHP以外にはできない芸当であるという事実は、ギークどもがいくらPHPを呪いながら他の先進的な言語をもてはやした所で変わりはしない。よって (まことに忌まわしいことであるが)PHPの地位が揺るぐことはまずない。

かといって HTMLの延長線上に取って付けたような言語である PHPで本格的なビジネスロジックの記述を行う作業は悲惨なものであり、できれば避けたい(逆に言うと、HTMLに動的な要素を埋め込むだけであれば不都合はあまりないのだが)。そこで、PHPで記述するのが難しい部分を他のプラットフォームに追い出すというのはどうだろうか。

野良ビルド禁止縛りのもとでは、そこで Javaが有力な選択肢たりえる。一般的に Javaのライブラリやフレームワークは jarファイルという環境に依存しないバイナリファイルで提供されており、さらに Webアプリケーションにおいては jarファイルをアプリケーション(warファイル)内にまとめて格納してしまうことが出来るので、運用環境上にインストールする必要がそもそも発生しないのである。

Javaも今となっては古い言語で記述力が高いとは言えないが、幸いなことにより先進的な言語である Scalaが Javaの動作環境(Java VM)を利用して動くため、この制約条件下でも使用可能だ。しかも Java VM上で動作するプログラムはコンパイルの手間はあるものの実行速度が速く、Rubyや Pythonと違いジャイアントロック無しでネイティブスレッド動作するので少ないメモリ使用量で複数のCPUコアを効果的に利用できるという利点もある。

永続データにアクセスする部分(プログラミング言語の記述力と、動作性能の恩恵を大きく受けられる部分)を Java(Scala)で記述して REST風の JSON APIとして利用可能にし、APIを呼び出して結果を HTMLに整形し表示する処理を PHPで行うといういっけん遠回しなアーキテクチャに関する一連の記事を書くことにしたのは、こういった背景からである。

(再掲)

ある時期の XML設定ファイル地獄に耐えられず CoCの楽園を求め Javaから離れた御仁も多かろうが、結局 Ruby on Railsのようなフルスタック・フレームワークが自社サービスを開発し提供する企業以外にまで普及することがなかった理由の一つは、動作環境の構築や維持が難しい(一部のギークにしか手に負えない)ため、納品したらそれっきりという案件に向かないからではないか。

いっぽう Javaに至ってはアノテーションの利用で XMLの量は激減しているし、Ruby並みかそれ以上の記述力を持つ Scalaという選択肢もあるばかりか、JavaVMも Tomcatも mod_jkに相当する Apacheモジュールも全て OSが標準で提供するようになっている今、ある意味時代が一回りして Javaはよりカジュアルな Web開発に使えるプラットフォームになったと言える(かもしれない)。にも関わらず Javaでの Web開発について Googleで調べると、検索上位がとにかく古い情報に占有されがちなため新しい事情が十分に知れ渡っていないのではないかと思う。ともあれ、本記事をきっかけにもう一度様子を覗きに戻って来る人がもしいたら幸いだ。

≪ 前の記事
warファイルを Tomcat上で動作させる
次の記事 ≫
JSON APIを PHPから呼び出して結果を表示する

同じカテゴリの記事

カテゴリ ScalaのようでJavaだけど少しScalaなJSON API の記事一覧
Pythonで Scalaの findのように条件にマッチする最初の要素をリストから取得する 2014-01-18
ScalikeJDBCを Springで使う 2013-12-25
JSON APIを Pythonから呼び出して結果を表示する 2013-10-25
Amazonの Product Advertising APIを Scalaから呼び出す 2013-08-20
JSON APIを PHPから呼び出して結果を表示する 2013-06-24

お勧めカテゴリ

英語でアニメ観ようず
なじみ深い日本製アニメの英語版DVDで、字幕と音声から英語を学びましょうという趣旨のシリーズ記事です。
ScalaのようでJavaだけど少しScalaなJSON API
Scalaと Spring Frameworkを使って REST的なJSON APIを実装してみましょう。
ドクジリアン柔術少女 すから☆ぱいそん
代表 嶋田大貴のブログです。写真は神仏に見せ金をはたらく罰当たりの図