SlideShare uma empresa Scribd logo
1 de 29
TRAIN TO TEST
   M. SCOTT FORD
CONTACT INFO

Senior Developer with Rails Dog, LLC
Chief Code Monkey with Corgibytes, LLC
mscottford.com
github.com/mscottford
@mscottford
scott@mscottford.com
WHY I GOT STARTED
PROJECTS

Library automation             Law enforcement
Experimental aircraft          Public API for email hosting
Library self checkout          More law enforcement
Real property management       Content management
Railroad traffic control        E-Commerce
Back office automation
MISSION CRITICAL AND
                 SAFETY CRITICAL


Safety critical:
        a software failure may result in the loss of someone’s life
Mission critical:
        a software failure may result in the loss of someone’s money
MY CONCLUSION


Every project is critical.
Critical projects should be
tested.
MY CONCLUSION


Every project is critical.
Critical projects should be
tested.
Every project should be
tested.
WHY TRAINING?
TESTING AND EXERCISE
           HAVE A LOT IN COMMON
Getting started is intimidating
Improves health
Developing the habit is hard
Work now prevents problems
later
There’s always room for
improvement
EXERCISE #1
BUYING A GYM MEMBERSHIP
ADD RSPEC TO YOUR GEMFILE

$ gem install bundler

# ./Gemfile

source :rubygems
gem ‘rspec’

$ bundle
CREATE SPEC DIRECTORY

$ mkdir spec

# ./spec/spec_helper.rb

require ‘demo’
CREATE YOUR FIRST SPEC

# ./spec/demo_spec.rb

require ‘spec_helper’

describe Demo do
  it ‘should exist’ do
  end
end
RUN RSPEC

$ rspec
.

Finished in 0.00034 seconds
1 example, 0 failures
EXECISE #2
 CREATE GOALS
LET’S TALK ABOUT MEASUREMENTS

Test Coverage                   Body Mass Index
TC = Tested LOC / LOC           BMI = mass / height2
Size of your project dictates   Your age dictates what’s
what’s reasonable               reasonable
Too much energy on test         It’s possible to go to the gym
coverage is not productive      too much
WHAT GOAL SHOULD I SET


SMART goals are best
Specific Measurable Attainable Reasonable and Timely.
Example:
By January 2013 test coverage will have increased by 5 percentage
points to 12%.
Source: http://en.wikipedia.org/wiki/SMART_criteria
EXERCISE #3
  BUY A SCALE
ADD SIMPLECOV TO YOUR GEMFILE

# ./Gemfile

source :rubygems
gem ‘rspec’
gem ‘simplecov’

$ bundle
ADD SIMPLECOV TO SPEC_HELPER.RB

# ./spec/spec_helper.rb

require 'simplecov'
SimpleCov.start

require 'demo'
RUN RSPEC

$ rspec
.

Finished in 0.00043 seconds
1 example, 0 failures
Coverage report generated for RSpec to ./coverage.
2 / 3 LOC (66.67%) covered.
EXERCISE #4
GET ON THE DAMN TREADMILL
WRITE MORE TESTS

Anytime you find yourself asking these questions, consider writing a
test
  What happens when I pass nil to this method?
  How does this method respond if a dependent method raises an
  exception?
  Do those 30 lines that I wrote actually work? (How about the 30 I
  haven’t written yet?)
THIS IS A PERFECTLY VALID TEST

describe Demo do
  it ‘should not crashed when created with nil’
    Demo.new(nil)
  end
end
PRACTICE NOT USING THE DEBUGGER


When you start a debugging session you have a question that you’re
trying to answer.
Consider whether or not it’s possible to formalize that question in a
test.
If you find yourself repeating the debugging session more than twice,
then find a way to formalize the question.
EXERCISE #5
 STAYING FOCUSED
THINGS TO KEEP IN MIND

It’s okay that you’re struggling.   There are others out there like
                                    you.
