2019-08-28 PHP勉強会 #140
PHPを始めて1年、レガシーシステムにどう向き合っているか2019/08/28 PHP勉強会 #141@mizuki_r
View Slide
@mizuki_r弁護士ドットコム株式会社税理士ドットコム事業部/開発チームチームマネージャー2なにものPHP, Vue, Nuxt, Management,Recruitment, etc…
今日話すこと
転職してそろそろ1年、レガシーシステムにどう向き合ってきたか
これまでの経歴
経歴サーバサイドエンジニア(Perl)↓フロントエンドエンジニア(AngularJS, Vue)↓テックリード兼フロントエンド兼サーバ兼インフラ↓(転職)開発マネージャー(PHP)
経歴• これまで触ったWeb App Frameworks• Perl: Amon2, Mojo• Node: express, koa• DBとか• Perl: Teng, Aniki, DBIx• Node: Sequelize, TypeORM, mysql
個性• ライトウェイトフレームワーク + 様々なモジュールの構成が得意• パズルを組むのが好き• フルスタックフレームワークが苦手←
レガシーシステムとは?
レガシーシステムとは• 古いフレームワーク• 古いパラダイム• 積み重ねられた歴史的経緯• 断絶した知識• 現在のビジネスモデルとシステムの乖離• モダンとレガシー https://speakerdeck.com/rymizuki/modantoregasi-number-gotandaem
運用しているサービス
税理士ドットコム• 日本最大級の税理士/税務ポータルサイト• 税理士紹介、Q&A、ニュースなど• サービス開始: 2006年• エンジニア: 社員x1, 業務委託x5
システム• PHP 7.3• Yii 1.1.20• jQuery(一部Vue, 一部TypeScript)• MySQL 5.6
ビジネス• 税理士紹介サービス• 税理士検索サービス• 税務相談サービス(Q&A)• メディア、広告など• 税理士が監修するものもある• etc
人がすくない\(^o^)/
課題
課題• 使ってるかどうかもわからないルーティング• DBの知識があらゆるところに漏洩• カラム50を超える重要なテーブル• 同じ目的で存在する複数のロジック• 違う目的が共存する巨大なロジック
れがしー!\(^o^)/
取り組み
課題• フレームワークがEOL• フレームワークに依存したシステム• ミドルウェアに依存したシステム• ビジネスニーズとシステムの乖離
フレームワークがEOLEnd Of Lifeなんだよ\(^o^)/
フレームワークに依存したシステム• Routing, Request, Response, Session• あらゆるファイルに存在する Yii::app()• システム的な境界は存在せず、あえて言うならWAFの制約のみ• アップデートが辛い
ミドルウェアに依存したシステム• 特定のミドルウェアのバージョンとコードが密結合、分散しており、バージョンアップが困難• DB構造がActiveRecordを通してViewに漏洩している• SQLがあちこちでベタ書き
ビジネスニーズとシステムの乖離• みんなが頭の中で思い描くシステムが違う• ビジネス側が想像してるシステム• 開発側が認識しているシステム• 実際に動いているシステム• 「こうしたい」という要望に対して、温度感やスケジュールが噛み合わない• ビジネス側としては素早く判断して素早く動きたい要望でも、システム的に困難な場合がある
どうすんのこれ\(^o^)/
対策• ビジネス領域の整理• Diの導入• ロガーの抽象化• DBレイヤの抽象化• Web各レイヤの抽象化• Routerの抽象化
ビジネス領域の整理• 言葉の認識違いを地道に埋めていく• よくやる変更・ワークフローを認知し、分析の範囲の目処をつけていく• 将来的にやりたいことから大きめの改善の予定を切っていく• 改修によって、ビジネス的な価値が最大化できるように計画にコミットする
Diの導入• Ray.Di• DiはFWから独立したものを使いたい• Interfaceを定義して、FWのシステムを隠蔽する
ロガーの抽象化• `Yii::app()->log()`• 本当に至る所で使われている• Diを使ってLoggerのInterface経由でインスタンスを注入する
DB層の抽象化• ActiveRecord or Yii::app()->db• ActiveRecordを使うまでもないようなSQLか、ActiveRecordでは賄いきれない規模のSQL• SQLを直接書く or 外部のSQL Builderを使う• 自作した: https://github.com/rymizuki/coral-sql
DB層の抽象化 2 (予定)• Repository層からのDBアクセスの隠蔽• Specifiction Patternによる条件の抽象化• Data Access層を作り、SQL関連の処理を隠蔽• unitテストを回してスキーマ変更を検知できるようにする
各Web層の抽象化• Controller層ではYiiを使う• Controllerからビジネスロジックを呼び出し、ビジネスロジックはYiiを使わない• UseCase/Interaction/Repository• Response(Renderer)は現状PHPだが、他のライブラリに差し替えられるようにInterfaceで抽象しておく
Routerの抽象化• ルーティングライブラリを差し替える(予定)• 謎不要なルールなども残っており整理を始める
なんとかできそう\(^o^)/
1年やってみて• PHP 7系は型が示せてハッピー• ドキュメントは公式を見ろ、PSRを把握しておけ• リクエスト単位でスコープが切られている• expressとかより抽象化しやすい• 地道にやっていきの気持ち
まとめ• レガシーシステムに対する取り組みをご紹介しました• 地道にやってくしかない
ご清聴ありがとうございました