2011年1月15日土曜日

Stack Overflow上でのPHPについての議論

 

仕事でPHPを任されることもあるかもしれないと思い、言語仕様やビルトイン関数についていろいろとdisが多いPHPの、最近の論点を調べてみました。

Stack Overflowによくまとまった記事があるので、抜粋して翻訳します。

Defend PHP; convince me it isn't horrible

以下、質問主のPHPに対する問題提起。

  • ビルトインやライブラリ関数の名前に一貫性がない。予測可能な命名規則はどんなデザインにおいても重要。
  • 組み込み関数の引数の順序に一貫性がない。例えば簡単な例でも、array_filterとarray_mapなどがうざい。(訳註:引数の順序が逆。)さらに悪いことにいろいろと期待していない振る舞いをする。
  • PHP開発者がビルトイン関数と低レベルな機能を非推奨にする。良い例は、関数の参照渡しを非推奨にしていること。これにより、いわゆる関数のコールバックを行うときの悪夢が生じた。
  • 再設計への配慮の欠如。上記の(参照渡しの?)非推奨により、多くの場合において、関数のデフォルト引数値を提供する能力がなくなった。PHP5では修正されたが、PHP4では非推奨にされている。
  • 名前空間のしょぼい実装。(昔は名前空間が全くなかった)今は名前空間が存在するが、何を逆参照文字として使用すればいいと思います?バックスラッシュですよ!この文字は、普遍的に(PHPにおいてさえ)エスケープを行なうために使用される文字なのに!
  • 過度に広範な暗黙の型変換がバグにつながる。私は、例えばfloatとintegerを相互に、暗黙に型変換することなどには疑問はない。しかし、PHPは(最後に私がチェックしたときは)喜ばしいことに、配列を整数にするという魔法のような型変換をしようとする。
  • しょぼい再帰。再帰は、どんな言語にも実装されている根本的に重要なツールです。再帰によって、とても簡単に、複雑なアルゴリズムを作ることができます。しょぼいとかありえない。
  • 関数が大文字と小文字を区別しない。何を考えているのか全くわからない。プログラミング言語は、コンピュータとコードを読む人間にの両方に取って、曖昧さを排除しつつ、振る舞いを指示する手段なのだから。大文字と小文字を区別しないことは、曖昧さを導入してしまう。
  • PHPは(実際上の要求として)プレゼンテーションと処理のカップリングを奨励している。もちろん、そうしない形でPHPを書くこともできるが、それは実際、簡単に(適切なデザインの観点から見て)誤った作法でコードを書いてしまいがち。
  • PHPのパフォーマンスは、キャッシュなしだと最悪です。誰かPHP向けの商用のキャッシュソリューションを売ってくれないものでしょうか?いやいや、PHPの言語デザイナーがやれよ。
  • 最悪なのは、PHPが、Webアプリケーションを設計するのは簡単だ、と人々に納得させていることだ。これは実際、多くの費やすべき努力を軽減してくれる。しかし、実際には安全かつ効率的なWebアプリケーションを設計するのは非常に困難な作業だ。
  • 多くの人をプログラミングに従事させるような宣伝のせいで、PHPはプログラマーのサブグループ(訳註:PHPクラスタ?)の全体に、悪い習慣と悪い設計を教えてしまった。このせいで、彼らに安全に使用するための理解に乏しい機能へのアクセス権を与えている。これは不安定なものとしてのPHPの評判につながっている。
  • (ただし、私は喜んで、PHPは他のWebプログラミング言語以上にセキュリティで保護された言語にほかならないことを認めると思います。)

これに対する解答で興味深かったのは、

  • PHPはWeb向けのDSL。例えば、Webの分野に再起が必要になる場面はそんなにないから、そのパフォーマンスが悪いことはWeb制作上問題にならない。

CMS系のWebアプリケーションに特化したDSLと考えれば、今はテンプレートエンジン/フレームワークも膨大にあるし、セキュアな設計についての蓄積もだいぶまとまってきた、という感じでしょうか。

最近はどの言語でもそうですが、仕事で使う場合、PHPを覚えるというより、業務に適したフレームワークを選べて、すぐに覚えて使えるようになることが大事な気がします。(でも、そういえば、前の職場で外注したSmartyのコードは結構DRY原則を無視していて、常駐の人が改修にものすごく手間取ってたなぁ。。)

  • ユビキタス

どこのサーバーでも動く、というのは確かですが、依存ライブラリが足りなくて困るようなことがあった気がします。それに、ユビキタスといったらやっぱりPerlじゃないのかな。

  • キャッシュを使えば速い。

仕事ではPHPアクセラレータやmemcachedの運用知識が重要そう。あと、Unixやhttpd、サーバロードバランスの運用知識ですね。

  • 巨大なコミュニティ

これにはちょっと疑問が。コミュニティが多いのは確かだけど、PHPの場合、玉石混交の情報量が多すぎて、検索時にベストプラクティスをさがすのが比較的難しいように思います。でもPEARの整備は凄いと思います。まさにWebのDSLだなぁ、というようなラインナップ。

http://pear.php.net/packages.php

  • 仕事がある

WordPressのテンプレートにプラグイン対応するように関数を追加する程度しか触ったことがないので、実際に大規模開発に触れてみたいところ。

ただ最近だと、jQueryが使えるWebデザイナーの裾野が広がっていたりします。フロントエンドと地続きで開発ができる、サーバーサイドJavaScriptが将来的に主流になる可能性もありそう。HTML5のオンラインゲームとかで。

どの言語でも言えますが、これを覚えたらお仕事安泰というのはないですね。

今後5年の個人的な技術指向としては、JSのプロトタイプベース設計をサイ本片手にじっくりやりたいと思います。

http://dev.ariel-networks.com/Members/inoue/serverjs

0 件のコメント:

コメントを投稿

Blogger Syntax Highliter

フォロワー

自己紹介

フリーランスのエンジニアとして、ソフトウェア開発、人材育成を行っています。ITに関する技術顧問、企業研修などに興味のある方はご相談ください。