と言っても、結局「本読んで終わり」な話なんだけど。
私は普段はCでプログラムを書き、Cで書く程のものじゃないなーな時はRubyを使う。COBOLは仕事なら使わないこともないが、積極的に使いたい言語じゃないし、「とりあえず書ける」という言語はいくらでもあるのだが、普段使いの言語となるとその2つか3つだ。で、まぁJavaも「とりあえず書ける」という程度には使える。
来年からの仕事を考えて、どんな言語を使うのがいいかなーとあらためて考えることにした。
Rubyは高負荷なアプリケーションはあまり得意でない風味だ。やっぱりあれは「富豪」が許される時に使うべき言語であって、速度チューニングとか意識しなきゃいけない局面がある時には、使うべきじゃない。速度のための可読性を落としたり、姑息な技を使うということをすると、せっかくの「それなりのプログラムがサクっと書ける」というメリットを消してしまう。そんなんだったら最初からCで書くなり、設計に時間かけるなりする方がいい。
しかし、Cはミドルウェアやゲーム、デスクトップアプリケーションは良いとしても、一般のwebなアプリケーションとかに使うのは、ちょっと芸がない気がする。自作のフレームワークやらミドルウェアやらを持っているので、いきなり「CでCGI」みたいなのよりはマシであるが、なんかちょっと違う気がしてならない。
そんなわけで、もうちょっと「程々」なところで使える言語の使い手になろうと思ったわけだ。その第一段としてのJavaの勉強である。
とりあえずプログラムを読み書きする程度のことはわかっているので、もうちょっと実用に近いところ、デザインパターンとかそういったあたりのこととセットで勉強をしてみた。いわゆる「アプリケーションを書きながら言語を勉強する」タイプの本をとりあえず読む。
本を読んでいるうちにあらためて思ったのは、
Javaだる〜
だ。と同時に、
これならCでもいいじゃん
とも思った。つまり「Cで書くのは何だかなぁ」という部分がまるで解決してないということだ。
「Cでプログラムの品質を下げる要素」はいくつかある。それはJavaは頑張って解決をはかっている。とは言え、長年Cでプログラムを書いていれば、そういった「要素」は既にいろいろな方法で解決をしていて、そんなところがハマりポイントになっていないものだ。
今時の言語なら、それ単体ではなくて、ライブラリだのフレームワークだのデザインパターンだのを意識しなければならない。その辺はどの言語も大差あるものじゃない。そうすると、言語に求められるものは、
本質にそったコーディング
ができるということである。つまり、「書きたいと思ったコードが書きたいと思ったように記述できる」ということが重要である。わざわざCよりも遅い言語を使うのは、その速度を補って余りあるような「記述性(ひいては可読性)」に価値があるからだ。
Javaは万能言語である。いろいろ工夫すればどんな目的にも使うことができる。速度や重さについていろんな意見もあるが、「アプリケーションがそれなりのパフォーマンスで動く」ということを目標とするなら、そんなに悪い選択にはならない程度でプログラムが書ける。
ただ、その「Javaは万能言語である」という観点で見ると、「Cは万能言語である」と言うのと大差ない、そんな程度のものだ。つまりは「同じ範囲のものを記述すると、同じ程度のコードになる」という点で、JavaもCも大差ないのだ。Javaを使うからと言って、そうそう記述量が減るわけでもないし、可読性が上がるわけでもない。
たとえば、Rubyで便利なイテレータはJavaにもあるけど、データ構造も込みで考えれば、glibを使ったCのプログラムでも大差ない程度には書ける。書かれた結果を見れば、Rubyの方はちゃんとイテレートしたいのだということがわかるが、Javaの方はそこまで明確じゃない。Javaでイテレータであることを明確にする工夫をすれば、同じことはCでもできる。
もちろんスタンドアロンなアプリケーションを書いたりすれば、CとJavaの違いは大きくなるであろうことは、想像に難くないし、実際そういった局面を見掛ける。しかし、「私が使う」という範囲で見るなら、ものすごい違いが出るものは少なそうである。
ここで言う「私が使うという範囲」とは、
- 既にCで品質維持の手段が確立している
- C/Sやweb(つまりフレームワークを使う)
- 実用「アプリケーション」
ということだ。この範囲であれば、何もJavaを使っても大差はない。「Javaだとこんな機能がありますよ」と喧伝される部分は、たいていは「Cでも大差なく書ける」ことであったり、「なければないで済む」ことであったりする。
「Cと違ってOOPじゃん」という声もあるが、OOPであることは「アプリケーション」という目で見れば、「ないよりはあった方がいいけど、なければないでどうにかなる」ことでしかない(それよりはOODの方が大事で、OODはOOPだけのものじゃない)。スコープ管理はCより賢いけど、スコープ管理はちょっとした規模のプログラムになると「言語の問題」ではなくて「プログラマの問題」になる。
JavaとRubyは最近よく対比されることがあるのだが、「Cの他にもう1つアプリケーションを書く言語を覚えたい」ということで言えば、Javaはあまり価値はない。まぁそれがあるから、JavaからRubyに軸足を移した人達は、「ひいきの引き倒し」のようにRubyに傾倒するのだろうが。
そんなわけで、「やっぱりJavaイラネ」というのが、個人的な結論となってしまった。