SlideShare une entreprise Scribd logo
1  sur  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

Contenu connexe

Plus 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
 

Plus 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
 

Dernier

DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
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
 
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
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAnitaRaj43
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2
 
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
 
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
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard37
 
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
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
"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
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKJago de Vreede
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusZilliz
 

Dernier (20)

DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
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
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
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
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by Anitaraj
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
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
 
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
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptx
 
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
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
"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 ...
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 

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

Notes de l'éditeur

  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