Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tips, Tricks & Good Citizenship

Tips, Tricks & Good Citizenship

What has version control got to do with good citizenship? How does this relate to code? How is your company culture and release policy reflected in your version control choices?

Join me in discussing how branching techniques can affect code conflicts and see what can happen when clever tools get too big for their boots!

An updated version of my June 2016 talk, given in July 2016 at @WorcSource; includes a clearer animated progress version of git lab flow style branching strategies.

Tess Barnes

July 05, 2016
Tweet

More Decks by Tess Barnes

Other Decks in Programming

Transcript

  1. VERSION CONTROL
    TIPS, TRICKS & GOOD CITIZENSHIP

    View full-size slide

  2. @CRATAEGUSTESS
    TESS BARNES
    • multi language developer
    • currently working for Fasthosts
    • tech lead
    • agile advocate
    • mental wellness advocate

    View full-size slide

  3. HOPEFULLY…
    WHAT WE WILL COVER
    • how good citizenship fits in
    • fundamentals
    • conflict resolution
    • branching
    • documentation
    • the right tool for the right reasons

    View full-size slide

  4. GOOD (CODE) CITIZENSHIP
    WHAT’S IT ALL ABOUT?

    View full-size slide

  5. EDUCATIONAL DEFINITION
    GOOD CITIZENSHIP
    Good citizens should always try to make a team-minded decision during any situation.
    Knowing what is right and wrong and understanding the consequences of a decision are
    important aspects of being a good citizen.
    Obeying laws and having respect for not only individuals in the community, but for the
    community itself, are other traits of a good citizen.
    Being helpful or helping those in need is another aspect of being a good citizen.
    from http://www.ask.com/world-view/qualities-good-citizen-5a9b527e5fe4adbc

    View full-size slide

  6. HTTPS://OSMIHELP.ORG
    HTTPS://
    WWW.INDIEGOGO.COM/
    PROJECTS/OPEN-SOURCING-
    MENTAL-ILLNESS-2016/
    @OSMIHELP

    View full-size slide

  7. WHAT’S IT GOT TO DO WITH CODE?
    GOOD (CODE) CITIZENSHIP
    • version control is the hub of a bigger system

    View full-size slide

  8. WHAT’S IT GOT TO DO WITH CODE?
    GOOD (CODE) CITIZENSHIP
    • version control is the hub of a bigger system
    • creating something great to build on

    View full-size slide

  9. WHAT’S IT GOT TO DO WITH CODE?
    GOOD (CODE) CITIZENSHIP
    • version control is the hub of a bigger system
    • creating something great to build on
    • keeping our house clean

    View full-size slide

  10. WHAT’S IT GOT TO DO WITH CODE?
    GOOD (CODE) CITIZENSHIP
    • version control is the hub of a bigger system
    • creating something great to build on
    • keeping our house clean
    • doing what we agreed

    View full-size slide

  11. WHAT’S IT GOT TO DO WITH CODE?
    GOOD (CODE) CITIZENSHIP
    • version control is the hub of a bigger system
    • creating something great to build on
    • keeping our house clean
    • doing what we agreed
    • sharing what we know

    View full-size slide

  12. WHAT’S IT GOT TO DO WITH CODE?
    GOOD (CODE) CITIZENSHIP
    • version control is the hub of a bigger system
    • creating something great to build on
    • keeping our house clean
    • doing what we agreed
    • sharing what we know
    • inviting feedback

    View full-size slide

  13. WHAT’S IT GOT TO DO WITH CODE?
    GOOD (CODE) CITIZENSHIP
    • version control is the hub of a bigger system
    • creating something great to build on
    • keeping our house clean
    • doing what we agreed
    • sharing what we know
    • inviting feedback
    • moving forward together

    View full-size slide

  14. THE FUNDAMENTALS
    CREATING SOMETHING GREAT TO BUILD ON

    View full-size slide

  15. HIGH LEVEL VIEW
    THE FUNDAMENTALS
    • version control is a keystone of good development practices

    View full-size slide

  16. HIGH LEVEL VIEW
    THE FUNDAMENTALS
    • version control is a keystone of good development practices
    • lots of tools available, some good, some awful

    View full-size slide

  17. HIGH LEVEL VIEW
    THE FUNDAMENTALS
    • version control is a keystone of good development practices
    • lots of tools available, some good, some awful
    • sharing code

    View full-size slide

  18. HIGH LEVEL VIEW
    THE FUNDAMENTALS
    • version control is a keystone of good development practices
    • lots of tools available, some good, some awful
    • sharing code • integrating code

    View full-size slide

  19. HIGH LEVEL VIEW
    THE FUNDAMENTALS
    • version control is a keystone of good development practices
    • lots of tools available, some good, some awful
    • sharing code
    • safeguarding code snapshots
    • integrating code

    View full-size slide

  20. HIGH LEVEL VIEW
    THE FUNDAMENTALS
    • version control is a keystone of good development practices
    • lots of tools available, some good, some awful
    • sharing code
    • safeguarding code snapshots
    • integrating code
    • allowing easy rollback

    View full-size slide

  21. HIGH LEVEL VIEW
    THE FUNDAMENTALS
    • version control is a keystone of good development practices
    • lots of tools available, some good, some awful
    • sharing code
    • safeguarding code snapshots
    • not just code
    • integrating code
    • allowing easy rollback

    View full-size slide

  22. THE SEQUENCE
    THE FUNDAMENTALS
    1. separate

    View full-size slide

  23. THE SEQUENCE
    THE FUNDAMENTALS
    1. separate
    • refresh (1…n)

    View full-size slide

  24. THE SEQUENCE
    THE FUNDAMENTALS
    1. separate
    2. change
    • refresh (1…n)

    View full-size slide

  25. THE SEQUENCE
    THE FUNDAMENTALS
    1. separate
    2. change
    • refresh (1…n)

    View full-size slide

  26. THE SEQUENCE
    THE FUNDAMENTALS
    1. separate
    2. change
    • refresh (1…n)
    • test (1…n)

    View full-size slide

  27. THE SEQUENCE
    THE FUNDAMENTALS
    1. separate
    2. change
    3. merge
    • refresh (1…n)
    • test (1…n)

    View full-size slide

  28. THE SEQUENCE
    THE FUNDAMENTALS
    1. separate
    2. change
    3. merge
    • refresh (1…n)
    • test (1…n)

    View full-size slide

  29. THE SEQUENCE
    THE FUNDAMENTALS
    1. separate
    2. change
    3. merge
    4. snapshot
    • refresh (1…n)
    • test (1…n)

    View full-size slide

  30. THE SEQUENCE
    THE FUNDAMENTALS
    1. separate
    2. change
    3. merge
    4. snapshot
    5. release
    • refresh (1…n)
    • test (1…n)

    View full-size slide

  31. THE SEQUENCE
    THE FUNDAMENTALS
    1. separate
    2. change
    3. merge
    4. snapshot
    5. release
    • refresh (1…n)
    • test (1…n)
    • sanity check

    View full-size slide

  32. HANDLING CONFLICTS
    DOING WHAT WE AGREED

    View full-size slide

  33. HANDLING CONFLICTS
    • some version control tools handle this better than others

    View full-size slide

  34. HANDLING CONFLICTS
    • some version control tools handle this better than others
    • some tools hide issues

    View full-size slide

  35. namespace RecipeForum;
    class Cleaver
    {
    private $weightInGrams;
    private $lengthInInch;
    private $percentSharp = 100;
    private $percentSteel;
    public function __construct($weightInGrams,
    $lengthInInch, $percentSteel)
    {
    $this->weightInGrams = $weightInGrams;
    $this->lengthInInch = $lengthInInch;
    $this->percentSteel = $percentSteel;
    }
    public function Sharpen($sharpener)
    {
    $this->weightInGrams -= 0.01;
    $this->percentSharp = 100;
    }
    public function Cut($foodItem)
    {
    $this->percentSharp -=1;
    }
    }
    namespace RecipeForum;
    class Cleaver
    {
    private $loyaltyScore;
    private $age;
    private $favouriteChef;
    private $dateJoined;
    public function __construct($age,
    $loyaltyScore, $dateJoined)
    {
    $this->age = $age;
    $this->loyaltyScore = $loyaltyScore;
    $this->dateJoined = $dateJoined;
    }
    public function setFavouriteChef($chefId)
    {
    $this->favouriteChef = $chefId;
    }
    }

    View full-size slide

  36. HANDLING CONFLICTS
    • some version control tools handle this better than others
    • some tools hide issues
    • remember - the conflict is in the code, design or interpretation, not the tool

    View full-size slide

  37. HANDLING CONFLICTS
    • some version control tools handle this better than others
    • some tools hide issues
    • remember - the conflict is in the code, design or interpretation, not the tool
    • how you branch / merge affects when, not if your conflicts occur

    View full-size slide

  38. BRANCHING STRATEGIES
    KEEPING OUR HOUSE CLEAN

    View full-size slide

  39. BRANCHING STRATEGIES
    DISTRIBUTED OR SINGLE SERVER
    origin
    clone 1 clone 2
    clone
    pull
    fetch
    merge
    request
    server / repo
    check in
    check out
    update
    working copy 1
    working copy 2
    working copy 3

    View full-size slide

  40. BRANCHING STRATEGIES
    IS BRANCHING CHEAP?

    View full-size slide

  41. BRANCHING STRATEGIES
    DEVELOPER OVERLAP? HOW DO YOU FEEL ABOUT SHARING?

    View full-size slide

  42. BRANCHING STRATEGIES
    RELEASE FOCUS OR FEATURE FOCUS
    v1.1
    v1.2
    clone / push
    master
    merge
    merge
    branch
    1.1 branch
    1.2
    v5.1
    MR
    MR
    MR
    master
    F1
    F2
    F3

    View full-size slide

  43. BRANCHING STRATEGIES
    CONTINUOUS INTEGRATION
    master
    production
    fetch /
    pull
    clone1

    View full-size slide

  44. BRANCHING STRATEGIES
    CONTINUOUS INTEGRATION
    master
    production
    fetch /
    pull
    clone1
    MR / push

    View full-size slide

  45. BRANCHING STRATEGIES
    CONTINUOUS INTEGRATION
    master
    production
    fetch /
    pull
    clone1
    MR
    MR / push

    View full-size slide

  46. BRANCHING STRATEGIES
    CONTINUOUS INTEGRATION
    master
    production
    fetch /
    pull
    clone1
    tag
    MR
    MR / push

    View full-size slide

  47. BRANCHING STRATEGIES
    CONTINUOUS INTEGRATION
    master
    production
    fetch /
    pull
    clone1 clone2
    tag
    MR

    View full-size slide

  48. BRANCHING STRATEGIES
    CONTINUOUS INTEGRATION
    master
    production
    MR / push
    fetch /
    pull
    clone1 clone2
    tag
    MR

    View full-size slide

  49. BRANCHING STRATEGIES
    CONTINUOUS INTEGRATION
    master
    production
    MR
    MR / push
    fetch /
    pull
    clone1 clone2
    tag

    View full-size slide

  50. BRANCHING STRATEGIES
    CONTINUOUS INTEGRATION
    master
    production
    tag
    MR
    MR / push
    fetch /
    pull
    clone1 clone2

    View full-size slide

  51. BRANCHING STRATEGIES
    CONTINUOUS INTEGRATION
    master
    production
    tag
    MR
    fetch /
    pull
    clone1 clone2 clone3

    View full-size slide

  52. BRANCHING STRATEGIES
    CONTINUOUS INTEGRATION
    master
    production
    tag
    MR
    fetch /
    pull
    clone1 clone2
    MR / push
    clone3

    View full-size slide

  53. BRANCHING STRATEGIES
    CONTINUOUS INTEGRATION
    master
    production
    tag
    live hot fix
    MR
    fetch /
    pull
    clone1 clone2
    MR / push
    clone3

    View full-size slide

  54. BRANCHING STRATEGIES
    CONTINUOUS INTEGRATION
    master
    production
    tag
    live hot fix
    MR
    fetch /
    pull
    clone1 clone2
    MR / push
    clone3

    View full-size slide

  55. BRANCHING STRATEGIES
    CONTINUOUS INTEGRATION
    master
    production
    tag
    live hot fix
    MR
    fetch /
    pull
    clone1 clone2
    tag
    MR / push
    clone3

    View full-size slide

  56. BRANCHING STRATEGIES
    CONTINUOUS INTEGRATION
    master
    production
    tag
    live hot fix
    MR
    fetch /
    pull
    MR
    clone1 clone2
    MR / push
    clone3
    tag

    View full-size slide

  57. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    clone1
    master

    View full-size slide

  58. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    clone1
    master
    MR / push

    View full-size slide

  59. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    clone1
    master
    MR
    MR / push

    View full-size slide

  60. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    clone1
    master
    clone2
    MR
    MR / push

    View full-size slide

  61. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    clone1 clone3
    master
    clone2
    MR

    View full-size slide

  62. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    clone1 clone3
    master
    clone2
    MR /
    push
    MR

    View full-size slide

  63. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    clone1 clone3
    master
    clone2
    MR /
    push
    fetch /
    pull
    MR

    View full-size slide

  64. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    clone1 clone3
    master
    MR
    clone2
    MR /
    push

    View full-size slide

  65. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    clone1 clone3
    master
    MR
    clone2
    fetch /
    pull

    View full-size slide

  66. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    clone1 clone3
    master
    MR
    MR
    clone2
    fetch /
    pull

    View full-size slide

  67. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    clone1 clone3
    master
    MR
    clone2
    tag
    fetch /
    pull
    MR

    View full-size slide

  68. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    clone1 clone3
    master
    MR
    clone2
    tag
    MR / push
    MR

    View full-size slide

  69. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    clone1 clone3
    master
    MR
    clone2
    MR / push
    tag live hot fix
    MR

    View full-size slide

  70. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    clone1 clone3
    master
    MR
    clone2
    tag
    MR / push
    live hot fix
    MR

    View full-size slide

  71. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    clone1 clone3
    master
    tag
    MR
    clone2
    MR / push
    live hot fix
    MR

    View full-size slide

  72. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    fetch /
    pull
    MR
    clone1 clone3
    master
    tag
    MR
    clone2
    MR / push
    live hot fix
    MR

    View full-size slide

  73. BRANCHING STRATEGIES
    MULTIPLE DEPLOYMENT ENVIRONMENTS
    staging
    production
    live hot fix
    fetch /
    pull
    MR
    clone1 clone3
    master
    tag
    MR
    MR
    clone2
    MR / push
    MR

    View full-size slide

  74. BRANCHING STRATEGIES
    LIVE HOT FIXES USING CHERRYPICKING
    staging
    production
    fetch /
    pull
    clone1
    master
    MR
    tag
    MR
    clone2
    MR /
    push

    View full-size slide

  75. BRANCHING STRATEGIES
    LIVE HOT FIXES USING CHERRYPICKING
    staging
    production
    fetch /
    pull
    clone1
    master
    MR
    tag
    MR
    MR /
    push
    live hot fix
    clone2

    View full-size slide

  76. BRANCHING STRATEGIES
    LIVE HOT FIXES USING CHERRYPICKING
    staging
    production
    fetch /
    pull
    clone1
    master
    MR
    tag
    MR /
    push
    MR
    live hot fix
    clone2

    View full-size slide

  77. BRANCHING STRATEGIES
    LIVE HOT FIXES USING CHERRYPICKING
    staging
    production
    fetch /
    pull
    clone1
    master
    MR
    tag
    MR /
    push
    MR
    live hot fix
    CHERRYPICK MR
    clone2

    View full-size slide

  78. BRANCHING STRATEGIES
    LIVE HOT FIXES USING CHERRYPICKING
    staging
    production
    fetch /
    pull
    clone1
    master
    MR
    tag
    MR /
    push
    MR
    live hot fix
    tag
    CHERRYPICK MR
    MR
    clone2

    View full-size slide

  79. BRANCHING STRATEGIES
    LIVE HOT FIXES USING CHERRYPICKING
    staging
    production
    fetch /
    pull
    clone1
    master
    MR
    tag
    MR /
    push
    MR
    MR
    clone2

    View full-size slide

  80. BRANCHING STRATEGIES
    LIVE HOT FIXES USING CHERRYPICKING
    staging
    production
    fetch /
    pull
    clone1
    master
    MR
    tag
    MR /
    push
    MR
    MR
    live hot fix
    clone2

    View full-size slide

  81. BRANCHING STRATEGIES
    LIVE HOT FIXES USING CHERRYPICKING
    staging
    production
    fetch /
    pull
    clone1
    master
    MR
    tag
    MR /
    push
    MR
    live hot fix
    MR
    clone2

    View full-size slide

  82. BRANCHING STRATEGIES
    LIVE HOT FIXES USING CHERRYPICKING
    staging
    production
    fetch /
    pull
    clone1
    master
    MR
    tag
    MR /
    push
    MR
    live hot fix
    CHERRYPICK MR
    MR
    clone2

    View full-size slide

  83. BRANCHING STRATEGIES
    LIVE HOT FIXES USING CHERRYPICKING
    staging
    production
    fetch /
    pull
    clone1
    master
    MR
    tag
    MR /
    push
    MR
    live hot fix
    CHERRYPICK MR
    CHERRYPICK MR
    MR
    clone2

    View full-size slide

  84. BRANCHING STRATEGIES
    LIVE HOT FIXES USING CHERRYPICKING
    staging
    production
    fetch /
    pull
    clone1
    master
    MR
    tag
    MR /
    push
    MR
    live hot fix
    tag
    CHERRYPICK MR
    CHERRYPICK MR
    MR
    clone2

    View full-size slide

  85. DOCUMENTATION
    SHARING WHAT WE KNOW & INVITING FEEDBACK

    View full-size slide

  86. THE ART OF A GOOD COMMIT MESSAGE (IMO)
    DOCUMENTATION
    • succinct

    View full-size slide

  87. THE ART OF A GOOD COMMIT MESSAGE (IMO)
    DOCUMENTATION
    • succinct, informative

    View full-size slide

  88. THE ART OF A GOOD COMMIT MESSAGE (IMO)
    DOCUMENTATION
    • succinct, informative, meaningful

    View full-size slide

  89. THE ART OF A GOOD COMMIT MESSAGE (IMO)
    DOCUMENTATION
    • succinct, informative, meaningful, consistent

    View full-size slide

  90. THE ART OF A GOOD COMMIT MESSAGE (IMO)
    DOCUMENTATION
    • succinct, informative, meaningful, consistent, agreed

    View full-size slide

  91. THE ART OF A GOOD COMMIT MESSAGE (IMO)
    DOCUMENTATION
    • succinct, informative, meaningful, consistent, agreed
    • could be scraped for release notes - respect your intended audience

    View full-size slide

  92. THE ART OF A GOOD COMMIT MESSAGE (IMO)
    DOCUMENTATION
    • succinct, informative, meaningful, consistent, agreed
    • could be scraped for release notes - respect your intended audience
    • linked to issue and story trackers - don’t duplicate data

    View full-size slide

  93. THE ART OF A GOOD COMMIT MESSAGE (IMO)
    DOCUMENTATION
    • succinct, informative, meaningful, consistent, agreed
    • could be scraped for release notes - respect your intended audience
    • linked to issue and story trackers - don’t duplicate data
    • used for code review in merge requests

    View full-size slide

  94. THE ART OF A GOOD COMMIT MESSAGE (IMO)
    DOCUMENTATION
    • succinct, informative, meaningful, consistent, agreed
    • could be scraped for release notes - respect your intended audience
    • linked to issue and story trackers - don’t duplicate data
    • used for code review in merge requests
    • pattern enforced using commit hooks

    View full-size slide

  95. ADDITIONAL THOUGHTS
    DOCUMENTATION
    • expected practices for open source (e.g. git hub templates)

    View full-size slide

  96. ADDITIONAL THOUGHTS
    DOCUMENTATION
    • expected practices for open source (e.g. git hub templates)
    • .gitmessage encouraging why & how over ‘one liners‘

    https://robots.thoughtbot.com/better-commit-messages-with-a-gitmessage-
    template
    • what (title)

    View full-size slide

  97. ADDITIONAL THOUGHTS
    DOCUMENTATION
    • expected practices for open source (e.g. git hub templates)
    • .gitmessage encouraging why & how over ‘one liners‘

    https://robots.thoughtbot.com/better-commit-messages-with-a-gitmessage-
    template
    • what (title)
    • why (link to feature)

    View full-size slide

  98. ADDITIONAL THOUGHTS
    DOCUMENTATION
    • expected practices for open source (e.g. git hub templates)
    • .gitmessage encouraging why & how over ‘one liners‘

    https://robots.thoughtbot.com/better-commit-messages-with-a-gitmessage-
    template
    • what (title)
    • why (link to feature)
    • how (details - pitched for your audience)

    View full-size slide

  99. RIGHT TOOL FOR THE RIGHT JOB
    MOVING FORWARD TOGETHER

    View full-size slide

  100. RIGHT TOOL FOR THE RIGHT JOB

    View full-size slide

  101. NOT EVERYONE USES GIT!
    RIGHT TOOL FOR THE RIGHT JOB
    • git is distributed, prolific, popular and practically required for open source

    View full-size slide

  102. NOT EVERYONE USES GIT!
    RIGHT TOOL FOR THE RIGHT JOB
    • git is distributed, prolific, popular and practically required for open source
    • but there are still other tools out there…
    ➡ older companies and legacy projects? Subversion?
    ➡ proprietary code? Mercurial?
    ➡ c# houses? TFS?

    View full-size slide

  103. RESPECT YOUR COMMUNITY
    RIGHT TOOL FOR THE RIGHT JOB
    • the first priority may not be to change version control tool

    View full-size slide

  104. RESPECT YOUR COMMUNITY
    RIGHT TOOL FOR THE RIGHT JOB
    • the first priority may not be to change version control tool
    • make sure you’re fixing the right problems

    View full-size slide

  105. RESPECT YOUR COMMUNITY
    RIGHT TOOL FOR THE RIGHT JOB
    • the first priority may not be to change version control tool
    • make sure you’re fixing the right problems
    • the more you know your tools, the more powerful they become

    View full-size slide

  106. RESPECT YOUR COMMUNITY
    RIGHT TOOL FOR THE RIGHT JOB
    • the first priority may not be to change version control tool
    • make sure you’re fixing the right problems
    • the more you know your tools, the more powerful they become
    • choose a version control system that suits your business

    View full-size slide

  107. RESPECT YOUR COMMUNITY
    RIGHT TOOL FOR THE RIGHT JOB
    • the first priority may not be to change version control tool
    • make sure you’re fixing the right problems
    • the more you know your tools, the more powerful they become
    • choose a version control system that suits your business
    • most importantly… know WHY

    View full-size slide

  108. THANK YOU FOR
    LISTENING
    TESS BARNES @CRATAEGUSTESS

    View full-size slide

  109. HTTPS://OSMIHELP.ORG
    HTTPS://
    WWW.INDIEGOGO.COM/
    PROJECTS/OPEN-SOURCING-
    MENTAL-ILLNESS-2016/
    @OSMIHELP

    View full-size slide