「PHPの現場 15」文字起こし
「PHPの現場」
15. PHP - The Wrong Way(tanakahisateru)
( https://php-genba.shin1x1.com/15 )
◆Google ドキュメントで読む場合はこちらのリンクからどうぞ。
https://docs.google.com/document/d/1-ZjvvtANAIteDkjv9ybBZin9U08GWh0ofrXc3la2GnE/edit?ts=5a53ce6e
◆話者
・新原雅司( @shin1x1 )
・田中ひさてる ( @tanakahisateru )
※注:今回、下線部は「PHP - The Wrong Way」の和訳ページからの引用部分です。
-----------------------------------------------------------
新原/
はい、「PHPの現場」です。今回のゲストは、ひさてるさんでーす。
ひさてる/
はいどうも、田中です~。ええと3度目くらいかな。ご無沙汰しておりました。
よろしくお願いします。
新原/
はい、よろしくお願いしま~す。
こないだ、1週間くらい(?)、東京に行ってたんですよ。
ひさてる/
ほう~。
新原/
あの、リアル「PHPの現場」を……。
ひさてる/
あれですね。
新原/
そう、見学させてもらいに、ちょっとあっちこっち……。
ひさてる/
美味しそうなお肉が、タイムラインに流れてきてねえ。
新原/
あはは、そうそう(笑)たん清(たんきよ)っていう……
ひさてる/
「肉テロめ!」みたいになってた(笑)
新原/
そうそう、美味しい焼肉屋さんに初めて行ったんですけど……。
まあ、それはいいんですけど。
で、まあ色々なところにお邪魔していて、1つ貴重な経験があったのが……
ひさてる/
はいはい。
新原/
ajitofm(アジトFM)っていう、VOYAGE GROUPの“すずけん”さんっていう方がやってらっしゃるポッドキャストがあるんですけど、そこに僕、ゲストとして、出てきました。
ひさてる/
はい。
新原/
なんかこう、今までホストとしては、この「PHPの現場」でやってたんですけど、ゲストで人のポッドキャストに出るのは初めてで。なんか、それはそれで「あ~、立場が変わると感じ方も違うんだな」っていうのは、結構、新鮮でした。
ひさてる/
ほうほうほう。呼ばれてしゃべる気持ちがやっとわかったと、そういうことですね(笑)。
新原/
ほんま、そうですね(笑)「十数回目にして、ようやく気づくんか」っていう感じですけどね(笑)。
ひさてる/
「勉強会でしゃべりっぱなしの人が、急にしゃべらなくなったら気持ち変わる」っていうか、ね(笑)
新原/
そう(笑)まあでもやっぱり、(今までは)ホストで、回す側だったので、今日もそうですけど、さっきみたいに「始めにまず話をして、最後締めたりとか、(話を)振ったり」っていうのを、一切やらなくていいので……。すずけんさんがまた、話を回すのがすごい上手なんで……すっごく……「ああ、ゲストっていいなあ」って思いました。
ひさてる/
ふふふ(笑)楽ですね。
新原/
その辺はね、楽ですけどね(笑)ただ、なんかやっぱり……なんていうんですかね。一応ね、「その人(ゲスト)の回」になるわけじゃないですか。
ひさてる/
あー、そうそうそう。「その回の色」を決めちゃうから、責任はありますよね。
新原/
そうそう。なんとなくこう、やっぱり思うところはあったりしましたけどね。いやほんと、貴重な体験でした。
ひさてる/
録音はあるんですか?まだ。
新原/
ありますあります。あ、もう配信されているはずなので。また「Show Notes」にリンクを張っとくので、もしよかったら、聞いてください。
ひさてる/
はい。
新原/
今日ね、収録しようと思ったのは、もちろん僕がサーバを移行して、収録したい(笑)っていうのも、まあ若干、あるんですけど。
それよりもメインは、Twitterで「#phpgenba」にwataさんという方から、「ひさてるさんがこないだ書いた、『PHP - The Wrong Way とは何だったのか』というのについて、ちょっと聞いてみたい」というリクエストをいただいてですね。
じゃあ、まさに書いた(本人である) ひさてるさんをお呼びして、ちょっと この話を聞こうかな、ということで。ちょっと本題に入っていきましょうかね。
ひさてる/
神対応ですよね。
新原/
へへへ(笑)本人みずから、ってことですか?
ひさてる/
いやあのほら、「tweetしたら呼ぶ」っていう(笑)
新原/
ああ~、そういうことですか。いやでも、こう、話題を振ってもらえるとありがたいですし、実際、僕もこれについては、ひさてるさんと話をしたいなと思っていたので、はい。wataさん、どうもありがとうございます。
ひさてる/
ありがとうございます。
新原/
じゃあそもそも、「PHP - The Wrong Way」って何じゃらほい?というのを、ひさてるさんから、お願いします。
ひさてる/
はい。えーとね、自分がこれを知ったのは、多分、できあがってからだいぶしてからかな?と思うんですが。
えーと、「BEAR.Sunday(ベアーサンデー)」を作っておられる郡山(昭仁)さんと、あと東京におられる、ハンドルネーム「うずら(笑)」 さん( @uzulla )あたりから、「こんなんがある」っていう話をちらっと聞きまして。そのあたりを見て、「なにこれ」って見に行ったのが最初ですね。
見てみると、見出し的には、なんかそれっぽいことが書いてあるんですけど「これ、何なんやろう?」と。えー、何ですか、「フレームワークを使った開発はダメだ」みたいなことが書いてあって。
新原/
ふむふむふむふむ。
ひさてる/
でも、結構 一生懸命作ってるっぽいので、「そうは言うても、ホンマに何が言いたいのか、ちょっと読み解いてやろう」ということで。えーと、英語だったのを翻訳して、プルリクして、「これ、どういう意味なんやろうね」っていうのを日本語で話し合いたいな、と思って、翻訳をさせてもらいました。
新原/
素晴らしい。まああの~、一応補足でいうと、皆さんご存知だと思うんですが、「PHP: The Right Way 」っていう、まさに名前のとおり「今のPHPってこんな感じで、こういうやり方がいいですよ」みたいなのを まとめているサイトが、結構前からあってですね。
しかも、そのサイトはちゃんと、どんどん時代にあわせて更新されていくので、我々も「PHP学習するのに何か良いサイトはありますか?」って言われたら、わりとおすすめしている、定番のサイトになっているんですよね。
なので、まあそれの対比として「PHP - The Wrong Way」。似たような名前で、言葉の意味を逆にしているっていうサイトが出てきた、……というのが一応の流れですね。
で、ひさてるさん、これ訳されて実際、どうでした?
ひさてる/
いやあ……。内容だけいきますよ、内容だけ。
新原/
はい、はいはい。
ひさてる/
内容だけいきますけど……もうなんか、割と、「痛いポエム」っていうか……。
新原/
あははははは(笑)
ひさてる/
最初の印象から、そこは変わらなかったですね~……。
新原/
あ~、なるほど(笑)
ひさてる/
ますます、痛みを増していって……。いや、翻訳つらかったですよ、これ(苦笑)
新原/
あはははは(笑)
ひさてる/
あの、1センテンス訳すごとに、なんていうのかな、言いたいことが(自分の中で)山盛りになって。「あかん、あかん。今は素直に訳そう」って(苦笑)
ちょっと休憩いれては、次のセンテンスいって、っていう。
(後ろで新原さんが涙が出そうな勢いでずっと笑っている)
新原/
あ~、なるほどなるほど(笑)
ひさてる/
あの~、精神的にしんどかったです(苦笑)
新原/
っはははは(笑)なるほど、いいっすね……。ちなみにこのサイトのリンクは、また「Show Notes」の方で張りたいと思うので……。じゃあですね、これ聞いてる方も、ちょっとこれ見ながら……せっかく色々な内容を、ひさてるさんが翻訳してくださってるので。
ちょっと上から順番に見ていきましょうかね。
ひさてる/
はーい、見ていきましょうか。……この世界に、耐えられるかな?(笑)
新原/
ふはははは(笑)
ひさてる/
ちなみに、ストロングゼロをエネルギー源として、今、おしゃべりをさせていただいております。これ、今をときめく奴やから、言うとかな……っていう(笑)
新原/
ははは(笑)皆で飲みながら話したいですね(笑)皆、飲みたいんだなーとは思いましたけどね、あれ。
ひさてる/
ははははは(笑)「やっとかな(あかん)」っていうね(笑)……もし話題でなければ、もうちょっとマイルドなやつ(酒)を買ってたかも……(笑)
新原/
(笑)じゃあ、ストロングゼロをいきながら(飲みながら)やりましょうか。まず初めは、まあ「概要」はいいとして、(その次の)
「過激主義の危険性」っていうやつですね。
ひさてる/
短いセクションですね。
新原/
そうですね。うん。まあ、よくありますよね、「なんとか原則」とかね。いうたら「SOLID(ソリッド)原則」とか。まあそういうの、たくさんあるんですけど……。
「あんまりそういうのを過剰に当てはめようとするのは、いかがなものか」みたいな感じですかね。
ひさてる/
……って(もとの筆者が)言いたい感じ、ですね。
新原/
うん。
ひさてる/
これね。「当てはめるか否か」はさておき、「知りもしないで“良い”って言うのはよくないな」っていうのには、つながりますね、と(僕は)思っていて。
新原/
うんうん。
ひさてる/
人って、何段階かあるじゃないですか。
「知りもしないけど『まあいいや』で、お仕事がこなせればいい」っていうフェーズから、
次、「知ってしまうと使いたくなる」フェーズ。
で、だいぶ成熟してから、「知ってるけど、それはカードのひとつ」というフェーズ。
で、本当はその3段階めに行かなあかんところを、1段階めと2段階めがケンカしてるもんやから、こういう……。
新原/
ふふふ(笑)
ひさてる/
なんかね、何だろう。ほら「デザパタ厨(デザインパターン厨)」ってあったじゃないですか。
新原/
ありましたね、はいはいはい。
ひさてる/
このあと、デザパタの話が出てくるんですけどね。昔でいうと、それ。
……(そのデザパタ厨)と、「いやいや、デザパタも何も、なんとかファクトリーじゃなくてnew(?)で書けや」っていうパートが争っているのを思い出しますね~。「行き過ぎた主義主張は警戒した方がいいぞ」と。見出しではそうなっています。
新原/
そうですね。なんかでも、今読んだ感じでは、僕は何か、「腑に落ちる」というか……。
「盲目的にルールとかガイドラインとかを当てはめたり、守ろうとすることは よくない」と書かれているので、何かわりと「そうだよね」とは感じますね。
ひさてる/
う~ん……。うまいこと(僕が)訳してるでしょ?ここはね(苦笑)
新原/
あははは(笑)
ひさてる/
うん、導入部やからね。あれですね、この人の世界観を作る場所っていうか。
ただあの~、KISS(の原則)が……。えーなんだ、……「シンプルすぎて行きすぎる」っていうね。これ、どうなんかなって思いますね。
新原/
……シンプルすぎて、行きすぎる……?
ひさてる/
えーと、"Keep it simple, stupid" って……
新原/
ありますね。
ひさてる/
うん。あの~、「KISS原則」っていうやつで、「単純さを可能な限り維持しておけ」っていう。
新原/
うん、そうですね。えっと、さっき、ひさてるさんが言ったのは、この本文(「PHP - The Wrong Way」和訳ページ)からいうと、
「この大きな原則さえも、極端にとられると、プロジェクトにとって危険です。
『あまりの単純さ』は、必要な機能の不足を もたらすことがあります。」
この部分を指して言ってるってことですかね?
ひさてる/
あ、そうですそうです。
新原/
あ~、なるほど?
ひさてる/
うん、あの……。とはいえ、「機能を提供できないほどそぎ落とす」ってことは、現実、あんまりなくて。むしろ、ノイズのほうが多いじゃないですか、現実って。
新原/
ふむふむ。
ひさてる/
で、この部分は、あの……。今、なんだっけ、ほら。リーンなんちゃらっていう奴。
「アジャイルなのかリーン手法なのか」みたいなので、よく対立なのか平衡なのかで語られる……。そのリーンの方の考え方が「無駄を可能な限り削れ」と。
新原/
うん、そうっすね。
<--11分ごろ
(新原/続き)
まあよくいうMVP(実用最小限の製品: minimum viable product)とかを作って、検証しようとしていることの、コアの部分だけをまずちっちゃく作って、検証をちゃんとして、ちょっとずつ改善していこう、という。
ひさてる/
うんうん……。ちょっとずつ増やしていく、イテレーティブなところはあるにしても、あの……ほら、どういうたらええかな。リファクタリングされる……んですよね、アジャイル的にアプローチすると。あの、作ってはリファクタ、作ってはリファクタ……って。
で、リーンの場合は、立ち上げ時に、そもそも……なんだろう、良く分かんないものが、ゴチャッとくっついてるっていうのを、えー……なんだ。「極端なくらいシンプルにして、そぎ落としていかないと」っていうのを語ってると思ってて。
新原/
うん。
ひさてる/
なんだろな、文章の説明でいくと「あまりの単純さは必要な機能の不足をもたらす」っていうのは、えー、でも、「必要な機能」を「仕様」として作っているのであれば、それを満たさない単純さとは何だろう?と。「ここで何を言いたいのか、ちょっとよく分からないな」という第1ポイントがありました、と。
新原/
なるほど。
ひさてる/
ただ、でも、あれですね。「ルールやガイドラインを宗教的に信じることよりも、自分の頭で考えるほうが大事」っていうのは多分、全プログラマーが共感する話だなと思います。
新原/
そうですね、確かに……。そうですねえ、「あまりの単純さ」が意味するものが、見方によって変わるから……。確かに「必要なものがない」っていうのは「単純さ」ではないので……うん。
ひさてる/
うんうんうん……。これ、サンプルがDRY(DRY原則)やったらね、まあ……
新原/
あ~~……まあ、そう、そうっすね。DRYも……まあ、いっか。
ひさてる/
ちょっと、似たような話やけど。
新原/
ん~~……そうっすね、DRYに関しても、それは思いますね。
ひさてる/
「DRYだ、DRYだ」と言って、「同じ見た目のコード」を全部統合してしまうと、「意味が違うけど偶然同じ形をしているコード」まで統合されちゃうから……。
新原/
そうそうそう、うん。コード片が似ているからって、ひとつにまとめるのは良くないですね。あれは、まさに「過激主義の危険性」に当てはまる話かなって思いますね。
ひさてる/
あ~、そうそうそう。「絶対newしてはいけない」とか(笑)
新原/
うんうん。
ひさてる/
なんかね、全部DI じゃないとだめ、とか(笑)、その辺ですね。
新原/
まあでもそこが、プロジェクトのガイドラインというか、「我々はこうするんだ」っていうルールだったら別に構わないと思うんですけれども……
ひさてる/
うんうんうん。
新原/
「それが一般的に良しとされているから盲目的に採用する」っていうのが、良くないっていうことかなー?とは、僕は感じましたね。
ひさてる/
そうそう。まあ、「Right Way」への、直接的ではないけど、多分そういうことを言ってるんだろうなーと。
新原/
うんうんうんうん。
ひさてる/
「全部やるのは、きつすぎる」みたいな(苦笑)
新原/
んふふふふ(笑)
ひさてる/
ただでも、「KISSをここで例に挙げるのはよくないよな、ここで」って。
新原/
あ~、まあ、そう、そうですね。
ひさてる/
良くないっていうか、ちょっと、うまくないですね、っていう。
新原/
あ、そう、そうね。「内容が間違っている」というよりは、そう、今、ひさてるさんが言った表現が正しいわけですね。「うまくない」と。何かこう、「ん?」ってなってしまう、ってことですよね。腹落ちしにくい、っていうかね。はい。
ひさてる/
はい。
新原/
はい、じゃあ次いきましょう。
ひさてる/
ここはいいです。問題なしです。
新原/
じゃあ、次。ここは結構、ブログにも書いてましたね。
ひさてる/
この、2章が。2章というか、
「常にフレームワークを使うこと」が、「Wrong」だと。
新原/
あははははは(笑)
ひさてる/
ここ、燃えますね(笑)
新原/
これがね~。はいはいはい。
ひさてる/
そうですよ……。これが、本当の「導入部」なんですよね。
新原/
うんうんうん。
ひさてる/
えーと、ちょっと引用文……ラスマスの引用文があるんですけど。本当の引用文としては、
「実に良くないトレンドが、Web アプリケーションを開発するためのデファクトスタンダードになってしまいました。」っていう……(苦笑)
(「Wrong Way」の筆者いわく)「流行っている汎用フレームワークを使う」っていうのが「トレンドになった」ことが、「実に良くないことだ」と。
新原/
うん……。
ひさてる/
ここが、「PHP - The Wrong Way」の、なんていうか、一番の導入部ですよね(苦笑)
新原/
んふふふふ(笑)
ひさてる/
だいたい、この流れでざーっといくという。もうねえ、ほんと……どうですか!?(憤慨)
新原/
まああの~、今までの流れを考えると……。あ、今までっていうか、PHPアプリケーションが、どんどん進化してきた流れを考えると、昔は、PHPで いわゆる一般的なフレームワークっていうのはなくて、それが、Javaとかの影響で登場して、更にRails(レイルズ)の影響でどんどん変わっていって、成熟していって……っていうのが、それこそ2000年代の中盤から、まあ最近までの流れだと思うんですけど……。
だから、その時は、それはそれでよかったんです。
そのもっと前は、統一された、皆が「こうだよ」っていうものがなくて、皆おのおの、好き好きに作っていたので、再利用の問題とか、それこそ保守の問題とか、やっぱり色々な問題があって、それを解決する方法として、「オープンソースのフレームワークを利用しよう」と。そうすれば、皆がある程度の共通認識をもって開発ができる、と。これはすごく僕は良かったと思うんですよ。
ひさてる/
うんうん。
新原/
で、……ただ、妄信的にそれを信じてしまうと、「とりあえず流行ってるフレームワークは使わなきゃいけない」とか、本当は自分たちの問題とはミスマッチだけど、「今まで自分たちが使ってきた」とか「誰かが使っているから」という理由で、有名なフレームワークを採用して。
しかも、それは、作ったときは良いんですよ。新規で作るときはいいんですけど、それを何年も何年も、機能追加したり、改善していったりとかしていくと、だんだんだんだん、やっぱり「今のトレンドに合わない」とか「保守しにくい」とか、「新しく入ってきた人には何がなんだか分からない」とかいう問題が出てきて……。
ひさてる/
「実はプロダクトとフレームワークがあってなかった」っていうのが、後から分かってくる感じ。
新原/
そうそうそうそう。それに、「作ったときは合ってたんだけど、そこから要件が変わっていって合わなくなった」っていうのも、もちろんあると思うんですけれども。
ひさてる/
うんうんうん、あるあるある。
新原/
だから、それで……。今まさに、「オープンソースのフレームワークと、自分たちのアプリケーション開発っていうのは、どういうふうな距離感でやるべきなのか」っていうのを、まさに皆が考え出してるとこだと思うんですよね。
ひさてる/
うん、うんうん。
新原/
だから、ここの文章だけを見ると、すごく表面的というか。PHPのコミュニティで汎用的なフレームワークを使うのが良い・悪い、っていうのは、そんなの、「コンテキストによる」としか言いようがなくて……。そういう話でもないのかな、っていう気は……それは、すごく感じましたね。
ひさてる/
そうそう。あの、程度問題の、程度のラインを決めずに……なんだろね、「主流は悪だ」っていう、ただそれを言いたいだけ、みたいな雰囲気を作ってしまってますよね。
新原/
そう、そうそう。何かこう、「(音楽バンドが)メジャーデビューしたら、あいつらは大衆に日和った(ひよった)」みたいな言い方をするのに若干、似ているような気がしてて。
ひさてる/
あははは、そうそうそうそう。
新原/
「いや、そうじゃないだろ」っていう話だと。
ひさてる/
「シャ乱Qが有名になってから、おもろない」とか(笑)なんかそういうやつね。(笑)
新原/
そうそう。あの、好きなもん同士で話すんだったら、それでもいいんですけど……。そうそう、なんか「いや、そういうこっちゃないやろ」っていう話、だと思うんですよね。
だから……うーん、あの……。
でもそれって、やっぱりフレームワークの開発とか、出てきているフレームワークの性質とかにも、すごく反映されてて。
ひさてる/
うーん……。
新原/
それこそ、今は、フルスタックのがっちりしたフレームワークもあるし、それこそSymfonyとかZend Frameworkとか、まあ言うたらLaravelとかケイク(CakePHP)も そうなんですけど……。
ひさてる/
そうそうそうそう。
新原/
各ライブラリとしても抜き出して使えるようにやってて。要はその、やっぱり自分たちのアプリケーションなんだから、「どういうふうに使うか」とか、「どういうフレームワークの構造にするか」とかって、決めるのはやっぱり自分たちなんですよね。うん。
<--19分28秒
<--2018年1月10日0:39にアップ
----------------------------------------------------------------------
ひさてる/
まさにこれ、「ライブラリを使うっていうのには反対しないんだけれども、フレームワークに縛られるのは嫌だ」という主張をこの章で書いてはるんですが……。
実際問題、今、Zendが「はじめライブラリ、なかフレームワーク、でもやっぱりライブラリ」という志向をしてきていますし、Symfonyも、先の「4」が話題ですが……Symfony4の一番重要なところって、「はじめは何も入っていないところに、ライブラリを足していく」っていうやり方だし、と。
こう、PHPのフレームワークの……なんていうかな、偉い人というか、「主流」が、ライブラリなのかフレームワークなのか?っていうのは、境界線がなくなっている。
新原/
うんうん。
ひさてる/
ただ、大枠として、「たくさんのライブラリをうまく扱うっていう枠組み」を、フレームワークと呼ぶ……っていう形に向かっていってる感じがして。これがだからほら、えーと、BEAR.Sundayが前からやっていることにも通じるし。(PHPが)5.3~5.4くらいのころに、「Aura(オーラ)フレームワーク」ってあったじゃないですか。
新原/
あ~、はいはい、ありましたね。
ひさてる/
ね。“ライブラリしか作らないプロジェクト”、Auraフレームワーク。あれも、そういうところにいってる感じがするので……。
実際、多くのサンプルを見ると、決して「フレームワークは縛るもの、ライブラリは良いもの」とは言い切れない世界が、PHPにはあるので。
これ、(「PHP - The Wrong Way」が)「各論を避けた」のは、本当に「ダメな選択」だなあ、と思いました。それぞれ、個々に見ると「あれ?そうでもないな」っていうとこに来ますよね。
新原/
うんうんうんうん。
ひさてる/
で、それとは対極の、CakePHP、Laravel、yii(イー)フレームワーク、あとNette(ネッテ)もそうかな?あの、割と「全体を包括するのをワンパッケージで提供する」っていうのは、「あ、それはそれで“そういう道具”なんだ」と。
でも「フレームワークワールド」の核心部分は、「あまたのライブラリをうまく取りまわして、自由にライブラリを構成する」っていうことに本質がある、と。まあ、Symfony2のおかげさまで。
で、Symfonyが……(PHPの)5.3が出て、一番最初に革新的なことをやったのがSymfony2で。そこさえ見てれば、その本質は見えたはずなんですよね。
別に「Symfonyスタンダードなんとか」を使わなくても、Symfonyライブラリは使っていいし、その結果、できたのがLaravelだし(笑)。
新原/
うんうんうんうん。
ひさてる/
で、個々にしっかり考えると「こうはならんのにな~」っていう……(苦笑)
新原/
そうなんすよね~。なんか、「フルスタックのフレームワーク」と「ライブラリ」の2つしか存在しないような雰囲気を感じるから……。
ひさてる/
初心者がそう感じてしまうのは否めない世界かな、とは思っていて。現代の開発って、言うたら、あれでしょ。初心者にしてみれば、まず1つめ、2つめのフレームワークで「あんな使い方」「こんな使い方」と、道具の使い方の習熟に、ものすごいコストを割いて、覚えなあかん。
で、それはあくまでSymfonyやZendの世界観とは違う、「簡単に使えるためのやつです」っていう触れ込みで、「Laravelのドキュメントをガーッと読む」「CakePHPのドキュメントを全部読む」「クックブックを総括する」。で、息切れする、っていうのは……ちょっと、同情はしますね。
新原/
今、CakeにしてもLaravelにしても……、特にLaravelの場合は、まあ割と分割する……。だからまあ、もともとが、Symfonyコンポーネントをまとめてるパッケージというかフレームワークなので。
ひさてる/
そうですね。
新原/
もともとが そういうものだから、分割とかやっぱりちゃんと考えてあるし……。
ひさてる/
そうそう。
新原/
だからね、なんかやっぱ、Cake 1 とか 2 とかの「フルスタックフレームワーク」っていうのと、今の時代は、ちょっと違うような気がするんですよね。CakePHPに関しても。
ひさてる/
はいはいはいはい。そうですね。
新原/
だから、この人が言っているフレームワークっていうのは、そのころのフレームワーク、っていうことで。
ひさてる/
ちょっと前時代感がある。
新原/
そうそうそう。今は、オールインワンパッケージになっているフレームワークにおいても、やっぱり部分的に活用することはできますし、他のもんと簡単に組み合わすこともできるし。
だからね、だいぶなんか、ちょっとこれ、古いなあと思いますね。
ひさてる/
はいはい、うん。感覚がちょっと古いですね。
新原/
フレームワーク観がちょっと古い、とは思いますね。
ひさてる/
あの~、Composer(コンポーザー)が無かったころの話ですね。
新原/
そうですね、まさに。
ひさてる/
その頃は、コードの取り扱いをフレームワークがやってくれないと、ClassLoaderもなかったっていう。
新原/
そう。だからね、その辺がちょっと惜しいなあと思うのが、Zend Frameworkで……。
ひさてる/
ははは(笑)
新原/
1 のころから、機能分割がちゃんとできてたのに。なので、僕も実際、「ZendDBだけ、自分たちのフレームワークで使う」とか やってたんですけど……。
ひさてる/
うん~。
新原/
当時は……そう、Composerがなかったんですよ。
だから、今みたいに簡単に結合することができなかったんで、惜しかったな~って思いますね。もしかしたら、Symfony2とか……今のSymfonyコンポーネントの位置を、Zend Frameworkが担ってた可能性は十分あるんですけど。
ひさてる/
そうですね。本当はそうかもしれない。
<--25分25秒
新原/
多分そういうとこ、狙ってたんだと思うんですよね。フレームワークの構造は。
ひさてる/
今あの~、Symfonyが 4 になっても、やっぱりSymfony実装のワールドがあるので、PSRとZendと、Auraと、その他周辺もろもろ……PHP-DIを使ったりとか…ライブラリマッシュアップの世界と、Symfony中心の世界っていうのは、あるように感じますね。
Zend は、この後、もっと活躍してほしいですね。
新原/
そうですね。
ひさてる/
「エクスプレッシブ(zend-expressive)」って言うてんねんから。
新原/
んふふふふ(笑)
ひさてる/
……ということで、はい。何かね、ちょっと……「フレーム感覚が前時代的」っていうところがね。
新原/
ちょっとね。そこは確かに、違和感、僕も分かります。
ひさてる/
そう見えてしまうっていうのは……やっぱり、本とか買っちゃうと、そう見えるかもしれないですよね。
新原/
ああ~~。でも、その指摘は大事かもしれませんね。僕らは、いうたらずっと見てきているから「それ古いな」って感じるけど、皆がそう思っているかって言うと別もので……。なるほど、確かに。
ひさてる/
なんかね、“『○○フレームワークの本』、どーん!”ってなると、それで縛られるかのような感じ……。
新原/
そうですね、確かにね。
ひさてる/
で、まあ、DjangoとRails(Ruby on Rails)の成り立ちについて書いてはりますけど、これは、ダメな理解ですね。違いますね。
新原/
まあ、いいんじゃないですかね、これはね。次いきましょうかね(笑)。
ひさてる/
「そう見えてるんだ~……」って。
あ、で、このセクションで大事なことがあるんですよ。超・大事な間違いが。……間違いっていうか、「ダメなこと」が。
新原/
ああ、はいはいはい。
ひさてる/
ええとですね、ラスマスの引用がね……。
新原/
はい。
ひさてる/
飛ばしたんですよね、最初(このポッドキャストで話している時に)。「すべての汎用フレームワークは、クソ!」って、1コめに書いてて。
新原/
はいはいはい。
ひさてる/
2コめに、「誰も必要としていないのは、万能フレームワークです。」と。「みんながみんな一般的な問題を抱えているわけではなく、みな非常に特殊な問題を抱え解決しようと試みています。」と。
これ、間に大事な一文がね、抜けてますよ。
新原/
ほお~、はいはいはいはい。
ひさてる/
これ、ブログにも書きましたが、もっかいここでも言いますね。
新原/
うん。
ひさてる/
あ、……っていうか、一番最初のフリが抜けてるんですけど。
これ、えーと「PHP Frameworks Day」……やったかな?
新原/
うん、「PHP Frameworks Day 2013」ですね。
ひさてる/
あ~、うん、そうそう。そこでラスマスがゲストとして来た時に、質疑応答の最初で、(参加者が)ラスマスに「どのフレームワークがいいですか?」っていう質問をした、と(笑)
新原/
(笑)
ひさてる/
……というのが、ネタふりの最初です。で、それに対してラスマスは……。あの……いうたらこれ、いろんなフレームワークのユーザーが、一堂に会している場所ですよ。「どれがいい」って言えないじゃないですか(笑)
新原/
あ~(笑)
ひさてる/
で、普段から「PHPはクソ」って言われてる、あの雰囲気で、“all sucks”なんですよ(笑)。で、会場を大爆笑でつかむ、っていう。
新原/
うんうん、あはははは(笑)
ひさてる/
だから、そういう、ね……。そういう意味で使っているものを……否定するために、使う、っていうのは、間違いだし。
……あと、えーと、あれだ。「誰も必要としていないのは、万能なフレームワークです」の手前に、「皆、何かフレームワークは必要としているんだけど、みんながみんな同じものは必要としていない」っていうのを、並べて言わないと意味がないですよね、コレ。
新原/
ふむふむ、確かに。
ひさてる/
何か、フレームワーク的なもの……それは、CMSでもいいし、Laravelでもいいし、Symfonyでもいいし……で、その現場現場に合った、目的に合ったフレームワークのような、PHPをベースとしたソフトウェアは皆、必要なんだけど。……でも、皆が「同じ万能なもの」は、欲しくない、と。「だから、どれが1番良いとは言えない」っていうのがラスマスの話で。まさにそれは、その通りやなと。
新原/
うん。
ひさてる/
だから、さっきのフレームワークの話でも、「ライブラリマッシュアップの方向に向かってる」っていうのが、「特定目的のMVCモデルとかじゃない、もっと自由でいいっていうのをPHPが志向している」ことを物語っていて。一致してて良いな、って。
……と思っていたのが、こういう使われ方をすると、非常に腹立だしいな、と(苦笑)。
新原/
(笑)
ひさてる/
えっとね……ラスマス、東京来はりましたよね。
新原/
来てましたね。
ひさてる/
うん、そうそう。そのちょっと前の話が、これで。「ええこと言わはるなあ、この人」って思ってたんですよ(泣笑)
……それがね、なんかね……。なんか、うまいこと編集されて、こうなるのは……、いただけない。(ちょっと感情的に)いただけない……!と、思いまして。
新原/
確かに……まあ、その……「全員に適合するフレームワーク」って、多分、ないでしょうからね。
ひさてる/
そうですね~。
新原/
あと、「フレームワークにどこまで求めるか」も、アプリケーションによって、さまざまでしょうから。
ひさてる/
「ブログを書きたい」って言ってる人に、「Symfonyで作れ」って言うのは、アホな話なんですよね。
新原/
うんうん。
ひさてる/
「記事をまず書いて、足りないところを、WordPressプラグインで補いなさい」っていうのが、妥当じゃないですか。
新原/
うんうん、そうですね、確かに。
ひさてる/
で、WordPressは、確かに、オブジェクト指向的じゃないから「う~ん」ってなるけど、「目的としては合ってる」と。
新原/
そうそうそう。「実現するツール」としては、正解ですからね。
ひさてる/
「スーパーカーで買い物に行かない」っていう例えが、すごくピッタリなんですけどね。そういう多様性を持てばいいじゃないか、と。
新原/
うんうん。
ひさてる/
だから、なんかこの人(PHP - The Wrong Way の作者)はね、何かひとつ特定の「イヤなフレームワーク」があるんですよ。多分。
新原/
あはははは(笑)。何か、つらい目にあったんですかね。
ひさてる/
つらい目にあったんでしょうね、それで(苦笑)
なんか、会社から無理やり「これ使え」って言われて、変な使い方させられたんやろな、っていうことを思いますね。
新原/
なるほどね(笑)。まあでもあの……ひとつちょっと救いを言うとですね。「間違った方法」っていうのが、セクションの最後の締めにちゃんとあるんですけど……。
ひさてる/
あ~、はい。
(※文字起こし人注:PHP - The Wrong Wayの中に、「間違った方法:PHP上で常にフレームワークを使うこと。」という一文がある)
新原/
「PHP上に“常に”フレームワークを使うこと」ってあるんで。この主張は、間違ってはないんですよね。「常に」使う必要は、当然ないので。
さっきの話で、まさに「自分たちの要件にフレームワークがフィットしないんだったら、別に、フレームワークを使わなくてもいい」。
まあこれ、「(単なる)フレームワーク」じゃなくって、「汎用フレームワーク」ってことなんですよね。自分たちにフィットしたフレームワークは、当然使ってもいいと思うんですけど。
ひさてる/
ああ~(納得)。「(既存の)(汎用)フレームワーク」ね。
(※文字起こし人注:音声では「カッコ 既存の、カッコ 汎用 フレームワーク、ね」と言われています(^^;)
新原/
そうそう。それを「常に使う必要」は、ない。それはもちろん、正しいとは思いますね。
ひさてる/
ですね。ライブラリを集めて、ある典型的な「自分たちのスタイルを作りました」っていうのは、全然アリで。
新原/
うんうん、そうですね。
ひさてる/
それが、「オレオレフレームワーク」とか言われたりするけど、決して悪いものじゃない(笑)
新原/
そう、そう。(ちょっと改まった感じで)……あのね、僕「オレオレフレームワーク」っていう言葉が、だいぶ罪だなあと思っていて。
ひさてる/
ああ。でもそれも「前・前時代(ぜんぜんじだい)的」じゃないですか。
新原/
そうそう、そうなんですよ。だから、さっきの「皆が自由に作ってた」時代から、「汎用フレームワークが登場してきた」時代の、ちょうど過渡期の時代の話で。
今は、そこはもう終わってて、今度は汎用フレームワークは皆使ってて、でも出てきた問題に対して「ああ、やっぱり自分たちの問題を解決するのは自分たちなんだ」っていうのがちゃんと分かってから、「自分たちのフレームワーク」を作るのは、これは、以前の「批判的な意味あいのオレオレフレームワーク」とは、意味が違うんですよね。
ひさてる/
そうですね。
新原/
だから、何か、ここに良い用語があればいいんですけどね。
ひさてる/
ほんとに、なんかね……。OSSで、せっかく良いコードが公開されているのに、それを無視して勝手なライブラリを自分で作り始めて、エンバグ(enbug)する、という……。「そんなバグは、だいぶ昔にOSSは解消しているのにね」っていう。
新原/
うん……。だからそこはやっぱり、一面的な見方は良くなくて。皆がそっちに傾くと、「じゃあもう、オープンソースで提供されているライブラリは、作るべきではないのか」……っていうのも、それは「行きすぎ」というか、まさにさっきの「過激な適応」「過剰適応」になるのかなと思うので、そこはやっぱりちょっと、疑って考える必要はあるかな……疑うというか、「考える」必要はあるかなって思います。
ひさてる/
「似たようなものがあったら、作ったらアカンのか」っていう……(笑)
新原/
そうそうそうそうそう。あんまり行きすぎると、それもちょっと良くないのかなあ、とは思うんですけどね~。
<--34分37秒
ひさてる/
まあ、言うても昔、「似たようなもんがあっても作ったらあかんってのは良くない」って自分でブログに書いてることがあってね…。
新原/
ん~、まあでもそれもやっぱ、時代ってのもあると思うんですよね。前はそういう、オープンソースのものを…どちらかというと、使い慣れてないから、こう…なんだろ、「忌み嫌う」人が多かったんですよね。
「それより自分たちの書いたコードの方が信用できる」みたいな。
ひさてる/
ああ~、そっちね。
新原/
そう。だから、「いや、もうあるんだから、皆もうこれ使おうぜ」っていう流れだと思うんですけれども。
今はもう逆になって、もう「あるものしか使わない」みたいになってくると…「いや、それはそれでちょっと過剰すぎるな~」とは思うので。
ひさてる/
はいはい。ん~。
新原/
それでも、やっぱりこう、時代時代で変わるような気がしますね。
ひさてる/
そうですね…。
新原/
さっきの、あの「オレオレフレームワーク」の別の言い方は、さっきから話に出ていた郡山さんがおっしゃっていたのが「インハウスフレームワーク」っていう言い方をしてて。
ひさてる/
ああ~、それそれ。
新原/
確かに、そっちのほうがしっくりくる名前やなって。「オレオレ」っていうとねえ…。
ひさてる/
「インハウスソフトウェア」とかいう言葉は、昔からありますもんね。
新原/
そうそうそうそうそう。だから、やっぱ「自分たちの」フレームワークっていう意味合いのほうが良くて。それは「自分たちの問題を解決する」のにフィットするんだったら、そっちのほうが絶対いいですからね。
ひさてる/
そうそうそう。「フレームワーク標準のフォルダ構成じゃないとだめ」とかそんなことはまったくなくて。
新原/
そうそうそうそう。
ひさてる/
自分たちのプロジェクトに合った構成にして、それこそネームスペースで好きなように呼びなさいよ、っていう話で。
新原/
そうそうそうそう。そうなんです。
(ちょっと雰囲気を切り替えて、いたずらっぽく)…ってことが、言いたいんじゃないですかね、このセクションは。すごく好意的にとらえると(笑)
ひさてる/
まあ、たぶんね~(笑)。「フレームワーク標準のフォルダ構成があっちとこっちにめっちゃ離れとって腹立つ」っていう…(苦笑)
新原/
だからね、なんかコレ…タイトルと最後の「間違った方法」のシメだけだったら、良かったんですよね。
ひさてる/
そうそう…っていうか、やっぱり各論ですよ。「この場合、こういうことがあった」っていう、自分の体験をちゃんと書けば…。
新原/
ああ~、そう!ほんまそれ、そうですね。
よく言うじゃないすか、ブログなんかでも「主語が大きい問題」って。
自分の問題とか「自分が不快だった」という話を書けばいいのに、なんか「こういう人間は、こうだ!」みたいな(笑)
ひさてる/
そうそうそうそうそう(笑)
新原/
主語を大きくしすぎると、アレやって。
ひさてる/
「男はみんなバカ」とか、そういうやつですね(笑)
新原/
そうそう、そういうこと そういうこと(笑)
ひさてる/
「そら、怒られるわ」ってね(笑)
新原/
よし…。だいぶ「読み方」が…(わかってきた、というか)。
ひさてる/
これ、主題ですね~。
新原/
さあ、次。
「常にデザインパターンを使用すること」。
ひさてる/
ん~。
新原/
まあ、これが「Wrong Way」や、と。
ひさてる/
2つめの、大間違い、みたいなのが、ここのやつかな。もう、引用が古いですね。
新原/
ふはははははは(笑)
まあ、さっきの「ルールの過剰適用」の話と、似た話っちゃ、似た話ですけどね~。
ひさてる/
え~とね、「デザインパターンを使用すること」の、ブレンダン・アイクとポール・グレアムの引用をしてはるんですが…。これ、感覚がもう00年代初期の感覚じゃないですか。
新原/
ふふふ(笑)
ひさてる/
当時ほら、90年台にOOP(オブジェクト指向プログラミング、英: object-oriented programming, OOP)が「すげぇ!」ってなって。で、鳴り物入りでJavaが登場、みたいな。
(※文字起こし人注:上記部分、音声では「オーオーピー」と言っていて、ど素人が聞いて「オブジェクト指向プログラミングのことだ」とパっと分からないため、余計なカッコをつけてあります。文字起こし人自身が忘れないための注釈です、ご容赦ください)
新原/
うんうん。
ひさてる/
で、そっからMicrosoftも頑張って、DCOMがどう、とか言い出して…。
で、その…オブジェクト指向の幻想ワールドを作るために、ものすごい…その、パターンというか、やり方が…「なんでこんな複雑な構造を覚えなあかんのやろ?」みたいな。
新原/
うんうん。
ひさてる/
…ってなったのに対するアンチテーゼを、濃い海外のエンジニアが言い出した…っていうころのやつ。
新原/
ん~、うんうん。
ひさてる/
…っていうのをね、「2015年をこえた今、これを出すか?」みたいな。
新原/
まあ…、そうですねえ。ほんと、まあよくある「金のハンマー」ってやつですね。ゴールデンハンマーってやつですね。「人はそれを手にすると釘を打ちたくなる」ってやつですね。
やはり「良い」とされるものを手にすると、どうしても色々なものに当てはめようとする、それが良くないっていう、それだけの話だとは思うんですけどね~。
まあ、もちろんね、「 PHP: The Right Way 」があるから、こういう向き(に書いている)だとは思うんですけどね。
ひさてる/
ん~。無理な…というか、なんていうかな。無理に話題を広げようとしているセクションかな?と思いますが(苦笑)
新原/
確かに(笑)
ひさてる/
ちょっとね、ここ…あの、面白い項目の並びがあって。え~と、どこだ。
PHPは、「命令型、関数型、オブジェクト指向、手続き型、およびリフ…でく、てぃぶ、なパラダイム…」
新原/
「リフレクティブ」ね(笑)
ひさてる/
これ「リフレクティブ」って、なんやよう分からんのですけどね。
「…のサポート」って書いてるところの…これね、「オブジェクト指向」の前に「関数型」が書いてあるっていうところに、「ん?」っていう匂いを感じましたね。
新原/
これは多分、「 PHP: The Right Way 」にそういう章があるからじゃないですか?
ひさてる/
…あるのかなあ?
新原/
うん、確かね、あるんですよ。「関数型としても使える」みたいな表記はね、確か読んだ記憶がありますね。多分だから、その辺を見て言ってるんじゃないですかね。
ひさてる/
関数…。ん~、自分はね、「いやあ、これもしかして」って思ったのは、あれですね。
「命令型、手続き型」…手続き型が後ろに来ているのがよく分からないんですけど、あの~、よりシンプルな概念として「コマンドを叩く」ってのがあるでしょ?
新原/
うん。
ひさてる/
で、えーと「コマンドを叩く」のを、なんだろな、「オブジェクトを主語にして、メソッドで」っていうオブジェクト指向があって。で、ちょっと一般的には、ほら、「参照透過性が」とか、その辺、ピンと来にくい…エンジニア的にというか、手続き的なエンジニア的にピンと来にくい関数型があって、っていう順番にしそうなものを、「命令型、関数型、オブジェクト指向」って書いてあるところのこの「関数型」って、もしかして「ファンクション・リテラル(?)」のことかな?って。
新原/
…ああ~~…。
ひさてる/
ちょっと、「毛の壁」感を感じまして。
(※文字起こし人注:ここ全然意味わからなかったんですが、「岡部健」という方のことらしいです。「愛称」?(「通称」?)とのこと。)
新原/
ああ~。
ひさてる/
で、具体的にどういうことなのかが書いていなくて、ちょっと残念なんですですけど。(笑)
新原/
まあ、ここで言いたいことは、そういう「色々なパラダイムを備えた言語」っていうのを言いたいがために、そういうワードを列挙した、っていう。
ひさてる/
そう…かなあ?
新原/
僕はそういう捉え方をしたので(笑)、この中身にそんなに意味があるとは思わなかったですね。
ひさてる/
そう、無駄にね、列挙してあるっていう。
自分は、この章の最後のまとめが、一番、良いことを言っているなと思いまして。
新原/
ほうほうほう。
ひさてる/
なんですかね、「常にデザインパターンを使用すること」の章の最後は、「間違った方法: 問題を解決できるパターンを探すこと。」っていう…。これも、言うたらさっきの「インハウス・フレームワーク」に似た話で、「自分たちのプロダクトにぴったりの既存フレームワークはない」っていう…(笑)
新原/
ふむふむふむふむ。
ひさてる/
それと同じで、デザインパターンにも、「自分たちの問題とぴったり一致するデザインパターン」が、もしあったら、それは「自分たちのプロダクトのアドバンテージがないってことや」と(笑)
新原/
ふむふむふむふむ。
ひさてる/
逆にいうと、プログラマとして価値を生み出せるっていうのは、え~、なんていうのかな。
「本質となる形を生み出せる」から、プログラマーなんでしょ?と。
で、どうでもいい問題はパターンに当てはめて解決すればいいんだけど、えーと、「一番大事な問題だと思っていること」「自分の抱えている問題」を解決してくれるパターンは、世の中には無い。
新原/
うんうんうん。
ひさてる/
もしあったら、アイデアそのものが、間違ってる。
新原/
ビジネスのアイデアとかサービスのアイデアと、技術的な問題とは、またちょっと切り離して考えたほうがいいかな、とは思うんですけれども。
技術の問題って、わりと一般化しやすいっていうところはあって。
あの、それらが組み合わさって…どう組み合わせるかで、サービスとかビジネスを動かすシステムが出来上がるので。
「技術的な問題が汎用的である」っていうことは、あることはあると思うんですけれども。
ただ、確かに「どういう風に当てはめるか」は、自分たちで考えるしかないんで。
ひさてる/
ん~。技術的な問題といえばですが。Webでいうと、「トゥエルブファクター( Twelve-Factor App )」っていうHeroku(ヘロク)のヤツが、教科書的なセオリーじゃないですか。
新原/
そうっすね。
ひさてる/
「アプリケーション・サーバーには状態を持つな」とか、そういうやつね。
<ーー43分36秒
(ひさてる:続き)
リレーショナルデータベースを一つ置いといて、それに対してアプリケーションサーバーが複数アクセスする。
新原/
うん。
ひさてる/
で、同じもんが横に並んでて、まあこの形が、今の Web アプリケーションの王道やけど。いや、言うてもね、あの…「半端ないWrite量がある」とか、あるじゃないですか。
新原/
うん、うんうん。
ひさてる/
あの…サービスによっては。
で、それに対して、じゃあその Twelve Factor 的な、ある意味、Webのアプリケーションのパターンですよね。
新原/
うんうん。
ひさてる/
それが、何か、その…半端ないWrite量?…言うたら、「ゲームとかのリアルタイム情報を送ってくる」とか。それは、どうすんねん?…っていうたら、どうしようもない。
で、逆に言うと、その「半端ないWriteをこなせる技術」こそが、コア技術じゃないですか、その企業の。
新原/
まあ、そうですね。
ひさてる/
で、それを誰かがやってくれるっていうことはないぞ、と。(苦笑)
……語りすぎましたね。
新原/
いや、まあ…そうっすね。
…いまのWriteの話は、割と一般的な話かなっていう気はするんですけどね。
ひさてる/
ああ、まあ…。
新原/
ただまあ、言わんとするところは分かります。
ひさてる/
わかります?(笑)
新原/
ええ、言わんとしているところは分かります(笑)
あの、まあその…僕らが勉強会とかいって、誰かの話を聞いたり、こうやって話したりとか、ブログを読んだりとかっていうのは、すごく似てて。
…というのは、すごく似た問題を扱っている場合もあるけど、まったく一緒の問題っていうのはやっぱり、ほとんどないんですよね。
ひさてる/
そう、そう。
新原/
だからやっぱり、多少のアレンジは必要で。
だからまあ、その辺を自分たちで考えましょう、っていうことが書いてあるセクションかなあ、とは思いますね。
ひさてる/
これでもやっぱり、フレームワークといっしょで、振り回されんな、って言いたい感じですね。
新原/
うん、そうですね。
…だからやっぱりね、これね、セクションのタイトルと、最後の締めだけ見ているとね、あんまり違和感ないんですよ。
ひさてる/
そうそうそう(笑)。
新原/
たぶんね、その間の内容は自分たちで「ああ、こういうことが言いたいんだろうな」っていうのを補完すると、そんなに悪いことは書いてないんですよね。
ひさてる/
そうそう。なんかね、気持ちを汲んであげると、わからいでもないんやけど。
ただ、コレを見て学ぼうとすると間違い、っていうか。
新原/
あ~、なるほどね(笑)。
ひさてる/
そういうね、罪深い感じが…(笑)
新原/
はいはいはい。なるほどね。
…次は、「常にオブジェクト指向プログラミングを使うこと」。
これですねえ…。さっきと似た話っちゃあ、似た話かもしれないですけど。
ひさてる/
これも、似たような話やけど。これ、引用で、「良い引用をしたな」っていうのは…ありますよね。あれ、えーと、うまくFacade(ファサード)を被せられてないと言うか、え~、「カプセル化で、より単純化がうまくいかなかった例」として、あの…あれ。「バナナが欲しかったのにバナナとゴリラとジャングルが出てくる」やつ。
新原/
あはははははは(笑)
ひさてる/
これ、有名な話ですよね。
新原/
ね。まあこの文でいうと、
「オブジェクト指向言語の問題は、これらの暗黙の環境をすべて持ち歩いていることです。あなたはバナナを欲しましたが、あなたが得たものはバナナを抱えたゴリラとジャングル全体でした。」
ですね。
ひさてる/
結局、なんだろうな、これっていったら、その奥にコンテナがあって、コンテナ全体を取り巻く環境があって…。でかいわ、正体が、っていう…。
新原/
まあ、ああいうところってやっぱり、ここのやつだけを無理やり当てはめると、「DIとサービスロケーターの対比」みたいにも見えますけどね。
本当は、バナナだけがイジェクトして欲しかったんだけど、サービスロケーターが…。これが、いわゆるジャングル全体ですよね(笑)
ひさてる/
なんか結局、「app(アップ)」って書いてある、みたいな。(笑)
新原/
そうそうそうそう(笑)
ひさてる/
これ、「appって書いてある」って、Laravel 知らんと分からないですよね。
新原/
あ~~、まあ、確かにね。
ひさてる/
Laravelは、「app()」(※音声では「エーピーピーかっこひらく、かっことじる」と言っています)で、「アプリケーション全部」っていうのを指すし、
yii(イー)も、「 Yii::$app」(※音声では「イー コロンコロン、ダラー エーピーピー」と言っています)っていうのがあって、アプリケーション全体を指す変数がある…。
新原/
あ、アプリケーション全体というか、Laravelの場合は、サービスコンテナですね。それに直接アクセスできるっていうだけで。まあ、言うたらいわゆるサービスロケーターですね。
<ーー48分15秒
ひさてる/
うん。まあ、言うたら「ジャングル全体」みたいな(笑)
新原/
そうそうそう、ジャングル全体。ジャングル全体を触る方法、ですね。
まあ、それを使うかどうかは、アプリケーションの作り方次第ですけどね。
ひさてる/
これも、でも…あれじゃないですかね。「EJBコンテナ」とか言うてた、Javaの時代?に、サービスロケーターっていうのが「おおお~」ってなった瞬間の説明かな?…っていうのは、僕は思ってて。古いんちゃうかなあ、と。
新原/
あ~。まあでも、サービスロケーターとDIの話は、今でも出てくる話だし。
PHPのフレームワークの話でも、サービスロケーターを使うやり方のものもあれば、今はDI…インジェクションしてくれるほうが、メジャーかなと思うんですけど。
まぁ、さっきのLaravelとかyiiみたいに、ジャングル全体を触る手段も、もちろん用意されているので。まあ、「昔からあるけど今もある問題」だと思いますけどね。問題っていうか、課題ですかね。
ひさてる/
ん~。で、「バナナだけほしいねん」って言うたら、バナナ型のインスタンスがコンストラクタに入ってきて、それさえ見ていればいい、っていうのが、あの「サービスロケーター」言うた次のフェーズで起こったことですよね。
新原/
ふむふむふむ。
ひさてる/
そのおかげで、「バナナモックでテストができる」みたいな(笑)
新原/
(笑)まあね。ただまあ、「型を明示すること」…ちょっとまあズレますけど…。
「型を明示すること」のメリットで、…あ、もちろん「モックでテストしやすくなる」のもひとつ(メリット)なんですけど、…あんまりにもそればっかり言われると…。よく出てくる話なので、何かちょっと、薄れるかなって気がするんですけどね。
「型を明示してDIを使えばモックがさせる」っていうこと「だけ」がメリットではないので。当然。それは本質じゃなくて…もちろんそういう効用もあるけど、「それが狙いでやるんじゃないよ」っていうのは、なんかちょっと、思うところですね。
ひさてる/
(笑)単体テスト「だけ」を目的にして、アーキテクチャを組むのはおかしくて…っていう話ですよね。
新原/
そうそうそう。だから、そういう反論が出てきちゃうので。
「いやいや、テストのためにプロダクションのコードを…テストにどう???ていくの?」っていう話になると、「いやいや、そうじゃなくてね」っていう。
ひさてる/
ふふふ(笑)難しい話ですけどね。
あの、要は「関係が薄い」っていうことを言いたいんやけど、「分かりやすく言うと、つまり単体テストがモックでできる」って言ってるのを、逆にとらえてね…(笑)
新原/
そうそうそうそう(笑)…だから、ヤバいっすよ、そういうふうに言っていると「型を明示してDIすることは、Wrong Way」って言われちゃいますよ(笑)
ひさてる/
あ~、やばいやばいやばい。
新原/
「それは、単体テストのためだ」と。「単体テストがやりやすくなる」っていうのは…
ひさてる/
「宗教的な原理主義」って言われる(笑)
新原/
そうそう、「そのためにコードを書き換えるのは、おかしい!」みたいな(笑)
ひさてる/
ちゃうねん、スコープを狭くしたいだけやねん!…みたいなやつね(笑)
新原/
そうそう(笑)
まあ、横道にそれましたけど、そういうことの寄せ集めなんですよね、このサイトはね、本当はね。
ひさてる/
そう、目的を見失った手段だけで、プレッシャーをかけてくるっていうのが、すごい嫌っていうことなんでしょうね。
新原/
うん…。
ひさてる/
クラス書かないと、PHPの場合はね、(よろしくないんだよね)っていう話で…。
PHP の場合、どうしても、その、ネームスペースと一致した配置にして、Composer のオートローダーに任せないと、しんどいやないですか。
新原/
まあ、そうですね。
ひさてる/
で、require して…2回、require するとか、「require once で2回動いてほしいのに、1回しか動かなかった」とか。なんか、不幸の集まりなので…。
(文字起こし人注:この部分、ひさてるさんにお聞きしたところ、「同じファイルにreqireが二重に呼ばれて重複定義でエラー発生するからって、require_once にすると今度はいつの間にか手前で呼ばれてて適切なタイミングで動いてもらえなかったりとか、そういうトラブルは地獄感あるよね」という意図だそうです。詳しい説明ありがとうございます!)
「クラス定義はロードしますが実行は自分でやります」っていうのを徹底するがためにも、パラダイムとして、オブジェクト指向は使うかどうかは別として、スタティックでもいいから、クラスはしよう?って(笑)
でないと、もう、ね(苦笑)。
Composer に任せられへんからって。
…って言うのは、なんか、突っ込まれてましたね。
新原/
(「PHP - The Wrong Way」の作者は)オブジェクト指向に、何か、嫌なことがあったのかなあ…。
で、まあ歴史とかいろいろ書いてはあるんですけど。
ひさてる/
歴史も、まあ前半どうでもいいですよね。
新原/
うん…そうっすね。結局、何が言いたいのかな?とは思いますね。
ひさてる/
歴史…。でね、オブジェクト指向になってからの話が、ちょっと、ずれててしょうがなくて(笑)。オブジェクト指向になってからの話が、まるで「C++が一番最初のオブジェクト指向言語」みたいな表現をされていて。
「あんた、自分でSimula-67とか言うてるやん」と(笑)。
(※文字起こし人注:Simula-67 ‐ 通信用語の基礎知識
http://www.wdic.org/w/TECH/Simula-67 )
<ーー53分30秒
(ひさてる:続き)
なんかね、C言語の手続き的関数呼んで…とかいうのを、いうたら「スコープ切るために、オブジェクト指向が生まれた」みたいな(笑)
新原/
ああ~~~。そうですね。
ひさてる/
「いや、待て、この文脈で Smalltalk と言わないのは何でやろ?」と(笑)
新原/
まあ、本文では Java って言われてますね。
「後に、主に Java の開発のために、ある『バズワード』が発生し、『プロシージャ』または『関数』は(中略)『メソッド』に改名されました。」って書いてありますね。
ひさてる/
「あっれ~?昔からメソッドって言うてなかったっけ?」って…なるんですけどね(笑)
まあ、C++(※音声では「シープラ」と言われています)は確かに「メンバ関数」って言うてましたね。「メンバ変数」みたいなん、とか。
新原/
あ~~~…。そうですね、確かに「メンバ」って言ってましたねえ…。
ひさてる/
「メソッド」と、きっちり名前を統一し始めたのは、Java文化からかもしれん。
新原/
Smalltalk とかって…「メッセージ」…でしたっけ?
ひさてる/
「メッセージ」か…。
新原/
「メッセージ」かな。
ひさてる/
いやまあ、でも、なんか…(笑)若いのか、年寄りなのか、分からないですよね。この認識が(笑)
新原/
まあ、あの~…歴史的なことにふれると…。言うたら、皆が皆、ちゃんと認識しているわけじゃなくて。僕もあやふやなので、アレなんですけど。
ひさてる/
その時代に生きてるわけじゃないから(笑)
新原/
そう、なんかね…ここに書かれている歴史が正しいかどうかは別として、「なんでこの引用をしたのかな?」っていうのが、僕はピンとこなかったですね。
ひさてる/
あはは(笑)
新原/
それを読んだからって、この人の主張がうなずけるってわけでもなく。
だから、この人が書かれている部分のなかで、
「アプリケーション内のさまざまな問題を単一の特定のプログラミングパラダイムに強制しようとすると、あっという間に、私たちは創造的に思考しなくなり、効率的に作業しなくなります !」
そんな、1つのアプリケーションの中で、いろんなプログラミングパラダイムがまぜこぜになって開発するって、あんまりないような気がするんですけどね(苦笑)。
まあ、言わばマルチパラダイムの言語で、最近いわれるのは「Scala(スカラ)」だと思うんですけど。「オブジェクト指向と関数型、両方使えますよ」と。
もちろん「両方使える」のはひとつのメリットではあるんですけど、「そうしないと創造的に思考しなくなる」なんて、あんまり考えたことがないので…。
これはだいぶ、こじつけな気がしますね。
ひさてる/
「具体的にどうなのか」が まったくない、っていうのがこの文書の特徴なんですよね、うん。「例えば…」って、ひとことでも実際の話を入れてくれれば、「あ~、そういうことか!」ってなる(納得できる)のが、全くないので、全部がこじつけに見える、と。
新原/
そうですね。だから、いろんなパラダイムを勉強するっていうのは、もちろん良いと思うんですよ。さっきもね、僕らも「いろんな言語を触るのは良い」っていうのは、僕も実際の経験としても、あるんで。それはもちろん良いと思いますよ。
ひさてる/
新原/
そうそうそうそう。そういうのはすごく良いと思うんですけれども、「それを1つのアプリケーションの中でする必要が、なぜあるのかな?」って…、それは思いましたね(笑)
ひさてる/
ふはははは(笑)あ~、そう見えました?
新原/
はい、「アプリケーション内のさまざまな問題を単一の特定のプログラミングパラダイムに強制しようとすると」って書いてあるんで。
ひさてる/
なるほどなるほど。
新原/
そういう意味だと思うんですよ。
ひさてる/
「このアプリケーションでは、ここは関数型アプローチで、ここはオブジェクト指向で」…あれ?っていう。
新原/
そう(笑)そんなこと、意識して書くかな?っていう。
ひさてる/
(笑)そう…なんですよね。やるんかなあ。…やるんかなあ?
あの~、「上位レイヤーは、なるべくピュアな、抽象的なオブジェクトで考えて、下位レイヤーはもっとハードウェア寄りで考える」…っていうときの、レイヤーの違いは、当然、あるじゃないですか。
新原/
ああ、そうですね。それはもちろんあるんですけどね。
ただここでは、「常にオブジェクト指向を使う」ということに対する話なので、多分…
例えば「ドメインレイヤーはオブジェクト指向、インフラストラクチャーレイヤーは手続き型、アプリケーションレイヤーは関数型」とか、多分、そういうことだと思うんですけど(笑)…「え~!?そんなこと、するかなあ?」っていう(笑)
ひさてる/
うん。そうね。…パラダイムじゃないよな、って。
新原/
そう。プログラミングパラダイムじゃないと思うので。
ひさてる/
これ、ちょっと、アドバンスな話、行ってもいいですか?
新原/
どうぞ。
ひさてる/
「ドメインモデル貧血症」という言葉が、ひとり歩きしていってるじゃないですか。
新原/
よくありますね。
ひさてる/
Fowler(ファウラー)が言うたんやけど、「オブジェクトに述語が全然足りなくて、ただ構造体になっている」っていうのみたいな。
(※文字起こし人注:Martin Fowler's Bliki (ja)「ドメインモデル貧血症」
http://bliki-ja.github.io/AnemicDomainModel/ )
新原/
いわゆる「データの入れ物になっている」っていう話ですね。
ひさてる/
うん。「getter/setter(ゲッター、セッター)と手続きでできてる」っていうのが、貧血症や、という。
じゃあ、ドメインモデルを充実させればいいか?っていうと、今度は…、
「あるオブジェクトに、こんなことも、あんなこともできる」っていうのをいっぱい取り付けていくと、あの~…血圧で言うたらね、「高血圧」になりすぎる、っていうのか(笑)
新原/
ああ、貧血じゃなくてね(笑)
ひさてる/
うん(笑)なんか、オブジェクトにコレステロールいっぱい溜まっていって、血圧あがってまうんちゃうか?と(笑)
新原/
うんうんうんうん。
ひさてる/
…っていうのも、あるので…。
言うたら、Fowlerの貧血症から、王道としていく流れは、DDDやないですか。オブジェクトリッチなボキャブラリーで固めろ、と。それをやりすぎると、たしかに良くない。(笑)
「オブジェクトをどんどんリッチにするんじゃなくて、場面場面の切り口を作っていくのが、本当は良いんじゃないの?」…っていうのが、ひとつ、言えることですよね。
新原/
はああ~。
ひさてる/
Webでいうと、例えば、フロントに出すときと、バックで管理するときと、外部の業者で扱うときとがあるとして。全部が同じエンティティである必要がない(笑)
新原/
ああ~!(納得したというふうに)そう、そうっすね。なるほどなるほど。
まさにそれが、DDDでよくいわれる「境界付けられたコンテキスト」ですね。
だから、ちゃんとコンテキストを分けて、それぞれでちゃんと、モデルを分けるなり、アプリケーションを分けるなりして。
やっぱり「コンテキストが大事」っていうのは、DDDでも言われていることなんで。
ひさてる/
「ファットモデルになると、血圧上がりすぎるよね」っていう…(笑)
新原/
そうですね、確かにね。
ひさてる/
うん。ただ、その、オブジェクト指向パラダイムを突き詰めていった結果が、もし「現実のものをすべてオブジェクトで模して」ってことになると、1つのモノが1つのオブジェクトになって、そこに、言うたら人間みたいに、異常に多くのメソッドを持つことになっちゃう。
新原/
ふーむ、うんうん…。
ひさてる/
インターフェースまみれになっちゃう、っていう(笑)
新原/
ああ~、分かります(笑)「ログインユーザーに、全部の操作が入ってる」ってやつですか?(笑)
ひさてる/
そうそう(笑)ユーザーが何かするからって、ユーザーに大量のメソッドつけんな、っていう(笑)
新原/
はいはい(笑)
ひさてる/
ファットモデルのヤバいやつ(笑)
新原/
あ~(笑)…まあ、それはちゃんと、モデリングとかの話になるので。
でも、言わんとするところは分かります。
あのね、この「PHP: The Right Way 」と「PHP - The Wrong Way」、まあ「 The Wrong Way 」の立ち位置がやっぱり似てて。
というのもやっぱり「カウンターがあって、それに対する物言い」みたいなやつで、そういうのは色々広がっていくので、やっぱり背景を知らないと…。
ひさてる/
あ~、はいはい。
新原/
さっきの「ドメイン貧血症」も、それだけ聞くと「じゃあ、1つに集めればいいんか」ってなるんですけど、多分そうじゃなくて。
もともとの発祥は僕も分からないんで、想像なんですけど…。
例えば、O/Rマッパーとかが出てきて、「永続化層からモデルを作ります」っていう場合とかに、「データの入れ物としてのモデル」だけをこさえておいて、それを使ってアプリケーションを組む、みたいな。そうすると、O/Rマッパーを使うので、データベースとか使うのは楽になるんですけど。
で、そこに入ったモデルが、その中にドメインの知識や処理が入っていればいいんですけど、今度はそれをアプリケーションのレイヤーが、ただのデータの入れ物として扱う。実際の処理は全部、アプリケーション側が持ってしまう、と。
ひさてる/
あ~。あの、「ビューで文字列結合しまくり」みたいなやつ?(笑)
新原/
そうそう。まあ、アプリケーションのコードでも、ビューじゃなくてもいいんですけどね。
いわゆる「コントローラー」でもいいし、サービスレイヤーでも何でもいいんですけども。
…そうなると、せっかくドメインモデル作っても、こいつは、ただの入れ物。言うたらDDOみたいになっちゃうので、「それはよろしくないよね」って話だと思うんですよね、多分。だから、そこがないと…。じゃあ「全部の処理をそこに入れたらいいか」っていうと、それはまた違う話なので。
ひさてる/
あー、そうそうそう。あの、バランスなんですよね。
新原/
そうそうそう。
<--1時間2分29秒
ひさてる/
本当のこと言うと、バランスなので、何っていうのは言い切れないんだけど、その時代時代に、あの…バランスが偏ったらアンチが出て来る(笑)
新原/
そうそうそうそう。だからやっぱり、行き過ぎると、それに対する反応が、やっぱり出てくるんで…。
…っていうことかな?って思ったんですけどね、ドメイン貧血症とか。だから、「ドメインモデルを作ったら終わり」なんじゃないよってことですよね。「クラスの構造とデータの入れ物だけあればいいんじゃないよ」っていうことが、多分言いたいんだと思うんですけどね。
ひさてる/
ねえ。昔、ファットコントローラーと言うてましたけど、今、ファットモデルについてどう、っていう話になったりしたり…(笑)
ほんで、(昔は)ドメインモデル貧血症って言うてたのが、今、自分が思っているのは「高血圧」っていうやつやったり(笑)
いろいろ、時によって、バランスが偏ると「なにか違うんじゃないか」っていうのが出てくる。
新原/
そうっすね。だから、昔 言ってたファットモデルって、いわゆる「MVCのパターンで分類します」、昔よく言ってた「モデル」っていうのは、「Active Record(アクティブレコード)」を指すことが多くて。
要は、ドメインモデルがファットなんじゃなくって、ドメインモデルとかその下のリポジトリとかを全部含めて、ひとつのクラスでやってた。だから太りやすかったんですよね。
そりゃそうですよね、いろいろなものをやってるから。だから余計、ファットになりやすかったっていうのは、ありました。
ひさてる/
どうしても、クラス切るより、メソッドを足すほうが楽なんで、どんどんどんどん…。で、本当に、現実世界にあるように「モノがいろいろな特性を持ってしまう」っていうのが…。
そこがね、確かに「極端にいきすぎるとよろしくない」という意味で、「ひとつの考え方に集まりすぎるのは良くない」と。
新原/
そうですね。
ひさてる/
それ、プログラミングパラダイムっていう話じゃないって(笑)
新原/
そうそうそうそう(笑)
ひさてる/
そうなんですよね~。
新原/
でもね、僕、分かってきました。このサイトの役割が。
ひさてる/
ほう。
新原/
今の、こういう話ですよ。「そういうことを考えて、議論してくれ」っていう風なことだ、と捉えれば…。いや、確かそういうようなことも、下の方に書いてあったかと。
ひさてる/
あああ、そう。うん~…。
新原/
基本原則、そういうことだと思うんで。
ひさてる/
見えてきましたね~(笑)
新原/
はい。じゃあ、次いきましょう。次は…。
ひさてる/
「歴史」は、置いといて。
新原/
「他人のコードを恐れること」。
ひさてる/
これ、一番ヤバい章ですね(苦笑)
新原/
あははははは(笑)
ひさてる/
これ、ヤバい章でしょう。
要は…その…。長いんですよ、ポエムなんですよ。
新原/
(笑)
ひさてる/
えっとですね~…。
「なんや、お前ら、えらい(すごく)オブジェクト指向やら、関数型やら言うて(?)、うまいこと出来るように言うらしいけど、Linuxカーネルとか、Cで書いてあるぞ」って書いてあるんですよね。(苦笑)
新原/
(笑)
ひさてる/
「え?…おお、そうやな(汗)」って(苦笑)
新原/
あ~…え、でも、これ、章タイトルと、シメの「間違った方法」のところを見ると、
「 他人のコードを恐れること 」が Wrong Way になってるので…いいことやな、って思うんですけれどもね。
ひさてる/
そうそうそう。
・・・でね、その「恐れた」結果が…。
我々は(普通は)、なかば「秘伝のタレ」化しかけたものを、すくい上げて、自動化できるような形にもっていって、仕様を明らかにしようとしたり、するじゃないですか。何らかの方法で…今まで、ソフトウェアが積み重ねてきた知見を利用して、「つらみを減らそう」と。「どうにかうまくできるようにしたいやん」っていうのが、我々の気持ちとして、あるじゃないですか。
ところが、この人は、「恐れた」結果、「受け入れろ」って書いてある(笑)。「怖がっていること自体が間違いや」と(笑)。
とんでもないモノ…例えば「2万行のスクリプト」とか、ダメでしょ。怖いに決まってるやん(笑)。
「だからエンジニアは、責務を分離して、スコープを小さくして、頑張るやん。」…とは、書いてないんですよね~。
「プレーンPHPみたいな、他人がスクラッチで書いたようなコードを扱いたい人はいない、というのがフレームワークユーザーの気持ちらしいけど、他人の書いたコードを保守するというのは、当たり前のことちゃうんか」と(The Wrong Wayの作者は書いている)。
新原/
うん、そうっすね。
ひさてる/
「フレームワークの知識だけでどうにかなるようなコードじゃないと、いやだ」っていうのは、ワガママでしょ、みたいなことを言おうとしているんですが…(苦笑)
…真ん中は飛ばしますね。ここ、どーでもいいですから。
で、最終的に何にいきついてるかというと、最後の3節。
「確かに、恐ろしいコード、おそらくはじめから設計されていなかったコード、または」
…これね、本当にこんな調子で英文(原文)が書いてあって(苦笑)。
「クライアントが書き直しを選択したくなくて何度も自己成長しているであろうコード、(中略)…手に負えないとしても、…」みたいなのが、ガーっと書いてあります。
で、「どんなフレームワークもこの状況は改善してくれません」。
新原/
うん…。
ひさてる/
「これはよくあるプログラムの自然な成長プロセスです」と。…ほんま…(苦笑)
新原/
ちょっと僕は、「PHP - The Wrong Way 」を書いた人の側に立ってみます。
僕は、この章に関して、あんまり違和感はなくて。…というのは、この人が言いたい主題としては、「他人が書いたコードを、必要以上に恐れるな」と。「それも受け入れて開発していこう」ということだと思うんです。
そう考えると、「何かのフレームワークを使ったからって、全てがうまくいくわけじゃない」。そりゃそうです、当然だと思います。
…なので、そういうことを言いたいんじゃないかなー、と思うんです。表現は別にしても。
「フレームワークを使ったって、結果はスパゲティコードになります」とか、「オブジェクト指向を使っても、結果はスパゲティコードになります」っていうのは、
「スパゲティコードにしようぜ」っていうことではなくて、
「結果としては、そうはなるんだけど、そういうの受け入れてやっていこうぜ」ってことだと思うんですよね。
もちろん、それを回避することは必要だと思うんですけど、「必要以上に恐れることはない」ってことじゃないのかな?と思うんですけどね。
ひさてる/
…何やろ、その…「回避」っていう言葉が何を意味しているかってことなんですが。
「初めから、『そういうのはイヤだ、イヤだ』とワガママをいって逃げること」を「回避」と呼んでいるのか、
「blob化したもの…つまりクソの山になってしまったものを、クソじゃなくしていく(改善していく)努力」を指して「回避」と呼んでいるのか、
で、話が大きく変わるな、と思います。
新原/
あ~~…。
ひさてる/
この人の側に立つとすると、「初めから『そんなんヤだヤだ』ってワガママ言うな」っていう話で「回避」という言葉が使われている、というスタンス。
だけど、その逆でいくと…。
あの、コレ結局ね、その後ね、「こういうものを受け入れて、後世に つらみを残さないように改善していくことが、エンジニアの仕事です」…とは、書いてないのね(苦笑)
新原/
あ~!(そこかー、といったニュアンス)
…まあ、(逡巡)でもそこは、アレかな。あの、僕はこの人の書いた真意は分からないんですけど、…僕は、そこはちょっと拡大解釈しすぎかなー、と思っていて。
というのは、これ、よくある話でもあるんですけど、
「ここに書かれていることは、ここに書かれていることしか言ってなく」て。
それ以外の、「言ってない(書かれていない)こと」について、「言ってないってことは、こういうことだ!」っていうのは…ちょっと、なんか、解釈のスコープが広すぎるんじゃないかな?と、ちょっと今思いました。
ひさてる/
なるほどね(笑)
新原/
「こうなるんだったら、こう書いておくべき」っていうのは…。
ブログでは、そういう強い表現をしたときは「これは自分のケースに当てはまることで」だの、何か(断りを)入れておくべきってのはありますけど。
ひさてる/
あ~。
新原/
でも、すべてのことにそれを言い出すと、本当に言いたいことがかすむ場合もあるし、
「そもそも、この人はそんなことまで考えていない」っていう場合もあるし(笑)
だから、ちょっとスコープ広げすぎてるかなーって思いましたね。
ひさてる/
既存コードをdisりまくってる若手がいて、(それに対して)「いや、そういうメンタリティはどうかと思うよ」ってとこは、一致なんですよね。
新原/
「こういうコードを書いてるやつは、こういうやつだ」っていうところまで、見方が広がっている気がしますけど。
ひさてる/
ああ~。なに、「クソコードだから、人格もクソだ」みたいな?(笑)
新原/
そうそうそうそう。だから、まあ…ねえ。
ひさてる/
ただ…ただ、ね。このセクションを僕らは「語れる」から、いいじゃないですか。
新原/
うん。
ひさてる/
でも、このセクションを読んで、「おお、その通り」っていう学習をしてしまう人って、未来がないじゃないですか(笑)
新原/
あー、ん~、それ、それねえ…。
(逡巡、葛藤?ひとりごとっぽく)んー、でも、いいな、それ。
<ーー1時間12分25秒
(新原:続き)
そこも、ほんま、そうかなあと思っていて。いま自分で「スコープ拡大しすぎ」って言っておいて、(自分も)広げちゃいますけど(笑)
よく思うのが…。例えば、誰かが技術的なブログ記事を書きます、と。
で、意図的に悪く書いているわけじゃなくて、その人は そのやり方でうまくいっているし、これが正しいと思って「こういう方法がありますよ」と書くと、詳しい人がそれを見て「本当はこういうやり方もあるよ」とか「そういう風にすると、こんな問題があるよ」と指摘をするのは、いいと思うんですよ。
で、それでどんどん、元の記事を書いた人が「あ、そうなんだ。知らなかった。じゃあこういうふうにしましょう」となると、これはいい循環で。
ひさてる/
いいマサカリですね。
新原/
そうそう、良い循環なんですけどね。
そうじゃなくて、「いや、おかしい、おかしい」って、とりあえず文句を言って、さらに「
こんなのが Google 検索で上に出てきた」とか、インターネットにそういうものが存在してると、「オレはいいけど、それを知らない初心者の人が間違えるから、アカン!」みたいな。
…っていうのと、ちょっと似てるなと。いや、ひさてるさんがそこまで考えて言ったのかどうか、分からないですけど。
「いや、なんかそれってちょっと広げすぎ」っていうか。
で、そういうのに対する一番良い方法は、「書いた人に対するコメント」が、もちろん良いんですけど、そうじゃなくても、自分がもっとちゃんとした良い方法を、自分のブログなりで発信すれば解決する話なのに…
なんかこう、それを見た「自分じゃない、第三者の初心者といわれる人」を勝手に作って、「その人が間違えたらどうするんだ!」っていうのは、なんかちょっと話を広げすぎじゃないかな?…って、前から思っていたんですよ。
ひさてる/
なるほどね。
新原/
…っていうのを、今、思いました。
ひさてる/
なるほどね~。
これ、さっき「バランスの問題」って言ったじゃないですか。
新原/
はいはい。
ひさてる/
これ、バランスをレガシー順応に偏らせすぎた文章だと思うのですよ。
新原/
あ、そう取ったってことですか。
ひさてる/
うん。
新原/
ああ~、なるほどね~~~。
ひさてる/
…だとすると、やるべきことは何かっていうと、あれじゃないですか。
「エンジニアの仕事というのは、レガシー順応の真反対をいくべきだ、GO!」っていう強いメッセージをぶつけないといけないな、と思ったんです。
新原/
あ~~。…僕はね、それよりも、「それはオープンソースのフレームワークとライブラリを指しているのかな」と思ったんです。初めから、「フレームワークの使い方」とか出ているんで。だから、フレームワークとかライブラリーが「他人が書いたコード」だって思ったんです。
ひさてる/
あ、そういうことか~。
新原/
僕は、そういうふうに捉えたんで…。だから別に、「そういうのを使うのは普通のことだし、使っても、うまくやらないと、当然スパゲティコードになる」っていうことかな?と思ったんですよね。
ひさてる/
ん~。えっとね、自分がこれ翻訳して、つぶさに見ているので発見しているんですけど。
この人が指している「他人のコード」は、「前任者のプログラマー」とか…
新原/
…それ、どの辺にあります?
ひさてる/
「元のプログラマーに最終的に放棄された、」……違うわ、これは別や。
えーと…「クライアントが書き直しを選択したくなくて何度も自己成長しているであろうコード」っていうところで、「案件モンやな」みたいな。
新原/
うんうんうんうん。
ひさてる/
「おそらくはじめから設計されていなかったコード」(※←上記引用部分のすぐ直前)…って、これはオープンソースでは無いことであろうし。
新原/
ふ~ん…。なるほどね、これ「他人のコード」がどこを(何を)指すかによってね、確かにね…。
ひさてる/
その「他人のコード」っていうのが、「ブラックボックスとして扱いたいくらい高級すぎてしんどい」のか、「本当に下手くそで、スパゲッティで、ダメすぎて難しいコード」なのかによっても、話が変わりますよね。
新原/
確かに。なるほどね。
あー、まあ確かにそうかもしれませんね、僕のほうが、曲解してる…ちょっと「意図を汲みすぎている」ところはあるかもしれませんね(笑)
ひさてる/
見出しだけ見ると、そう感じたんじゃないんですかね。
新原/
あー、確かにね、そうっすね。
ひさてる/
世の中にある「立派なコード」「高級すぎて、抽象度が高すぎて、難しいコード」とかを、ブラックボックスとしてフタをしちゃうとだめだよ、と。
言うたら「ベンダーの人も掘って読もうね」っていう…(笑)
新原/
そうとも取れますからね、このタイトルだけ見るとね。(笑)
ひさてる/
それと同じで、「前の人が書いたレガシーも、もしかしたらそういう価値のあるものを表しているかもしれん」と。
「だから頑張れ」…と、見出しだけ見れば、そう思うんですけど(苦笑)なんかね、文章(原文・英文)を読むと…。
翻訳していると、どんどんしんどくなっていったの、ここなんですよね(笑)「あ~~、そうかあ~~~~~~」って。
新原/
(笑)確かに、まあ、ひさてるさんのブログにもちょっと書いてありましたが、回りくどいというか…何が言いたいのか、ちょっとブレてるというか。わざと こういう風に書いてんのか、どういうふうな解釈もできるように書いてんのか、ちょっと意図は分かんないですけど。
確かに、「何が言いたいんだろう?」っていうのは、読む人が結構 補わないと分かりにくい、っていうのはあるかもしれませんね。
ひさてる/
分かりにくいですよね(笑)
新原/
うん、確かに。確かにそうですね。
ひさてる/
分からせようとしているのか、何なのか。
新原/
ふはははは(笑)
ひさてる/
でもね、これね。術中にハマっているかもしれなくて…。
書いた人は、もしかしたら、我々がこうやってディスカッションすることを、(つまり)こうすることでディスカッションを生んでるっていうのを、狙ってるかもしれん(笑)
新原/
まあ、確かにね。うん。
ひさてる/
プルリクを送ったときに、「自分は この意見に完全賛成ではないんだけど、『自分たちの言語でディスカッションを作る』ということには すごく納得するから、やりたい」というメッセージを付けて送ったら「素晴らしい!」ってすぐマージされたのね。あ、スグじゃないか。
新原/
あ~~(なるほど、みたいな感じ)。だからまあ、そういうことだと思うんですよね。
ひさてる/
それが成り立ったっていうのは、正解かなって。
新原/
まあ、やっぱり意図としては「PHP: The Right Way 」みたいなものがあって、それが、あまりにもひとつの(オンリーワンになりすぎて)、「これだけに従っていればいい」「これに従わないといけない」みたいなかんじになると、それは良くないってことで、カウンターとしてこれを作ったんだと思うんで…。
ひさてる/
うん…。そうですよね。まさに、それが次のセクションですね。
新原/
そうですね。
次が「宗教的に PHP-FIG 標準に従うこと」。
ひさてる/
そういうことなんですよね(笑)
「 Right Way 」的に、「FIGのインターフェースをどんどん使え」みたいなことを言われると「ほんまかいな」と(苦笑)。
新原/
だからまあ、それも、「ひとくくりにしすぎ」っていうか(笑)PHP-FIGも、いっぱいあるじゃないですか(笑)「全部ひっくるめて」って話になると「ん~?」とは思いますし。
今さら、PSR-0 とか、PSR-4 とかを無視するとか、ちょっとないなあと思うし。
ひさてる/
これホント、言うてることが、もったいない話で。
新原/
うん、ちょっと、広すぎる感じがしますけどね。
ひさてる/
実際、PSR-11に、Docコメント内に「これでいいのか」っていう点は、自分も思うところがあるんですよ。
新原/
うんうんうんうんうん。
ひさてる/
ただ、PSR-0 と 4 を無視することは、あり得へん、と(笑)
新原/
そうですね。うん。
ひさてる/
それを無視したら、どうやってクラスをロードするねん?って(笑)
新原/
だからまあ、そこは別にもう、ねえ。従ったほうが良いと思うし…。
あまり何か、主義主張が入るというよりは、単純に「便利だから、それでいいんじゃない?」って思うんですけどね。
ひさてる/
そう。でね、強く縛られるべきなのは、参加メンバーですよね。
新原/
うんうんうんうんうん。
ひさてる/
むしろ自分は、参加メンバーが、もっとちゃんと活躍してディスカッションをして、決めるところは決めていただかないとね、とは思っていて。
新原/
うんうん。
ひさてる/
…で、あの~…。ピクシィ事件(?)があったのが…。
新原/
えーと、あれいつやったかな。去年?
ひさてる/
去年でしたっけ。
新原/
去年だったと思います。
ひさてる/
あの~、Doctrineが脱退したんですよね。
新原/
結構、脱退してますよね。Laravel とかも、確か脱退していると思いますよ。
ひさてる/
Laravelって、脱退でしたっけ?
新原/
脱退してたと思います、確か…。
ひさてる/
加入してなかった…んじゃなくて?脱退なんでしたっけ?
新原/
いや、加入はしてたと思うけど、脱退だったと思う…。
ひさてる/
これが使ってない人の感覚ですね、覚えてない(笑)
新原/
(笑)
ひさてる/
僕は、覚えてないんですよ。
「フレームワーク相互運用」をうたってるんだから、フレームワーク同士が手を取り合うために、決めるところはもっとじゃんじゃん、ちゃんと決めていこう、と。PSR-5が動いてなければ、皆で手を取り合って頑張っていこう、と(笑)
…ほんまね、PSR-5、…なんとかして(苦笑)Docコメント標準…(笑)
新原/
PSR-5…。
ひさてる/
5…だったはずですが…
新原/
はいはい。「PSR-5 PHPDoc Standard 」ね。
たしかコレ、phpDocumentor(PHPドキュメンター)のやつと違うんですよね。完全準拠じゃなかったと思うんですよね。ちょっとなんか、足りてない表記があるんですよね。
ひさてる/
ん~。
新原/
「足りてない」って(^^; 何をもって「足りてる」っていうか、ですけど(笑)…
まあざっくり言うと「PhpStorm(PHPストーム)使う上では」ってことでしょうけど。
ひさてる/
JetBrains(ジェットブレインズ:会社名)は入っていないので、そうとも言い切れないし(笑)「これ、何なんやろ?」っていう(笑)
で、発起人はアレですよ。phpDocumentorの人。
新原/
うんうんうん。
ひさてる/
…なんやけど、んー、なんか、どうしたらいいのコレ(笑)
新原/
(笑)
ひさてる/
こんなん言うてる間に、文法、増えていくねんけど、って(笑)
ま、そういうようなのをね。その人がダメなら、 PHPDoc 書いてるじゃないですか、皆。書いてるねんから、書いてるもんとして、コントリビュートしていくのを、フレームワークのリーダーがやっていってほしいな、っていう気持ちはある(笑)
新原/
ん~~~~。
ひさてる/
そこは強くなってほしいんだけど。
ただ、この人(PHP - The Wrong Way の作者)が言うてるのは、「その強さをコミュニティ全体に強制しようとするヤツがいる」らしいんですよね。「皆 従え!」って(笑)
新原/
あ~、はいはいはい。
ひさてる/
イタいでしょう(笑)
新原/
まあ、こういうのは出来るとね、規模の大小は別にしても、「ルールがあればそれに従わせようとする人がでてくる」っていうのは、やっぱりありますよね~。
ひさてる/
「PHP: The Right Way 」に「PSRの標準のアレとコレが良いから、従え」って書いてあるとしても、別に「 Right Way 」全部やらなイカンってことは、ないねんから(笑)
新原/
そうっすね。
ひさてる/
で、実際、さっきから話題のSymfony 4は、リクエストとレスポンスは、PSR-7じゃなくてSymfonyのリクエストレスポンスで出来てますよね。
新原/
うんうんうんうんうん。
ひさてる/
かまへんやん(笑)だってフレームワーク自体が、それを選択してやってないねんから。「PSR-7 なんとかしたいね」って、言いっ放しでもう2年くらい経ちましたよ(笑)
新原/
まあ…。実際問題、統一された規格があったほうが、ものごとをやりやすくなるのは確かなので…。あの~、それはやっぱり相互運用できるような場面では、従った方が…。
「どっちのほうが良くなるか」だけの話なんで。
「宗教的に従うことが良くない」っていうのは、それはもちろん、おっしゃる通りだな、とは思いますけどね。うん…。
ひさてる/
「フレームワークが互いに手を取り合うために必要なインターフェース」が決まってるのであって。
あなたはPSR-7の実装者じゃないんだから、いいじゃん、と。
それはフレームワークの部品と部品がつながるために、PSR-7というインターフェース、…HTTPのメッセージングで、やり取りしてくれたら、あなたがコントローラに書くコードは、いいじゃん、と(笑)
「そこに縛られることはないだろう?」と。…CakePHP(ケイク) 3 とかは、そこをうまくやっている感じですね。出入り口はPSR-7との互換性を考えつつ、やっぱり中はこれまでのCakePHPユーザーを中心に考えてる、っていう。
新原/
うんうんうん。
ひさてる/
何か、そういうふうに思います。
まあ、そういうところもあるねんし、別に、ユーザーが従わなあかんことじゃないのに、ねえ。なんか、これに関しては本当に何の嫌な思いをしたのかも、分からない(笑)
新原/
そうっすね~。まあ、何回も言うてますけど、章タイトルだけ見ると、おっしゃる通りなんですけどね(笑)
ひさてる/
そうですね(笑)
新原/
「宗教的に PHP-FIG 標準に従うこと」。確かに、それはそう(よくない)なんです。
「自分で考えて、『ここは合わせる』『合わせない』」で、いいと思いますよ(笑)
ひさてる/
うん…。で、便利なとこだけ使ったらええやんね(笑)
新原/
うん、そうっすね。
ひさてる/
で、なんか…PSR-3とか、よう分からんけど…「ロガーに保存したいねん」だけ言うといたら、Monolog(モノローグ)使うかなにか知らんけど、別の人がライブラリでロガーを作ってくれて、つなげられる、と(笑)
新原/
うん。まあ、それを、従うかどうかですね。
そうじゃなくて、「オレたちのアプリケーションでも、インターフェースはこうだ」と決めて。実際の実装ではPSR-3準拠かどうかは、別に気にしなくてよくて。
ひさてる/
うん。一般的にはPSR-3にしておけばいいけど、「いや、うちの会社はログを取るときはちょっと、特別な事情があって」みたいなときは、別に、やらんかったらええやん、と(笑)
新原/
うん。まあ、それだけの話だとは思うんですけどね~。ん~。
で、これが最後ですかね。
「セキュリティをサボる」。
…まあ、それは「Wrong Way」でしょうね。
ひさてる/
これは「Wrong Way」ですね。
ここは短くまとまっていて、具体論がない…というのはあるものの、ええこと書いてますね(笑)
新原/
うん~。
ひさてる/
ここは、割と素直に(翻訳が)いきました(笑)
で、ここで言うてる「セキュリティ」っていうのは、HTTPごしのセキュリティっていう話ではなくて、どっちかというと「セキュアプログラミングをきっちりやっておかないと、怖いです」っていう話かな、と自分は思いまして。
新原/
あ~。なるほどね。
ひさてる/
それは例えば、「ダメなものが来たらちゃんと例外を吐く」とか。
「ようわからん型で来たけど、多分整数やろ」で処理するのはダメで(笑)、ダメなものが来たら、弾く。
新原/
(笑)
ひさてる/
変換すべきことは、ちゃんとサニタイズする。中で扱う。
新原/
ふむふむ。
ひさてる/
…っていう思想をきっちりしとかないと、それが積み重なって怖いですよ、と(笑)
新原/
なるほど。
まあ、デフォルトで安全に…じゃなくて「セキュリティをサボるのがWrong Way」っていうのは、そんなに違和感ないっていうことですかね。
ひさてる/
そうですね。
新原/
…ということで、「PHP: The ら…」じゃなかった、「PHP - The Wrong Way」だ。 Right Way じゃない。
ひさてる/
Right Way じゃない、 Wrong Way !
新原/
「PHP - The Wrong Way」を見てきたんですけど。
ひさてる/
はい。
新原/
まあでも、こうして議論をしたってことは、書いた人の思惑どおりになったというか、目的は、まあ達成したのかな?と思いますね。
ひさてる/
そうですね。
新原/
ある意味あれっすかね、ちょっとこう…どう批判するか…いや批判までいかないですけど、「どういうふうに言ったろか」みたいなスタンスで入っちゃったのも、ちょっと良くなかったかな?って僕は今思ってるんですけど。
ひさてる/
(笑)
新原/
もうちょっと、こう、公平な目で見るべきやったかなって(笑)
ひさてるさんは、多分ブログに書いてるし、スタンスとしては はっきりしていると思うんですけど…僕のほうは、もうちょっと、「PHP - The Wrong Way」側で見たほうがよかったかな?とちょっと思ったりしましたけど。
ひさてる/
(笑)
新原/
とはいえ、まあ、色々話はでてきたので。
ひさてる/
僕、「書いてる内容に間違いが多い」っていうだけで、この人の「気持ち」は察して、なんとかしていきたい、という立場ですからね。
新原/
うんうんうん…。確かに、こういうのって、言われて初めて「当たり前だと思っていたことに気付かされる」部分があって。
「ああ、たしかに」「あ、もしかして、そうかな?」「でもやっぱり合ってるよな」とか。
やっぱり振り返り(という効用)は、あるので。
いっぺん、これ(ポッドキャスト)聞いてる方も、ちょっとじっくり…
…途中、読みづらいところがあるので、そこは飛ばしてしまってもいいと思うんですけど(笑)
ひさてる/
すいませんね、もう(笑)
新原/
いやこれ元(原文)が読みづらいんだと思うんですけど。
ひさてる/
「日本語が読みにくいから」といって、英文にあたると、英文の方が、本当に読みにくいです(笑)
新原/
あははは(笑)
でもまあ、読んでみるといいかもしれないですね。
特に、まあいろんな人と、特にエンジニア同士で話す時とかに、普段、自分たちが当たり前のようにやっていることを、いっぺん疑ってみる、っていう材料としては、良いかなと。
ひさてる/
そうですね。「ここに書いてあったから」という免罪符にするみたいな使い方は、絶対、してほしくないですけどね。「議論しあえる人」に、ぜひ読んでもらいたいと思いますね。
新原/
だから、そういう意味では、そもそも、これのテーマをちゃんととらえたら、絶対、これを教条主義的に扱うことは、ないと思うんですよ。
ひさてる/
あ~…。
新原/
今までの「当たり前」で、「皆が信頼していること」が「Wrong Wayだ」って言ってるようなサイトを、盲目的に信じたら、それは本末転倒も甚だしいので(笑)
これの意図をわかっている人は、多分大丈夫だと思うんですけどね。
ひさてる/
なるほどなるほど。確かにね。
議論した上で「これが間違いだ、こうすべきだよね」という合意が取れるのなら、(このサイトは)「必要な やられ役」ですね。
新原/
そうそうそうそう。そうっすね。
…ということで、このポッドキャストでは、「#phpgenba」というハッシュタグがありますので、それでまた今日の感想とか、あるいは今日とか前回みたいに「この話題を取り上げてほしい」とか、ツイートいただければ、我々、見ていますので。ぜひ、お願いします。
今回のゲストは、ひさてるさんでした。ひさてるさん、どうもありがとうございました。
ひさてる/
はい、どうもありがとうございました。
<ーーおわり(1時間31分16秒)