読者です 読者をやめる 読者になる 読者になる

megamouthの葬列

長い旅路の終わり

Perl6リリースに寄せて〜PHPと仏教、あるいはプログラマにとっての救済とは何か

http://developers.srad.jp/story/15/12/26/2217221/

というわけで、Perl6がリリースされました。

僕はLarryWallはPerl総本山の深奥にある部屋で即身仏と化しながらPerl6を開発し続けていて、側近がそこにコーヒーとドーナッツを毎日お供えしているという「Larry=空海説」をずっと主張していたのだけど、そうでもなかったようで、リリースされたソースをビルドした人の、ほとんどモジュールが動かないとか、なんかこれRakudoじゃねえの?という感想から、元Perlプログラマーとしては、TV版エヴァ最終回ばりの笑顔で「おめでとう!Larryゴールおめでとう!」とだけ言って、Perl6のことは金輪際忘れてあげるのが、せめてもの恩返しになるんじゃないかな、と思っていて、各方面の方々におかれましては、Perl6実装のバイナリパッケージ配布など、すぐ試せる形でのディストリービューション行為はLarryの一連の黙示録に対する重大な背教行為であることを自覚していただき、くれぐれもご遠慮いただきますようお願い申し上げる次第です。

で、LarryがPerl6を開発している間に僕はPerl CGIプログラマからRails、最近はScalaなんかを書いている、わけはなくて、バッチリPHPプログラマになっちゃってるわけなんですが、前任者の残したクソ非常に奥の深いコードなどを読んでいるうちについ「PHPプログラマなんてものはな、プログラマの最底辺なんだよ。俺たちはこの地獄で永遠に苦しみ続ける運命なんだよ!自覚しろやクソどもが!」と新卒の子をアルコール依存症特有の血走った目で睨みつけたりしていたわけなんです。

そういう生活を続けておりますと、愚鈍な凡俗である僕もようやく気づき始めるわけでして、ちょっと長いですが、今の時点の自分のプログラミング・パラダイム観みたいなのをまとめておこうと思います。

PHPPerl

PHPというのは皆さんがご存知のとおり、非常に新人に優しい言語です。

ビルドする必要はなくて、入門書の内容をWindowsのメモ帳にコピペして、拡張子phpで保存して、レンタルサーバーにアップロードすればそれで動くわけですから。railsがwebricで8080番ポートのWebサーバーはすぐ起動できるよ!とか、Scalaがrepl環境ですぐ試せるよ!とか言っても、そんなもの「コンパイルぷよぷよの開発元?」とかいう専門学校(ゲーム)出の新人にとっては完全に無意味なことです。

ただ、よく引き合いに出されるかつてのVisualBasicが「10分で出来ないことは、そもそも(VBでは)不可能なことなのだ」のような哲学を(後天的であるにせよ)備えていた一方、PHPは「エンタープライズクラスもいけるよ!」みたいなお題目をオフィシャルで備えていて、一部のPHPのパワーユーザーたちもそれを肯定しているわけです。

で、実際にそれを信じて、そういう領域にPHPを使うとどうなるか、

っていうと後ろから撃たれるんですよ。これはもう見事に。

そもそも、名前空間が暗黙裡に破壊されるわ、APIは統一されてないわ、右辺値は破壊されるわ、とかもう完全に後ろから撃つ気満々じゃないですか。それはね、そういう道を避けて通ることはできますよ。例えばフレームワークの言うとおりの道を歩くとか。PHPを書いててトラブルにあっている新人に先輩はこう言うわけですよ「あーそれはそうすべきじゃないね」と。頭の良いrubyプログラマならPHPは「10分で出来無いことは、多分できるけど、すべきじゃない言語」とでも言うかもしれません。

で、もう一つの重要な事実があって、それはPHPが「最も成功したWebプログラミング言語」である点です。Perlプログラマが全員鬱屈を抱えているのはこのへんが原因なんですけど、ようするにPerlっていうのは、CGI全盛期にKentWEB産のアクセスカウンターとか、そのへんが全盛の時代はWebで天下とってたわけです。で、Perl5系も順調に進化して、後方互換性を確保しつつ、オブジェクト指向とか、モジュール化とか、まともな機構を「次のステップ」として備えていったんですよ。新人がKentWEBから脱皮しようと思った時「エンタープライズも(気色の悪い書き方を我慢すれば)いけるよ!」という言語だったわけです。

でも、この後、PHPに無茶苦茶コールド負けしたんです。なんでか?っていうのをね、Perlプログラマはずっと考えてきたんです。おおげさでなく、僕みたいに今もそれを考え続けている人がいるんです。だってそうでしょ?Perlが色々クソな言語であった事は否定しないですけど、Javaに負けた。Rubyに負けた。Pythonに負けた、じゃないんですよ。PHPですよ?え?あのお子ちゃま言語のPHPに!?ですよ。
で、最近思うのは、それは「新兵を後ろから撃つ覚悟があったかどうか」なんだろうなあ、ということなんです。

新兵を後ろから撃つ行為について

とりあえず、そこそこの規模のサービスを作る計画があったとします。会社には、できるベテラン1人と新人が2人。この3人でいっちょやってみっかとなった時に、Perl、いや別にPythonでもRubyでもいいんですけど、プロジェクトをどう進めるかという時にどうするかというと、とりあえず教育ですよ。コーディング規約とか、それ以前に、オブジェクト指向とか、標準ライブラリの使い方とか、最低限の知識をまず新人に教え込まないといけない。

