SlideShare a Scribd company logo
技術的負債とリファクタリング
2017/06/22(木) Rails Developers Meetup #2
自己紹介
● HN: 神速
● twitter: @sinsoku_listy
● github: sinsoku
● 所属: 株式会社grooves
● Ruby/Rails歴: 6年くらい
Forkwell の紹介
技術的負債とは
> 手抜き、ハック、重複などなど、開発速度と期日の
名の下に、私たちは数々の 狼藉をコードベースにコ
ミットしている。技術的負債とは、そうした狼藉が時間
とともに積み重なったものだ。
引用: アジャイルサムライ p249
自社のコードに技術的負債のない人
今日話すこと
1. DB制約
2. 変更しやすいコード
3. リファクタリングはいつやるの?
1. DB制約
null: false は基本的に必須
● 3値論理は複雑なので避ける
○ Ruby 側で nil チェックが増える
● 意図しないデータ挿入を防ぐ
● NULL は不定で、空文字列とは違う
○ 値比較、インデックス、UNIQUE制約でハマる
OAuth とスライドのデータが
同じテーブルのDB設計
null: false がつけられない...
UNIQUE制約にも気をつける
● 意図しないデータ挿入を防ぐ
● 後から追加するのが大変
※ users.email にUNIQUE制約を追加する良い知見をお持ちの方、後ほど教えて頂ける
と嬉しいです。
2. 変更しやすいコード
コードの可視性
スコープの狭いメソッドは変更しやすい。
● private
● Refinements
読みやすいコード
● 分かりやすい変数名
● 短い行数のクラス・メソッド
● ABCSize の小さいコード
○ RuboCop で検出できます
● 過剰な DRY よりも可読性
eval, send の少ないコード
eval, send があると影響範囲が分かりづらい
eval のコード例
3. リファクタリングはいつやるの?
引用: アジャイルサムライ p249
良いコードは伝説
https://twitter.com/sinsoku_listy/status/163621382054346752
ソフトウェア開発は難しい
● 予想外の仕様の追加
● 限られた時間
● 技術力のあるエンジニアの不足
○ コード化されていないインフラ
○ RESTful ではない URL
○ fat controller
○ `includes` や `sort` が書かれている view
● ...etc
SessionsController#auth
メソッド行数は 90 行
引用: アジャイルサムライ p253
1つのプルリクが出来るまで
1. コードを読んで理解する
2. 変更方法を考える
3. 変更(コミット)する
4. 動作確認
5. レビュー&マージ
リファクタリングはいつやるの?
1. コードを読んで理解する
○ 理解した内容をコードに反映する
○ スコープを狭くする(未使用なら消す)
2. 変更方法を考える
3. 変更(コミット)する
4. 動作確認
5. レビュー&マージ
理解した内容をコードに反映する
● 説明変数の導入
● メソッドの抽出
● メソッドの移動
スコープを狭くする(未使用なら消す)
● private にしていく
● git grep -n "method_name" で調べる
○ 未使用メソッドは躊躇なく消す
○ 不安なら "deprecated" をログに出し、後日消す
リファクタリングしていくと...
● 漏れている条件
● 意味のない処理
○ 絶対に true にならない条件
○ 絶対に呼ばれないメソッド
● 実は同じ処理のメソッドがある
など、気付けるようになります。
まとめ
まとめ
● DB制約を厳しくする
● 読みやすく、消しやすいコードを意識する
● リファクタリングは常にする
技術的負債は必ず生まれるので、常に返済し続け
るのが大事!(少額の技術的負債なら...)

More Related Content

What's hot

Riverpodでテストを書こう
Riverpodでテストを書こうRiverpodでテストを書こう
Riverpodでテストを書こう
Shinnosuke Tokuda
 
CA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについてCA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについて
Huy Do
 
証明プログラミング超入門
証明プログラミング超入門証明プログラミング超入門
証明プログラミング超入門
Kyoko Kadowaki
 
RxShowcase -for ignote & i-Jupiter-
RxShowcase -for ignote & i-Jupiter-RxShowcase -for ignote & i-Jupiter-
RxShowcase -for ignote & i-Jupiter-
Takaaki Suzuki
 
Ansibleに貢献してみよう
Ansibleに貢献してみようAnsibleに貢献してみよう
Ansibleに貢献してみよう
Michihito Shigemura
 
ドキュメントを直し続ける話 #kbkz_tech
ドキュメントを直し続ける話 #kbkz_techドキュメントを直し続ける話 #kbkz_tech
ドキュメントを直し続ける話 #kbkz_tech
Michihito Shigemura
 
