Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
php-conference-japan-2022
Search
Tasuku Yamashita
September 23, 2022
Programming
2.3k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
php-conference-japan-2022
Tasuku Yamashita
September 23, 2022
More Decks by Tasuku Yamashita
See All by Tasuku Yamashita
php-conference-japan-2024
tasuku43
1
760
Other Decks in Programming
See All in Programming
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
140
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.5k
Foundation Models frameworkで画像分析
ryodeveloper
1
240
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
9
4.1k
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
290
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
17k
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
570
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
360
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
230
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
240
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
3.3k
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
630
Featured
See All Featured
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
760
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
190
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
520
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
The browser strikes back
jonoalderson
0
1.4k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
460
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
240
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Evolving SEO for Evolving Search Engines
ryanjones
0
250
The World Runs on Bad Software
bkeepers
PRO
72
12k
Transcript
© Chatwork PHP Conference Japan 2022. September 24, 2022.
2022年09月24日 PHP部 山下 祐 Chatwork株式会社 リリースして11年経過した PHPアプリケーションにPHPStanを導入した
自己紹介 2 • 山下 祐 (Yamashita Tasuku) • PHPエンジニア ◦
2019年12月~ Chatwork • SNS ◦ GitHub ▪ tasuku43 ◦ Twitter ▪ task2021 ◦ Zenn ▪ https://zenn.dev/tasteck
事業概要 3 • 国内最大級のビジネスチャット「Chatwork」 を中心に、複数の周辺サービスを展開*1 • ビジネスチャットのパイオニアであり国内利用 者数No.1*2、導入社数は36.5万社*3を突破 • 電話やメールから効率的なチャットへ、ビジネ
スコミュニケーションの変化を加速させ、 プラットフォーム化を目指しています *2 Nielsen NetView 及びNielsen Mobile NetView Customized Report 2022年5月度調べ月次利用者(MAU:Monthly Active User)調査。調査対象はChatwork、Microsoft Teams、Slack、LINE WORKS、Skypeを含む47サービスをChatwork株式会社にて選 定。
4 普及率は24.6%ほどで、非常にポテンシャルが大きいマーケット コロナ禍やDX推進の流れを受け テレワークが急激に普及*3 未だ低水準に止まる ビジネスチャット国内普及率*2 全業種に展開可能な 潜在市場規模(TAM*1) 東京23区 全国
テレワーク率の変化 国内労働人口 6,724万人 Chatwork 料金単価 6,455億円 ビジネスチャット ツールを利用して いる 2019年12月 2020年12月 単位:% *1 実現可能な最大の市場規模(Total Addressable Market)。外部統計資料や公表資料、当社保有のデータを元に当社が想定する市場を推察した市場規模であり、客観的な市場規模を示すものではありません。 *2 当社依頼による第三者機関調べ、2022年3月調査、n=30,000 *3 内閣府「第2回 新型コロナウイルス感染症の影響下における生活意識・行動の変化に関する調査」より ビジネスチャットの市場環境
詳細な情報はSpeakerDeckを御覧ください ! https://speakerdeck.com/chatwork_hr/chatwork
1. なぜPHPStanを導入したか 2. 導入していく道のり 3. 何を得られたか 4. まとめ AGENDA アジェンダ
1. なぜPHPStanを導入したか 2. 導入していく道のり 3. 何を得られたか 4. まとめ AGENDA アジェンダ
8 何度か本番環境でエラーが 起きたから
実際に発生したことのあるエラー 9 • nullに参照してエラー • ライブラリアップデートしたら型が厳しめになっててエラー a. メソッドの引数にタイプヒントが追加されていた • 存在しないメソッドを呼び出してエラー
a. ブランチAで削除したメソッドがブランチBで利用されていた b. ブランチをマージしたタイミングで発生 • etc…
実際に発生したことのあるエラー 10 • nullに参照してエラー • ライブラリアップデートしたら型が厳しめになっててエラー a. メソッドの引数にタイプヒントが追加されていた • 存在しないメソッドを呼び出してエラー
a. ブランチAで削除したメソッドがブランチBで利用されていた b. ブランチをマージしたタイミングで発生 • etc…
11 静的解析ツールを使えば、 こういう問題の発生を事前に防げるらしい
PHPStanとは 12 • PHPコードを実行する前に静的に解析し、実行時エラーになる ような問題のあるコードを検出・警告してくれるツール ◦ メソッドや関数に渡される引数の型チェック ◦ 未定義変数・メソッドへの参照 ◦
nullになる可能性がある変数へのメソッド呼び出し
PHPStanとは 13 • PHPコードを実行する前に静的に解析し、実行時エラーになる ような問題のあるコードを検出・警告してくれるツール ◦ メソッドや関数に渡される引数の型チェック ◦ 未定義変数・メソッドへの参照 ◦
nullになる可能性がある変数へのメソッド呼び出し • バグが発生する可能性のあるコードに、リリースする前に気づ くことができるようになる
14 コード修正を より安心してリリース できるようになる
導入した結果得られた事 15 • 問題のあるコードがリリース前に気づけるようになった • 思い切ったリファクタが気軽にできるようになった • レビューコストの削減 • ライブラリアップデートが安心して行えるようになった
1. なぜPHPStanを導入したか 2. 導入していく道のり 3. 何を得られたか 4. まとめ AGENDA アジェンダ
導入していく道のり 17 • 解析レベルを決定する • baselineを作成し、既存のエラーは検知対象外にする • CIでPHPStanを実行する • PHPStanの警告への対応について相談できる場を作る
解析レベルについて • PHPStanでは0~9までの解析レベルの設定が可能 • 各レベルでどんなチェックがなされるかは以下のドキュメントに記載がありま す。 ◦ https://phpstan.org/user-guide/rule-levels
解析レベルについて • また、自分達がチェックしたい問題はどのレベルで検知できるのかは Playground | PHPStanを使って一つづつ見ていくと確実だと思います。
解析レベルを決定する 20 検知したい問題を明らかにする どの解析レベルでその問題が発見できるかを確認する
解析レベルを決定する 21 検知したい問題を明らかにする どの解析レベルでその問題が発見できるかを確認する (1) 未定義メソッド・未定義変数・未定義クラスへの参照 (2) 型エラーの検知
解析レベルを決定する 22 レベル4だと(2)が検知されない
解析レベルを決定する 23 レベル5だとどちらも検知された!
解析レベルを決定する 24 検知したい問題を明らかにする レベル5に決定 (1) 未定義メソッド・未定義変数・未定義クラスへの参照 (2) 型エラーの検知
25 よし、レベルは決まった! 早速実行だ!
26 「二万件くらいエラーでた...」
baselineを作成し、既存のエラーは検知対象外にする 27 • 数万件単位のエラーを今から対処していくのは現実的ではない • 「本番環境でエラーなく動いているから問題ない」という前提にたち、 一旦警告を除外対象にしてしまう • 警告に対応しなくても導入を進める事ができる
baselineを作成し、既存のエラーは検知対象外にする 28 • baselineとは ◦ 特定のエラーをあらかじめ除外対象に指定しておく事で、PHPStanの解 析時に無視してくれるようになる機能 ◦ ひとつひとつのエラーを指定する必要はなく、コマンド一発でbaseline ファイルを作成できる
CIでPHPStanを実行する 29 • mainブランチにマージされるコードの品質が保たれる • PHPStanは実行時にキャッシュを残すので、それをCIの機能で保存 しておけば、commit毎の解析は非常に早く終わる ◦ ただし、キャッシュを使った結果と0から解析した結果は微妙に 異なる事があるので注意が必要
• reviewdogを使えば、どこで警告が受けたかをPRにコメントしてく れるようにもできる
PHPStanの警告への対応について相談できる場を作る 30 • 導入当初は今まで特に気にしていなかったコードもPHPStanに怒られるよ うになる ◦ 慣れるまでは「何に怒られてるの...??」とパッとわからない事もある • 困った時に「どうすればいいの!」って言える部屋を作り、なるべく PHPStanが開発のストレスにならないようにしました
開設してから半年以上た ち、今ではたまにしか投稿さ れません
1. なぜPHPStanを導入したか 2. 導入していく道のり 3. 何を得られたか 4. まとめ AGENDA アジェンダ
何を得られたか 32 • 問題のあるコードがリリース前に気づけるようになった • 思い切ったリファクタが気軽にできるようになった • レビューコストの削減 • ライブラリアップデートが安心して行えるようになった
何を得られたか 33 • 問題のあるコードがリリース前に気づけるようになった • 思い切ったリファクタが気軽にできるようになった • レビューコストの削減 • ライブラリアップデートが安心して行えるようになった
思い切ったリファクタが気軽にできるようになった 34 • あるメソッドの引数・返り値のタイプヒントを変更する • 巨大なメソッド・クラスを分解して、削除した • 大規模なnamespaceの変更・パッケージ構成のリファクタ • 型エラーや未定義のメソッド・クラスへの参照が残っていた場合は
PHPStanが教えてくれるので、「ええいままよ!」と実行する事がで きる
思い切ったリファクタが気軽にできるようになった 35 影響範囲ちゃんと調べてないけど、 どれくらいエラー出るか一旦pushしてみよ という選択が取れるようになった
何を得られたか 36 • 問題のあるコードがリリース前に気づけるようになった • 思い切ったリファクタが気軽にできるようになった • レビューコストの削減 • ライブラリアップデートが安心して行えるようになった
レビューコストの削減 37 • 型エラーなどはPHPStanが保証してくれるので、レビュアーは「設 計」や「仕様」に集中してレビューが可能になる ◦ むしろ静的な部分はPHPStanの方がしっかり警告してくれる • レビュイーも、型エラーなどは事前にPHPStanが警告してくれるの で、静的解析をクリアした状態でレビュー依頼できる
レビューコストの削減(余談) 38 • 先ほど「設計」に集中できる、と書きましたが、そこも静的解析ツー ルで負荷を軽減できる可能性があります ◦ PHPStan ▪ 「カスタムルール」で独自のルールを定義が可能 ▪
「あるライブラリを継承してはいけない」など ◦ deptrac ▪ 依存関係チェックツール ▪ 「依存関係がアーキテクチャのルールに乗っ取っているか」を 解析する事が可能
何を得られたか 39 • 問題のあるコードがリリース前に気づけるようになった • 思い切ったリファクタが気軽にできるようになった • レビューコストの削減 • ライブラリアップデートが安心して行えるようになった
ライブラリアップデートが安心して行えるようになった 40 • メジャーバージョンアップなどでは、インターフェイスの破壊的な変更 がある事が予想される • 「引数のタイプヒントが追加された」などの変更も、PHPStanが見つけ てくれる
1. なぜPHPStanを導入したか 2. 導入していく道のり 3. 何を得られたか 4. まとめ AGENDA アジェンダ
まとめ 42 • PHPStanの導入は低コストで非常に恩恵が高い ◦ baselineを使ったら、導入コストも下がる • 導入ハードルは超えやすいが、開発メンバーができるだ けスムーズに慣れるような運用体制は必要
43
None