PHPerKaigi 2023 に40分レギュラートークで登壇した。
(プロポーザル / スライド / 動画)
トークの中で紹介した記事や後日頂いたフィードバックのURL、また登壇のモチベーションや失敗談などを紹介する。
スライド中で紹介した記事やURL
- History of Laravel - Qiita
- CodeIgniter へようこそ — CodeIgniter 3.2.0-dev ドキュメント
- アプリケーションのひな型を生成 - railsコマンド(rails) | Railsドキュメント
- Ruby (off|with) the Rails (Shinpei Maruyama) - builderscon tokyo 2019
- Ruby (off|with) the Rails - Speaker Deck
- 5年間 Laravel を使って辿り着いた,全然頑張らない「なんちゃってクリーンアーキテクチャ」という落としどころ
- 第150回 PHP勉強会@東京 #phpstudy - YouTube
- Eloquentとクエリビルダを両方使った実装の失敗例 - 第150回 PHP勉強会 #phpstudy - Speaker Deck
- https://twitter.com/taylorotwell/status/1560020999378292736
- [10.x] Uses PHP Native Type Declarations 🐘 by nunomaduro · Pull Request #6010 · laravel/laravel
- [10.x] Uses PHP Native Type Declarations 🐘 by nunomaduro · Pull Request #44545 · laravel/framework
- https://twitter.com/taylorotwell/status/1592227118481805312
- Laravel 10 Application Skeleton Code Will Have Native Type Declarations | Laravel News
- Laravel 10 / Release Notes - Laravel - The PHP Framework For Web Artisans
- https://twitter.com/dillinghamdev/status/1626989292227551232
- Laravel Daily - YouTube
- https://twitter.com/taylorotwell/status/1626987187274129408
- https://twitter.com/taylorotwell/status/1626987508369178624
- Use mixed return type on controller stubs by taylorotwell · Pull Request #46166 · laravel/framework
登壇に言及いただいたブログ記事など
- PHPerKaigi 2023に初参戦してきました! | ランサーズ(Lancers)エンジニアブログ
- PHPerKaigi2023に参加してきたよ - テコテック開発者ブログ
- PHPerKaigi 2023にコアスタッフとして參加しました - muno_92の日記
- PHPerKaigi 2023 に参加しました! #phperkaigi - がんばるぞ
- PHPerKaigi 2023に3名のメンバーが登壇・プラチナスポンサーとして協賛しました - BASEプロダクトチームブログ
- PHPerKaigi2023に参加しました - Qiita
- PHPerKaigi2023参加レポート
- 【PHPerKaigi】オフラインカンファレンスの魅力 - Qiita
- PHPerKaigi 2023に参加しました & 登壇しました #phperkaigi - 大好き!にちようび
- hanhan’s blog - PHPerKaigi 2023 Day 2 参加記録
- PHPerKaigi2023で「PsySHを使った効率的なデバッグ方法について」を発表しました - Endo Tech Blog
※ページタイトル50音順。こちらに掲載されていない記事をご存知の方は是非ともお知らせ下さい。追加させて頂きます。
登壇のモチベーション - 開発の効率化
コードの意図を理解し、人に伝える労力を最小限にしたい。これがモチベーションだ。
これまで数多くのPHP案件に関与してきた。自分が参加する時も他者に参加してもらう時も、既存コードを理解するのに一定の時間が必要となる。これは避けられないことだが、開発チームのスケーラビリティも重要だ。タスクが山積みで人手が欲しい時、人を増やすこと自体は可能でも、新しいメンバーと情報を共有する手間が問題となることがある。この部分のコストを抑えられれば開発がより効率的になると考えていた。
そんな時、Ruby on Railsでの開発に次々と関わる機会があった。新メンバーが加わった際の立ち上がりの速さに驚いた。
新しく参加したメンバーが、ドメイン知識は別としてコードベースの知識で経験豊富なメンバーと対等に議論する様子を何度も目にした。最初はその人の能力によるものかと思ったが、それだけではなさそうだった。全員が平均的に速いのだ。
何が違うのだろうと思い Ruby on Rails チュートリアル を実践してみた。すぐに理由が解った。APIリファレンスやサンプルコードでは説明しきれない、Rails開発の「型」のようなものが明確に示されていた。他のメンバーに聞いてみると、ほとんど全員がこのチュートリアルから学んでいることが解った。
LaravelにもRails Tutorialみたいな、とりあえずこれやっとけ的なやつが欲しい
https://b.hatena.ne.jp/entry/4734153958419525444/comment/hate_nao
このチュートリアルは初学者にとって有益でありながら、Ruby on Railsでコードを書く際のベストプラクティスも示してもいる。確かにLaravelにはこれに相当するコンテンツが無い。これが、RailsとLaravelとの間で発生する「キャッチアップの所要時間の差」の正体と理解した。
幸いなことに自分の手元にはレビュアーとして書いた文章の蓄積や過去に書いたblog記事がある。それらを再編し発表し洗練することで、問題に対処できると考えた。これが登壇のモチベーションだ。
Laravelの設計 - それでもLaravelを使う理由
登壇の冒頭でLaravelに対する厳しい意見を紹介した。また途中でFacadeの注意点にも触れた。OOP原則から見て適切とは言い難い実装が数多く存在すると私も考えている。
これらの機能を一切使わず「正しい」コードを書く選択ももちろん有効だ。しかしそうすると前述の課題にぶつかってしまう。プロジェクトごとの「流儀」が生まれてしまうのだ。例えばこんな具合に。
Storage
ファサードを使う。interface Filesystem
をDIコンテナで解決する。league/flysystem
を直接使う。- 独自実装する。
「このLaravelとあのLaravel、全く別物じゃないか。」は私が以前書いた記事の冒頭の一節だ。要はこれを避けたいのだ。
つまり私の主張は、プログラムの正しさより局所的なプロダクト開発効率を優先した1つの形と言える。単一の自社プロダクトをある程度固定されたメンバーだけで開発している場合など、必ずしも Laravel Way を突き詰める必要のない状況も存在するため、そこは各位、適切に使い分けて欲しい。
※余談だが、開発が真に効率化され偶有的困難さからプログラマーは開放されそこで空いた時間をより本質的な設計などに使うことで、開発の効率化がゆくゆくはプログラムの正しさに還元されるとも考えている。この点は意見が分かれるかもしれない。
登壇タイトルと反省点
ここから先はプログラム成分ゼロの趣味の文章。古典映画やカルト映画が好きな方向け。
鬼才、スタンリー・キューブリックの伝説的映画「博士の異常な愛情」が登壇タイトルの元ネタだ。
半世紀以上前のモノクロ映画だ。知っている人はそう多くないだろうと予想してはいたが、それにしても見込み違いだった。
あらすじ
冒頭にアメリカ空軍による「映画はフィクションであり、現実には起こりえない」との趣旨の解説が流れる。
物語の構造はこうだ。
- 前提としてフィクションである。物語の鍵を握る人物は全員が異常者である。
- 笑うしかないようなあり得ない出来事が劇中で起こり続ける。結果、世界は滅びる。
- このフィクションで描かれる冗談のような世界は、現実より現実味を帯びている。
冗談のような現実にどう向き合うか、この着想と共に「降りてきた」のが今回の登壇タイトルだった。
OOP原則に則ったコードを息を吐くように書ける人にとってLaravelというフレームワークは何かたちの悪い冗談に見えているはずだ。一方でそんなフレームワークが人気トップという奇妙な現実も存在する。
そんなLaravelに対する純度100%のポジショントークをキューブリックの映画になぞらえたタイトルとともに展開するという、要はネタなのだが、そうではない真正面からの高評価を多く頂いてしまった。大変ありがたいと同時に、複雑な心境でもある。次回はせめて国内作品から登壇タイトルを着想したいと思う。