SlideShare ist ein Scribd-Unternehmen logo
1 von 45
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
アプリがパッチに
まみれたら
TokyuRuby会議11
2017-07-29�(Sat)
伊藤�浩⼀�(@koic)
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
�
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
�
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
�
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
�
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
ドリンク
アップス
ポンサー
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
�
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
ティルックラル�第391篇
学ぶ価値のある知識はすべて
学べ学ん だ知 恵を⽣か し て⾏
動せよ
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
今⽇
の話
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
rails�
new�以降
はパッチ
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
パッチいろいろ
機能拡張✓
バグ修正✓
パフォーマンス改善✓
依存Gemのアップグレード✓
リファクタリング✓
機能削除✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
結論
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
良いパッチにま
みれれば幸い、
悪いパッチにま
みれたら⾟い。
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
良いパッ
チと悪い
パッチ
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
良いパッチ
本質的な問題を解決している✓
必要最⼩限でいて拡張の邪魔に
ならないパッチ
✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
悪いパッチ
その場凌ぎで問題解決している✓
本質的な問題解決となっておら
ずしばしば拡張の邪魔になるパ
ッチ
とはいえ問題解決はしているので、
度合いの問題ではある
✓
✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
今⽇の
お題
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
みんな大好
きモンキー
パッチ
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
課題
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
アプリケーションの
ドメインコードと、
フレームワーク/ラ
イブラリの汎用コー
ドが同⼀リポジトリ
に混在する
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
分け
よう
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
本来フォーカスす
る問題領域のみア
プリケーションの
コードとしてリポ
ジトリにあるべき
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
依存する
OSSを含
めた観点
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
良いパッチ
適切な�upstream�に対するパ
ッチを送って、本質的な問題解
決をする
✓
アプリケーションコードに依存
Gem特有の問題を混ぜない
✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
問題の残るパッチ
とりあえず⼿元のアプリケーシ
ョンが動くワークアラウンド
✓
あの時のあのパッチがあればが
今のアプリケーションに埋もれ
たままになるかも
✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
天使の助⾔と悪魔の囁き
問題の抽象化やupstream向け
のテストを書く⼿間はある
往々にして汎化問題より特化問題の
⽅が簡単
✓
✓
「おまえもモンキーパッチにし
てやろうか」
✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
モンキーパッチの⽌むを得な
い場合
フレームワーク/ライブラリへ
の抽象化が難しい、本当にアプ
リケーション特有の問題
✓
RailsAdmin�での�CSV�ダウン
ロードの�ShiftJIS�変換とか
あれ?この例パッチ送れるのでは...✓
✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
⼈間の葛藤
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
悪魔の囁き
に敗れた際
の対処事例
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
bundle�updateへ負債対策
�������������������������������������������
bundle�update�に注意みたいな
コメントではなく、動くコード
での警告にしておく。
✓
Gemfileへのバージョン固定にす
ると固定されて終わる
✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
Extract�Gem
外部Gemにして開発サイクル
を分ける
✓
アプリケーション固有の問題で
ないので切り出しGemfile�1⾏
にする
✓
事例:�https://github.com/
koic/oracle-enhanced-
monky̲patch̲755
✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
Gemfile
������������������������������������������
����������������������������������������������������������
Rails�4.2.1でタイムゾーンがズ
レる問題を直すGemのはずが、
Rails�5でタイムスタンプ型が変
わったことへの対応も⼊った
✓
Oracleでのスキーマ移⾏を延命
できる
✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
Railsアップグレードとスキ
ーマ
RDBMSのスキーマの型変更は
重い話になりうる
✓
Railsアップグレードと異なる
タイミングで⾏なえるようにし
たのは悪い判断ではなかった
✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
究極の弱点
activerecord-
oracle̲enhanced-adapter-
monky̲patch̲755
✓
わざとイケてない名前にしたけ
れど、本当にイケてなくてつら
い
全⼒でこの名前を消しにかかる✓
✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
パッチ戦争
からGem
戦争へ
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
モンキーパッチGemを倒す
Gem
https://github.com/koic/
screamers
✓
oracle-enhanced-
monky̲patch̲755を倒すた
めに誕⽣した
✓
怨念駆動開発✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
screamers:migration
�����������������������������������������������
��������������������������������������������������
dateからdatetimeに⼀括変換す
るマイグレーションファイルを
⽣成する
✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
天使界と
悪魔界の
狭間
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
Forked�Gem
upstreamのmasterでは直っ
ているがリリースされていない
✓
PRは出しているがコミッター
が活動していない
✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
Rails�5.0.1�+�Ruby�2.4
warning:�constant�::Fixnum�
is�deprecated�川が氾濫して
いた
✓
⾒たいログが警告に流されて⾒
えない
✓
警告川の氾濫✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
Rails�5.0.1で警告を鎮まら
せた
����������������������������������������������������������
��������������������������������������������������
����������������������������������������������������������������
rails/railsの5-0-stableからブラ
ンチを切って、必要なコミット
をmasterからcherry-pick
✓
Rails�5.0.2までのあいだ警備し
ていた
✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
反応がない。どうしたら...
��������������������������������������
������������������������������������������������
パッチはある。反応はない。✓
Gemの選定は大事✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
天使の助
⾔が勝っ
たとき
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
Upstreamに投げる
Oracleに詳しいわけではない
ので、DBAに⾒てもらえる
✓
新しい知識を得ることが出来る✓
パッチ投げていたら、コミッタ
ーに推薦してもらえた
✓
アプリがパッチにまみれたら Powered�by�Rabbit�2.1.9
⼩さな仕事、大きな成功
パッチの送り先はアプリケーシ
ョンに限らない
✓
依存先のupstreamにも出来る
ことからコツコツと
✓
少しずつ出来ることが増えて⾏
くので、カルマを積み重ねて⾏
きましょう
✓

