Diary?::2007-06-03

(18:35)

一月の終わりあたりから忙しくなり出して、しばらくはかなりそっちで HP も MP も消費されてしまっていたのだけど、最近は少し余裕が出てきたんで久しぶりに勝手翻訳を一発。「あまりに多い使われざる PHP の機能」。といっても、全訳には途中で飽きてしまったので、適当にポイントポイントを訳すだけ。


僕は言語として PHP が好きだ。こいつは手っ取り早くダーティなスクリプティングに使えるんだよ。あるいは、プロジェクトをきっちりと構造化するためにオブジェクト指向の機能を使ってもいい。過去二年間、僕は専ら後者の方を使っていたよ。どうしてかって? 一般的に、機能をクラスに隠蔽した方がメンテナンスし易いからだ。決して何かをコピーしたいなんてしたいと思わない、そうだろ? 基本的に、手続き型に対するオブジェクト指向プログラミングのリストだね。

とにかく、僕は友達の Ben がwww.benchodroff.comでやったみたいに、ブログとプロジェクト一覧とリポジトリとその他諸々を備えた個人的な Web サイトを作ろうと思い立ったんだ。自分のサイトを作るにあたっての最初のステップは、どのソフトウェアを運用するかだ。僕は Ben が WordPress を使ってることを知った。というわけで、僕はダウンロードしてそのソースにざっと目を通してみたんだ。そしたらすぐに気がついたんだ。

これらの殆どが即座に警告を引き起こした。 SQL bound parameters がの欠落は SQL インジェクションへの防御が難しくなるって事だ。 MVC の欠落は XSS の可能性を増加させる。クラスを使わないって事は、 API を理解しづらくなるって事だ。 PHP 5 の可視範囲のキーワード (public, protected, private)を使わないって事は、将来におけるコードの対応を確実にするのが難しくなるってことだ。

National Vulnerability Database で WordPress のおおまかな経緯について疑惑を強めたところで、僕はこいつにはチャンスを与えないことを決めた。このソフトウェアは簡単に使えるし多分きちんと動くだろうけど、僕はセキュリティを運否天賦に委ねる気には全くなれない。そのうえ、PHP 伝道師としては三年に渡る PHP の発展を利用していないソフトウェアを自分のサイトに置くべきじゃないだろう。

(中略)

僕は PHP 5 の利用を妨げている最大の問題は無知だと信じている。 PHP プログラマは総じて PHP で使える機能について無知だ。何故なら PHP の文法は新参プログラマが読むには易しく (少なくとも Perl, C に比べてで、 Python に対しては議論の余地がある。自分用メモ: Python についてもっと調べること) そのおかげで PHP に取り組むための敷居は低く (スクリプト言語は Java のようなコンパイラ言語よりも反復型開発がやり易い)、多くの PHP プログラマーはインフォーマルなプロセスで言語を学ぶんだ。 PHP 人気のせいで、多くの人は既存のプログラムから言語を学んでいる。これは僕もそうだった (たしか Netjuke をきちんと動作させようとしてたんだっけ)。そして PHP 4 が統計的には PHP 5 よりも人気なおかげで、最初に PHP を取り上げるチャンスは PHP 4 のものになるだろう。勿論、素晴らしい PHP 5 のアプリケーションはあるけど (最良のものをいくつか: IMO, Zend Framework の部分) 、統計的にはしばらく PHP を使ってもいない限りは決して出会えないだろうね。

PHP 4 と PHP 5 の違いは仰天ものだ。僕はこれらを二つの別の言語と思っている。そんなわけで、 PHP プログラマの間の違いの大きさは全然驚くべき事じゃない。もしも PHP プログラマの技術や技能を分析して彼らを分類しようと試みるのなら、彼らの使っている PHP のバージョンに関するグループに遭遇するだろう。 PHP への理解のレベルが高ければ高いほど、新しいバージョンの PHP を使っているってのがありそうなことかな。

(中略)

