#phperkaigi に参加してきました (day1)

https://phperkaigi.jp/2020/ に行ってまいりまして。
プロポーザル出したら採択していただけたので、自分も30分枠で喋ってきました。

f:id:o0h:20200211135249p:plain

前夜祭(day-0)については参加を見送って、登壇準備等に費やしておりました・・
そのおかげもあって「発表用」と「公開用」の2タイプを用意できそうな兆しがあるので、ちょっと遅らせてupさせてください。
その代わりに・・・って事でもないですが、主旨をテキストに起こしてまとめてみます。
(簡単にまとめます、って言おうとしたけど30分枠の話なのでそこそこの分量になりました😇)

色々な感想などは終了後に書きますので(iwillblog)、この記事は「発表した内容の掻い摘み」と「Twitterで拾った感想・声に絡んで見る」というものです。 会場にてバタバタと書いているので、見直しとかは後ほどやりますが、ご感想・ご質問・ツッコミなどあったら呟いていただけると!

発表内容の掻い摘み

  • Pt.1 「レガシー」「モダン」とは?
    • このトークでは「改修・保守」といった「進化させる」のが難しいモノを「レガシー」と呼びたい
    • 「ソフトウエアは使われ続ける限り進化していく」もの(リーマンの法則より)
    • 「レガシー」の逆サイドに「モダン」があるなら
      「腐った(腐りかけの)コード」に対応するのは「防腐剤」とでも言えそうに思う
    • 肝要なのは「新しい機能を取り入れたもの」ではなく、「未来に向かってついていけるもの」という点。
      これが「モダンであるか」という問いなのではないか
  • Pt.2 PHPの進化
    • 言語としてのPHPや、コミュニティ(PHPで書かれたソフトウェア等)の進化を振り返ってみる
      • 〜2008年 / 〜PHP5.2
      • 〜2014年 / 〜PHP5.6
        • 名前空間の導入とComposerの登場
        • PHP-FIGもこの時期。「FW間の相互運用性」
        • 「複数モジュールを手軽に扱いたい」雰囲気?
      • 2015年〜 / PHP7.0+
        • 型宣言・Expectation( assertが「文」に) の導入
          • ※「タイプヒンティング」が「型宣言」と呼ばれるようになったのは7.0から。
            以後、スカラー値、iterable、nullable、void、objectなど「使える型」が増強されていっている
        • 静的解析ツールの盛り上がり
        • PHPでも固く書きたい」雰囲気?
    • あらゆるものは「因果」があり、「ダイナミズム」が根底にある。
      色々な変化を微分して、「大きな流れ」を読み解きながら「モダンさ」を考えて見るとよいのでは
  • Pt.3 CakePHPを例にとって「進化」を見てみる
    • 主に3点。
      1. 使い手に対して親切にすることで、「レガシー」を排除していける状態を保つ
      2. コミュニティの資産を活用する
      3. コードの品質を保ちやすくする
    • ソフトウェアの進化にとってはフィードバックがあることが重要で、OSSでは「コミュニティ」の力が欠かせない
      • しかしCakePHPは「2.x->3.0」への変更が大きく、ユーザーが「断絶」してしまった
      • この時の経験から、「4.0へはユーザーにとって優しく変化を促す」ことを重要視し始めた
      • CakePHP3は、「3.6からは機能の追加ではなく、4.0へ向けた準備にフォーカスする」という流れを作った
        (最終的に3.8まで進展し、4.0がGAになった)
        • 具体的には @deprecated の付与や E_USER_DEPRECATEDの活用。
          丁寧に「廃止予定」を分かりやすくしつつ現行ユーザーには影響のない形で、進化を促した
        • 「親切さ」と「コードのリストラ」が共存している
      • 移行ツールの提供
        • 過去にも同様の独自ツールを提供していたが、Rectorベースになった
        • これにより、「Rectorを使えれば誰でも使える・コードもフィードバックできる」という状況を生み出せた。「とっつきやすさ」と「フィードバック可能性」の拡大
    • コミュニティの資産に乗っかることは「オリジナルのソフトウェア」であることのリスクを減らすし、流動性も高める
      • CakePHP4は、PSRへの準拠を進めている
        • オートロード(1+4)、コーディング規約(12)、HTTPメッセージ(5)/ミドルウェア(15)、ロギング(3)、キャッシュ(16)。またコンテナインターフェイス(11)にも次期対応予定
        • FW内のパーツが交換可能になるし、読みやすくなる
      • CakePHP自体がFIGメンバーでもあるので、今後も積極的に使っていきそうな気はする
      • Rectorの採用も「似た効果」があるように見えるのは、先述の通り
    • 静的解析やチェックの強化を進めている
      • declare(strict_types=1)の全面適用
      • 引数・戻り値の型宣言の必須化
        • これは3xと違いPHP7以下を切ったから出来たことでもある
      • PHPStan / Psalmの適用
        • 元々PHPStanは利用されていたが、適用レベルが大幅に引き上げられた
      • これにより、(FWの)開発者にとっては「不正確なコードを書いてしまう」という蓋然性が排除されやすくなる。他方で、利用者にとっては「(取り分け型宣言により)IDE等の利用時の開発体験が向上する」という恩恵がある
  • まとめ
    • 「何のためにモダンが良いの」?
      • 未来に近い場所にいるため!
      • 時代に取り残されるのが「レガシー」
    • 「どうモダンさを獲得するか」に対して、PHPやコミュニティの大きなトレンドに則って「モダンさ」を考えるのは1つのヒントになるはず
    • CakePHP4はたんまり”今っぽさ”を実践しているよ!!!
    • 「進化を止めない」ための仕掛け方、という観点で社内プロダクトなどにも参考になるポイントがあるはず

