どんなイベント?
PHPer界隈のカンファレンスに参加したら一度はお世話になっているであろう「fortee」を題材に、PHPの匠による改善ビフォーアフターをお楽しみいただけるイベントです。
大改修!PHPレガシーコードビフォーアフター - connpass
セッション
メルカリ様セッション(@suzuki)
今回の会場はメルカリ様にご提供いただいており、更にドリンクまで提供いただきました!
森ビルは初で今後行くこともあまりないと思うので、レアな体験になりました…!
ありがとうございます!
Twitter検索
- 価値を生み出しているレガシーコードを、「レジェンドコード」という。
- namespaceを使っていなかったり、Fat Controller/Modelだったりと負債があった。
- まずはテストがあったのでリファクタリングで対応していた。
- リファクタリングだけでは辛くなってきたのでマイクロサービス化に舵を切った。
- メルカリではマイクロサービスをテンプレート化することで簡単に立ち上げられるようになっている。
テストコードがあることの重要性っていうのがサービスが大規模になるにつれて効果を発揮していきますね。
テストコードがないと、「レジェンド」だからこそその生み出している価値を壊す可能性がある行為を取りづらくなってしまうので…。
独立したコアレイアパターンの適用(@shin1x1)
Twitter検索
独立したコアレイヤパターンの適用 - fortee 編 - / fortee-meets-independent-core-layer-pattern - Speaker Deck
- Port&Adaptersは、USBのように刺さるものは何であっても大丈夫。
- 極力FWに依存しないようにコアの部分を独立させる。
- ただしFWに依存してもよいと自分で判断したなら依存させてもよい。(Carbonとか)
- PhpStormを使ったライブコーディング
- コントローラロジックをとりあえずそのままユースケースを切り出す。
- まずはユースケースに必要なものは引数で受け取り、Httpレスポンスに必要なものは戻り値にする。
- FWのExceptionは自分で定義しなおす。
- TestCaseもFWで拡張している基底クラスではなく素のPHPUnitを使うことでFW依存させなくする。
- Adapterはテスト用にテストコード内で無名クラスを作る方法もある。
- 「0 or 100」ではなく、漸進的にリファクタリングする。
- 適用する箇所を絞る。(副作用のある箇所だけなど)
PhpStormめちゃくちゃ便利そうで欲しくなりました。
単純なコンストラクタやGetterを作るのは人間のやる仕事じゃないというのはとてもわかりみが深いですね…。単純だけどミスりやすいっていうのもありますし。
PHP7.4のtyped propertyで会場が「おおーー!!」って盛り上がっていて面白かったです。
静的解析 (@tadsan)
Twitter検索
「PHPプロジェクトに静的解析を新規導入する」 #phperkaigi|tadsan|pixivFANBOX
- 静的解析をすることでエラーとして顕在化していない「たまたま動いてるコード」の問題点を炙り出せる
- PHPStanならCIで差分を見れる。
- 「Phan Docker」で出てくるDockerImageは古いから使っちゃダメ。
- baselineを一度取って、その後に「これ以上増やさないでくれ」ということができる。
- issetの中などぱっと見エラーにならないところもある。
- 地道なものを地道に潰していくのが大切。
静的解析はやらねば…と思ってるけどまだやっていない。
「たまたま動いてるコード」の問題点を炙り出せるというのは、静的コンパイルが出来ないPHPで安全性をなるべく高めるためには必要だろうなと思う。
baselineを一度取って、その後に「これ以上増やさないでくれ」と制約をつけるのはあとから導入するときに周りの理解は得られやすそう。
Vaddyによる脆弱性分析(@cakephper)
Twitter検索
- VAddyでは脆弱性診断対象サイトを登録して、ユーザがproxyを使った状態で当該サイトを巡回(クロール)することでシナリオを作成する。
- 自分で所有しているサイトのみ診断できる。海外ユーザがFacebookとかに診断かけようとしてるらしいけど、そういうのはNG。
- パラメータ毎にXSSやSQLインジェクションなどの検査を行う。
- forteeでは1件の脆弱性が見つかった。(本番は修正済み)
- ツールじゃ見つけにくい脆弱性(仕様なのか脆弱性なのか判断が必要なもの)もある。
- 認可の不備
- ログ出力不備
- 複雑な攻撃経路
- Mass Assignment
- 長谷川さん「僕も素人じゃないんでね」
脆弱性解析は、そういうツールがあるのは知っていたけど実際の利用イメージがなかったので参考になりました。
結構機械的な脆弱性検査って自分でやるにはコスパが悪く、結局試験項目としては上がらないものになりがち。
テストも人間が必要なところに関心を分離させて、ツールで見つけやすい脆弱性と見つけにくい脆弱性をそれぞれ分担を分けるのが良いんだろうなと思います。
レガシーなWebアプリケーションと向き合う(@blue_goheimochi)
Twitter検索
レガシーなWebアプリケーションと向き合う
- レガシーソフトウェア改善ガイドによれば、レガシーと言っても種類がある。
- レガシーコードへの対応はいくつかある。
- 「レガシーさ」には、計測できるものとできないものがある。
- 計測できるレガシーさはコードの大きさや重複、循環的複雑度などがある。定量的に測れるのでアプリの健康診断的な感じ。
- 計測できないレガシーさは、
// ここのコードは変更しないこと
みたいなやつとか。
- コピペコードは必ずしも悪ではないが、phpcpdなどで検知したら目視確認をして判断する。
- 部分的にリファクタリングをしていく。一番重要なところを守るためにE2Eテストを書く。全部網羅するのはつらい。
コードの重複を検出したら、共通化していない理由とか他の人が判断できるようなコメントを書き残すとかがいいのかなと思いました。
コードを書いた人は「これは別の概念だからコードも別にして、重複してもやむなし」と考えていたのに、その思想が他の人に伝わらないと後で勝手にまとめられて事故ることも起きそうですよね。
コードの重複が可視化される弊害というか……。
ごへいもちさんはしずかなトーンで笑いを取っていくところがプロですね!
Forteeをバージョンアップしてみた(@yakitori009)
Twitter検索
Forteeをバージョンアップしてみた - Speaker Deck
- 最初にバージョンアップ成功したか判断するためのユニットテスト/E2Eテストを作る。
- E2Eテストはコストがかかる。作って維持する覚悟があるか。
- まずはcomposer updateでマイナーバージョンを1つずつ上げていく→テストを動かす、というのを繰り返す。
- 自動アップデートツールは必ずしも簡単にアップデートできるというわけではない。まれによく事故る。
- PHPのバージョンアップの場合も同様にテストをしてアップデート結果を確認する。
- PHP7.4からcompactに未定義変数を渡すとE_NOTICEが出るようになったが、実は静的解析ですでに検出されていた。
- ランサーズのCM #採用やめよう で誤解されて採用しづらくなった。
滑らかなバージョンアップのためにはE2Eテストコードやらユニットテストやらないと確からしさは得られないから必要ですというのは再認識しました。
テストさえあれば一つずつ上げていけばどうにか出来るけど、テストがなければ上がったことの影響を一つ一つ手探りでやらなくちゃいけないのがつらいですよね…。(めちゃくちゃ心当たりがある)
compactってかなり事故起こりやすいですよね。
PHP7.4になって未定義変数の警告が出るようになったけど、それ以前は出なかったし、そもそも文字列で扱いにくいだとか……。
感想
最後の登壇者トークは、みなさんのトークスキルの高さが高く、参考になることがポンポンとでてきて面白かったです。
養殖物のコードよりも天然物のコード、例にするなら天然物の方が理解しやすいだとか、作ったからと言って無理して使い続ける必要はなくて、捨てるのも選択肢だとか。
次回開催の雰囲気もあったので、楽しみにしています!
余談
6階に喫煙所があると聞き、試しに特攻してみたのは私です。
一緒に行った方と「確か6階でしたよね?」「帰り18階って忘れないようにしないとですねー」みたいな話をしつつ、6階に到着。
降り立ってみれば左右にあからさまにロックがかかってそうなドアがあり、試しにドアノブをひねってみると開くようだった。
直感で「これ内側から開けられない扉なのでは?」と不安になり、同行してた他の方に一回ドアの外に出てもらい、外から開けられるか試したら開いたので安心してドアを通過した。
エレベーターホールから出てみると、右にはゲート。左にもゲート。道の先にはゲートしかなく、我々に進めない。
実は喫煙所に行くためにはビルカードが必要そうで、諦めて戻るかと思った矢先、さっきは開いたドアが開かない……。
さっき開いたのはドアを閉めてからロックされるまでの待機時間に被っていたらしく、エレベータも使えないため会場にも戻れないという詰んだ状態になったが、そこに救いの手を差し伸べてくださったのが警備員さんだった。
ちなみにエレベーターホールに戻れたとしても、エレベータ自体に認証機能があり戻れないのに変わりはなかったそうだ。
本当にありがとうございます🙏🙏