Javaで開発って言葉ほど曖昧なものは

JavaでWeb開発してきました?

// JavaEE6の部内紹介に向けて | Challenge Java EE !
http://d.hatena.ne.jp/kikutaro777/20121117/1353164715

とても興味深い記事なのでした。

jfluteはJavaでもC#でもシステム開発の経験があります。
とはいえ、その多くはJavaではありますが。
ずっとC#畑でやってて初めてJavaをやるって人や、
その逆の人の面倒をみることも多く経験しました。
(プログラマーの面倒を横断的にみるという立場が多いので)

その多くの経験から確実に思ったことは一つ:

Javaで開発って言葉はあまりにあいまいだということ

新しいプログラマーをプロジェクトに迎えるにあたって、
C#でWeb開発してきました」と言われれば、
そんなにイメージにズレは発生しませんでした。
紹介記事のコメントでもある通り.NETも色々と進化していて、
それなりの選択肢はあるものの、大きくは外すことは少ないです。

一方で、「JavaでWeb開発してきました」と言われても、
それだけじゃまったくイメージできないというのが実情です。

Javaにはデファクトスタンダードというものがないから

多様性のメリットデメリット

Java標準ってものはもちろんありますが、Javaの世界では単なる「選択肢の一つ」とでしか言えないでしょう。

o WebLogic? WebSphere? Glassfish? Tomcat?
o CDI? Seasar? Spring? Non-DI?
o Servlet? JSF? Struts? Struts2? SAStruts?
Teeda? Ymir? GWT? (JSP? Velocity?)
o JPA? Hiberbate? S2JDBC? DBFlute? JDBC-Direct?
o Eclipse? NetBeans? (vi? emacs?)

いろんなキーワードあり過ぎ(書き切れません)。Javaという世界は、Javaという言語を使っていることが同じだけで、そこで繰り広げられるアーキテクチャはあまりに多種多様。

Javaには、「標準」と言われるものがことごとく流行らなかったという歴史があります。最近のJavaEEはわりとGoodと聞きますが、Javaって誕生してからもう15年以上も経ってるわけです。既にJavaEE以外の良いツールやフレームワークが続々と世に誕生し、さらに進化し続けています。それはもう色々な人が色々なやり方で。その大きな一つの世界が、オープンソースと言えるでしょう。

もちろん、.NETにもオープンソースのツールはありますが、残念ながら、Javaの世界ほど多様であるとは言えないでしょう。(少なくとも日本のシステム開発の現場ではそう感じます)

Microsoftが「それなりに良いもの」を提供してきたので、自分たちで頑張らなくてよかったという面もあるでしょうし、開発環境であるVisualStudioが有料というのも要因でしょう。(しかもバージョンが上がるとまた購入しないといけない!?)

また、依存ライブラリのバージョンが実行時に厳密であるとか。Windowsでしか動かないとか、まあ色々な要因があるでしょうが、両方の言語でオープンソース活動しているjfluteとしては、.NETでのオープンソース活動は確実に「やりづらく」感じます。

Javaの世界では「Java提供側でない組織や個人」が、オープンソースとして多様なプロダクトを生み出してきました。しかも、単なる趣味ソフトのレベルではない。お堅い業務でも使える品質と利便性を備えたプロダクト。Javaを語るとき、Javaアーキテクチャを語るとき、オープンソースの存在を抜きで考えることはできないでしょう。

例えば、紹介記事であったJPQL、jfluteは多くのJavaプログラマと会う機会が多いのですが、JPQLを書いてDBアクセスしてる人は一割にも満たないかと。もちろん、ある程度偏りはありますけどね。でも偏りがあるなら、それはJavaの世界が画一的でない証拠。

まあ、逆にオープンな世界のJavaプログラマーも、Goodと言われる最近のJavaEEにはちゃんと着目しないとぅ!?

ということから、Javaには「多様性」という、メリットにもデメリットにもなる特徴があります。

メリットは、選択肢がいっぱいあるということ。その現場にフィットした最高の布陣を自ら考えて、もしオープンソースなら拡張することだってできる。自分たちの努力次第でいくらでも最適化ができる。

デメリットは、選択肢がいっぱいあるということ。誰も自分たちの現場にフィットした構成を考えてくれません。自分たちで考えて正しく取捨選択しなければならない。へたするとはずれを引く可能性は大いにあるのです。

「悲しいJava開発」が世にたくさんあるのは事実。

選択肢を探す旅のできる人

C#からJavaに来たひとがうまく順応していけるかどうか!?

面倒みてきた経験から思うその大きなポイントがこちら:

フレームワークがは与えられるもの」という考えが抜けない人、残念ながらその実力を発揮せずJavaをけなして去っていきました。

