48

How to build quality software

Embed Size (px)

Citation preview

Page 1: How to build quality software
Page 2: How to build quality software

BEYOND HACKINGCrafting Quality Software

Page 3: How to build quality software

HOW IS SOFTWARE BUILT IN SMALL TEAMS?

WHY DOES THAT APPROACH NOT SCALE?

WHAT IS QUALITY?

HOW CAN WE ACCOMPLISH IT?

Page 4: How to build quality software

FROM CLEAN CODE - A HANDBOOK OF AGILE SOFTWARE CRAFTMANSHIP BY ROBERT C. MARTIN

Page 5: How to build quality software

Development Speed

Issues

WHAT IS QUALITY?

Page 6: How to build quality software

BUILDING SOFTWARE IN SMALL TEAMS

Page 7: How to build quality software

App

1. Code

2. Deploy

<Code>

Page 8: How to build quality software

V 1.0 V 1.0.1 V 1.1 V 1.1.1

Add FeatureFix Bug Fix Bug

Page 9: How to build quality software

LIFE IS SIMPLE LIFE IS GOOD

Page 10: How to build quality software

YOU ARE SHIPPING FAST

Page 11: How to build quality software

BUT SOMETHING FEELS WRONG

Page 12: How to build quality software

def update(post, title) @user = User.first

if @user.logged_in if @user.type == "admin" @user.type.permissions.each do |permission| { if (permission == "update_permission") { if post begin post.title = title post.save rescue display_error("This horrible code is not workin!") end else display_error("No Post provided") end } } elsif @user.type == "other" return else display_error("Invalid User Type") end else #What do here? end end

BAD CODE

Page 13: How to build quality software

TEAMS GROW, SOFTWARE GROWS

Page 14: How to build quality software

Rock Bottom

t

code complexitydev velocityissues

Page 15: How to build quality software
Page 16: How to build quality software

App

1. Code

2. Deploy

<Code>

?

?

!

!

!

?

?

!

Page 17: How to build quality software

WHAT NOW?

Page 18: How to build quality software

IT’S TIME TO REFACTOR

Page 19: How to build quality software

WHERE’S THE SPEC FOR ALL FEATURES?

Page 20: How to build quality software

Page 21: How to build quality software

HOW CAN WE AVOID THIS?

Page 22: How to build quality software

AS SOFTWARE AND TEAM GROW - ADD PROCESS

AND AUTOMATION

Page 23: How to build quality software

HOW CAN WE AVOID CHAOS?

Specification

Automated Testing

Continous Integration

Coding guidelines / Code Analysis

Reproducible development environment

Page 24: How to build quality software

(1) SPECIFY YOUR APPLICATION

Page 25: How to build quality software

TESTS CAN ACT AS SPECIFICATION!

Page 26: How to build quality software

BDD FRAMEWORKS CAN BE USED TO SPECIFY SOFTWARE

Cucumber Framework: http://cukes.info/

Feature: Search courses Courses should be searchable by topic Search results should provide the course code

Scenario: Search by topic Given there are 240 courses which do not have the topic "biology" And there are 2 courses, A001 and B205, that each have "biology" as one of the topics When I search for "biology" Then I should see the following courses: | Course code | | A001 | | B205 | Acceptance Test

Page 27: How to build quality software

(2) WRITE AUTOMATED TESTS (BEFORE WRITING APPLICATION CODE)

Page 28: How to build quality software

HOW SHOULD WE TEST?

Page 29: How to build quality software

ACCEPTANCE TEST

When it fails, it tells you that the application is not doing what the

customer expects it to do

Page 30: How to build quality software

UNIT TEST

When it fails, it tells you what piece of your code needs to be fixed

Page 31: How to build quality software

EXAMPLE

SignupService.POST(User:"Ben-G", PW:"&47-:#sdö").expect(200) SignupService.POST(User:"Ben-G", PW:”").expect(400)

SignupService.POST(User:"Ben-G", PW:"&47-:#sdö").expect(200)

PasswordValidator.testPassword("&47-:#sdö").expect(true) PasswordValidator.testPassword(“”).expect(false)

UsernameValidator.testUsername("Ben-G").expect(true)

PasswordValidator

SignupService

testPassword:Bool

HTTP POST User: Ben-G

PW: &47-:#sdö

UsernameValidator

testUsername:Bool

SignupService.POST(User:"", PW:"&47-:#sdö").expect(401) UsernameValidator.testUsername("").expect(false)

Acceptance Tests Unit Tests

Page 32: How to build quality software

(3) MEASURE CODE COVERAGE

Page 33: How to build quality software

CODE COVERAGE = % OF CODE COVERED BY TEST

Page 34: How to build quality software

(4) PROVIDE CODING

STYLEGUIDES, AUTOMATE CODE QUALITY TESTING

Page 35: How to build quality software

GITHUB RUBY STYLEGUIDE: https://github.com/styleguide/ruby

Page 36: How to build quality software

RUBOCOP, OCLINT, JSLINT TOOLS THAT MEASURE CONFORMANCE TO CODING GUIDELINES + FIND CODE SMELLS

“static analyzers”

Page 37: How to build quality software

CODE CLIMATE

STATIC ANALYZER AS

A SERVICE

Page 38: How to build quality software

(5) USE A CONTINUOUS

INTEGRATION SERVER

Page 39: How to build quality software

CONTINOUS INTEGRATION Every time code is pushed: • Run Static Analyzer • Run All tests • Measure Code Coverage • Run the Build Process

Working product can be shipped at any time!If anything breaks we find out right away

Page 40: How to build quality software

(6) PROVIDE REPRODUCIBLE

DEVELOPMENT ENVIRONMENT

Page 41: How to build quality software

?

But it works on my local machine…

Page 42: How to build quality software

MINIMUM CONFIGURATIONgit clone [email protected]:MakeGamesWithUs/www-makeschool.git

./server start

./server test

start rails serverrun test suite

• Git repository contains the definition of a Docker container+ a Fig configuration describing services

• App runs in Virtual Machine providing the same environment for all developers

Page 43: How to build quality software

+VM

define

Rails App

MongoDB

Postgres

Page 44: How to build quality software

PUTTING IT ALL TOGETHER

Page 45: How to build quality software

Code Coverage Measurements

Unit Tests

enforce

Acceptance Tests

Specification

Low Issue Count

define

support

Refactoring

enable

High Code Qualitydrives

enables

Automated CodeQuality Analysis

drives

drives

Development Speed

Reproducible DevelopmentEnvironment

drives

enables

support

ContinousIntegration{

automates

Page 46: How to build quality software

QUALITY SOFTWARE =

SLEEP WELL AFTER PUSHING NEW CODE TO MILLIONS OF USERS

Page 47: How to build quality software

QUALITY SOFTWARE

t

code complexitydev velocityissues