Upgrade to Pro — share decks privately, control downloads, hide ads and more …

新卒から4年間、20年もののWebサービスと 向き合って学んだソフトウェア考古学

guri
March 23, 2025

新卒から4年間、20年もののWebサービスと 向き合って学んだソフトウェア考古学

guri

March 23, 2025
Tweet

Other Decks in Programming

Transcript

  1. 株式会社CARTA HOLDINGS ⼩栗 ⼤輝 ぐり X: @_guri3 略歴 • 2020年新卒⼊社

    • 20年もののWebサービスのリアーキテクチャ プロジェクト 関連書籍 過去スライド 配属⾯談にて レガシーシステムの改善をやってる チームがあるんだけど、どう? 面白そう!やってみます! CARTA本 第3章 「VOYAGE MARKETING 20年級大規模レガシーシステムとの戦い」 に登場する話と地続きのお話
  2. 新卒から 4年間、 20年ものの Webサービスと向き合って学んだソフトウェア考古学 20年もののWebサービスの中⾝ 様々な年代に書かれたコードや技術選定の結果が並行運用されている • Perlで書かれた旧システムとPHPで書かれた新システム • Oracle

    DatabaseとMySQLの共存 • 年代によって変わる実装方針の混在 • テストコードが存在しない 2つの言語を行き来しつつ理解。 PHPでも10年前のコードはずいぶん書き味が違うな...
  3. 新卒から 4年間、 20年ものの Webサービスと向き合って学んだソフトウェア考古学 20年もののWebサービスの中⾝ 様々な年代に書かれたコードや技術選定の結果が並行運用されている • Perlで書かれた旧システムとPHPで書かれた新システム • Oracle

    DatabaseとMySQLの共存 • 年代によって変わる実装方針の混在 • テストコードが存在しない こっちのテーブルはOracle、あっちのテーブルはMySQL。 頭が混乱するよ〜
  4. 新卒から 4年間、 20年ものの Webサービスと向き合って学んだソフトウェア考古学 20年もののWebサービスの中⾝ 様々な年代に書かれたコードや技術選定の結果が並行運用されている • Perlで書かれた旧システムとPHPで書かれた新システム • Oracle

    DatabaseとMySQLの共存 • 年代によって変わる実装方針の混在 • テストコードが存在しない 手続き的に書かれているコードもあればオブジェクト指向的に書かれているコードもある。 フレームワークなんてありません。スクリプトのmain関数実行!!とか
  5. 新卒から 4年間、 20年ものの Webサービスと向き合って学んだソフトウェア考古学 20年もののWebサービスの中⾝ 様々な年代に書かれたコードや技術選定の結果が並行運用されている • Perlで書かれた旧システムとPHPで書かれた新システム • Oracle

    DatabaseとMySQLの共存 • 年代によって変わる実装方針の混在 • テストコードが存在しない ガードレールがないので、変更によってどこが壊れるかわからない不安が常に付きまとう
  6. 新卒から 4年間、 20年ものの Webサービスと向き合って学んだソフトウェア考古学 リアーキテクチャにおいて、既存システムの把握は重要 • 既存の問題点を正しく認識しないと改善に繋がらない ◦ 何を解決すれば現状よりよくなったと言える? ◦

    表面的なコードだけでなくなぜそうなっているのかの意図も重要 • 開発時のスコープや設計方針の意思決定の材料 ◦ 今ある資産はどこまで使える? → 開発工数に大きく影響する • ビジネスロジックの抜け漏れが起きかねない ◦ 移行後のシステムでは業務が回せない!?なんてことにも
  7. 依存関係などから大きな構造を読み解く @startuml namespace Controller { class HogeController { } }

    namespace Function1 { class ServiceFactory { } interface ServiceInterface { } namespace Hoge { class HogeService { } } namespace Poyo { class PoyoService { } } } HogeController ..> ServiceFactory ServiceFactory --> ServiceInterface HogeService --|> ServiceInterface ~~~ @enduml わかりやすいデザインパターン(Factory) どういう意図で設計したんだろう?
  8. 依存関係などから大きな構造を読み解く @startuml namespace Controller { class HogeController { } }

    namespace Function1 { class ServiceFactory { } interface ServiceInterface { } namespace Hoge { class HogeService { } } namespace Poyo { class PoyoService { } } } HogeController ..> ServiceFactory ServiceFactory --> ServiceInterface HogeService --|> ServiceInterface ~~~ @enduml あー、この辺を抽象化して実行時に使い分け したかったんだなー
  9. 03. 具体的な進め方 データのインプット / アウトプットの把握 • インプットとアウトプットの情報を元にER図を書き起こす • テーブル間の関係性に注目 ◦

    ECナビの古いテーブルには外部キーが存在しない😭 ▪ IDEで出力したりしても何もわからない ◦ 命名や、データの入力時の挙動などで関係性を想像して書く
  10. 03. 具体的な進め方 プリントデバッグとデバッグツール 使い分けイメージ 詳細度 低 遅 速 高 スピード

    脳内インタプリタで実行 手軽で速いが詳細を追ってくと認知負荷が高い
  11. 03. 具体的な進め方 プリントデバッグとデバッグツール 使い分けイメージ 詳細度 低 遅 速 高 スピード

    var_dumpなどを利用して特定の値の遷移を知る 少し手間が増えるがより詳細を追うことができる
  12. 03. 具体的な進め方 プリントデバッグとデバッグツール 使い分けイメージ 詳細度 低 遅 速 高 スピード

    PsySHやXdebugなどのデバッグツールを利用 プロジェクトによっては下準備が必要 さらに詳細を追うことができる
  13. 03. 具体的な進め方 プリントデバッグとデバッグツール • 脳内インタプリタで実行       ↓ 頭の中だけでは把握し切れない • var_dumpなどを利用して特定の値の遷移を知る ↓

    特定の場面の複数の状態が絡み合っている • PsySHやXdebugなどのデバッグツールを利用 メンタルモデルとズレていればいるほど より詳細を追いすり合わせることが必要
  14. 03. 具体的な進め方 プリントデバッグとデバッグツール • 脳内インタプリタで実行       ↓ 頭の中だけでは把握し切れない • var_dumpなどを利用して特定の値の遷移を知る ↓

    特定の場面の複数の状態が絡み合っている • PsySHやXdebugなどのデバッグツールを利用 使い慣れているツールがあればあまり変わらないかも どの程度メンタルモデルとのずれが生じているかを意識することが大事
  15. 新卒から 4年間、 20年ものの Webサービスと向き合って学んだソフトウェア考古学 ソフトウェア考古学の経験から学んだこと • 理解しやすいコードを書くコツ ◦ 前提としてあるべき姿に常にシステムが追従しているのが一番 ◦

    歴史を学ぶ中で変更が多い場所、作ったきり変更されにくい 場所がだんだんわかってくる ▪ 最初から変更を考慮した設計にできれば設計思想の乖離 が起こりづらい
  16. 新卒から 4年間、 20年ものの Webサービスと向き合って学んだソフトウェア考古学 ソフトウェア考古学の経験から学んだこと • 意思決定の記録が残っているとわかりやすい ◦ 常に最新に更新されているドキュメントでなくても良い ◦

    詳しく仕様が書いてあるよりもなぜそうしたか?の方が大事 • メンタルモデルにずれが発生しそうな部分への予防 ◦ どうしても根本対応仕切れなかった仕様改修箇所に積極的にコメントを書く
  17. No day but TODAY CARTA HOLDINGSについて 約 53% 電 通

    (株) VOYAGE GROUP 約 47% 既存株主 事業例 サービス例 CARTA HOLDINGSについて
  18. 新卒から 4年間、 20年ものの Webサービスと向き合って学んだソフトウェア考古学 ありがとうございました • ビジネスの要求に対応するためには古いコードの改善が必要 • 自身の持つメンタルモデルとのずれがコードの理解を難しくする •

    「鳥の目」で全体把握、「虫の目」で詳細を把握 • ソフトウェア考古学で変更の傾向を学ぶことができる 学んだことを設計に反映する • 意思決定についてのスナップショットが有効 メンタルモデルとの乖離や驚きが生まれそうなところに コメントが補足されていると理解しやすい