12 hours to rate a rails application

98
hours to rate a Rails application Elise Huard @elise_huard http://jabberwocky.eu Tuesday 8 June 2010

Upload: ehuard

Post on 17-May-2015

2.369 views

Category:

Technology


0 download

DESCRIPTION

improved version of 12 hours to rate a rails application - modified after feedback from Euruko and ScotRuby. As presented at Railsconf

TRANSCRIPT

Page 1: 12 hours to rate a rails application

hours to rate a Rails application

Elise Huard @elise_huardhttp://jabberwocky.eu

Tuesday 8 June 2010

Page 2: 12 hours to rate a rails application

Acquisition

Tuesday 8 June 2010

Page 3: 12 hours to rate a rails application

Maintenance

Tuesday 8 June 2010

Page 4: 12 hours to rate a rails application

12 hours To Rate a Rails Application

12:00

Tuesday 8 June 2010

Page 5: 12 hours to rate a rails application

Team

Tuesday 8 June 2010

Page 6: 12 hours to rate a rails application

One man’s application

Tuesday 8 June 2010

Page 7: 12 hours to rate a rails application

Maintenance

Maintenance

Innovator

Automator

Control freak

Tuesday 8 June 2010

Page 8: 12 hours to rate a rails application

...

Tuesday 8 June 2010

Page 9: 12 hours to rate a rails application

Vision

photo by OneEighteen

vision

Tuesday 8 June 2010

Page 10: 12 hours to rate a rails application

Methodology

Tuesday 8 June 2010

Page 11: 12 hours to rate a rails application

docman on flickr

issue TrackerVersion control

Tuesday 8 June 2010

Page 12: 12 hours to rate a rails application

Back seat driver

Tuesday 8 June 2010

Page 13: 12 hours to rate a rails application

10:00

12 hours To Rate a Rails Application

Tuesday 8 June 2010

Page 14: 12 hours to rate a rails application

Try the app

Björn Söderqvist on Flickr

Tuesday 8 June 2010

Page 15: 12 hours to rate a rails application

does it work ?

Tuesday 8 June 2010

Page 16: 12 hours to rate a rails application

09:45

12 hours To Rate a Rails Application

Tuesday 8 June 2010

Page 17: 12 hours to rate a rails application

Rails version

Tuesday 8 June 2010

Page 18: 12 hours to rate a rails application

plugins and gems

Photo Lex on Flickr

Tuesday 8 June 2010

Page 19: 12 hours to rate a rails application

Tuesday 8 June 2010

Page 20: 12 hours to rate a rails application

managing updatesBundlerpiston

git submodules(svn externals)

Tuesday 8 June 2010

Page 21: 12 hours to rate a rails application

LicensesBSD, MIT, Apache ...

Tuesday 8 June 2010

Page 22: 12 hours to rate a rails application

NIH syndrom

Tuesday 8 June 2010

Page 23: 12 hours to rate a rails application

Run Tests

Tuesday 8 June 2010

Page 24: 12 hours to rate a rails application

09:00

12 hours To Rate a Rails Application

Tuesday 8 June 2010

Page 25: 12 hours to rate a rails application

Lots of code

Tuesday 8 June 2010

Page 26: 12 hours to rate a rails application

config/routes.rb

match ‘/’, :to => ‘root#index’ match ‘root’, :to => ‘root#index’

namespace :admin do resources :grids do resources :nodes resources :edges do collection do post :all post :update_all end end resources :walkers endend resources :nodes, :only => [:show,:new,:create,:destroy] do put :directions, :on => :collectionend

resources :walkers, :only => [:show,:new,:create,:destroy] do get :select, :on => :collectionendresources :itineraries, :only => [:show]

map.four_oh_four '*path' , :controller => 'four_oh_fours'Tuesday 8 June 2010

Page 27: 12 hours to rate a rails application

modelsrailroad -M | dot Tpng > models.png

rubymine ctrl-alt-D

Tuesday 8 June 2010

Page 28: 12 hours to rate a rails application

names

“There are only two hard things in Computer Science: cache invalidation and naming things”

Phil Karlton

Tuesday 8 June 2010

Page 29: 12 hours to rate a rails application

08:30

12 hours To Rate a Rails Application

Tuesday 8 June 2010

Page 30: 12 hours to rate a rails application

Metricsknow thine tools

docman on flickr

Tuesday 8 June 2010

Page 31: 12 hours to rate a rails application

LOC

