November 14, 2003

大規模開発では PHP や Perl よりも Java、という話について

[ Java , Perl ]
私は個人的にPerlは大好きなのだが(正確に言うと「だったのだが」)、何でも出来る便利さゆえ他の人が見ると全く分からないプログラムになる。他の人の中に半年後の自分も含まれるから困ったものだ。

開発期間とメンテナンス期間を比べた場合、圧倒的にメンテが長いわけだから、明らかにメンテナンス性に優れた言語を採用するべきだというのが私の意見だ。
それには出来るだけ制約が多いほうが良い。制約というと語弊があるかもしれないが、誰が書いてもほぼ似たようなプログラムになるものほど、メンテナンスが楽になるのだと思う。

そういう意味で言えば、Javaで書くのが一番よろしいと個人的に考えている。本的な機能は全て言語側でサポートしているため、APIとにらめっこしていると少ない行数で動くアプリケーションが出来上がる。また、C/C++のような自由度、不明度がない。Javaで書く分には個人差はあまり発生してこないと思う。イコール、メンテが楽、引継ぎが楽、ということになると思う。

PHP や Perl はスクリプト中で何でも一本でできてしまうので、小規模でシンプルなサービスには適用できるが、大規模な開発には向いてないよというお話。Excite Japan の CTO の井上さんのウェブログです。

で、この話についてですが、う〜ん、どうだろう。大規模開発に Java が向いているというのは間違いないのだけど。井上さん的には、Perl や PHP は自由度が高すぎて中規模以上の開発ではシステム全体としてみた場合の整合性を確保するのが難しいという点を指しているわけだけど、Java だってやろうと思えば何だってできるわけだしなあ。(Perl や PHP がそんなに自由度が高いかどうかも疑問だったり。)

(Javaは)基本的な機能は全て言語側でサポートしているため、APIとにらめっこしていると少ない行数で動くアプリケーションが出来上がる。

ということらしいけど、ここはさすがに CPAN や PEAR の存在を知らないか、あまり利用経験がないのではないかと疑ってしまう。CPAN の世界に一度でも足を踏み入れたことがある人なら、Java で API とにらめっこするのと、Perl の CPAN ドキュメントとにらめっこするという作業がほぼ同じであることはすぐに実感できるわけで。だいたい、Java とスクリプト言語を比較した場合には、圧倒的に Java のコードの方が冗長であることは疑いようがないし。

僕は、Perl も strict な構文を意識して、コーディング規則をしっかりと設ける、テストをコードにより自動化するといった作業を徹底することで、複数人数開発での一貫性は確保できると思います。より複雑かつ大規模な開発においてはフレームワークを適用することで設計やコーディングに縛りをつけて、整合性を保つ。この辺の話については、言語が何であろうと変わらないですね。ただ、そういった話題をするときに Perl、PHP、Ruby といった Lightweight Language を題材に扱われること自体が稀なために、「スクリプト言語は大規模開発には向かない」という先入観が世の中に浸透してしまっているような気がします。

個人的には、Java が言語仕様として優れているのは抽象クラスやインタフェースによって、コードを以てプログラマに制限を加えることができる点、スクリプト言語と違って基本的にはクラスのロードやメソッド呼び出しが静的であるから、その辺りがコンパイラによって厳密にチェックされるというところだと思います。(ただ、この辺の話も、やろうと思えば裏道や逃げ道なんかは幾らでも作れるわけですが。)

そして、各種アプリケーションサーバや EJB などに代表される大規模運用を想定して設計され、実績を積んだ多くのミドルウェアやソフトウェアパッケージ、フレームワーク、開発環境が周辺をがっちりと固めている。どちらかというと前者の言語仕様に関しては、Java を積極的に採用する理由にはなりにくく、後者の J2EE 関連プロダクトの存在の方が遥かに大きな影響力を持っているというのが一般の理解ではないでしょうか。且つそれこそが、Java は大規模開発に向いていると言われる所以ではないかと。

Java の成功はマーケティングの産物だと、著名なエンジニアの誰かが言ったのを聞いたことがあります。なんとなく、分かるような気がします。

Posted by naoya at November 14, 2003 01:53 AM | トラックバック (1)  b_entry.gif
トラックバック [1件]
TrackBack URL: http://mt.bloghackers.net/mt/suck-tbspams.cgi/633
PHPは大規模開発に向かない?
Excerpt: NDO::Weblog 僕は、Perl も strict な構文を意識して、コーディング規則をしっかりと設ける、テストをコードにより自動化するといった作業を徹底することで、複数人数開発での一貫性は確保できると思います。より複雑かつ大規模な開発においてはフレームワークを適用する...
Weblog: p0t
Tracked: November 15, 2003 02:57 PM
コメント [8件]

JavaにはIDEがいろいろあるっていうのも大きいのかもしれません(Perlにもあるんでしょうか?寡聞にして存じません)。

[1] Posted by: kdmsnr at November 14, 2003 09:34 AM [返信]

