Download - How to build quality software
![Page 1: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/1.jpg)
![Page 2: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/2.jpg)
BEYOND HACKINGCrafting Quality Software
![Page 3: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/3.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/4.jpg)
FROM CLEAN CODE - A HANDBOOK OF AGILE SOFTWARE CRAFTMANSHIP BY ROBERT C. MARTIN
![Page 5: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/5.jpg)
Development Speed
Issues
WHAT IS QUALITY?
![Page 6: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/6.jpg)
BUILDING SOFTWARE IN SMALL TEAMS
![Page 7: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/7.jpg)
App
1. Code
2. Deploy
<Code>
![Page 8: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/8.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/9.jpg)
LIFE IS SIMPLE LIFE IS GOOD
![Page 10: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/10.jpg)
YOU ARE SHIPPING FAST
![Page 11: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/11.jpg)
BUT SOMETHING FEELS WRONG
![Page 12: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/12.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/13.jpg)
TEAMS GROW, SOFTWARE GROWS
![Page 14: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/14.jpg)
Rock Bottom
t
code complexitydev velocityissues
![Page 15: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/15.jpg)
![Page 16: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/16.jpg)
App
1. Code
2. Deploy
<Code>
?
?
!
!
!
?
?
!
![Page 17: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/17.jpg)
WHAT NOW?
![Page 18: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/18.jpg)
IT’S TIME TO REFACTOR
![Page 19: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/19.jpg)
WHERE’S THE SPEC FOR ALL FEATURES?
![Page 20: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/20.jpg)
…
![Page 21: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/21.jpg)
HOW CAN WE AVOID THIS?
![Page 22: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/22.jpg)
AS SOFTWARE AND TEAM GROW - ADD PROCESS
AND AUTOMATION
![Page 23: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/23.jpg)
HOW CAN WE AVOID CHAOS?
Specification
Automated Testing
Continous Integration
Coding guidelines / Code Analysis
Reproducible development environment
![Page 24: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/24.jpg)
(1) SPECIFY YOUR APPLICATION
![Page 25: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/25.jpg)
TESTS CAN ACT AS SPECIFICATION!
![Page 26: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/26.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/27.jpg)
(2) WRITE AUTOMATED TESTS (BEFORE WRITING APPLICATION CODE)
![Page 28: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/28.jpg)
HOW SHOULD WE TEST?
![Page 29: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/29.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/30.jpg)
UNIT TEST
When it fails, it tells you what piece of your code needs to be fixed
![Page 31: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/31.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/32.jpg)
(3) MEASURE CODE COVERAGE
![Page 33: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/33.jpg)
CODE COVERAGE = % OF CODE COVERED BY TEST
![Page 34: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/34.jpg)
(4) PROVIDE CODING
STYLEGUIDES, AUTOMATE CODE QUALITY TESTING
![Page 36: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/36.jpg)
RUBOCOP, OCLINT, JSLINT TOOLS THAT MEASURE CONFORMANCE TO CODING GUIDELINES + FIND CODE SMELLS
“static analyzers”
![Page 37: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/37.jpg)
CODE CLIMATE
STATIC ANALYZER AS
A SERVICE
![Page 38: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/38.jpg)
(5) USE A CONTINUOUS
INTEGRATION SERVER
![Page 39: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/39.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/40.jpg)
(6) PROVIDE REPRODUCIBLE
DEVELOPMENT ENVIRONMENT
![Page 41: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/41.jpg)
?
But it works on my local machine…
![Page 42: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/42.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/43.jpg)
+VM
define
Rails App
MongoDB
Postgres
![Page 44: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/44.jpg)
PUTTING IT ALL TOGETHER
![Page 45: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/45.jpg)
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](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/46.jpg)
QUALITY SOFTWARE =
SLEEP WELL AFTER PUSHING NEW CODE TO MILLIONS OF USERS
![Page 47: How to build quality software](https://reader030.vdocuments.net/reader030/viewer/2022020110/55a676e31a28abcc758b45e1/html5/thumbnails/47.jpg)
QUALITY SOFTWARE
t
code complexitydev velocityissues