you can't miss what you can't measure

50
YOU CAN’T MISS WHAT YOU CAN’T MEASURE

Upload: kerri-miller

Post on 25-May-2015

279 views

Category:

Technology


4 download

DESCRIPTION

Adrift at sea, a GPS device will report your precise latitude and longitude, but if you don't know what those numbers mean, you're just as lost as before. Similarly, there are many tools that offer a wide variety of metrics about your code, but other than making you feel good, what are you supposed to do with this knowledge? Let's answer that question by exploring what the numbers mean, how static code analysis can add value to your development process, and how it can help us chart the unexplored seas of legacy code.

TRANSCRIPT

Page 1: You Can't Miss What You Can't Measure

YOU CAN’TMISS WHATYOU CAN’T MEASURE

Page 2: You Can't Miss What You Can't Measure
Page 3: You Can't Miss What You Can't Measure

Y’uh can’ git the’uh fruhm he’uh

[You can’t get there from here]

Page 4: You Can't Miss What You Can't Measure
Page 5: You Can't Miss What You Can't Measure
Page 6: You Can't Miss What You Can't Measure
Page 7: You Can't Miss What You Can't Measure
Page 8: You Can't Miss What You Can't Measure
Page 9: You Can't Miss What You Can't Measure
Page 10: You Can't Miss What You Can't Measure
Page 11: You Can't Miss What You Can't Measure

RED ➭ GREEN ➭ REFACTOR

Page 12: You Can't Miss What You Can't Measure
Page 13: You Can't Miss What You Can't Measure

1. Denial2. Anger3. Bargaining4. Depression5. Acceptance

Page 14: You Can't Miss What You Can't Measure

1. Depression2. Bargaining3. Anger4. Acceptance5. Denial

Page 15: You Can't Miss What You Can't Measure
Page 16: You Can't Miss What You Can't Measure

@customers = Person.find_by_contents(@phrase, :columns => ['first_name', 'last_name', 'business_name', 'email_address', 'phone1'], :include => { :contacts => :customer }, :limit => 50).collect { |person| person.contacts.collect { |contact| contact.customer } }.flatten

Page 17: You Can't Miss What You Can't Measure

{10:51}[1.9.3]~/project:master ✓ ➭ git blame app/controllers/customers_... ... cf2ee204 (Kerri Miller 2012-02-18 12:09:22 -0700 36)

Page 18: You Can't Miss What You Can't Measure
Page 19: You Can't Miss What You Can't Measure

TEST COVERAGE

Page 20: You Can't Miss What You Can't Measure

TEST COVERAGEC0 — % of lines of code that have been executed

C1 — % of branches that have been followed at least once C2 — % of unique paths through the source code that have been followed

Page 21: You Can't Miss What You Can't Measure
Page 22: You Can't Miss What You Can't Measure

LINES OF CODE

Page 23: You Can't Miss What You Can't Measure

LINES OF CODE{20:32}[1.9.3]~/project:master ✓ ➭ rake stats

+----------------------+-------+-------+---------+---------+-----+-------+| Name | Lines | LOC | Classes | Methods | M/C | LOC/M |+----------------------+-------+-------+---------+---------+-----+-------+| Controllers | 2297 | 1566 | 18 | 106 | 5 | 12 || Helpers | 177 | 137 | 0 | 18 | 0 | 5 || Models | 3948 | 2522 | 35 | 272 | 7 | 7 || Libraries | 164 | 92 | 4 | 12 | 3 | 5 || Model specs | 2863 | 2143 | 1 | 2 | 2 | 1069 || View specs | 5 | 3 | 0 | 0 | 0 | 0 || Controller specs | 4283 | 3632 | 0 | 0 | 0 | 0 || Helper specs | 152 | 108 | 0 | 0 | 0 | 0 || Library specs | 51 | 36 | 0 | 0 | 0 | 0 |+----------------------+-------+-------+---------+---------+-----+-------+| Total | 13940 | 10239 | 58 | 410 | 7 | 22 |+----------------------+-------+-------+---------+---------+-----+-------+ Code LOC: 4317 Test LOC: 5922 Code to Test Ratio: 1:1.4