ツイートへのリアクション

このイベントには前回も参加させていただいて、発表内容に対してフィードバックを送れるオンラインシステムを提供してくれているのは大好きな点の1つです。5分間のLTでしたが、色々な声をもらって嬉しいものでした。
それともう1つ、「この時間帯のツイートを見る」が出来ることですね!(冒頭のキャプチャを参照!!)

折角ご感想をいただいているので、リアクションしてみたいと思います。

当初は「CakePHPの設計がどうなったか」みたいな話をしようと思っていたのですが、内容を詰め始めたら「そこら辺は一切触れる余裕無さそうだな・・」となりました🙇‍♂️
今おそらく「クリーンに作ること」のもたらす価値〜みたいなのが再発見されてきつつあるのかな?という雰囲気は感じていて、その観点に対して「CakePHPのような、縛りの強いフレームワークはどうなのか」というのは、トピックになるのかなぁと思っています。
トーク中で「コードの寿命」というのを強調していたので、例えば「FWの死によってアプリケーションが身動き取れなくなう」というのはリスクとして挙げられそうです。に対して、(実現できれば)クリーンアーキテクチャは処方箋になりそうかも・・・・?

と思うのですが、「寿命」というのは、「手前」にも伸ばせる事ができると思っていて、「悩みを少なくして、オーバーヘッドも少なくして」作り始める・動かし始めるというのは強烈な価値だと思います。 ので、「レールを敷く」ようなフレームワークは好物です。
CakePHPは、3.x/4.xになっても「道を示してくれる」力を保ちながら、「パーツを交換することはしやすくなった」状態だと思っています。ふわっとした言い方・・・
一応、CakePHP3をガッツリ使っていたのは前職時代になりますが、その当時は「CakePHPが足かせになっている」と感じたことはなかったです。

これもめちゃくちゃ大事な視点だよな!!と思いました。
そのためにも「(言語やFWの)セキュリティアップデートを迅速に行える状態を保つ」のも必要そうかもな、と感じました。
(何かポジショントーク的な話の展開の仕方になったぞ)
パッチとか新しいの出たらガンガン適用していこうぜ!そのために普段から備えておこうぜ!!となると、テストコードやCI/CD環境の充実も重要になってきそう。ココらへんもまた、「未来に近い場所に居続ける」努力なのかもなぁと思った次第です

コード写してた時間は短かったはずなんですが、このツイート見てビビってましたw
レガシーとかそういう次元じゃない・・・😇
資料公開時には直します!!

そうなんですよ、これは最低限かつ最重要なポイントですよね!!
「なんとなくカッコ良さそう」が「モダン」じゃねーぞ、と思います。

例えばPHP話でいうと、7.0から入った null合体演算子は便利で「使えそう」な場面も多いのですが、乱用しすぎるとリスクになりそうです。 「定義したつもりの変数(やプロパティ)」をウッカリ混入してしまうことになります。
ので、「既存コードを、新しいやり方で、短く書き換えられそう」な時でも、「手段と目的を履き違えるな」というのは言い続ける必要がありそう。