rake stats+----------------------+-------+-------+---------+---------+-----+-------+| Name | Lines | LOC | Classes | Methods | M/C | LOC/M |+----------------------+-------+-------+---------+---------+-----+-------+| Controllers | 2702 | 2150 | 36 | 158 | 4 | 11 || Helpers | 358 | 303 | 0 | 22 | 0 | 11 || Models | 1358 | 1104 | 30 | 117 | 3 | 7 || Libraries | 2286 | 1655 | 38 | 152 | 4 | 8 || Integration tests | 0 | 0 | 0 | 0 | 0 | 0 || Functional tests | 1687 | 1322 | 31 | 195 | 6 | 4 || Unit tests | 1356 | 1079 | 27 | 158 | 5 | 4 |+----------------------+-------+-------+---------+---------+-----+-------+| Total | 9747 | 7613 | 162 | 802 | 4 | 7 |+----------------------+-------+-------+---------+---------+-----+-------+ Code LOC: 5212 Test LOC: 2401 Code to Test Ratio: 1:0.5

Tuesday 8 June 2010

Page 32: 12 hours to rate a rails application

RubyParser and Parsetree

Ryan Davis and Eric Hodel(‘Ruby Sadists’)

Tuesday 8 June 2010

Page 33: 12 hours to rate a rails application

RubyParser and Parsetree

Abstract syntax treeRubyParser.new.parse(File.read(‘metrics.rb’),‘metric.rb’)

class Metrics def probe puts "good" end end

s(:class,:Metrics, nil, s(:scope, s(:defn,:probe, s(:args), s(:scope, s(:block, s(:call, nil, :puts, s(:arglist, s(:str, "good"))))))))

Symbolic Expression (Sexp)

Tuesday 8 June 2010

Page 34: 12 hours to rate a rails application

RubyParser and Parsetree

Abstract syntax treeRubyParser.new.parse(File.read(‘metrics.rb’),‘metric.rb’)

class Metrics def probe puts "good" end end

s(:class,:Metrics, nil, s(:scope, s(:defn,:probe, s(:args), s(:scope, s(:block, s(:call, nil, :puts, s(:arglist, s(:str, "good"))))))))

Symbolic Expression (Sexp)

Ruby2Ruby

Tuesday 8 June 2010

Page 35: 12 hours to rate a rails application

RubyParser

Parsetree

pure ruby

ruby and inline c< 1.9

swap out with Ripper ?

Tuesday 8 June 2010

Page 36: 12 hours to rate a rails application

cyclomatic complexity

size

code complexity code similarities

test coverage

antipatterns

rake stats

Flay

ReekRoodi

Flog

Saikuro

Heckle Rcov

Rails

R_B_P

Tuesday 8 June 2010

Page 37: 12 hours to rate a rails application

flog‘the pain your code

is in’

Tuesday 8 June 2010

Page 38: 12 hours to rate a rails application

FLOG

flog lib/flog.rb 647.8: flog total 13.8: flog/method average

87.5: Flog#output_details 58.8: Flog#process_iter 54.2: Flog#flog 48.8: Flog#parse_options 34.1: Flog#none 23.2: Flog#output_method_details 22.1: Flog#score_method 16.0: Flog#process_block_pass 15.6: Flog#report 15.2: Flog#expand_dirs_to_files 15.0: Flog#klass_name

Tuesday 8 June 2010

Page 39: 12 hours to rate a rails application

FLOG

Assignment Branch Condition (ABC) def score_method(tally) a, b, c = 0, 0, 0 tally.each do |cat, score| case cat when :assignment then a += score when :branch then b += score else c += score end end Math.sqrt(a*a + b*b + c*c) end

Tuesday 8 June 2010

Page 40: 12 hours to rate a rails application

FLOG

Weighing the AST with factors def process_if(exp) add_to_score :branch process exp.shift # cond penalize_by 0.1 do process exp.shift # true process exp.shift # false end s() end

Tuesday 8 June 2010

Page 41: 12 hours to rate a rails application

FLOG

Very good: < 20All Right: < 50

Tuesday 8 June 2010

Page 42: 12 hours to rate a rails application

FLAYcode similarities

Tuesday 8 June 2010

Page 43: 12 hours to rate a rails application

flay *.rb Total score (lower is better) = 621

1) IDENTICAL code found in :defn (mass*2 = 188) channel.rb:48 clip.rb:80

2) Similar code found in :defn (mass = 93) channel.rb:150 clip.rb:110 clip.rb:116

3) Similar code found in :defs (mass = 58) contact.rb:32 contact.rb:37

FLAY

Tuesday 8 June 2010

Page 44: 12 hours to rate a rails application

RubyParser def mass @mass ||= self.structure.flatten.size end