可視化周辺の進化がヤヴァイ~rChartsを中心として~
可視化周辺の進化がヤヴァイ~rChartsを中心として~可視化周辺の進化がヤヴァイ~rChartsを中心として~
可視化周辺の進化がヤヴァイ~rChartsを中心として~
Nagi Teramo
 

What's hot (7)

Riverpodでテストを書こう
Riverpodでテストを書こうRiverpodでテストを書こう
Riverpodでテストを書こう
 
CA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについてCA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについて
 
証明プログラミング超入門
証明プログラミング超入門証明プログラミング超入門
証明プログラミング超入門
 
RxShowcase -for ignote & i-Jupiter-
RxShowcase -for ignote & i-Jupiter-RxShowcase -for ignote & i-Jupiter-
RxShowcase -for ignote & i-Jupiter-
 
Ansibleに貢献してみよう
Ansibleに貢献してみようAnsibleに貢献してみよう
Ansibleに貢献してみよう
 
ドキュメントを直し続ける話 #kbkz_tech
ドキュメントを直し続ける話 #kbkz_techドキュメントを直し続ける話 #kbkz_tech
ドキュメントを直し続ける話 #kbkz_tech
 
可視化周辺の進化がヤヴァイ~rChartsを中心として~
可視化周辺の進化がヤヴァイ~rChartsを中心として~可視化周辺の進化がヤヴァイ~rChartsを中心として~
可視化周辺の進化がヤヴァイ~rChartsを中心として~
 

Similar to 技術的負債とリファクタリング

Sinatra軽量Web開発 - LOUPE Study #1
Sinatra軽量Web開発 - LOUPE Study #1Sinatra軽量Web開発 - LOUPE Study #1
Sinatra軽量Web開発 - LOUPE Study #1
Takuya Mukohira
 
[20190530]yahoo japan+kubernetes meetup "Rook v1.0で試すCSI"
[20190530]yahoo japan+kubernetes meetup "Rook v1.0で試すCSI"[20190530]yahoo japan+kubernetes meetup "Rook v1.0で試すCSI"
[20190530]yahoo japan+kubernetes meetup "Rook v1.0で試すCSI"
t8kobayashi
 
Ruby on Rails Overview
Ruby on Rails OverviewRuby on Rails Overview
Ruby on Rails Overview
Koki Shimizu
 
Railsプロジェクトを成功させるために現場ができること -Railsdevcon2010
Railsプロジェクトを成功させるために現場ができること -Railsdevcon2010Railsプロジェクトを成功させるために現場ができること -Railsdevcon2010
Railsプロジェクトを成功させるために現場ができること -Railsdevcon2010Yuki Akamatsu
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発
Koichi Shimozono
 
nomlab_okayamaruby_slide
nomlab_okayamaruby_slidenomlab_okayamaruby_slide
nomlab_okayamaruby_slide
nomlab
 
Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記
Yoshiyuki Nakamura
 
高速!Clojure Web 開発入門
高速!Clojure Web 開発入門高速!Clojure Web 開発入門
高速!Clojure Web 開発入門
Kazuki Tsutsumi
 
データベース屋がHyperledger Fabricを検証してみた
データベース屋がHyperledger Fabricを検証してみたデータベース屋がHyperledger Fabricを検証してみた
データベース屋がHyperledger Fabricを検証してみた
Hyperleger Tokyo Meetup
 
Railsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えてRailsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えて
Hirata Tomoko
 
普段Djangoを使っている人間がruby on railsを勉強してみた話
普段Djangoを使っている人間がruby on railsを勉強してみた話普段Djangoを使っている人間がruby on railsを勉強してみた話
普段Djangoを使っている人間がruby on railsを勉強してみた話
ko ty
 
Shimane2008
Shimane2008Shimane2008
Shimane2008
Yasuko Ohba
 
Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作
terurou
 
クリーンアーキテクチャ学んでみた
クリーンアーキテクチャ学んでみたクリーンアーキテクチャ学んでみた
クリーンアーキテクチャ学んでみた
Isao Ebisujima
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングterurou
 
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3Yukimitsu Izawa
 
マイクロサービスにおける 非同期アーキテクチャ
マイクロサービスにおける非同期アーキテクチャマイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける 非同期アーキテクチャ
ota42y
 
超高速アプリ開発法
超高速アプリ開発法超高速アプリ開発法
超高速アプリ開発法
Keiichi SASAKI
 
Web屋の運用その極意
Web屋の運用その極意Web屋の運用その極意
Web屋の運用その極意
Michihito Shigemura
 