Weitere ähnliche Inhalte

Mehr von Koichi ITO

俺の開発日誌
俺の開発日誌俺の開発日誌
俺の開発日誌Koichi ITO
 
ghq gem-src and more
ghq  gem-src and moreghq  gem-src and more
ghq gem-src and moreKoichi ITO
 
RuboCopとXPコーディング規約
RuboCopとXPコーディング規約RuboCopとXPコーディング規約
RuboCopとXPコーディング規約Koichi ITO
 
俺たちの新人教育!!
俺たちの新人教育!!俺たちの新人教育!!
俺たちの新人教育!!Koichi ITO
 
スローテスト刑事 (デカ)
スローテスト刑事 (デカ)スローテスト刑事 (デカ)
スローテスト刑事 (デカ)Koichi ITO
 
Gate of Agile Web Development
Gate of Agile Web DevelopmentGate of Agile Web Development
Gate of Agile Web DevelopmentKoichi ITO
 
RubyKaigi 2015 の Drinkup を支える技術
RubyKaigi 2015 の Drinkup を支える技術RubyKaigi 2015 の Drinkup を支える技術
RubyKaigi 2015 の Drinkup を支える技術Koichi ITO
 
開発時の探し物を楽にする習慣作り
開発時の探し物を楽にする習慣作り開発時の探し物を楽にする習慣作り
開発時の探し物を楽にする習慣作りKoichi ITO
 
Motivationware
MotivationwareMotivationware
MotivationwareKoichi ITO
 
達人プログラマーへの道
達人プログラマーへの道達人プログラマーへの道
達人プログラマーへの道Koichi ITO
 
Let's get ready for next Ruby
Let's get ready for next RubyLet's get ready for next Ruby
Let's get ready for next RubyKoichi ITO
 
Agile Software Development with Edge Ruby
Agile Software Development with Edge RubyAgile Software Development with Edge Ruby
Agile Software Development with Edge RubyKoichi ITO
 
