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

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

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

プロポーザル: https://fortee.jp/phperkaigi-2025/proposal/all?q=guri&f=all&l=

古いコードベースを読み解く作業はしばしば「ソフトウェア考古学」と呼ばれ、多くの人にとって大変で辛い作業と思われがちです。
しかし、サービスの歴史を辿ることで当時の設計思想や変化の過程を知ることができ、それ自体が良い設計を体験し、学べる貴重な機会でもあります。
私の実体験としても20年もの歴史のあるWebサービスの考古学からは学べることがたくさんありました。

本トークでは、新卒5年目エンジニアである私が、20年以上稼働し続けるWebサービスの改善に向き合う中で試行錯誤したことをお話しします。

お話すること

古いコードベースを読み解き改善を行った事例とその課題
Webメディアの広告運用のための管理画面改修
歴史の塊のバッチ処理をPerlからPHPに移行する
全体を知るための「鳥の目」と細部を観察するための「虫の目」の考え方
鳥の目で意図や構造を理解する作図ツールなどを使ったコードの読み方
虫の目で詳細を把握するためのデバッグ方法
「どこまで深掘りするか?」の判断基準
ソフトウェア考古学の経験から学んだこと
理解しやすいコードを書くコツ
自分が書いたコード、その後どうなった?上手く行ったこと、行かなかったこと
ソフトウェアの健全な変化を助けるドキュメントとは?

話さないこと

トークの中で出てくるツール自体の詳細な使い方
リファクタリングやデータ移行といったソフトウェア改善に伴う手順の詳細

聴いてほしい人

コードベースが古い環境で悩んでいる人
歴史のあるコードを改善したいと思っている人
プロダクションコードに初めて触れ、規模の大きさや複雑さに圧倒された経験のある新卒の人たち

CARTA Engineering

March 23, 2025
Tweet

More Decks by CARTA Engineering

Other Decks in Technology

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サービスと向き合って学んだソフトウェア考古学 ありがとうございました • ビジネスの要求に対応するためには古いコードの改善が必要 • 自身の持つメンタルモデルとのずれがコードの理解を難しくする •

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