で、プロジェクト開始から2ヶ月ぐらいで、ようやく新人も覚束ないながらもコード書けるようになった。半年ぐらいしたら、けっこうデバッグも様になってきて、1年すぎるころには完成!二人の新人も一人前になって、良かったよかった。

これがまあ、普通の言語の成功シナリオなわけです。こういうシナリオを思い浮かべる限りは(Perlは少し微妙でもあったりしますが)PythonRubyは適した言語です。APIは直感的ですし、オブジェクト指向が基本になっているから書き方も理にかなっているんです。

でも、それじゃダメだったんですよ。Web業界でこのシナリオを実行できた企業は僅かしかなかったんです。なんでかっていうと、もうこの頃の日本のWeb制作会社には、教育をできるエンジニアはほとんどいなかったんですよ。

できるベテランエンジニアはいたし、教育を受けたい新人Webプログラマは沢山いたんです。でもね、同時に案件もすっごいあったんですよ。できるエンジニアはそれを作るのに精一杯で、新人を教える暇はなかったし、競合が増えてどんどん単価の下がる中、営業はプロジェクトの最初の2ヶ月を研修にあてるなんて悠長な計画を認めなかったんです。

そんな現場にPHPがあったんですよ。わからないことがあったらググって、でてきたコードをそのままコピペしたら、とりあえず動くか、動かなくても、わかる人がちょちょっと直せば動く言語があったんわけです。
新人は募集すればいくらでも採用できます。なにしろVBしか書いたことのない連中がこぞってWebにやってきてましたし、ライブドアが株式市場で大暴れしたおかげで新卒も豊富でした。その連中にとりあえず、仕事っぽい何かをあてがっておける。そんな言語はPHP以外にありませんでした。

この頃の現場は、入門書を渡されただけの新人がコピペで作ったプログラムをベテランが直して納品する、そういうサイクルにありました。とりあえず納品できる、ということがすごく重要で、納品後、XSSでこんにちはこんにちはされようが、SQLインジェクションで顧客情報が全部流出しようが、そんなことは些細なことでした。

我々は、来る日も来る日も幾多の新人を見知らぬ戦場にいきなり送り込み、Webプラグミングの深淵に絡み取られた彼らを(時には顧客ごと)機銃掃討し続けました。

後に残ったのは、無残に穴ぼこにだらけになりながらも健気にMySQLクエリを吐きつづけるシステムのような大量の「何か」でした。戦線を維持したベテラン兵卒も今はいません。皆精神を病むか、管理職になるかして、戦場から去りました。新兵はどうなったかって?1年持たずに皆辞めました。今頃、コンビニでバイトでもしてるんじゃないですか?

大乗と小乗、救済とは何か

Perl6に限らず、あの時代にポストPerl5とならんとしようとした言語が目指したものは、全てのプログラマが順調に成長し、良質なコードを書き、魅力的なサービスを高い生産性でリリースできる世界でした。一応PHPもかばっておくと、PHPの場合、その役割を担うのはフレームワークであり、その点では素晴らしいフレームワークPHPにも沢山あります。

しかし、その言わば衆生済度な大乗的パラダイムは、これまで書いてきたようにビジネス的には否定されています。おそらくはこれからも、否定され続けるのに違いありません。

Webばっか見ているプログラマワナビーには、そんな実感はないかもしれませんが、それは君たちが、暇なアーキテクチャ宇宙飛行士・フレームワークオタクどもの自己顕示目的のブログばっか読んでるからであって、現場では、死んだ目で黙々とコードをペーストしてはデバッグしているゾンビプログラマが主流で、日本のIT分野における付加価値の大部分は彼らによって生み出されているのが現実です。

彼らのコードは自分勝手です。至る所にある穴ぼこを踏み抜かぬように「独自に工夫」された方法論と、それによってもたらされた「彼のみが享受できる生産性」から、彼らは経営者から有能と見なされ、お給料をもらっています。railsチュートリアルを自宅でこなし、さあ、明日からプロになるんだ、と意気込んだ新人プログラマを待っているのはそういうコードです。なんだこれは?こんなのは間違っていると君が叫んでも、待っているのは配置転換がせいぜいと言ったところでしょう。

随分辛辣な事を書きましたが、実は私はこの大乗と小乗のような対立軸のどちらにも理はないと考えています。そもそも趣味でもない限り、プログラミングはビジネスの一部です。その儲かるか、儲からないかという、抵抗できない絶対的な価値観の前でプログラミング・パラダイムなどというものは、完膚なきまでに無力なのです。それは「関数型言語」の定義にあれほどうるさい連中が、一言もそのビジネス的側面について言及できないことからも明らかです。

僕は全てのプログラマにとっての救済は、美しいコードを書くことでもなく、新人を金に変える方法を体得することでもなく、「自分の思い描いたシステムを実装し続ける」ことだと考えています。そういう意味では、ビジネスに代表される「現実」と、プログラミング・パラダイムに代表される「理想」の接点を見出すことこそが必要とされているのではないでしょうか。

megamouthはCPANモジュール登録数世界一のmiyagawaを応援しています。