Safe navigation operator in Ruby
Safe navigation operator in RubySafe navigation operator in Ruby
Safe navigation operator in RubyKoichi ITO
 
プロの無職についての考察:序
プロの無職についての考察:序プロの無職についての考察:序
プロの無職についての考察:序Koichi ITO
 
frozen string literal in Ruby
frozen string literal in Rubyfrozen string literal in Ruby
frozen string literal in RubyKoichi ITO
 
俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜
俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜
俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜Koichi ITO
 
JavaからRubyへの変遷を約10年見てきて、プロジェクトで変わったこと、変わっていないこと12集
JavaからRubyへの変遷を約10年見てきて、プロジェクトで変わったこと、変わっていないこと12集JavaからRubyへの変遷を約10年見てきて、プロジェクトで変わったこと、変わっていないこと12集
JavaからRubyへの変遷を約10年見てきて、プロジェクトで変わったこと、変わっていないこと12集Koichi ITO
 
The World is Connected
The World is ConnectedThe World is Connected
The World is ConnectedKoichi ITO
 
進撃の受託開発
進撃の受託開発進撃の受託開発
進撃の受託開発Koichi ITO
 

Mehr von Koichi ITO (20)

俺の開発日誌
俺の開発日誌俺の開発日誌
俺の開発日誌
 
ghq gem-src and more
ghq  gem-src and moreghq  gem-src and more
ghq gem-src and more
 
RuboCopとXPコーディング規約
RuboCopとXPコーディング規約RuboCopとXPコーディング規約
RuboCopとXPコーディング規約
 
俺たちの新人教育!!
俺たちの新人教育!!俺たちの新人教育!!
俺たちの新人教育!!
 
スローテスト刑事 (デカ)
スローテスト刑事 (デカ)スローテスト刑事 (デカ)
スローテスト刑事 (デカ)
 
Gate of Agile Web Development
Gate of Agile Web DevelopmentGate of Agile Web Development
Gate of Agile Web Development
 
RubyKaigi 2015 の Drinkup を支える技術
RubyKaigi 2015 の Drinkup を支える技術RubyKaigi 2015 の Drinkup を支える技術
RubyKaigi 2015 の Drinkup を支える技術
 
開発時の探し物を楽にする習慣作り
開発時の探し物を楽にする習慣作り開発時の探し物を楽にする習慣作り
開発時の探し物を楽にする習慣作り
 
Motivationware
MotivationwareMotivationware
Motivationware
 
達人プログラマーへの道
達人プログラマーへの道達人プログラマーへの道
達人プログラマーへの道
 
Let's get ready for next Ruby
Let's get ready for next RubyLet's get ready for next Ruby
Let's get ready for next Ruby
 
職と人
職と人職と人
職と人
 
Agile Software Development with Edge Ruby
Agile Software Development with Edge RubyAgile Software Development with Edge Ruby
Agile Software Development with Edge Ruby
 
Safe navigation operator in Ruby
Safe navigation operator in RubySafe navigation operator in Ruby
Safe navigation operator in Ruby
 
プロの無職についての考察:序
プロの無職についての考察:序プロの無職についての考察:序
プロの無職についての考察:序
 
frozen string literal in Ruby
frozen string literal in Rubyfrozen string literal in Ruby
frozen string literal in Ruby
 
俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜
俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜
俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜
 
JavaからRubyへの変遷を約10年見てきて、プロジェクトで変わったこと、変わっていないこと12集
JavaからRubyへの変遷を約10年見てきて、プロジェクトで変わったこと、変わっていないこと12集JavaからRubyへの変遷を約10年見てきて、プロジェクトで変わったこと、変わっていないこと12集
JavaからRubyへの変遷を約10年見てきて、プロジェクトで変わったこと、変わっていないこと12集
 
The World is Connected
The World is ConnectedThe World is Connected
The World is Connected
 
進撃の受託開発
進撃の受託開発進撃の受託開発
進撃の受託開発
 

アプリがパッチにまみれたら