Javaを使うメリットはありますか? はい、それはもちろんあるに決まってます!
/.Jに聞け:Javaを使うメリットは? | スラッシュドット・ジャパン デベロッパー
え、ありますよね? Webアプリに限っても。 というか、上げてるデメリットが現代的じゃないなぁ...
個人的には少数精鋭チームを作れてないならJavaはかなり有りな選択だと思っています。
※ Java使ってるメンバーがスキルが低いのではなく、LL系で高品質なものを作るのにスキルが必要で、例えスキルがあっても多人数開発にはあまり向かない、という意図
というわけで、自分が思うLL系言語ではなく、JavaでWebアプリを開発するメリットを書いてみます。
静的型づけ言語
HaskellとかOCamlとかScalaとか、その辺の超強力な型付け言語から見ると弱いですが、多くのLLと違い静的型付けな事が特徴です。
これは型というメタ情報を言語仕様に明確に取り込んでいるということです。以下のメリットがあります。
- 人間が読みやすい
- コンピュータが読みやすい
動的型付けだと何が入ってるか不明のオブジェクトがあります。
メソッドの引数に入る値がフリーダムだったり、逆に戻り値がintだったりオブジェクトだったり。
型をインターフェースに定義することで、この辺りは非常に読みやすくなります。曖昧な書き方をすれば、コンパイラが指摘しますし。
初期のJavaだと記事で上げられてるデメリットにある通り、キャストが増えて結局型安全じゃないケースも多々有りましたが、Java5以降はGenericsがあるので、ほぼキャストに出くわすことは無いでしょう。
他にもJavadocを書くときに型情報を記載してなくても自動的に入れてくれるという地味に便利な機能もあります。
パフォーマンスも付け加えたくなりますが、JITが優秀なら型の有る無しが決定差にならないらしいですし、それ以外のメリットに注目してみました。
IDEが強力
EclipseやNetBeans, IntelliJと言ったIDEが結構強力。 静的型付ということもあって、リファクタリング機能も強力にサポートしてるし、コードアシストも素早くかつ正確に動作します。
リファクタリング機能が安心して使えると、トライ&エラーの開発がしやすくなるので開発スピードもグッとアップしますね。
gitやsvnといったバージョン管理、GlassFishやJettyなどのアプリケーションコンテナ、antやmavenやgradleといったビルドツールとの連携/統合もバッチリ。
IDEとアプリケーションコンテナを連携してホットデプロイすれば、コンパイルが必要という点もほぼ意識することはないかと思います。
IDEなんて嫌だ! vimやemacsが使いたい! って人も居るでしょうけど、統一した環境をサクっと作れるのは開発現場には有用なことだと思います。
静的解析が強力
Javaは静的型付け言語なのでコンピュータが読みやすいという特徴と、長年開発の第一線で利用されてきたこと、そしてアカデミックな研究に使われることも多いという理由で静的解析ツールが豊富です。
コード品質を保ち、コードレビューのコストを減らすことが出来るのでとりあえず入れといたほうが良いレベルの仕組みです。なぜなら、コードの綺麗さは中長期的な生産性のために必須な要素だからです。
とはいえ、レビューをきちんとするのはコスト的に辛くてやってない、ってケースは結構あるんじゃないでしょうか?
JavaだとFindbugやPMDをはじめ様々な解析ツールが揃っていて、最低限のコード品質を保つのが非常に簡単です。コードクローンや命名規約ミス、危険な代入などレビューチェックシートで見つかる程度のことは見つけてくれます。
また、Veracodeとかの商用製品だとセキュリティ観点でも静的解析を行いSQLインジェクションやXSS, CSRFの疑い等を検出してくれます。
もちろん、RubyやPHPにもそういったものは有りますが、一日の長がありJavaのレベルまでは達していない認識です。
コーディング規約の方言が少ない
Javaは全面的にSun時代のコーディング規約をベースとしたものが使われていてコーディング規約に関してJavaエンジニア全員がある程度共通の認識を持っています。
そのため、モジュールごとにCamelCaseだったりSNAKEだったりしないです。もちろん完全に方言というか、それぞれの規約が無いわけではありませんが、 かなり小さいので、厳密なルール無くてもある程度統一でき、宗教戦争も起きにくいです。
それなりに高い生産性
めんどくさい言語、冗長な言語として評判なJavaですが、そこまで生産性の悪い言語ではありません。
オブジェクト指向言語としての基本的な機能は揃えており、標準クラスライブラリもどんどん強化されています。 例えば、元記事で言及されいているデメリットですが
と連想配列がリテラルじゃないので少し冗長なことくらいしか今は残っていません。
加えて1.7ではFilesでファイル処理が簡単になり、1.8からは待望の関数オブジェクトとStreamAPI、型推論、そして日付周りのライブラリ改修が入ります。
この辺が導入されれば、言語機能としても大きくLL系と見劣りすることはないでしょう。 また、リフレクションやAPTで基本的なメタプログラミングを行うことも可能です。
加えて、JavaEEやSpringを使えば、Webアプリケーションを組むのはさほど難しく無いかと思います。
高い上位互換
Javaは言語としての安定性が非常に高いです。
バージョンアップにより非互換の言語仕様の変更が入ることはほぼ無く、リビルドすらしなくても結構そのまま動くことは多いです。 一方、LLでWebでよく使われるPHPやRubyは結構ひどいです(直近のバージョンアップは比較的マシですが)。当たり前のようにAPI等が統廃合されます。
自分たちの書いたコードだけではなく、FWやライブラリが影響を受ける場合もあり、おいそれとは上げれなくなります。 なら上げなければいい、とか言われそうですが、世の中にはセキュリティアップデートというものが有ります。適度に最新化しないと致命的なセキュリティを放置することになってしまいます。
こういった点は、4,5年以上の運用には非常に重要です。
モニタリングのしやすさ
.NET系もそうらしいですが、JMXによるオンライン監視やスレッドダンプやメモリダンプ、GCログといったリソースモニタリングや障害調査のための仕組みが非常に強力です。
プロファイラもVisualVMやJava Mission Controlなど強力なものがデフォルトでついています。
最近だとFlightRecorderやENdoSnipeなど運用時に低負荷でプロファイラ級の情報を取得できるものもあります。GCのタイミングからホットメソッドまで分かるでの、問題発生時の切り分けがずいぶん楽になります。
LLでも使えるNew Relicとかも登場しており、Javaだけの特徴ではないですが、それらを含めた運用ノウハウの蓄積はまだ勝ってると思います。
まとめ
色々書きましたが、下記の2点にメリットを集約できると思います
- 言語機能や開発環境によりコード品質や生産性の底上げがしやすいため人の確保が比較的容易
- 言語の安定性やモニタリングなど運用時に都合の良い部分が多い
別段Javaが最高の言語だとはちっとも思いません。ScalaとかRubyとかの方が普通に好きです。
Javaのデメリットも多くあり、ScalaやRubyほどの生産性はないですし、Haskellほどの安全性もありません。C++のようなパフォーマンスもないです。 メモリをよく食いますし、インメモリセッションレプリケーションを使うなら尚更GCには気をつけねばなりません。バランサ設定をスティッキーにする必要があるのも面倒です。
とはいえ、仕事で中長期的に使うなら、先に上げた2つのメリットは捨てがたいものなので、個人的にはまだまだJavaという選択肢「も」ありだな~、と思っています。
それではHappy Hacking!
参考:
ちょっとだけ追記
想像以上にブクマもらってびっくりな今日このごろです。
で、コメントとか見てて、ちょっと補足した方がいいな、と感じたこともあったので少し追記します。
それはJavaじゃなくてJVMの特徴
障害情報、モニタリング系とかはそうですね。だから私も個人的にはScala押しです。ただ、JVMの機能を使えること「も」Javaの特徴なので、メリットして評価項目には入るかと思います。
逆に、RubyもScalaもGroovyも言語の安定性/静的解析ツールの品質という点ではまだJavaに及んでないと感じてるので、単純置き換えできるものじゃないかな、と。
そのメリットは◯◯言語使ったほうが得られる。
そうかもしれないです。少なくともJavaが常に最適解になるわけでは決して無いです。 当たり前ですが適材適所あります。手持ちの札(人、モノ、金、時間)によっても同じシステム要件でも変わるでしょう。
C#なんかは言語的には同じ方向でかつJavaより機能的なので、代替候補としては最有力ですね。 ただ、個人的にはWindowsサーバの適切な運用ノウハウを持って無いので、Web系とかには採用したくないです。とはいえ、海外では一般的ですし、Azureも出たので国内でも良い選択になるかもですね。
その上で、この記事自体が「Java使うメリットはあるの?」という問い対する回答なので、頭ごなしな否定を(しかも古い情報で)してほしくないなぁ、という意図なので記載したメリットを他の言語で受けれない、という意味では全く無いです。
言語毎、ユースケース毎に採用を判断するための様々な特徴があるので、他言語で似たような観点の記事を書いてみたいですし、別の人が書いたいろんな言語や環境の記事を見てみたいですねー。