phpcon-2022
--- 内容
- 弊社サービスにおけるフィーチャートグルを導入した効果 - フィーチャートグルの導入〜現在に至るまでの実装 - 導入後にテストを可能にするための改善
ローンチから16年目のWebサービスに、どうやってフィーチャートグルを導入したか、運用しているか。
View Slide
自己紹介名前: meihei(江間洋平)所属: 株式会社PR TIMESTwitter: app1e_sGitHub: meihei3VTuberの配信を流して生きています2
今回が初登壇です🙌3
この発表の位置づけ4
5ローンチから16年目のWebサービスに、どうやってフィーチャートグルを導入したか、運用しているか。
アジェンダ● 導入の背景と結果● フィーチャートグルについて● フィーチャートグルの実装・導入● フィーチャートグルの運用・改善● まとめ6
アジェンダ● 導入の背景と結果● フィーチャートグルについて● フィーチャートグルの実装・導入● フィーチャートグルの運用・改善● まとめ7
PR TIMESというサービスについて● プレスリリース配信サービス● 月間のサイト閲覧数は6,000万PV8
その裏側は?(去年まで)● PHP x.x ( < 8.1 ) で動いている● 触れるとすべてが崩壊する独自フレームワーク● テストなし● Namespaceなし● スーパーグローバル使いたい放題9
つまり、レガシーコード10
レガシーコードゆえの課題● コードを変更する事のコストが大きい● 少しの改修も一苦労● 新規機能追加はなかなか行えない11
レガシーコードゆえの課題● コードを変更する事のコストが大きい● 少しの改修も一苦労● 新規機能追加はなかなか行えない→ 開発速度の鈍化12
レガシーコードゆえの課題● コードを変更する事のコストが大きい● 少しの改修も一苦労● 新規機能追加はなかなか行えない→ 開発速度の鈍化→ サービスの成長が鈍化している13
もう少し課題の原因を深堀りする14
開発速度の鈍化の原因● レガシーコードであること15
開発速度の鈍化の原因● レガシーコードであること● 1度のリリースのコードの変更量が多い○ コードレビューや UI テスト(人力)のコストが増加● ↑2つが合わさってバグが生まれやすくなり、さらに開発工数がかさむ16
1度のリリースの変更量を減らしたい17
1度のリリースの変更量を減らしたい→フィーチャートグルという戦略18
その他、背景● エンジニア以外の人でも、リリース前に変更内容を確認できるようにしたい○ 他部署の人が変更内容を事前にキャッチアップできるように○ 開発担当者以外が確認する事で、未然にバグを発見できるように19
導入背景をまとめると● 1度のリリースの変更量を減らしたい● エンジニア以外の人でも、リリース前に変更内容を確認できるようにしたい20
フィーチャートグルを導入した結果21
2021年4月〜12月上旬までの開発生産性● レガシーコードであること※フィーチャートグル以外の要因もあります 22
2021年4月〜12月上旬までの開発生産性● レガシーコードであること※フィーチャートグル以外の要因もあります 23
2021年4月〜12月上旬までの開発生産性● レガシーコードであること※フィーチャートグル以外の要因もあります 24
「細かい変更を頻繁に」行う用になった理由● 細かい変更を頻繁に行える仕組みがある○ =フィーチャートグルが運用されている● デプロイ速度の改善● UIテストの自動化ツールの導入● フロントエンドのリプレイス● PHPコードのレガシー改善● etc... 25
アジェンダ● 導入の背景と結果● フィーチャートグルについて● フィーチャートグルの実装・導入● フィーチャートグルの運用・改善● まとめ26
フィーチャートグルとは何か● コードを書き換えることなく動的にシステムの振る舞いを変更できる開発手法● アプリの再起動やコードのデプロイを伴わない参考: https://martinfowler.com/articles/feature-toggles.html27
フィーチャートグルの例参考: https://martinfowler.com/articles/feature-toggles.html28
フィーチャートグルの分類● Release Toggles● Experiment Toggles● Ops Toggles● Permission Toggles29
フィーチャートグルの分類● Release Toggles● Experiment Toggles● Ops Toggles● Permission TogglesPR TIMES が使っているものは Release Toggles + α30
● トランクベース開発に利用されるフラグ○ 細かい変更を頻繁に main ブランチにマージする手法● 開発中の機能をOFFにすることで、機能が未完成であっても main ブランチにマージできる● このフラグは静的であるRelease Toggles31
● トランクベース開発に利用されるフラグ○ 細かい変更を頻繁に main ブランチにマージする手法● 開発中の機能をOFFにすることで、機能が未完成であっても main ブランチにマージできる● このフラグは静的であるただし、社内からのアクセスだけ、動的にフラグを切り替える事が出来て、開発中の機能を試す事ができるPR TIMES が使っている Release Toggles32
PR TIMES が使っている Release Toggles33
アジェンダ● 導入の背景と結果● フィーチャートグルについて● フィーチャートグルの実装・導入● フィーチャートグルの運用・改善● まとめ34
フィーチャートグルの導入方針● 必要最低限の機能で実装する● 導入することに比重をおく○ レガシーコードは一旦無視○ 導入後にリファクタリングする35
仕様の確認36
フィーチャートグルの仕様● ON/OFF を切り替える事で、実装を切り替える● 基本的にリリース時まではフラグをOFFにする● ただし、社内からのアクセスだけは、動的にフラグを切り替える事ができる37
実装38
フィーチャートグルの仕様● ON/OFF を切り替える事で、実装を切り替える● 基本的にリリース時まではフラグをOFFにする● ただし、社内からのアクセスだけは、動的にフラグを切り替える事ができる39
実装切り替えのコード40
フラグは常にOFFにする41
フィーチャートグルの仕様● ON/OFF を切り替える事で、実装を切り替える● 基本的にリリース時まではフラグをOFFにする● ただし、社内からのアクセスだけは、動的にフラグを切り替える事ができる42
実装方針● 社内からのアクセスを判定する事ができる○ (オフィス・VPNの)IPアドレスから判定● 動的にフラグを切り替える事ができる○ Cookiesでフラグを管理43
フィーチャートグルの実装方針44
フィーチャートグルの実装方針● 社内からのアクセスを判定する事ができる○ (オフィス・VPNの)IPアドレスから判定● 動的にフラグを切り替える事ができる○ Cookiesでフラグを管理45
(オフィス・VPNの)IPアドレスから判定46
(オフィス・VPNの)IPアドレスから判定47
(オフィス・VPNの)IPアドレスから判定48
(オフィス・VPNの)IPアドレスから判定49
フィーチャートグルの実装方針● 社内からのアクセスを判定する事ができる○ (オフィス・VPNの)IPアドレスから判定● 動的にフラグを切り替える事ができる○ Cookiesでフラグを管理50
Cookiesでフラグを管理51
Cookiesでフラグを管理52
Cookiesでフラグを管理53
導入完了54
なんでスーパーグローバルを使っているの?55
その裏側は?(去年まで)● PHP x.x ( < 8.1 ) で動いている● 触れるとすべてが崩壊する独自フレームワーク● テストなし● Namespaceなし● スーパーグローバル使いたい放題56
正しい設計・実装を行うことフィーチャートグルを導入すること<57
第一優先でフィーチャートグルを導入する● この実装でレガシーコードが増える事は承知の上○ 既にレガシーコードだから、レガシーコードが増えても良い、というわけではない○ 導入後、開発速度を上がった時にリファクタリングすれば良いという考え※これは、会社・個人によって方針は変わると思います。58
アジェンダ● 導入の背景と結果● フィーチャートグルについて● フィーチャートグルの実装・導入● フィーチャートグルの運用・改善● まとめ59
フィーチャートグルを使ってもらう60
フィーチャートグルを使ってもらう為に● トランクベース開発を実践する● フィーチャートグル自体を使いやすい物にする● 情報を公開する61
フィーチャートグルを使ってもらう為に● トランクベース開発を実践する● フィーチャートグル自体を使いやすい物にする● 情報を公開する62
1度のリリースの変更量を減らす● チケットの粒度を小さくする○ 実装開始から1〜2日で終わる程度に● 細かい変更量で main ブランチにマージする○ Release Toggles を OFF にすることで、開発中の機能であっても影響なくマージ可能● 「細かい変更を頻繁に」という意識を持つ63
「細かい変更を頻繁に」という意識を持つ● チケット(Issue or Pull Request)の粒度自体にもアドバイスをする64
フィーチャートグルを使ってもらう為に● トランクベース開発を実践する● フィーチャートグル自体を使いやすい物にする● 情報を公開する65
現在の実装のコードを確認66
● Namespaceを用意していないので Autoloader が使えない● Featureテストでスーパーグローバルを操作出来ないので、ONの時の動作をテスト出来ない○ (または、テスト自体できない)現在の実装の問題点67
リファクタリングをする68
● クラス化(Namespaceが設定された状態)○ 動的にフラグの切り替えもできるようにする● スーパーグローバルをインジェクトできるようにするリファクタリングをする69
クラス化(Namespaceが設定された状態)70
動的にフラグの切り替えもできるようにする71
少しコードをきれいに72
少しコードをきれいに73
スーパーグローバルをインジェクトできるようにする74
スーパーグローバルをインジェクトできるようにする75
スーパーグローバルをインジェクトできるようにする76
フィーチャートグルを使ってもらう為に● トランクベース開発を実践する● フィーチャートグル自体を使いやすい物にする● 情報を公開する77
社内で共有する78
● エンジニアは、フィーチャートグルを用いた開発が行えるように● エンジニア以外は、フィーチャートグルの切り替え方法がわかるように社内Wikiで共有79
● 社内で多くの人に使ってもらうSlackで共有「プレスキット」という機能がリリースされる数日前の様子80
社外で共有する81
● 社内外の人に認知してもらう○ 社内の人にとっても参考資料となる○ 新しくJOINする人に事前に知ることができる情報となるテックブログで発信82
アジェンダ● 導入の背景と結果● フィーチャートグルについて● フィーチャートグルの実装・導入● フィーチャートグルの運用・改善● まとめ83
● レガシーコードだからこそ、必要最低限の質素な実装でフィーチャートグルを導入する● その後にテスタブルにする、リファクタリングする● 結果、開発速度が向上しましたまとめ84
● フィーチャーフラグにはタイプ(リリース・実験・運用・許可)がある!○ https://kakakakakku.hatenablog.com/entry/2022/02/01/102104● 小さく安全なリリースを実現するために使える「フィーチャートグル」って何?年収は?彼女は?調べてみました!○ https://qiita.com/ipeblb/items/92b794321751a6fa133e● FeatureToggle戦略と運用方法○ https://speakerdeck.com/kubotak/featuretogglezhan-lue-toyun-yong-fang-fa● トランク ベース開発○ https://www.atlassian.com/ja/continuous-delivery/continuous-integration/trunk-based-development参考85
● 株式会社PR TIMESはPHPer募集しています○ https://herp.careers/v1/prtimes/ePCFEMomxCoA● テックブログもやっているので是非見てください○ https://developers.prtimes.jp/会社紹介86