22
たた Rails たたたたたたたた たたたたたたたたたたたたたたた @muramurasan たたた .rb #19 たたたたたたたたたたた…… 2017-02-02

表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

Embed Size (px)

Citation preview

Page 1: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

ただ Railsで使われていないメソッドを削除したい人生だった@muramurasan

表参道 .rb #19 静的解析と技術的負債と……2017-02-02

Page 2: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

誰?○名前

□松村 康弘 (@muramurasan)○所属

□ピクスタ株式会社○来歴

□客先常駐の組み込み SE を 3 年やって、「畜生、転職だ!」□2015 年 10 月からピクスタで Rails をさわり始める

○Rails 一年生卒業後、「いつまでもミジンコ名乗れると思うなよ」という同僚の指摘を受け、オタマジャクシに

Page 3: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

ピクスタ???

Page 4: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

今日話すこと「未使用メソッドの削除」○ 従来手法○ 静的解析の投入○ 動的監視の投入○俺が考える最強のメソッド削除フロー

Page 5: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

従来手法職人による心温まる grep

Page 6: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

従来手法職人による心温まる grep

○ 強み□信頼できる感□実績ある□職人の温もり

○弱み□IDE やコマンドの力を借りれるとはいえ、人の目であり、抜け漏れがありえる□疲れる□時間かかる□結局、デッドコード削除は後回しとか ......

Page 7: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

静的解析の投入debride

Page 8: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

静的解析の投入debride

○ debride とは?□( 詳細を説明できる自信がありませんが ......)□構文木解析により、未使用の可能性が高いメソッドを列挙する gem□素の Ruby でも使えるし、 Rails 向けのオプションや、 erb を解析対象に含めるプラグインもある% debride lib

These methods MIGHT not be called:

MyClass good_method lib/some/file.rb:16 bad_method lib/some/file.rb:20...

Page 9: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

静的解析の投入debride

○ 強み□とにかく軽く、実行時間わずか。すぐに解析可□精度は結構高い感触□RubyKaigi2016 で登壇していた、実績ある

gem○弱み

□動的メソッド呼び出しに対応できない□Controller とか外部への公開インタフェースも未使用メソッドとして検出してしまう

○routes.rb を見ているのかそれなりの精度で除外してくれるけど ......

Page 10: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

静的解析の投入debride

○ 強み□とにかく軽く、実行時間わずか。すぐに解析可□精度は結構高い感触□RubyKaigi2016 で登壇していた実績ある gem

○弱み□動的メソッド呼び出しに対応できない□Controller とか外部への公開インタフェースも未使用メソッドとして検出してしまう

○routes.rb を見ているのかそれなりの精度で除外してくれるけど ......

でも、外部から呼び出される可能性がある限り、

本当にどこからも呼び出されていないかなんて、

判断できないですよね?

Page 11: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

動的監視の投入ouribito_rails

Page 12: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

動的監視の投入okuribito_rails

○ okuribito_rails とは?□yaml で指定したメソッドを監視し、呼び出し検出時にその情報を DB に格納する Rails Engine□どのメソッドが呼び出し済みで、呼び出されていないかを閲覧できる WebUI を提供

Page 13: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

動的監視の投入okuribito_rails○ 強み

□動的メソッド呼び出しに対応できる!□外部から呼び出されるメソッドも当然対応!□監視対象を記した yaml を置くだけで監視できる

○プロダクションコードに手を入れる必要なし□一定期間呼び出されていなければ、消せそう!

○弱み□私です ( ^ o ^ )  作なので地雷たくさん確実□影響範囲が大きいので、地雷踏むと被害大□使用実績が現在進行形で弊社だけ□本体に Rails Engine の migration が入ってしまう□メモリちょっと使うかも□ドキュメントや gem 内部コードの英語が破滅

Page 14: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

動的監視の投入okuribito_rails○ 強み

□動的メソッド呼び出しに対応できる!□外部から呼び出されるメソッドも当然対応!□監視対象を記した yaml を置くだけで監視できる

○プロダクションコードに手を入れる必要なし□一定期間呼び出されていなければ、消せそう!

○弱み□私です ( ^ o ^ )  作なので地雷たくさん確実□影響範囲が大きいので、地雷踏むと被害大□使用実績が現在進行形で弊社だけ□本体に Rails Engine の migration が入ってしまう□メモリちょっと使うかも□ドキュメントや gem 内部コードの英語が破滅

まだまだ弊社でも投入して日が浅いので、

導入はまだしない方がいいです ....

平気で rails server で落ちえます

Page 15: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

俺が考える最強のメソッド削除フロー

Page 16: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

俺が考える最強のメソッド削除フロー未使用の可能性が高いメソッド一覧を debride で取得静的解析

Page 17: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

俺が考える最強のメソッド削除フロー

okuribito_rails で一定期間監視する動的監視

未使用の可能性が高いメソッド一覧を debride で取得静的解析

Page 18: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

俺が考える最強のメソッド削除フロー

okuribito_rails で一定期間監視する

最後まで呼ばれていないメソッドを消すプルリクを出す安全に消せそうだ!

動的監視

職人の手

未使用の可能性が高いメソッド一覧を debride で取得静的解析

Page 19: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

おわりに○ 静的解析でアタリをつけて ....○動的監視で安心感を得る!

○ 動的型付け言語の Ruby だって怖くない!“Let’s Delete Driven

Development!!”

RubyKaigi2016debride の作者 zenspider氏より

Page 20: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

endhttps://github.com/muramurasan/okuribito

Special thanks!!

@yasaichi …… 名付け親、コア部分の処理のアイディア提供@kaiba …… Contributor (Document, Spec)@yuyasat …… ロゴ画像の提供Shibuya.rb の皆様 …… gem を公開する勇気!

https://github.com/muramurasan/okuribito_rails

https://github.com/muramurasan/debride2okuribito

Page 21: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

おまけ

Page 22: 表参道.rb #19 / ただRailsで使われていないメソッドを削除したい人生だった

debrideの解析結果をokuribito_railsに投入

debride2okuribito

○ 要は debride の解析結果を okuribito 向けの yaml に変換するだけの gem です

User: - '#feed' - '#profile'Micropost: - '.from_users_followed_by'

$ debride2okuribito --rails app--- Run debride and convert to yaml...--- 'okuribito.yml' has been generated.