資料作成中に調べていて、「もう10年前!」と個人的に驚いたので言及した話。
今でも読むに値する話が詰まった、素晴らしい本だと思っています。そのため自分としては「今でもおすすめしたい」のですが、確かに「書き方が古い」部分もあるだろうな、って思うと悩ましい・・・
PHPの「中級者になるための」みたいな入門書、決定版がほしい。

これも凄い有り難い指摘だなぁ〜と思っています!!
触れていなかったのは、発表枠の時間的な問題と、自分の見識の浅さの両面からです。

例えば,PHPのyieldはPythonのジェネレータに影響を受けていますし(PHP: rfc:generatorsのFurther resources等を見ると面白いです)、「CakePHPRuby on Railsの」「Composerはnpmの」影響を受けている〜〜っていうのが、何よりの証左な気がします。ちょっと毛色は違いますが「PHP7はHackの」とか。

ということで、他言語や他文化圏も含めて流れを感じ取れたら、武器な気がします。とりわけPHPは、キャラクター的に他言語の影響を受けやすい印象があるんですが、どうなんですかねー

※あとで展開する資料には参考文献をのせます

元lead developerであるMark Storyさんの発表から引用したものです。
CakePHP - The Road Ahead

ここで「CakePHP3の時どうだったのか」が語られているので、ご興味がありましたら読んでみていただけると。

去年のCakeFest(※CakePHP4の正式リリース直前)でのMark Storyさんの発表において、「4.xに移行するにはどうすればいいですか?」という説明の中で使われたスライドがコレですからねw

f:id:o0h:20200211141101p:plain

実際どのくらいdeprecated付けられたんだろう。後で数えてみよう

Safer, More Helpful CakePHP

※ 今回の僕のトークに興味を持ってくれた方には面白がってもらえると思うのでオススメです!

具体例でいうと、「setter/getterの分離」みたいなのが実施されました。
( $a>value($v) をdeprecatedにして、 $a->getValue()$a->setValue()を提供)
これは「コードの可読性を上げる(for human, for 静的解析)」ためのイシューといえますが、急に破棄されたらアプリケーションが死滅しかねないなぁというAPIなので、廃止予告を出してもらえて助かりました。CHANGELOGや移行ガイドを見ると、3.6~3.8時代にかけて、様々な箇所で「setter/getter分離」ポリシーを拡大適用していった様子が感じ取れるかと思います。

ちなみに、地味に私もPR送ったりしてます ✨
CakePHP Add Fixture importing name style rector(for 3.7) by o0h · Pull Request #1252 · rectorphp/rector · GitHub

余談ですが、当然ながらRectorの作者があらゆるFWを使い倒してる可能性は低いので、これOSSコントリビュートデビューのチャンスが転がってる気がします!!!
Cf: もっと気軽にOSSに Pull Requestを出そう!/ Let’s make a PR to OSS more easily - Speaker Deck

ここ、ニュアンス結構ムズいんですけどね。
トーク後に呟いてた補足的な私見です。

個人的にはFIGの活動素晴らしいし、流行って欲しいし応援したいんですけど。
で、「強い人達が集まって良いものを作ってくれる」というところで、自分でオラオラするよりは信頼できるヒントがある・・という事で参考にしています。
他方で、↓でも触れたことがありますが、「必ずしもどうなん」みたいな話もある〜というのも理解できます。

daisuki.nichiyoubi.land

そんな感じなので、 「PSRが標準で、絶対だ!」ということはないぞ というのは、周りに勘違いしている人がいたら教えてあげてください・・・という気持ち。
(この記事のURLを共有するだけで良さそう PSRの誤解 - Qiita


ということで、「取り急ぎお返事」みたいなやつでした! 「反応してもらってるし自分の意見を返してぇ〜〜」って思いつつ、でも引用ツイートとかしたくねーな、って思いからこのタイミングでブログを書いてみたフシがあります。

では、引き続き PHPerKaigiです・・・!

おまけ的に宣伝

気が向いた時に「Cake縛りブログ」みたいのをやっていますので、何か「気になる!」とか「他の人どうしてるのか知りてぇ」みたいな話があったら、適当にIssueを立ててみてもらえると喜びます!必ずしも、全て拾えたりはしないと思いますが、自分の知識のアップデートしつつ・・