It’s okay that you’re not testing
every single line of code.          You are not alone.
It’s okay that you want to give     Sticking with it is hard, but
up.                                 worthwhile.
It’s okay that you feel guilty
about not testing enough.
PHOTO CREDITS

All photos are licensed under a Created Commons              “Apples & Oranges - They Don’t Compare” by
license that requires attribution. In order of appearance:   TheBusyBrain
                                                             http://www.flickr.com/photos/thebusybrain/2492945625/
“Brompton World Championship - Sprint Finish” by Jon
Spooner                                                      “out with the old, in with the new” by KetuGajjar
http://www.flickr.com/photos/johnspooner/2899977876/          http://www.flickr.com/photos/ketugajjar/5406134368/

“Young & Old, Let’s Get it On” by AlphaTangoBravo /          “FOCUS on the GOAL !” by GHOURI !
Adam Baker                                                   http://www.flickr.com/photos/geekydevil/2707101111/
http://www.flickr.com/photos/atbaker/447122802/               “scale_zero” by dsearls
“Sailor participates in Marine Corps Combat Fitness          http://www.flickr.com/photos/docsearls/5500725788/
Test.” by Official U.S. Navy Imagery                          “New Year’s Resolution: 36/365” by SashaW
http://www.flickr.com/photos/usnavy/5590118536/               http://www.flickr.com/photos/sashawolff/3171917389/
“Danbo Goes to the Gym” by chauromano                        “Focus” by toolstop
http://www.flickr.com/photos/chauromano/5786885286/           http://www.flickr.com/photos/toolstop/4546017269/
CONTACT INFO

Senior Developer with Rails Dog, LLC
Chief Code Monkey with Corgibytes, LLC
mscottford.com
github.com/mscottford
@mscottford
scott@mscottford.com

Mais conteúdo relacionado

Mais de M. Scott Ford

Lessons Learned Migrating from Jekyll to Next.pptx
Lessons Learned Migrating from Jekyll to Next.pptxLessons Learned Migrating from Jekyll to Next.pptx
Lessons Learned Migrating from Jekyll to Next.pptxM. Scott Ford
 
PyGeekle 2022 - A Deep Dive into Measuring Dependency Freshness with LibYear
PyGeekle 2022 - A Deep Dive into Measuring Dependency Freshness with LibYearPyGeekle 2022 - A Deep Dive into Measuring Dependency Freshness with LibYear
PyGeekle 2022 - A Deep Dive into Measuring Dependency Freshness with LibYearM. Scott Ford
 
Communication is Just as Important as Code
Communication is Just as Important as CodeCommunication is Just as Important as Code
Communication is Just as Important as CodeM. Scott Ford
 
MenderCon 2021 - Keynote
MenderCon 2021 - KeynoteMenderCon 2021 - Keynote
MenderCon 2021 - KeynoteM. Scott Ford
 
Moving a Monolith to Kubernetes
Moving a Monolith to KubernetesMoving a Monolith to Kubernetes
Moving a Monolith to KubernetesM. Scott Ford
 
MenderCon 2020 Keynote Presentation
MenderCon 2020 Keynote PresentationMenderCon 2020 Keynote Presentation
MenderCon 2020 Keynote PresentationM. Scott Ford
 
Makers and menders - Finding Talent for Legacy Code Projects
Makers and menders - Finding Talent for Legacy Code ProjectsMakers and menders - Finding Talent for Legacy Code Projects
Makers and menders - Finding Talent for Legacy Code ProjectsM. Scott Ford
 
A deep dive into measuring dependency freshness with lib year
A deep dive into measuring dependency freshness with lib yearA deep dive into measuring dependency freshness with lib year
A deep dive into measuring dependency freshness with lib yearM. Scott Ford
 
Building a Bridge to a Legacy Application: How Hard Can That Be?
Building a Bridge to a Legacy Application: How Hard Can That Be?Building a Bridge to a Legacy Application: How Hard Can That Be?
Building a Bridge to a Legacy Application: How Hard Can That Be?M. Scott Ford
 