Javaの優位な点としては、「言語能力を抑えていること」、「コンパイラで型チェックすること」です。能力がばらばらのプログラマの多人数構成であっても均質なコードになりやすい(設計は別ですよ)、ということではないでしょうか?規模の大小は本質ではない気がします。
逆に動的な言語能力を売りにしているスクリプト言語では、あまりコーディング規約を設けると旨みが減ってしまうと思います。言語能力を使い切るためには高い能力を持つプログラマ必要で、強力なプログラマが少人数でPerlでがりがり書きまくれば何も問題はありません。(それだったらJavaでも問題ありませんね(^^;)
現在からメンテナンスの未来まで、そういう人間を雇いつづけることがコストに見合うかどうかが重要ではないでしょうか?

・・PHP4は取って付けたようなOO能力が不満なので、そういう意味で「PHPはちょっと」です(^^;

[2] Posted by: swd at November 14, 2003 02:45 PM [返信]

CPAN を利用していれば、Java API とのにらめっこと一緒と言う話が出てます
が、これは井上さんが意図してらっしゃる部分と少し論点が異なる気がします。

私自身は、CPAN, PEAR など活用すれば Java よりも効率的、且つ洗練された
コードが書けると考えている人間なんですが、今回の話は、それらを言語仕様
として用意している部分を言っている気がします。
Perl と言う言語環境を広範囲に捉えて CPAN モジュールの話が出て来ること
には何の異論もありませんが、様々な亜種、亜流が混在してしまうのが Perl
の Perl らしいところでもあり。
それだとチームでの開発で行なう時に厳しい制約を課しておかないと標準化さ
れたコードを残すのが難しい -> 保守性が落ちると言う論法かと。

Java の場合は、好む好まざるに係わらず、言語が用意している仕組みを使う
ことになり易いため、個人レベルの要素が混入し難いと言うところが主眼な様
に思います。

[3] Posted by: ten at November 15, 2003 09:53 AM [返信]

大人数開発をするなら Java でしょうが、大規模だと大人数が必要なんでしょうかね。俎上に乗せられている言語ならば、システムのスケーラビリティはハードウェア・ネットワーク側の要件と言ってていいと思いますし。

[4] Posted by: D at November 15, 2003 08:50 PM [返信]

>>1 kdmsnr さん

IDEの存在は絶対的に大きいでしょうね。IDEも、プログラマ間のコードの差異を吸収するのに一役買ってくれますし。Eclipse とかだとコーディング規約に沿うように自動フォーマットするとかいうのもできますしね。

Perl にもいくつか IDE がありますが、IDE を使った開発のイメージ自体が Perl の持つ "Hack" というイメージに合わないような気もします。(そういうイメージこそがこのエントリでも問題にされる点なのかもしれませんが。)

>>2 swd さん

能力がバラバラでも均一なコードになりやすい、というのは果たしてコンパイラに型チェックがある点や、言語能力が押さえられているということにどこまで依存するのかというところが少し気になります。

Java で書いたコードが均一になっているように感じるのは、Java プログラマが参考にするソースコードがそのような書き方をされているところも大きいというか、Java には暗黙のコーディング規約のようなものが、暗黙でありながらも明確に存在しているような気がしますね。Sun が提唱しているコーディングルールや、Writing Robust Java Code あたりを意識して書いているということが結構多かったりしませんか?

>>3 ten さん

確かに CPAN は Perl ディストリビューションから観ると外部リソースになるのですが、それがそれほど大きな差異であるかどうかは僕にはあまりわかりません。Java が言語で用意している仕組みと言っても、要はクラスライブラリの集まりを指差していることが大半で、Perl の場合も、デファクトなものは CPAN から、Perl 配布パッケージに取り込まれることもありますし。

亜流、という点では、Java の XML 実装なんかを見てても、安定してないところは安定してないんじゃないかなという印象です。

>>4 D さん

確かに、大規模 = 大人数って考えがちだけど別にそうじゃなくてもいいんだよねえ。肝心なところかも。

この手の話は宗教戦争っぽくなりがちですが、僕自身は Java も Perl も扱いますし、Java の方が、確かに堅牢なシステムを作るのには総合的に適していると考えるのはみなさんの思うところと同じだと思います。

ただ、Java だからというので盲目的にそれを信じてしまっている人や、逆に Perl などのスクリプト言語だから駄目だーなんていう根拠のない話をする人をときどき見るので、その辺りの誤解はなんとかならないものかなあと思うこの頃です。

[5] Posted by: naoya at November 16, 2003 08:10 PM [返信]

なるほど、naoyaさんのおっしゃる通り、「Javaならこう書け」というような教育が暗黙的に行き届いているかもしれません。
Perlは"TMTOWTDI"ですから、「誰でも、どんな場合でも、こう書け」という啓蒙は合わないですよね?
余談ですが、昔、Larry様にサインを頂いたことがあります。その時ちゃんとTMTOWTDIのスタンプも押されました。

[6] Posted by: swd at November 17, 2003 04:45 PM [返信]

一応、ある程度 Perl に慣れてくると、それなりの定番スタイルというのが掴めてくるようにも思うのですが、あくまで感覚的なものであって、それが明文化されているというケースは稀ですね。

そいういう意味で、Java は後発ということもあって、そのあたりの教育、啓蒙がしっかりしているというのがかなりの利点なんだなあと実感します。

Larry のサインは以前に宮川さんが LL でプレゼンしたときにも出てきました。OO というのが追記で書かれていたんだったかな。

[7] Posted by: naoya at November 19, 2003 02:48 AM [返信]

僕は Perl は使っても CPAN 全然使わない人なんですが、なんで使わないかというと「どのモジュール使ったらいいかわからないから」です。

Java のパッケージ群が魅力的なのは、どのパッケージもだいたい同じ思想のもと構築されているため、
1.基本的に機能的重複がない
2.経験がなくても必要なモノをAPIドキュメントで探しやすい
ところです。
要は、選択の連続である設計において「選択しやすい」のです(そういう意味ではPHPもそう)。
僕が CPAN の効率的な使い方を知らないだけかも知れませんが(教えてw)。

[8] Posted by: ooba at November 20, 2003 03:29 AM [返信]