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

PHPで品質と生産性向上を目指すやり方 / Improve quality and prod...

Shigeru Chiba
September 19, 2024

PHPで品質と生産性向上を目指すやり方 / Improve quality and productivity with PHP

メタップスホールディングス主催 第三木曜LT会#9 にて登壇した内容です

Shigeru Chiba

September 19, 2024
Tweet

More Decks by Shigeru Chiba

Other Decks in Technology

Transcript

  1. © HataLuck and Person Inc. © HataLuck and Person Inc.

    PHPで品質と生産性向上を 目指すやり方 第3木曜LT会 #9 2024.09.19 千葉 茂 / @ohageeq
  2. © HataLuck and Person Inc. 千葉 茂 / @ohageeq 執行役員 CTO

    自己紹介 ▪ 技術: Kotlin, Go, AWS 💕 ▪ 好きなおはぎ: 今西軒(京都) ▪ 経歴: 2012年 サイバーエージェント入社 2022年 現職、業務委託入社 2023年 正社員入社 2024年 執行役員CTO就任
  3. © HataLuck and Person Inc. 会社紹介 株式会社HataLuck and Person MISSION:

    「はたらく」を楽しく VALUE: 「働きがい」を科学する シフトワーカーの潜在能力を 解放する 染谷 剛史 設立  代表者 2017年1月 事業内容 リテールテック事業 はたらきがいテック事業 主要株主
  4. © HataLuck and Person Inc. アジェンダ ▪ 背景: 開発の状況 ▪

    品質および生産性向上のための取り組み PHPで品質と生産性向上を目指すやり方
  5. © HataLuck and Person Inc. プロダクト変遷と現在 背景: 開発の状況 2018 2019

    2020 2021 2022 2023 2024 マネージドサービス (Firebase) 主体に開発 外注/業務委託中心に PHPベースで開発 現はたLuck 正式リリース シフト機能 開発着手 プロパー不在 新基盤 開発開始 新基盤 開発停止 FS脱却 プロジェクト 新権限の 開発 シフト機能 1stリリース • 基盤をゼロから作った人が20年時点で既にいない状況 • マルチプロダクト戦略、MVP→PMF移行期で当時の意思決定 で技術スタックが増えてしまっている
  6. © HataLuck and Person Inc. 改善前の開発状況 1. 大小含めて毎日バグ対応をしている 2. 緊急性が高いバグ以外のデプロイは2週間に1回

    3. 古いバージョンの言語が使われているままである 4. プロジェクト間で利用言語が統一されていないことで、  業務ロジック共通化ができない 背景: 開発の状況
  7. © HataLuck and Person Inc. 自身の開発歴 3年 背景: 開発の状況 10年

    5.x? 5.x? 1年未満 動的型付け言語は経験がほとんどない 品質をあげることはできるのだろうか...
  8. © HataLuck and Person Inc. 開発生産性指標を目安にする Four keysでELITEを目指す! 背景: 開発の状況

    https://cloud.google.com/blog/ja/products/gcp/using-the-four-keys-to-measure-your-devops-performance
  9. © HataLuck and Person Inc. なぜFour Keysを指標とするか ▪ 失敗の変更率を下げる -

    1ヶ月にかけるバグ対応を極力ゼロにする - %が上がった場合に機能開発を止める判断軸になる ▪ デプロイ頻度を向上する - 2週間に1回ビッグバンデプロイがバグを仕込んでしまう 原因の1つ - 小さく失敗して積み上げられるバグの数を減らす ▪ リードタイムを短くする - 1つのPRの変更量を少ないとバグが気づくことができる - 後方互換があれば即座にmainブランチにマージしデプロイ される 背景: 開発の状況
  10. © HataLuck and Person Inc. PHPのバージョンを上げる ▪ 型の表現や厳密さが向上した - type

    hintingが使える - Union型により型があいまいな箇所を型宣言できる - null safeが扱えるようになる 丸々1ヶ月リグレッションチェック→外部QA会社に依頼 大きな障害はなくバージョンアップ完了 生産性向上のための取り組み 変更前 変更後 PHP 7.3 PHP 8.2 Laravel 7 Laravel 9
  11. © HataLuck and Person Inc. 失敗の変更率を下げる① Phpmetricsでコード品質を図る 生産性向上のための取り組み ▪ 保守容易性指数

    = MI (Maintainability Index Metrics) ▪ 循環複雑度 = CCN (Cyclomatic complexity Number) 基準値より低いコードをCIで検知可能に 上記のような低品質なコードに対して ➔ テストコードの必須化 ➔ 開発者での確認手順の厳格化 ➔ リファクタリング工数を計画に盛り込む 指標を下回る = 変更による 障害が起きやすい!
  12. © HataLuck and Person Inc. MI, CCNの指標 失敗の変更率を下げる① クラス数合計 数千クラス

    変更不可能 2% 注力機能 0.7% 変更困難 注力機能 5% 10% メンテナンス不可能、テストが困難 MI <= 20以下 CCN >= 40以上
  13. © HataLuck and Person Inc. 失敗の変更率を下げる② コード規約・静的解析 生産性向上のための取り組み 動的型付けを静的型付けとして扱えるように ▪

    PHPStan + LaraStan ▪ php-cs-fixer 型の厳格検査を必須化しエディタやCIで見落とさない ➔ 新規コードは必須 ➔ 既存コードは修正できる範囲で対応する
  14. © HataLuck and Person Inc. デプロイ頻度を向上する、リードタイムを短くする 生産性向上のための取り組み ▪ 些細な変更でも後方互換があるものは毎日デプロイする (休日前、休日を除く)

    - 失敗の変更率を下げる取り組みがある前提で活きている ▪ レビュー負荷を下げる - design doc等でモデリングや設計意図がわかるようにする phpunit-snapshot-assertions ▪ リグレッションチェックを行えるようになる ▪ 手を加えたところはテストコードを追加することで後退を 検知する
  15. © HataLuck and Person Inc. 今後取り入れていきたいこと ▪ Feature Flags -

    リードタイムや復旧時間を短くできる - 開発者の成果 = 本番デプロイと顧客提供 = 機能リリース を分けることができる ▪ オブザーバビリティ監視 - Datadog等で全てのレイヤーでのリクエストを追えるよう にする - APIの呼び出し元、先の障害点の分析力が上がり将来課題 になる点を見通しが立てられる 生産性向上のための取り組み