フレームワークは自分で選ぶもの、自分でフィットさせる!」という感覚を身につけた人、もしくはもともと身につけてる人は、そのまま高いパフォーマンスを発揮しました。

ぶっちゃけJavaプログラマーが、みんな後者かっていったらそんなことはありません。だからこそ、「悲しいJava開発」が今でも尽きない話題になる要因の一つでもあるのです。......お、思い出すだけでも悲しい(><

ただ、成功するJavaプロジェクトでは、後者の意気込みをもったアーキテクトが必ずプロジェクトに数人いらっしゃります。最低一人は...でも一人はつらいからもう一人くらい誰かぁ...逆に全員そういう人だと確かにまとまらないから、そこは業務に専念する人とアーキテクチャ担当する人がうまく連携。もちろん、Javaの世界があまりに広すぎるから、全てを把握してってのは無理なのですが、少なくともアンテナを広げる意識のある人、そういう人が必ずJavaプロジェクトには必要です。目の前の問題を解決できる選択肢を探す旅のできる人が。

業務に専念する人は、やはり「与えられるもの」って形になりますが、それでも後者の理念をある程度は理解した上での開発にならないと、どんなに「ぐーのねもでない」プレゼンをしてJavaに移行しても、開発中に隙あらばブーブー文句をいくらでも言いますし、あまりモチベーションが上がらずパフォーマンスも上がりません。

ぶっちゃけ、文法の差なんてそれに比べたら差のうちに入りません。C#だって、Javaだって、もう実績は十分あり過ぎてるわけで、どっち使ったってシステムはしっかり作れるわけだから。そんなことよりも、しっかり業務パターンを網羅した綺麗なテストデータが用意されてることの方がよっぽど大事だろうし。

jfluteの経験から心配する最も大きな「差」は、このブログで語った「多様性の差」です。それをしっかりクリアして、紹介記事のプロジェクトが、どういう方向に進もうが、しっかり成功して欲しいなと思います。

本質追究の議論はどこへ?

最後に技術的な面に関してコメント:

「DI、AOP辺りは.NET系にはまだない(はず)ので、開発上の優位点かなと」

日本で大きなオープンソースの組織の一つに「Seasar」があります。Javaのプロダクトが九割を占めますが、.NETのプロダクトもあります。Seasar.NET の「Quill」というDIコンテナ、これは200人月を超えるようなプロジェクトでも実際に利用されています。紹介記事のコメントのとおり、.NETでもDIの概念は導入されつつあります。

「JPQLで複数テーブルのJoinクエリ等を書いたときに、戻り値がList

JPQLはちょっとわかりませんが、あと問題領域が合ってるかわかりませんが、例えば、SQLのselect句からEntityを自動生成するツールがあったりします。それはJavaに限らずC#でも利用できます。
-> 外だしSQL(OutsideSql)について | DBFlute

別に「じゃあ、そのツールを使わないといけないの?」というわけではなく(JPQL用に作られてるわけじゃないから)、そういう発想があれば自前で作ったり拡張したりって幾らでもできるかと。逆にそういう前向きな思想がないと、始まってみれば文句ばかりって、どうしてもjfluteは経験から容易に想像できてしまいます。

NetBeans

JavaEEに限らず、最近のNetBeansはとてもGoodとも聞きます。ただ、これはJPQLよりもさらにって感じですが、jfluteはJavaを10年以上色々な現場でやってきましたが、残念ながらNetBeansは一度も触ったことありません...(>< (それはそれで、俺も一回は触っとかないとだなぁ)

懐かしきサンフランシスコのJavaOneで、NetBeansのセッションで、後ろの外国人が「Eclipse is the best IDE」と言って、立ち去っていったのが今でもとても印象的で記憶に残っています。

Eclipseは、VisualStudioがReSharperを買わないとできないことが、デフォルトでできます。NetBeansもそこは変わらないのかなぁ...!? (そいえば俺もReSharperの新バージョンのライセンス買わないとぉ)

「O/Rマッパー」

ここに関しては、完全にC#Javaかって議論はもう関係ないですね。実は正直に言うと、一緒にされるのはすごいイヤだなぁと。JavaでベタにSQLを書く方法もあれば、C#NHibernate 使って HQL 書く方法だってあります。JavaでO/Rマッパー使うにしたって、「どういうスタイルのO/Rマッパーを使う?」って感じで、どのO/Rマッパーを使うかで全然結果は変わります。

なにはともあれ、変な意地の議論にならないように、前向きな議論の上での移行ができるといいですね。
 => 本質追究の議論のために | jfluteの日記

...
...
...

【追記 (2019/03/06)】
Javaデファクトスタンダードが決まってきて、フレームワークやツールに関してはあまり多様化しなくなってきましたね。。。