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

技術的負債を正しく理解し、正しく付き合う #phperkaigi / PHPerKaigi 2025

shogogg
March 22, 2025

技術的負債を正しく理解し、正しく付き合う #phperkaigi / PHPerKaigi 2025

2025年3月20-22日に中野セントラルパークカンファレンスで開催された PHPerKaigi 2025 DAY-2 登壇資料です。

shogogg

March 22, 2025
Tweet

More Decks by shogogg

Other Decks in Technology

Transcript

  1. 河瀨 翔吾 / Shogo Kawase 株式会社 PR TIMES ソフトウェアエンジニア シン・アジャイルコミュニティ 運営メンバー I

    LOVE... 型安全 / アジャイル / F1 / ももいろクローバーZ shogogg shogogg 自己紹介
  2. Photo: Carrigg Photography, CC BY-SA 3.0, via Wikimedia Commons •

    WikiWikiWeb の開発者 • アジャイルソフトウェア開発宣言 に署名した17人の1人 • 技術的負債という概念の生みの親 ※諸説あり Ward Cunningham
  3. • Ward Cunningham の語る「負債のメタファー 」は、今日我々が イメージする「技術的負債 」よりも限定的な概念である。 • その後、このメタファーがあちこちで引用されていった結果、 「技術的負債

    」という言葉が定着し、解釈も拡大していった。 • そのため一般的な原理・原則等と異なり、学術的かつ統一された 定義というものは実は存在しない 。 技術的負債とは
  4. • コードが十分に整理されていない・ドキュメントが未整備 ➡ 何が書いてあるのか読み取るのが困難 ➡ どこに何があるのか・どれが何なのかわからない • ライブラリやランタイムのバージョンが古いまま放置されている ➡ 便利な新機能などが導入できない

    ➡ 脆弱性などが発覚してもすぐに対応できない • テストが自動化されていない ➡ 変更の度に手動で大量のリグレッションテスト ➡ テスト漏れが生じるリスク 変更容易性が低い状態の例
  5. • ビジネスにおいてリスクは必ずしも避けるべきものではなく、 適切に管理 すべきもの。 • 負債=借金もその内のひとつ 。もちろん借金には様々なリスクが 伴うが、それによって大きな成長に繋げることもできる。 • 技術的負債

    も同様で、過度に回避しようとするあまり、機動性や スピードを犠牲にしすぎると、逆にそれがネックとなる。 負債のリスクを把握し、適切にコントロールすることが重要 。 • 技術的負債 はビジネス的なリスクである。つまり開発者だけの問 題ではなく、組織全体で理解し、立ち向かう必要がある 。 技術的負債=リスク=悪?
  6. class User { var $_name; function __construct($name) { $this->_name =

    $name; } function getName() { return $this->_name; } } PHP 4 時代のクラス プロパティに可視性がなく ”_” で始まる名前は内部用、という慣習 もちろん Property Promotion なんてない 引数も戻り値も型は指定できない
  7. この10年での PHP の進化(抜粋) • NULL 合体演算子(PHP 7.0) • スカラー型宣言(PHP 7.0)

    • 戻り値の型宣言(PHP 7.0) • 型付きプロパティ(PHP 7.4) • アロー関数式(PHP 7.4) • 配列スプレッド演算子(PHP 7.4) • 名前付き引数(PHP 8.0) • アトリビュート(PHP 8.0) • match 式(PHP 8.0) • nullsafe 演算子(PHP 8.0) • Property Promotion(PHP 8.0) • enum 型(PHP 8.1) • never 型(PHP 8.1) • スプレッド演算子の連想配列対応(PHP 8.1) • Readonly Propperty(PHP 8.1) • Readonly Class(PHP 8.2) • プロパティフック(PHP 8.4) • 非対称可視性(PHP 8.4)
  8. 消えていった(消えそうな)機能の例 • ereg 関数(PHP 5.3 で非推奨、PHP 7.0 で削除) • mysql_*

    関数(PHP 5.5 で非推奨、PHP 7.0 で削除) • mcrypt 拡張(PHP 7.1 で非推奨、PHP 7.2 で削除) • 動的プロパティ(PHP 8.2 で非推奨) • 暗黙的な nullable パラメータ(PHP 8.4 で非推奨)
  9. Laravel 4.2 ➡ 5.0 で起きたこと • ディレクトリ構成の大幅な変更 • Contracts(インターフェース)の導入 •

    フィルターの廃止・ミドルウェアの導入 • FormRequest の導入 • Form/HTML ヘルパーの廃止 • (ここに書き切れないその他たくさんの変更)
  10. Laravel 4.2 ➡ 5.0 で起きたこと • ディレクトリ構成の大幅な変更 • Contracts(インターフェース)の導入 •

    フィルターの廃止・ミドルウェアの導入 • FormRequest の導入 • Form/HTML ヘルパーの廃止 • (ここに書き切れないその他たくさんの変更)
  11. • フレームワークやライブラリを導入することで、短期的には開発速度の 向上が望める。 • 人気のフレームワークなら人材の確保 でも有利。 • ただし、どんなフレームワーク・ライブラリにも破壊的変更 や開発終了 のリスクがあるし、人気がいつまで続くかもわからない。

    • 一度導入すれば継続的なバージョンアップ作業 にも工数が掛かる。 (放置すると脆弱性が見つかった時にすぐに対応できない場合も……) • それらの技術を得意とするメンバーの離職 などによってメンテナンス不 能に陥り、一気に負債化するケースも。 フレームワーク・ライブラリの導入
  12. • ビジネスにおいてリスクは必ずしも避けるべきものではなく、適 切に管理すべきもの。 • 負債=借金もその内のひとつ。もちろん借金には様々なリスクが 伴うが、それによって大きな成長に繋げることもできる。 • 技術的負債 も同様で、過度に回避しようとするあまり、機動性や スピードを犠牲にしすぎると、逆にそれがネックとなる。

    負債のリスクを把握し、適切にコントロールすることが重要 。 • 技術的負債はビジネス的なリスクである。つまり開発者だけの問 題ではなく、組織全体で理解し、立ち向かう必要がある。 おさらい:技術的負債=リスク=悪?
  13. • 機能追加や修正の度に影響範囲を調べ、手動でテストをするのはとても大 変な作業。プロダクトが大きくなればなるほどそのコストは増大 。 • ランタイムやフレームワーク、ライブラリのバージョンアップ作業は影響 範囲が大きくなりがち。 (全体のリグレッションテストを手動で……?😱) • 自動テストを導入

    することで、機能追加はもちろん、ランタイムのバー ジョンアップなども短時間かつ自信を持って 行うことができるようにな る。 • もちろん継続的インテグレーション(CI) もご一緒に。 自動テストを導入する
  14. • 腐敗防止層: 外部やレガシーシステムの複雑さを吸収し、内部をクリー ンに保つための設計パターン。 • 外部依存との間に: 依存するパッケージや外部 API などとの間に抽象化 された腐敗防止層を置くことで、破壊的変更への対応や、将来的な乗り

    換えが容易 になる。 • レガシーコードとの間に: 新しい機能を開発する際、レガシーコードを 直接参照せずに腐敗防止層を挟むことで、新しいコードをクリーンに保 ち、リファクタリングも容易 になる。 腐敗防止層
  15. • 返済せずに放置すれば負債は増え続ける 。 • 整理・整頓・リファクタリングを「いつかやる 」ではなく日常の ルーティン に組み込み、文化を醸成 することで、コードをクリー ンに保つ。

    • ボーイスカウトルール: コードに手を入れる際、ちょっとだけで もコードをキレイにする。 • リファクタリングデー: 毎月必ずリファクタリングのための日 を 設ける。 • 20%ルール: スプリントの20%を開発者目線の改善 に充てる。 日常的な整理・整頓・リファクタリング
  16. • 【翻訳】技術的負債という概念の生みの親 Ward Cunningham 自身による説明 - t-wada のブログ • よし、技術的負債について知ろう

    - Qiita • 『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya • 時間がないからこそ、テストを書く • 設計の考え方 - インターフェースと腐敗防止層編 #phpconfuk Appendix: 参考資料