High-quality software practices

High-quality software practices

The purpose of the talk is to show some of the methodologies, tools and practices performed in Crowd Interactive that have helped us to become a world-class company.

Talk given to Tech Women Community during their 14th monthly meetup

6c137ee3013821b517c4b9beed0145df?s=128

Fernando Perales

June 03, 2015
Tweet

Transcript

  1. http://images.meredith.com/wood/images/p_411_1_1.gif High-quality Software practices

  2. <me>

  3. Bs. c. Computer Engineering @ CUCEI Software engineer @ Crowd

    Interactive http://ferperales.net Advocate @ FLOSS Passionate @ Web Development
  4. <ad>

  5. None
  6. None
  7. None
  8. None
  9. None
  10. None
  11. None
  12. None
  13. None
  14. None
  15. Junio 2015

  16. </ad>

  17. </me>

  18. None
  19. http://cwebhealth.com/wp-content/uploads/2013/12/need-want-like-keys-showing-craving-and- desire_GyMuC-vu-702x336.jpg REQUIREMENTS

  20. Deliver the right software

  21. Specification by example

  22. “A collaborative approach to defining requirements and business-oriented functional tests

    for software products based on capturing and illustrating requirements using realistic examples instead of abstract statements”
  23. We translate* this:

  24. http://www.pmscs.net/images/Client.png I want my system to have a login

  25. Into this:

  26. Feature: Login In order to use the application As a

    user I want to be able to login Scenario: with invalid credentials Given I visit the / page And I have entered demo as my username And I have entered demo1234 as my password When I press Sign in Then I will be shown a message error Scenario: with valid credentials Given I have created an account in the past And I visit the /events page And I have entered demo as my username And I have entered demo1234 as my password When I press Sign in Then I will be redirected to events page
  27. Gherkin!

  28. “It is a Business Readable, Domain Specific Language that lets

    you describe software's behaviour without detailing how that behaviour is implemented”
  29. Once we got what we need...

  30. Project Management http://www.targetprocess.com/blog/wp-content/uploads/2014/06/Kanban-with-time.jpg

  31. “A flexible, holistic product development strategy where a development team

    works as a unit to reach a common goal"
  32. Three roles: http://braintrustgroup.com/assets/2012/09/SM-TM-PO-3pigs-01.png

  33. Team Members: get things done

  34. Product Owners: represents stakeholders and the voice of customer

  35. Scrum master: grease that keeps everything running smoothly

  36. Product backlog

  37. “A comprehensive to- do list, expressed in priority order based

    on the business value each piece of work will generate”
  38. Tools

  39. Version Control System http://blog.laaz.org/tech/wp-content/uploads/2011/08/git-tree.png

  40. “A system that records changes to a file or set

    of files over time so that you can recall specific versions later”
  41. Tools

  42. Testing http://venturebeat.com/wp-content/uploads/2013/05/origin_1703252007.jpg

  43. Unit testing

  44. “A software testing method by which individual units of source

    code are tested to determine whether they are fit for use”
  45. Tools

  46. class User < ActiveRecord::Base # Method that checks if a

    user has a @crowdint.com account def has_crowdint_account? !!self.email.match(/@crowdint.com$/) end end
  47. require 'rails_helper' describe User do let(:user_with_crowdint_account) { User.create email: 'demo@crowdint.com'

    } let(:user_with_gmail_account) { User.create email: 'demo@gmail.com' } describe '.has_crowdint_account?' do it 'returns true when email ends with "@crowdint.com"' do expect(user_with_crowdint_account.has_crowdint_account?).to be_truthy end it 'returns false when email ends with "@crowdint.com"' do expect(user_with_gmail_account.has_crowdint_account?).to be_falsy end end end
  48. None
  49. Integration test

  50. “The phase in software testing in which individual software modules

    are combined and tested as a group”
  51. Tools

  52. Behaviour driven Development

  53. “A test method in which examples are used to describe

    the behavior of the application, or of units of code”
  54. Remember this?

  55. Feature: Login In order to use the application As a

    user I want to be able to login Scenario: with invalid credentials Given I visit the / page And I have entered demo as my username And I have entered demo1234 as my password When I press Sign in Then I will be shown a message error Scenario: with valid credentials Given I have created an account in the past And I visit the /events page And I have entered demo as my username And I have entered demo1234 as my password When I press Sign in Then I will be redirected to events page
  56. Can become Code!

  57. Feature: Login In order to use the application As a

    user I want to be able to login Scenario: with invalid credentials Given I visit the / page And I have entered demo as my username And I have entered demo1234 as my password When I press Sign in Then I will be shown a message error Scenario: with valid credentials Given I have created an account in the past And I visit the /events page And I have entered demo as my username And I have entered demo1234 as my password When I press Sign in Then I will be redirected to events page
  58. Given(/^I visit the (.*) page$/) do |page| visit page end

  59. Feature: Login In order to use the application As a

    user I want to be able to login Scenario: with invalid credentials Given I visit the / page And I have entered demo as my username And I have entered demo1234 as my password When I press Sign in Then I will be shown a message error Scenario: with valid credentials Given I have created an account in the past And I visit the /events page And I have entered demo as my username And I have entered demo1234 as my password When I press Sign in Then I will be redirected to events page
  60. And(/^I have entered (.*) as my username$/) do |username| fill_in

    'user[login]', with: username end And(/^I have entered (.*) as my password$/) do |password| fill_in 'user[password]', with: password end
  61. Feature: Login In order to use the application As a

    user I want to be able to login Scenario: with invalid credentials Given I visit the / page And I have entered demo as my username And I have entered demo1234 as my password When I press Sign in Then I will be shown a message error Scenario: with valid credentials Given I have created an account in the past And I visit the /events page And I have entered demo as my username And I have entered demo1234 as my password When I press Sign in Then I will be redirected to events page
  62. Given(/^I have created an account in the past$/) do @user

    = FactoryGirl.create :user, username: 'demo', password: 'demo1234' End Then(/^I will be shown a message error$/) do expect(page).to have_content 'Invalid login or password.' end When(/^I press Sign in$/) do click_button 'Sign in' end Then(/^I will be redirected to home page$/) do expect(page).to have_content 'Login successful' end Then(/^I will be redirected to (.*) page$/) do |url| path = URI.parse(current_url).path expect(path).to match "/#{url}" end
  63. Tools

  64. Cross- browser Testing

  65. Tools

  66. Deployment http://i.dawn.com/primary/2013/06/51b99d8da936d.jpg

  67. Platform as A Service (PaaS)

  68. Services

  69. Virtual Private Servers (VPS)

  70. Services

  71. Tools

  72. role :demo, %w{example.com example.org example.net} task :uptime do on roles(:demo),

    in: :parallel do |host| uptime = capture(:uptime) puts "#{host.hostname} reports: #{uptime}" end end
  73. Deployments are as easy as running

  74. cap production deploy

  75. Continuos integration/ delivery/ deployment

  76. “Continuous Integration is the practice of merging development work with

    a Master/Trunk/Mainline branch constantly so that you can test changes, and test that changes work with other changes” http://blog.assembla.com/AssemblaBlog/tabid/12618/bid/92411/Continuous-Delivery-vs- Continuous-Deployment-vs-Continuous-Integration-Wait-huh.aspx
  77. “Continuous Delivery is the continual delivery of code to an

    environment once the developer feels the code is ready to ship.” http://blog.assembla.com/AssemblaBlog/tabid/12618/bid/92411/Continuous-Delivery-vs- Continuous-Deployment-vs-Continuous-Integration-Wait-huh.aspx
  78. “Continuous Deployment is the deployment or release of code to

    Production as soon as it is ready” http://blog.assembla.com/AssemblaBlog/tabid/12618/bid/92411/Continuous-Delivery-vs- Continuous-Deployment-vs-Continuous-Integration-Wait-huh.aspx
  79. Tools

  80. Code quality http://www.pts-qc.com/images/AUDITING.jpg

  81. Code review

  82. Tools

  83. None
  84. Code metrics

  85. Tools

  86. None
  87. Syntax analyzer

  88. Tools Rubocop CSSLinter JSHint Hound CI

  89. scss_files: "**/*.scss" linters: BangFormat: enabled: true space_before_bang: true space_after_bang: false

    BorderZero: enabled: true convention: zero # or `none` ColorKeyword: enabled: true ColorVariable: enabled: true Comment: enabled: true DebugStatement: enabled: true
  90. None
  91. Maintenance http://www.mengsolutions.com.au/wp-content/uploads/2012/06/image041.jpg

  92. Error reporting

  93. Tools

  94. None
  95. Site availability

  96. Tools

  97. None
  98. I've only talked about procedures, methodologies and tools

  99. But most important is

  100. crowdint.com/team

  101. “High-quality software is done by people who care and love

    what they do”
  102. Questions?

  103. Thanks! me@ferperales.net