Important metrics for Measuring Code Health
Important metrics for Measuring Code HealthImportant metrics for Measuring Code Health
Important metrics for Measuring Code HealthM. Scott Ford
 

Mais de M. Scott Ford (10)

Lessons Learned Migrating from Jekyll to Next.pptx
Lessons Learned Migrating from Jekyll to Next.pptxLessons Learned Migrating from Jekyll to Next.pptx
Lessons Learned Migrating from Jekyll to Next.pptx
 
PyGeekle 2022 - A Deep Dive into Measuring Dependency Freshness with LibYear
PyGeekle 2022 - A Deep Dive into Measuring Dependency Freshness with LibYearPyGeekle 2022 - A Deep Dive into Measuring Dependency Freshness with LibYear
PyGeekle 2022 - A Deep Dive into Measuring Dependency Freshness with LibYear
 
Communication is Just as Important as Code
Communication is Just as Important as CodeCommunication is Just as Important as Code
Communication is Just as Important as Code
 
MenderCon 2021 - Keynote
MenderCon 2021 - KeynoteMenderCon 2021 - Keynote
MenderCon 2021 - Keynote
 
Moving a Monolith to Kubernetes
Moving a Monolith to KubernetesMoving a Monolith to Kubernetes
Moving a Monolith to Kubernetes
 
MenderCon 2020 Keynote Presentation
MenderCon 2020 Keynote PresentationMenderCon 2020 Keynote Presentation
MenderCon 2020 Keynote Presentation
 
Makers and menders - Finding Talent for Legacy Code Projects
Makers and menders - Finding Talent for Legacy Code ProjectsMakers and menders - Finding Talent for Legacy Code Projects
Makers and menders - Finding Talent for Legacy Code Projects
 
A deep dive into measuring dependency freshness with lib year
A deep dive into measuring dependency freshness with lib yearA deep dive into measuring dependency freshness with lib year
A deep dive into measuring dependency freshness with lib year
 
Building a Bridge to a Legacy Application: How Hard Can That Be?
Building a Bridge to a Legacy Application: How Hard Can That Be?Building a Bridge to a Legacy Application: How Hard Can That Be?
Building a Bridge to a Legacy Application: How Hard Can That Be?
 
Important metrics for Measuring Code Health
Important metrics for Measuring Code HealthImportant metrics for Measuring Code Health
Important metrics for Measuring Code Health
 

Último

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfOverkill Security
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 

Último (20)

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 