Hash of structure of nodes with mass > threshold self.hashes[node.structural_hash] << node

analyze: if same hash = similarif same node = identical

FLAY

Tuesday 8 June 2010

Page 45: 12 hours to rate a rails application

Saikuroサイクロ

cyclomatic complexity

Tuesday 8 June 2010

Page 46: 12 hours to rate a rails application

Saikuro

Tuesday 8 June 2010

Page 47: 12 hours to rate a rails application

Saikuro

ruby-lex

every keyword is interpreted into ‘state’

state used to calculateif, unless, while, until, for, elsif, when, rescue

(blocks)Recursively

Tuesday 8 June 2010

Page 48: 12 hours to rate a rails application

Saikuro

Good:methods < 5

Tuesday 8 June 2010

Page 49: 12 hours to rate a rails application

Roodi‘Ruby Object Oriented Design Inferometer’

nutmeg66 on flickr

Tuesday 8 June 2010

Page 50: 12 hours to rate a rails application

Roodi

app/controllers/itineraries_controller.rb:4 - Method name "show" cyclomatic complexity is 14. It should be 8 or less.app/models/itinerary.rb:41 - Block cyclomatic complexity is 6. It should be 4 or less.app/controllers/itineraries_controller.rb:4 - Method "show" has 30 lines. It should have 20 or less.app/helpers/application_helper.rb:27 - Method "clippy" has 26 lines. It should have 20 or less.

Tuesday 8 June 2010

Page 51: 12 hours to rate a rails application

Roodi

RubyParservisitor pattern visitor: checker (Configurable) visitable: parsed nodes= extensible

Tuesday 8 June 2010

Page 52: 12 hours to rate a rails application

Reek

Tuesday 8 June 2010

Page 53: 12 hours to rate a rails application

Reek

UserSessionsController has no descriptive comment (Irresponsible Module) UserSessionsController#destroy calls current_user_session twice (Duplication)app/controllers/users_controller.rb -- 5 warnings: UsersController has no descriptive comment (Irresponsible Module) UsersController tests @aid_app at least 4 times (Simulated Polymorphism) UsersController#create calls params 3 times (Duplication) UsersController#create calls params[:user] 3 times (Duplication)...

Tuesday 8 June 2010

Page 55: 12 hours to rate a rails application

Reek

RubyParserextends parsed nodes

traverses nodesreturns code after Ruby2Ruby

Tuesday 8 June 2010

Page 56: 12 hours to rate a rails application

rails_best_practices

kamoda on Flickr

Tuesday 8 June 2010

Page 57: 12 hours to rate a rails application

./app/controllers/ws/vmg/aid_user_accounts_controller.rb:160 - move model logic into model (@aid_user_account called_count > 4)./app/controllers/ws/vmg/ipt_controller.rb:102 - move model logic into model (xml called_count > 4)./app/controllers/ws/vmg/ipt_controller.rb:102 - move model logic into model (pf called_count > 4)./config/routes.rb:3 - overuse route customizations (customize_count > 3)./config/routes.rb:35 - overuse route customizations (customize_count > 3)./app/models/vmg/scenario.rb:41 - keep finders on their own model

rails_best_practices

Tuesday 8 June 2010

Page 58: 12 hours to rate a rails application

rails_best_practices

Visitor patternvisitor : checking_visitorvisitable: visitable sexp

Tuesday 8 June 2010

Page 59: 12 hours to rate a rails application

Churn

Tuesday 8 June 2010

Page 60: 12 hours to rate a rails application

Churn

Not only classes but also methods(RubyParser)

Version control: git, Hg, svnLocates changes in source using logs

(as in git log)

Tuesday 8 June 2010

Page 61: 12 hours to rate a rails application

Churn

+-------------------------------------------------+---------------+| file_path | times_changed |+-------------------------------------------------+---------------+| db/schema.rb | 26 || config/routes.rb | 24 || app/controllers/application_controller.rb | 22 || app/controllers/add_apps_controller.rb | 22 || config/environment.rb | 20 || app/views/layouts/application.html.erb | 20 || app/models/ability.rb | 18 |...

Tuesday 8 June 2010

Page 62: 12 hours to rate a rails application

Churn

common sense ... mostly useful in maintenance phase

Tuesday 8 June 2010

Page 63: 12 hours to rate a rails application

Rcov

Tuesday 8 June 2010

Page 64: 12 hours to rate a rails application

Rcov

Total coverage: comments included

Tuesday 8 June 2010

Page 65: 12 hours to rate a rails application

Rcov