Similar to 技術的負債とリファクタリング (20)

Sinatra軽量Web開発 - LOUPE Study #1
Sinatra軽量Web開発 - LOUPE Study #1Sinatra軽量Web開発 - LOUPE Study #1
Sinatra軽量Web開発 - LOUPE Study #1
 
[20190530]yahoo japan+kubernetes meetup "Rook v1.0で試すCSI"
[20190530]yahoo japan+kubernetes meetup "Rook v1.0で試すCSI"[20190530]yahoo japan+kubernetes meetup "Rook v1.0で試すCSI"
[20190530]yahoo japan+kubernetes meetup "Rook v1.0で試すCSI"
 
Ruby on Rails Overview
Ruby on Rails OverviewRuby on Rails Overview
Ruby on Rails Overview
 
Railsプロジェクトを成功させるために現場ができること -Railsdevcon2010
Railsプロジェクトを成功させるために現場ができること -Railsdevcon2010Railsプロジェクトを成功させるために現場ができること -Railsdevcon2010
Railsプロジェクトを成功させるために現場ができること -Railsdevcon2010
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発
 
nomlab_okayamaruby_slide
nomlab_okayamaruby_slidenomlab_okayamaruby_slide
nomlab_okayamaruby_slide
 
Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記
 
高速!Clojure Web 開発入門
高速!Clojure Web 開発入門高速!Clojure Web 開発入門
高速!Clojure Web 開発入門
 
データベース屋がHyperledger Fabricを検証してみた
データベース屋がHyperledger Fabricを検証してみたデータベース屋がHyperledger Fabricを検証してみた
データベース屋がHyperledger Fabricを検証してみた
 
Railsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えてRailsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えて
 
普段Djangoを使っている人間がruby on railsを勉強してみた話
普段Djangoを使っている人間がruby on railsを勉強してみた話普段Djangoを使っている人間がruby on railsを勉強してみた話
普段Djangoを使っている人間がruby on railsを勉強してみた話
 
Shimane2008
Shimane2008Shimane2008
Shimane2008
 
Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作
 
勉強会20140207
勉強会20140207勉強会20140207
勉強会20140207
 
クリーンアーキテクチャ学んでみた
クリーンアーキテクチャ学んでみたクリーンアーキテクチャ学んでみた
クリーンアーキテクチャ学んでみた
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミング
 
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
 
マイクロサービスにおける 非同期アーキテクチャ
マイクロサービスにおける非同期アーキテクチャマイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける 非同期アーキテクチャ
 
超高速アプリ開発法
超高速アプリ開発法超高速アプリ開発法
超高速アプリ開発法
 
Web屋の運用その極意
Web屋の運用その極意Web屋の運用その極意
Web屋の運用その極意
 

More from sinsoku listy

Rails6にいつ上げるか?
Rails6にいつ上げるか?Rails6にいつ上げるか?
Rails6にいつ上げるか?
sinsoku listy
 
Rails Testing on Fargate
Rails Testing on FargateRails Testing on Fargate
Rails Testing on Fargate
sinsoku listy
 
Search Form for Rails
Search Form for RailsSearch Form for Rails
Search Form for Rails
sinsoku listy
 
ENGINEER WORK!!
ENGINEER WORK!!ENGINEER WORK!!
ENGINEER WORK!!
sinsoku listy
 
自己修復的なインフラ -Self-Healing Infrastructure-
自己修復的なインフラ -Self-Healing Infrastructure-自己修復的なインフラ -Self-Healing Infrastructure-
自己修復的なインフラ -Self-Healing Infrastructure-
sinsoku listy
 
毎日gemをアップグレードする生活
毎日gemをアップグレードする生活毎日gemをアップグレードする生活
毎日gemをアップグレードする生活
sinsoku listy
 
Rails 5.2: credentials
Rails 5.2: credentialsRails 5.2: credentials
Rails 5.2: credentials
sinsoku listy
 
Randomly Failing Specs
Randomly Failing SpecsRandomly Failing Specs
Randomly Failing Specs
sinsoku listy
 
Git 初心者講座 by forkwell
Git 初心者講座 by forkwellGit 初心者講座 by forkwell
Git 初心者講座 by forkwell
sinsoku listy
 
Swift on Docker
Swift on DockerSwift on Docker
Swift on Docker
sinsoku listy
 
ES2015のカバレッジ計測
ES2015のカバレッジ計測ES2015のカバレッジ計測
ES2015のカバレッジ計測
sinsoku listy
 
CSSのカバレッジツール
CSSのカバレッジツールCSSのカバレッジツール
CSSのカバレッジツール
sinsoku listy
 