Train to test

  • 1. TRAIN TO TEST M. SCOTT FORD
  • 2. CONTACT INFO Senior Developer with Rails Dog, LLC Chief Code Monkey with Corgibytes, LLC mscottford.com github.com/mscottford @mscottford scott@mscottford.com
  • 3. WHY I GOT STARTED
  • 4. PROJECTS Library automation Law enforcement Experimental aircraft Public API for email hosting Library self checkout More law enforcement Real property management Content management Railroad traffic control E-Commerce Back office automation
  • 5. MISSION CRITICAL AND SAFETY CRITICAL Safety critical: a software failure may result in the loss of someone’s life Mission critical: a software failure may result in the loss of someone’s money
  • 6. MY CONCLUSION Every project is critical. Critical projects should be tested.
  • 7. MY CONCLUSION Every project is critical. Critical projects should be tested. Every project should be tested.
  • 9. TESTING AND EXERCISE HAVE A LOT IN COMMON Getting started is intimidating Improves health Developing the habit is hard Work now prevents problems later There’s always room for improvement
  • 10. EXERCISE #1 BUYING A GYM MEMBERSHIP
  • 11. ADD RSPEC TO YOUR GEMFILE $ gem install bundler # ./Gemfile source :rubygems gem ‘rspec’ $ bundle
  • 12. CREATE SPEC DIRECTORY $ mkdir spec # ./spec/spec_helper.rb require ‘demo’
  • 13. CREATE YOUR FIRST SPEC # ./spec/demo_spec.rb require ‘spec_helper’ describe Demo do it ‘should exist’ do end end
  • 14. RUN RSPEC $ rspec . Finished in 0.00034 seconds 1 example, 0 failures
  • 16. LET’S TALK ABOUT MEASUREMENTS Test Coverage Body Mass Index TC = Tested LOC / LOC BMI = mass / height2 Size of your project dictates Your age dictates what’s what’s reasonable reasonable Too much energy on test It’s possible to go to the gym coverage is not productive too much
  • 17. WHAT GOAL SHOULD I SET SMART goals are best Specific Measurable Attainable Reasonable and Timely. Example: By January 2013 test coverage will have increased by 5 percentage points to 12%. Source: http://en.wikipedia.org/wiki/SMART_criteria
  • 18. EXERCISE #3 BUY A SCALE
  • 19. ADD SIMPLECOV TO YOUR GEMFILE # ./Gemfile source :rubygems gem ‘rspec’ gem ‘simplecov’ $ bundle
  • 20. ADD SIMPLECOV TO SPEC_HELPER.RB # ./spec/spec_helper.rb require 'simplecov' SimpleCov.start require 'demo'
  • 21. RUN RSPEC $ rspec . Finished in 0.00043 seconds 1 example, 0 failures Coverage report generated for RSpec to ./coverage. 2 / 3 LOC (66.67%) covered.
  • 22. EXERCISE #4 GET ON THE DAMN TREADMILL
  • 23. WRITE MORE TESTS Anytime you find yourself asking these questions, consider writing a test What happens when I pass nil to this method? How does this method respond if a dependent method raises an exception? Do those 30 lines that I wrote actually work? (How about the 30 I haven’t written yet?)
  • 24. THIS IS A PERFECTLY VALID TEST describe Demo do it ‘should not crashed when created with nil’ Demo.new(nil) end end
  • 25. PRACTICE NOT USING THE DEBUGGER When you start a debugging session you have a question that you’re trying to answer. Consider whether or not it’s possible to formalize that question in a test. If you find yourself repeating the debugging session more than twice, then find a way to formalize the question.
  • 27. THINGS TO KEEP IN MIND It’s okay that you’re struggling. There are others out there like you. It’s okay that you’re not testing every single line of code. You are not alone. It’s okay that you want to give Sticking with it is hard, but up. worthwhile. It’s okay that you feel guilty about not testing enough.
  • 28. PHOTO CREDITS All photos are licensed under a Created Commons “Apples & Oranges - They Don’t Compare” by license that requires attribution. In order of appearance: TheBusyBrain http://www.flickr.com/photos/thebusybrain/2492945625/ “Brompton World Championship - Sprint Finish” by Jon Spooner “out with the old, in with the new” by KetuGajjar http://www.flickr.com/photos/johnspooner/2899977876/ http://www.flickr.com/photos/ketugajjar/5406134368/ “Young & Old, Let’s Get it On” by AlphaTangoBravo / “FOCUS on the GOAL !” by GHOURI ! Adam Baker http://www.flickr.com/photos/geekydevil/2707101111/ http://www.flickr.com/photos/atbaker/447122802/ “scale_zero” by dsearls “Sailor participates in Marine Corps Combat Fitness http://www.flickr.com/photos/docsearls/5500725788/ Test.” by Official U.S. Navy Imagery “New Year’s Resolution: 36/365” by SashaW http://www.flickr.com/photos/usnavy/5590118536/ http://www.flickr.com/photos/sashawolff/3171917389/ “Danbo Goes to the Gym” by chauromano “Focus” by toolstop http://www.flickr.com/photos/chauromano/5786885286/ http://www.flickr.com/photos/toolstop/4546017269/
  • 29. CONTACT INFO Senior Developer with Rails Dog, LLC Chief Code Monkey with Corgibytes, LLC mscottford.com github.com/mscottford @mscottford scott@mscottford.com

Notas do Editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n