もしも君が PHP の初学者なら、評判のいいフレームワーク (先に言及したようなもの) でもない限りは既存のプログラムから PHP を学ばないことを勧めるよ。これらのフレームワークは君がそれらでPHPのすべての側面を見つけることができるくらい多様性があって、そしてそのプロセスにおいてまともなやり方に出会うはずだ。php.netにあるオフィシャルマニュアルは言語リファレンスとしては素晴らしい総合店舗だ。でもクイックリファレンスとしてだけ使ってくれ。もしも「PHP で X がやりたい」なんてことを探しているのなら、Zend Developper Zone を参考にするか、フレームワークの勧めるプラクティスに従うんだ (まったく僕はフレームワークが好きすぎる、そう思うだろ? )。

結論としては、現在二つの PHP プログラマの陣営が存在していて、それらは量とスキルレベルの観点でとても異なっている。ほんの一握りの PHP プログラマだけが実際に効率的な (そしてしばしばセキュリティ上のベストプラクティスとなる) PHP の上位バージョンの機能を使っている。 PHP 5 はいやしの呪文なんかじゃなく、ダメなプログラマはダメなままだ。僕は PHP 5 が PHP 4 よりプログラミングの練習により良いと感じる。不幸にも、 PHP の初学者は PHP 4 の精神に最初にさらされ、そこに引っかかってしまう。その上、 PHP 5 を奨励し、伝導するためのリソースは限られている。これが変わらない限りは、 PHP 5 が多数を占めるなんてことはすぐには起こらないだろうね。希望といえるものは、 PHP の先進的な機能の使いかたを知っている候補者はそうでない候補者よりもずっと優れていて、おかげで PHP 開発者を雇うのは比較的簡単だって事ぐらいだ。


訳者後書き: PHP プログラマのスキル問題ってのはいろんなところで書かれているような気がするけど、 PHP 5 への移行が滞っている理由が「みんながバカでやってないだけ」ってのは初耳かも。後方互換性に問題があるのかとかホスティングしてる業者の都合かなとか思ってたんだけどなあ。それはともかく、 PHP のコードが読み易いってのは何かの冗談なので真に受けないように。いつだったかは忘れたけど、 goto 文の導入が決定されていなかったっけ? ループの構文もなんかアレだし (for 文を今更 C ライクにしなくてもなあ。ってかこれはイテレータの不在と配列の実装が原因か)、クラスにおける変数のスコープとクラスメソッドも妙。手元に PHP の実行環境を作ってないので間違ってるかもしれないけど、

class Foo {
  function bar() {
    echo($this->variable);
  }
}

というコードがあったとして、

class Hoge {
  var variable;
  function huga() {
    $this->variable = "!!!!";
    Foo.bar();
  }
}

というコードを書くと Hoge のインスタンス変数が Foo から参照されなかったっけ? つまり、インスタンスメソッドとクラスメソッドの違いが本質的になくて、暗黙のうちに多重継承状態になりかねないってこと。これを最初に知ったときはえらいこと驚いた。勿論これはクラスに限らずベタのコードでも同じで、別の PHP コードを require すると require したコードと require 元のコードの変数の文脈がごちゃまぜになる。

echo($x);

というコードを書いておいて別のコードで

$x = "fungaaaaaa!";
require "xxx.php"

ってやると、 $x の内容が反映されちゃうとか。これを利用すると簡単にテンプレートが作れるのだけど、うーんこの言語仕様はどうだろう。短期的には問題なくても、メンテのときに死ぬぞ。しかもこれ、注意深くコーディングしても陥る罠の類なんじゃないかなあ。面白いっちゃ面白いんだけどなあ。

あとクラスごとに関数を分けるってやり方だけど、俺は Java なんかでもよくある静的メソッドだけで構成されたユーティリティクラスが嫌いというかそれは完全にアホな言語仕様だと思っている (static import? 死ねばいい)。この場合クラス名はモジュールごとの識別子としてだけ働いているんだけど、だったら Python 方式でいいじゃん。たしか Java は Python よりも後発で、 PHP も今のような体裁を整えるころには Python があったはず。なんで他の言語が Python をパクらないのかすげえ不思議だ。