本当にあった怖い話 7つの幽霊 7つの成仏
本当にあった怖い話 7つの幽霊 7つの成仏本当にあった怖い話 7つの幽霊 7つの成仏
本当にあった怖い話 7つの幽霊 7つの成仏
sinsoku listy
 
Awsでwindowsゲームを動かす
Awsでwindowsゲームを動かすAwsでwindowsゲームを動かす
Awsでwindowsゲームを動かす
sinsoku listy
 
Action pack variantsの話
Action pack variantsの話Action pack variantsの話
Action pack variantsの話
sinsoku listy
 
LT_Gitのfast fowardと継続的デリバリー
LT_Gitのfast fowardと継続的デリバリーLT_Gitのfast fowardと継続的デリバリー
LT_Gitのfast fowardと継続的デリバリー
sinsoku listy
 
バージョン管理とGit
バージョン管理とGitバージョン管理とGit
バージョン管理とGitsinsoku listy
 
Git天空闘技場_ハンズオン
Git天空闘技場_ハンズオンGit天空闘技場_ハンズオン
Git天空闘技場_ハンズオンsinsoku listy
 
20101001 5分でわかるtrac pluginの作り方_slideshare
20101001 5分でわかるtrac pluginの作り方_slideshare20101001 5分でわかるtrac pluginの作り方_slideshare
20101001 5分でわかるtrac pluginの作り方_slidesharesinsoku listy
 

More from sinsoku listy (20)

Rails6にいつ上げるか?
Rails6にいつ上げるか?Rails6にいつ上げるか?
Rails6にいつ上げるか?
 
Rails Testing on Fargate
Rails Testing on FargateRails Testing on Fargate
Rails Testing on Fargate
 
Search Form for Rails
Search Form for RailsSearch Form for Rails
Search Form for Rails
 
ENGINEER WORK!!
ENGINEER WORK!!ENGINEER WORK!!
ENGINEER WORK!!
 
自己修復的なインフラ -Self-Healing Infrastructure-
自己修復的なインフラ -Self-Healing Infrastructure-自己修復的なインフラ -Self-Healing Infrastructure-
自己修復的なインフラ -Self-Healing Infrastructure-
 
毎日gemをアップグレードする生活
毎日gemをアップグレードする生活毎日gemをアップグレードする生活
毎日gemをアップグレードする生活
 
Rails 5.2: credentials
Rails 5.2: credentialsRails 5.2: credentials
Rails 5.2: credentials
 
Randomly Failing Specs
Randomly Failing SpecsRandomly Failing Specs
Randomly Failing Specs
 
Git 初心者講座 by forkwell
Git 初心者講座 by forkwellGit 初心者講座 by forkwell
Git 初心者講座 by forkwell
 
Swift on Docker
Swift on DockerSwift on Docker
Swift on Docker
 
ES2015のカバレッジ計測
ES2015のカバレッジ計測ES2015のカバレッジ計測
ES2015のカバレッジ計測
 
CSSのカバレッジツール
CSSのカバレッジツールCSSのカバレッジツール
CSSのカバレッジツール
 
本当にあった怖い話 7つの幽霊 7つの成仏
本当にあった怖い話 7つの幽霊 7つの成仏本当にあった怖い話 7つの幽霊 7つの成仏
本当にあった怖い話 7つの幽霊 7つの成仏
 
Awsでwindowsゲームを動かす
Awsでwindowsゲームを動かすAwsでwindowsゲームを動かす
Awsでwindowsゲームを動かす
 
Action pack variantsの話
Action pack variantsの話Action pack variantsの話
Action pack variantsの話
 
LT_Gitのfast fowardと継続的デリバリー
LT_Gitのfast fowardと継続的デリバリーLT_Gitのfast fowardと継続的デリバリー
LT_Gitのfast fowardと継続的デリバリー
 
バージョン管理とGit
バージョン管理とGitバージョン管理とGit
バージョン管理とGit
 
Git天空闘技場_ハンズオン
Git天空闘技場_ハンズオンGit天空闘技場_ハンズオン
Git天空闘技場_ハンズオン
 
DVCSとGitの基礎
DVCSとGitの基礎DVCSとGitの基礎
DVCSとGitの基礎
 
20101001 5分でわかるtrac pluginの作り方_slideshare
20101001 5分でわかるtrac pluginの作り方_slideshare20101001 5分でわかるtrac pluginの作り方_slideshare
20101001 5分でわかるtrac pluginの作り方_slideshare
 

技術的負債とリファクタリング