PHPを始めて1年、レガシーシステムにどう向き合っているか #phpstudy

E1dbe585427fa87cbfb0f4dbcebc3b2f?s=47 mizuki_r
August 28, 2019

PHPを始めて1年、レガシーシステムにどう向き合っているか #phpstudy

2019-08-28 PHP勉強会 #140

E1dbe585427fa87cbfb0f4dbcebc3b2f?s=128

mizuki_r

August 28, 2019
Tweet

Transcript

  1. PHPを始めて1年、 レガシーシステムにどう向き合っているか 2019/08/28 PHP勉強会 #141 @mizuki_r

  2. @mizuki_r 弁護士ドットコム株式会社 税理士ドットコム事業部/開発チーム チームマネージャー 2 なにもの PHP, Vue, Nuxt, Management,

    Recruitment, etc…
  3. 今日話すこと

  4. 転職してそろそろ1年、 レガシーシステムにどう向き 合ってきたか

  5. これまでの経歴

  6. 経歴 サーバサイドエンジニア(Perl) ↓ フロントエンドエンジニア(AngularJS, Vue) ↓ テックリード兼フロントエンド兼サーバ兼インフラ ↓ (転職)開発マネージャー(PHP)

  7. 経歴 • これまで触ったWeb App Frameworks • Perl: Amon2, Mojo •

    Node: express, koa • DBとか • Perl: Teng, Aniki, DBIx • Node: Sequelize, TypeORM, mysql
  8. 個性 • ライトウェイトフレームワーク + 様々な モジュールの構成が得意 • パズルを組むのが好き • フルスタックフレームワークが苦手←

  9. レガシーシステムとは?

  10. レガシーシステムとは • 古いフレームワーク • 古いパラダイム • 積み重ねられた歴史的経緯 • 断絶した知識 •

    現在のビジネスモデルとシステムの乖離 • モダンとレガシー
 https://speakerdeck.com/rymizuki/modantoregasi-number-gotandaem
  11. 運用しているサービス

  12. 税理士ドットコム • 日本最大級の税理士/税務ポータルサイト • 税理士紹介、Q&A、ニュースなど • サービス開始: 2006年 • エンジニア:

    社員x1, 業務委託x5
  13. システム • PHP 7.3 • Yii 1.1.20 • jQuery(一部Vue, 一部TypeScript)

    • MySQL 5.6
  14. ビジネス • 税理士紹介サービス • 税理士検索サービス • 税務相談サービス(Q&A) • メディア、広告など •

    税理士が監修するものもある • etc
  15. 人がすくない\(^o^)/

  16. 課題

  17. 課題 • 使ってるかどうかもわからないルーティング • DBの知識があらゆるところに漏洩 • カラム50を超える重要なテーブル • 同じ目的で存在する複数のロジック •

    違う目的が共存する巨大なロジック
  18. れがしー!\(^o^)/

  19. 取り組み

  20. 課題 • フレームワークがEOL • フレームワークに依存したシステム • ミドルウェアに依存したシステム • ビジネスニーズとシステムの乖離

  21. フレームワークがEOL End Of Life なんだよ\(^o^)/

  22. フレームワークに依存したシステム • Routing, Request, Response, Session • あらゆるファイルに存在する Yii::app() •

    システム的な境界は存在せず、あえて言う ならWAFの制約のみ • アップデートが辛い
  23. ミドルウェアに依存したシステム • 特定のミドルウェアのバージョンとコード が密結合、分散しており、バージョンアッ プが困難 • DB構造がActiveRecordを通してViewに漏 洩している • SQLがあちこちでベタ書き

  24. ビジネスニーズとシステムの乖離 • みんなが頭の中で思い描くシステムが違う • ビジネス側が想像してるシステム • 開発側が認識しているシステム • 実際に動いているシステム •

    「こうしたい」という要望に対して、温度感やスケジュールが噛み 合わない • ビジネス側としては素早く判断して素早く動きたい要望でも、シス テム的に困難な場合がある
  25. どうすんのこれ \(^o^)/

  26. 対策 • ビジネス領域の整理 • Diの導入 • ロガーの抽象化 • DBレイヤの抽象化 •

    Web各レイヤの抽象化 • Routerの抽象化
  27. ビジネス領域の整理 • 言葉の認識違いを地道に埋めていく • よくやる変更・ワークフローを認知し、分析の範囲の 目処をつけていく • 将来的にやりたいことから大きめの改善の予定を切っ ていく •

    改修によって、ビジネス的な価値が最大化できるよう に計画にコミットする
  28. Diの導入 • Ray.Di • DiはFWから独立したものを使いたい • Interfaceを定義して、FWのシステムを隠 蔽する

  29. ロガーの抽象化 • `Yii::app()->log()` • 本当に至る所で使われている • Diを使ってLoggerのInterface経由でイン スタンスを注入する

  30. DB層の抽象化 • ActiveRecord or Yii::app()->db • ActiveRecordを使うまでもないようなSQLか、 ActiveRecordでは賄いきれない規模のSQL • SQLを直接書く

    or 外部のSQL Builderを使う • 自作した: https://github.com/rymizuki/ coral-sql
  31. DB層の抽象化 2 (予定) • Repository層からのDBアクセスの隠蔽 • Specifiction Patternによる条件の抽象化 • Data

    Access層を作り、SQL関連の処理を隠蔽 • unitテストを回してスキーマ変更を検知でき るようにする
  32. 各Web層の抽象化 • Controller層ではYiiを使う • Controllerからビジネスロジックを呼び出し、ビジ ネスロジックはYiiを使わない • UseCase/Interaction/Repository • Response(Renderer)は現状PHPだが、他のライブ

    ラリに差し替えられるようにInterfaceで抽象してお く
  33. Routerの抽象化 • ルーティングライブラリを差し替える(予 定) • 謎不要なルールなども残っており整理を始 める

  34. なんとかできそう \(^o^)/

  35. 1年やってみて • PHP 7系は型が示せてハッピー • ドキュメントは公式を見ろ、PSRを把握しておけ • リクエスト単位でスコープが切られている • expressとかより抽象化しやすい

    • 地道にやっていきの気持ち
  36. まとめ • レガシーシステムに対する取り組みをご紹 介しました • 地道にやってくしかない

  37. ご清聴ありがとうございました