話がずれた。この人の主張は「PHP の学習には定評のあるフレームワークを使え。 PHP 4 は参考にするな」って感じで特にそれはプログラミングの初学者に対して書いてるけど、俺はそもそもプログラミングの初学者が PHP を学ぶ事自体に反対で、もっと筋のいい言語 (Python とか Python とか Python) でプログラミングを学んだ方が絶対にいい結果になると思ってる。 PHP は確かに手っ取り早くでっちあげるには最適だけど、それはあくまでも「他の言語だったらこのサードパーティのモジュールが必要だったり自前で書く必要があるけど、それが PHP では全部入り」ってところがわかった上で省力化出来るだけだろう。そしてプログラマとしての技量があがってくると、「あれ? PHP 使う必要ってあるっけ?」とある日気がついて、そこで PHP との蜜月は終わりを迎える。というか、迎えた。

あと PHP は php.ini が死ぬ程面倒というか地雷原で、同じスクリプトでもサーバでの設定が違っていたら台無しになる。一応多くの項目が .htaccess で制御できるものの、じゃあ .htaccess で制御させるのってどうなのよと言われると「.htaccess で PHP を設定? クソですね」としか答えられない。これは大学時代に部の Web サイトを作ったときに経験したんだけど、 register_globals とか magic_quotes_gpc とか mbstring 系の設定ではまりまくって、というかそのときに問題になったバグの全部が php.ini 絡みだったので未だにこれは怨んでる。こんな地雷ファイルを否応なしに使う言語を初学者に進めていいのかは甚だ疑問だ。

たまにバリバリの技術屋でないタイプには PHP は素晴らしいとかいう意見があるけど、じゃあバリバリの技術屋じゃない連中にどれほどのコードが書けるのかという疑問がある。先に書いた通り PHP のように簡単に作れる言語ってのはある程度以上わかった人が必要に応じて省力化のために使うものだと思ってるんで、そんなこといってる暇があったら転職したらどうかと思う。たとえば Web デザインの仕事に就いてる人が「自分、バリバリのデザイナーじゃないんで」とかいってたら仕事任せる気になるか? 自分の仕事を本質的になめてる連中は黙れといいたい。

また脱線した。まあとにかく、 PHP はそれなりに焦点を絞った比較的出来のいい実用性重視の言語だとは思うけど、俺は基礎的なプログラミングや計算機科学の学習をきっちりやれと思ってるんであんまり評価できないし、少なくとも今の状態では最初に覚えるべき言語とはとてもじゃないけど思えない。

追記:最近 PHP 関係で腰を抜かしたのは「PHPの奇妙なround関数」。これ、将来に禍根を残しまくるんじゃないかなあ。半年ぐらい前には「PHPのセキュリティ」みたいな酷い話もあったし、なんていうか PHP はやっぱお薦めできない。

(22:16)

前にもじぴったんに対して「俺としてはガツガツ攻略するようなゲームじゃねっす」とか書いておきながら、結局攻略モードに移行してしまいそうだ。普通に面をクリアするだけだったらまだ初級レベルだけに難易度はそれほどではなくサクサク遊べるんだけど、王冠を取ろうとするとこの時点からある程度は計算して連鎖を組んでかないと厳しい。しかもこのゲーム、自分の語彙にない言葉が偶然できて連鎖数が予想の二倍なんてこともざらで、もうなんていうか 10 連鎖以上になると脳内麻薬が出っぱなし。

問題は、俺は既にもじぴったんやってて電車乗り過ごしというかつてのヒッピーぐらいしかやらなそうなヘマを既に三回やっていることだ。幸い全部帰りの電車でのことだったので会社に遅刻はしてないが、これはもう時間の問題だな。職場の人に「もじぴったんやってて乗り過ごして遅刻しました」とかいったらぶっ殺されても文句はいえない (俺だったら確実にボディブローをうんこ漏らすまで叩き込む) ので、これからは朝の通勤電車内ではスコアアタックは控えることにしよう。流石に世界樹のときと違って普通にやってる分には乗り過ごすまで熱中はしないと思う。多分。

Written by Kuwata Chikara
Creative Commons