Executes testkeeps track of the executed linesUsing C extension when possible

to hook into MRI

(experimental for 1.9)

Tuesday 8 June 2010

Page 66: 12 hours to rate a rails application

Rcov

good: 100% coverage

Tuesday 8 June 2010

Page 67: 12 hours to rate a rails application

Heckle

Tuesday 8 June 2010

Page 68: 12 hours to rate a rails application

Heckle

ParseTree + Ruby2Rubymutate

Tuesday 8 June 2010

Page 69: 12 hours to rate a rails application

Heckle

Initial tests pass. Let's rumble.

************************************************************************* AidApp#property_names loaded with 4 possible mutations**********************************************************************

4 mutations remaining...Replacing AidApp#property_names with:

--- original+++ mutation def property_names- (meta_policy and meta_policy.property_names_for(:aid_app))+ (nil and meta_policy.property_names_for(:aid_app)) end

Tuesday 8 June 2010

Page 70: 12 hours to rate a rails application

time-consuming: combinatorialsmore for small programs (gems, scripts)

doesn’t work for ruby 1.9 (ParseTree)

Heckle

Tuesday 8 June 2010

Page 71: 12 hours to rate a rails application

cyclomatic complexity

size

code complexity code similarities

test coverage

antipatterns

rake stats

Flay

ReekRoodi

Flog

Saikuro

Heckle Rcov

Rails

R_B_P

Tuesday 8 June 2010

Page 72: 12 hours to rate a rails application

metric_fu

Tuesday 8 June 2010

Page 73: 12 hours to rate a rails application

what these metrics don’t tell you

Bugs

Tuesday 8 June 2010

Page 74: 12 hours to rate a rails application

what these metrics don’t tell you

code performanceRuby Profiling

Tuesday 8 June 2010

Page 75: 12 hours to rate a rails application

Reads like a book

Tuesday 8 June 2010

Page 76: 12 hours to rate a rails application

06:30

12 hours To Rate a Rails Application

Tuesday 8 June 2010

Page 77: 12 hours to rate a rails application

OrbitalJoe on flickr

check out the good stuff

Tuesday 8 June 2010

Page 78: 12 hours to rate a rails application

Database

db/schema.rbseed data

everything in migrations ?

Tuesday 8 June 2010

Page 79: 12 hours to rate a rails application

views

Bad:unindenteddivitis(too much) javascript in bodytoo much logic in viewiew

Tuesday 8 June 2010

Page 80: 12 hours to rate a rails application

04:30

12 hours To Rate a Rails Application

Tuesday 8 June 2010

Page 81: 12 hours to rate a rails application

Tests

Tuesday 8 June 2010

Page 82: 12 hours to rate a rails application

maintainable test suite

tests = software

changes in implementationchanges in requirements

Tuesday 8 June 2010

Page 83: 12 hours to rate a rails application

maintainable test suite

express code responsibilityhide implementation detail

Tuesday 8 June 2010

Page 84: 12 hours to rate a rails application

maintainable test suite

-> expressive code

(DRY not mandatory)

Tuesday 8 June 2010

Page 85: 12 hours to rate a rails application

02:30

12 hours To Rate a Rails Application

Tuesday 8 June 2010

Page 86: 12 hours to rate a rails application

Deployment

photo by devilarts on flickrTuesday 8 June 2010

Page 87: 12 hours to rate a rails application

Deployment

Tuesday 8 June 2010

Page 88: 12 hours to rate a rails application

Deployment

Automation, automation, automation

Tuesday 8 June 2010

Page 89: 12 hours to rate a rails application

Deployment

deployment = softwaresame rules apply

Tuesday 8 June 2010

Page 90: 12 hours to rate a rails application

Deployment

TrafficPerformance tests

Bottlenecks

Tuesday 8 June 2010

Page 91: 12 hours to rate a rails application

01:00

12 hours To Rate a Rails Application

Tuesday 8 June 2010

Page 92: 12 hours to rate a rails application

Brownie Points

Tuesday 8 June 2010

Page 93: 12 hours to rate a rails application

Continuous integration

... and they’re using it

Tuesday 8 June 2010

Page 94: 12 hours to rate a rails application

Documentation of any kind

... and it’s up to date

Tuesday 8 June 2010

Page 95: 12 hours to rate a rails application

monitoringexception notification

Log analyzers

Tuesday 8 June 2010

Page 96: 12 hours to rate a rails application

testing javascript

Continuous performance testing

Tuesday 8 June 2010

Page 97: 12 hours to rate a rails application

00:00

12 hours To Rate a Rails Application

Tuesday 8 June 2010