Page 24: You Can't Miss What You Can't Measure

STATIC vs DYNAMIC

Page 25: You Can't Miss What You Can't Measure

"Data is easy. Information is hard."

-Dr Ying Li

Page 26: You Can't Miss What You Can't Measure

COMPLEXITY

Page 27: You Can't Miss What You Can't Measure

CYCLOMATIC

Page 28: You Can't Miss What You Can't Measure

lin·e·ar·li

Page 29: You Can't Miss What You Can't Measure

ASSIGNMENTSBRANCHESCONDITIONALS

Page 30: You Can't Miss What You Can't Measure

class Test  def blah             a = eval "1+1" # 1.2 (a=) + 6.0 (eval)    if a == 2 then # 1.2 (if) + 1.2(==) + 0.4 (fixnum)      puts "yay"   # 1.2 (puts)    end  endend # 11.2 total

FLOG

Page 31: You Can't Miss What You Can't Measure

• Extract Method• Decompose Objects• Rethink your domain model

Page 32: You Can't Miss What You Can't Measure

CHURN

Page 33: You Can't Miss What You Can't Measure

app/models/user.rb = 84

app/models/invoice.rb = 88

Page 34: You Can't Miss What You Can't Measure

Wonderland Trail

Length:47.2 miles

Page 35: You Can't Miss What You Can't Measure

Wonderland Trail

Length:47.2 miles

Page 36: You Can't Miss What You Can't Measure

app/models/user.rb = 84

app/models/invoice.rb = 88

Page 37: You Can't Miss What You Can't Measure
Page 38: You Can't Miss What You Can't Measure
Page 39: You Can't Miss What You Can't Measure
Page 40: You Can't Miss What You Can't Measure

{10:54}[1.9.3]~/project:master ✓ ➭ git blame app/models/subscription.rb ... c9ce82b4 (Kerri Miller 2012-05-18 10:19:47 -0700

Page 41: You Can't Miss What You Can't Measure

{20:32}[1.9.3]~/project:master ✓ ➭ flog -a app/models/subscription.rb 1609.9: flog total 61.9: flog/method average

408.8: Subscription#update app/models/subscription.rb:472 323.2: Subscription#new app/models/subscription.rb:250 252.0: Subscription#reply app/models/subscription.rb:137 230.5: Subscription::send_notifications app/models/subscription.rb:78 33.6: Subscription#none 25.5: Subscription#can_expire? app/models/subscription.rb:155 11.7: Subscription::reject_no_ack app/models/subscription.rb:205 4.8: Subscription#initialize app/models/subscription.rb:64 4.4: Subscription#expire! app/models/subscription.rb:183 3.7: Subscription#unexpire! app/models/subscription.rb:194 3.4: Subscription#reason_text app/models/subscription.rb:172 2.2: Subscription#is_current? app/models/subscription.rb:178 2.0: Subscription#to_s app/models/subscription.rb:71

Page 42: You Can't Miss What You Can't Measure

{20:33}[1.9.3]~/project:master ✓ ➭ flog -d app/models/subscription.rb 321.7: flog total 32.2: flog/method average

230.5: Subscription::send_notifications app/models/subscription.rb:78 47.8: branch 31.7: ticket 23.1: assignment 17.9: user 17.6: [] 12.2: empty? 9.8: support_queue 8.1: deliver 8.0: class 7.6: email_address 7.0: ==

Page 43: You Can't Miss What You Can't Measure

{08:16}[1.9.3]~/project:master ✓ ➭ flog -a app/models/subscription.rb

52.8: Subscription::send_notifications app/models/subscription.rb:80 28.8: Subscription#none 25.5: Subscription#can_expire? app/models/subscription.rb:119 10.2: Subscription::set_mail_options app/models/subscription.rb:221 9.8: Subscription::email_staff app/models/subscription.rb:268 8.5: Subscription::filter_subscriptions app/models/subscription.rb:17 7.9: Subscription::email_reviewers app/models/subscription.rb:258 7.3: Subscription::email_subscribers app/models/subscription.rb:169 6.3: Subscription::subscriber_emails app/models/subscription.rb:204 5.0: Subscription::log_rate_limited app/models/subscription.rb:239 4.8: Subscription#initialize app/models/subscription.rb:65 4.7: Subscription::extract_email_addresses app/models/subscription.rb 4.6: Subscription::filter_rate_limited app/models/subscription.rb:248 4.4: Subscription#expire! app/models/subscription.rb:147 4.0: Subscription::wants_notifications_on_own_posts? app/models/subsc 3.7: Subscription#unexpire! app/models/subscription.rb:158 3.4: Subscription#reason_text app/models/subscription.rb:136 3.2: Subscription::valid_recipient? app/models/subscription.rb:187 2.4: Subscription::ok_to_email? app/models/subscription.rb:183 2.2: Subscription#is_current? app/models/subscription.rb:142 2.0: Subscription#to_s app/models/subscription.rb:73 1.5: Subscription::find_reviewers app/models/subscription.rb:254 1.4: Subscription::mail_subject app/models/subscription.rb:217

Page 44: You Can't Miss What You Can't Measure

{08:43}[1.9.3]~/project:master ✓ ➭ flog -a app/models/subscription.rb 27.9: Subscription#none 25.5: Subscription#can_expire? app/models/subscription.rb:78 4.8: Subscription#initialize app/models/subscription.rb:65 4.4: Subscription#expire! app/models/subscription.rb:106 3.7: Subscription#unexpire! app/models/subscription.rb:117 3.4: Subscription#reason_text app/models/subscription.rb:95 2.2: Subscription#is_current? app/models/subscription.rb:101 2.0: Subscription#to_s app/models/subscription.rb:73

{08:43}[1.9.3]~/project:master ✓ ➭ flog -a app/models/subscriber_notifier.rb 136.6: flog total 8.5: flog/method average

54.1: SubscriberNotifier::send_notifications app/models/subscriber_notif 12.0: SubscriberNotifier::email_subscribers app/models/subscriber_notifi 10.2: SubscriberNotifier::set_mail_options app/models/subscriber_notifie 9.8: SubscriberNotifier::email_staff app/models/subscriber_notifier.rb 8.5: SubscriberNotifier::filter_subscriptions app/models/subscriber_not 7.9: SubscriberNotifier::email_reviewers app/models/subscriber_notifier 6.3: SubscriberNotifier::subscriber_emails app/models/subscriber_notifi 5.0: SubscriberNotifier::log_rate_limited app/models/subscriber_notifie 4.7: SubscriberNotifier::extract_email_addresses app/models/subscriber_ 4.6: SubscriberNotifier::filter_rate_limited app/models/subscriber_noti 4.0: SubscriberNotifier::wants_notifications_on_own_posts? app/models/s 3.2: SubscriberNotifier::valid_recipient? app/models/subscriber_notifie 2.4: SubscriberNotifier::ok_to_email? app/models/subscriber_notifier.rb

Page 45: You Can't Miss What You Can't Measure
Page 46: You Can't Miss What You Can't Measure

> gem install flay

Page 47: You Can't Miss What You Can't Measure

rails_best_practices reek roodi pelusa cane

BEST PRACTICES & STYLE

Page 48: You Can't Miss What You Can't Measure
Page 49: You Can't Miss What You Can't Measure
Page 50: You Can't Miss What You Can't Measure

THANKS!★ @kerrizor

★ glass artist

★ vespa mechanic

★ lighting designer

★ professional poker player

★ Senior Developer @ Amazon, Contour.com, Blue Box Group