Top Banner
TIM PETTERSEN SENIOR DEVELOPER ATLASSIAN @KANNONBOY Code review vs Pull requests
112

Code reviews vs Pull requests

Apr 15, 2017

Download

Software

Tim Pettersen
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Code reviews vs Pull requests

TIM PETTERSEN • SENIOR DEVELOPER • ATLASSIAN • @KANNONBOY

Code review vs

Pull requests

Page 2: Code reviews vs Pull requests

@kannonboy

Code review at Atlassian

2006

2007Atlassian acquires Cenqua, starts using Crucible @kannonboy

Page 3: Code reviews vs Pull requests

@kannonboy

2006

2007Atlassian acquires Cenqua, starts using Crucible

2010 Atlassian acquires Bitbucket

@kannonboy

Page 4: Code reviews vs Pull requests

@kannonboy

2007Atlassian acquires Cenqua, starts using Crucible

2010 Atlassian acquires Bitbucket

2011 Work starts on “Caviar”!@kannonboy

Page 5: Code reviews vs Pull requests

@kannonboy

2010 Atlassian acquires Bitbucket

2011 Work starts on “Caviar”

2012 Stash 1.0 ships

!

Stash 2.0 ships with

@kannonboy

Page 6: Code reviews vs Pull requests

@kannonboy

2011 Work starts on “Caviar”

2012 Stash 1.0 ships

!

Stash 2.0 ships with pull requests

Comment drift

Unread status@kannonboy

Page 7: Code reviews vs Pull requests

@kannonboy

2011

2012 Stash 1.0 ships

!

Stash 2.0 ships with pull requests

Merge checks

Comment drift

Unread status

Conflict markers

Build status integration

Branch permissions

@kannonboy

Page 8: Code reviews vs Pull requests

@kannonboy

Stash renamed to Bitbucket Server2015

Merge checks

Comment drift

Conflict markers

Build status integration

Reviewer suggestions

Branch permissions

Comment likes

Enhanced branch permissions

Iterative review

Merge strategies

Reviewer statuses

Today@kannonboy

Page 9: Code reviews vs Pull requests

@kannonboy

Stash renamed to Bitbucket Server2015

Comment likes

Enhanced branch permissions

Iterative review

Merge strategies

Reviewer statuses

Today

@kannonboy

Page 10: Code reviews vs Pull requests

@kannonboy

T Y P E S O F R E V I E W

Y O U N E E D C O D E R E V I E W

C O D E R E V I E W @ AT L A S S I A N

T I P S F O R T E A M S

Agenda

Page 11: Code reviews vs Pull requests

Automated tests

@kannonboy

Page 12: Code reviews vs Pull requests

Automated tests

@kannonboy

Page 13: Code reviews vs Pull requests

human judgement needed

?

“what-evs”

bad API decision

O(n!) algorithm

technical debt

Automated tests

@kannonboy

Page 14: Code reviews vs Pull requests

CodeReview

Photo: Yogi (Flickr)

@kannonboy

Page 15: Code reviews vs Pull requests

Better Code

Shared Knowledge

Team Ownership

@kannonboy

Page 16: Code reviews vs Pull requests

G = 1

R+1

Developer guilt

@kannonboy

Page 17: Code reviews vs Pull requests

Team Ownership

@kannonboy

Page 18: Code reviews vs Pull requests

Team Ownership

@kannonboy

Page 19: Code reviews vs Pull requests

Better Code

Shared Knowledge

Team Ownership

@kannonboy

Page 20: Code reviews vs Pull requests

Code reviews take negative time

@kannonboy

Page 21: Code reviews vs Pull requests

Reviews and releases

10

20

30

40

Daily Weekly Monthly Quarterly Yearly

Code Review No Code Review

Source: Atlassian Git Survey 2013

@kannonboy

Page 22: Code reviews vs Pull requests

Types of code review

@kannonboy

Page 23: Code reviews vs Pull requests

Pull requests

Code review

Post-commit review

Pre-commit review

master

for/master

Staging area @kannonboy

Page 24: Code reviews vs Pull requests

Post-commit review

Pre-commit review

master@kannonboy

Page 25: Code reviews vs Pull requests

Pre-commit review

dev [email protected]

mastermaintainer @kannonboy

Page 26: Code reviews vs Pull requests

// flat fees and taxes final float customsFee = 5.5f; final float immigrationFee = 7f; final float federalTransportTax = .025f;

public float calculateAirfare(float baseFare) { float fare = baseFare; fare += immigrationFee + customsFee; fare *= return fare; }

AirfareCalculator.java

federalTransportTax;

@kannonboy

Page 27: Code reviews vs Pull requests

// flat fees and taxes final float customsFee = 5.5f; final float immigrationFee = 7f; final float federalTransportTax = .025f;

public float calculateAirfare(float baseFare) { float fare = baseFare; fare += immigrationFee + customsFee; fare *= return fare; }

(1 + )

AirfareCalculator.java

federalTransportTax ;

@kannonboy

Page 28: Code reviews vs Pull requests

Pre-commit reviewFrom: Tim Pettersen <[email protected]> Date: Mon, 12 Sep 2016 10:24:10 +1000 Subject: [PATCH] Calculate federal transport tax correctly

--- a/com/atlassian/airfare/AirfareCalculator.java +++ b/com/atlassian/airfare/AirfareCalculator.java @@ -10,7 +10,7 @@ public float calculateAirfare(float baseFare) { float fare = baseFare; fare += immigrationFee + customsFee; - fare *= federalTransportTax; + fare *= (1 + federalTransportTax); return fare; }

$ git format-patch HEAD~1 --stdout

@kannonboy

Page 29: Code reviews vs Pull requests

Pre-commit review

dev maintainer

public float calculateAirfare(float baseFare) { float fare = baseFare; fare += immigrationFee + customsFee;- fare *= federalTransportTax;+ fare *= (1 + federalTransportTax); return fare;}

Subject: [PATCH] Calculate federal transport tax correctly

@kannonboy

Page 30: Code reviews vs Pull requests

> > > > >

The braces are unnecessary.

Pre-commit review

dev maintainer

public float calculateAirfare(float baseFare) { float fare = baseFare; fare += immigrationFee + customsFee;- fare *= federalTransportTax;+ fare *= (1 + federalTransportTax);

return fare;}

Subject: Re: [PATCH] Calculate federal transport tax correctly

> >

@kannonboy

Page 31: Code reviews vs Pull requests

> >

> > > > > > > >

Technically true, but I think they add clarity.

> >

> > > > >

The braces are unnecessary.

Pre-commit review

dev maintainer

public float calculateAirfare(float baseFare) { float fare = baseFare; fare += immigrationFee + customsFee;- fare *= federalTransportTax;+ fare *= (1 + federalTransportTax);

return fare;}

Subject: Re: Re: [PATCH] Calculate federal transport tax correctly

@kannonboy

Page 32: Code reviews vs Pull requests

> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >

Pre-commit review

dev maintainer

Subject: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re:

@kannonboy

Page 33: Code reviews vs Pull requests

Iteration

master

@kannonboy

Page 34: Code reviews vs Pull requests

Pre-commit reviewLinus Torvalds*

Module maintainers

File / driver maintainers

[email protected]

* Gross oversimplification, check out: bit.ly/linux-dev

@kannonboy

Page 35: Code reviews vs Pull requests

Pre-commit review

Junio C Hamano*

[email protected]

* Also an oversimplification

@kannonboy

Page 36: Code reviews vs Pull requests

Pull requests

Post-commit review

Pre-commit review

master

for/master

Staging area

Pre-commit reviewVersion control agnostic

Difficult to read

High barrier to submit patches

Simple and decentralized

Difficult to iterate

Easy to keep ‘000s of people in the loop

Have to manually merge work@kannonboy

Page 37: Code reviews vs Pull requests

Pull requests

Post-commit review

@kannonboy

Page 38: Code reviews vs Pull requests
Page 39: Code reviews vs Pull requests

Flexible structure

master

master

patches & untracked files

commits

branches

specific filesmultiple repos

@kannonboy

Page 40: Code reviews vs Pull requests

Iterative review

Branch diff

Merge diff

Pull request diffs

@kannonboy

Page 41: Code reviews vs Pull requests

Iterative review

Branch diff

Post-commit review diffs

Arbitrary commit diffs

@kannonboy

Page 42: Code reviews vs Pull requests

Iterative review in

@kannonboy

Page 43: Code reviews vs Pull requests

Iterative review in

@kannonboy

Page 44: Code reviews vs Pull requests

Not an SCM

SCM host (e.g. Bitbucket)

Review host (e.g. Crucible)

Dev team

push & pull

code review

slurp

slurp

slurp

slurp

@kannonboy

Page 45: Code reviews vs Pull requests

Pull requests

Post-commit review

Post-commit reviewSupports popular CVCS and DVCS

Have to manually merge work

Flexible review content

Need a separate VCS host

Easy to iterate

Hard to enforce process

@kannonboy

Page 46: Code reviews vs Pull requests

Pull requests

Post-commit review

master

for/master

Staging area@kannonboy

Page 47: Code reviews vs Pull requests

Gerritand DIFFYThe Kung FooReview Cuckoo

@kannonboy

Page 48: Code reviews vs Pull requests

Gerrit is very “Git-y”

$ git config -f ~/gerrit/etc/gerrit.config gerrit.canonicalWebUrl

http://localhost:8080/

@kannonboy

Page 49: Code reviews vs Pull requests

Staging area review

for/master

master

reviewers approved?

verified (build passing)?

Dev team

fetchpush

@kannonboy

Page 50: Code reviews vs Pull requests

From: Gerrit Code Review - A Quick Introduction

@kannonboy

Page 51: Code reviews vs Pull requests

From: Gerrit Code Review - A Quick Introduction

+2+10-1-2

@kannonboy

Page 52: Code reviews vs Pull requests

“squash commits first”

$ git push origin HEAD:refs/for/master

# typey type type

$ git commit -am “Review feedback”

Counting objects: 2108776, done.Delta compression using up to 8 threads.Compressing objects: 100% (59/59), done.Writing objects: 100% (86/86), 893.21 KiB, done.Total 86 (delta 0), reused 0 (delta 0)

! [remote rejected] HEAD -> refs/for/master (squash commits first)error: failed to push some refs to ‘ssh://...'

@kannonboy

Page 53: Code reviews vs Pull requests

“squash commits first”

for/master

@kannonboy

Page 54: Code reviews vs Pull requests

“squash commits first”

for/master

push

@kannonboy

Page 55: Code reviews vs Pull requests

“squash commits first”

for/master

push

push --force

@kannonboy

Page 56: Code reviews vs Pull requests

“squash commits first”

for/master

push

push --force

push --force

@kannonboy

Page 57: Code reviews vs Pull requests

From: Gerrit Code Review - A Quick Introduction

@kannonboy

Page 58: Code reviews vs Pull requests

Pull requests

Post-commit review

Pre-commit review

master

for/master

Staging area

Staging area reviewSophisticated policy enforcement

Steep learning curve to use & administer

Iteration is a little awkward

FOSS project built in Java, on JGit

Git only

Clean commit history

@kannonboy

Page 59: Code reviews vs Pull requests

Pull requests

Post-commit review

@kannonboy

Page 60: Code reviews vs Pull requests

Branches only

master

master

patches & untracked files

commits

branches

specific filesmultiple repos

@kannonboy

Page 61: Code reviews vs Pull requests

Pull requests

review before merging

> Code review

@kannonboy

Page 62: Code reviews vs Pull requests

Pull requests > Code review

Passing build

Reviewer sign-off

Ready for deployment

@kannonboy

Page 63: Code reviews vs Pull requests

Pull requests > Code review

Passing build

Reviewer sign-off

Ready for deployment

@kannonboy

Page 64: Code reviews vs Pull requests

Two developers about to press the “Merge” button

@kannonboy

Page 65: Code reviews vs Pull requests

Merge Strategies

@kannonboy

Page 66: Code reviews vs Pull requests

@kannonboy

Page 67: Code reviews vs Pull requests

--no-ff

--ff-only

--squash --ff-only

--squash

--ff

@kannonboy

Page 68: Code reviews vs Pull requests

git merge --no-ff

@kannonboy

master

feature/JIRA-123“Always create a merge commit.”

Page 69: Code reviews vs Pull requests

git merge --no-ff

@kannonboy

master

feature/JIRA-123“Always create a merge commit.”

Page 70: Code reviews vs Pull requests

git merge --ff

@kannonboy

master

feature/JIRA-123

“Fast forward if you can, otherwise create a merge commit.”

Page 71: Code reviews vs Pull requests

git merge --ff

@kannonboym

aster

feature/JIRA-123

“Fast forward if you can, otherwise create a merge commit.”

Page 72: Code reviews vs Pull requests

git merge --ff

@kannonboy

mast

er

“Fast forward if you can, otherwise create a merge commit.”

Page 73: Code reviews vs Pull requests

git merge --ff

@kannonboy

mast

er

“Fast forward if you can, otherwise create a merge commit.”

Page 74: Code reviews vs Pull requests

git merge --ff-only

@kannonboy

master

feature/JIRA-123“Only allow fast forwards.”

Page 75: Code reviews vs Pull requests

git merge --ff-only

@kannonboy

master

feature/JIRA-123

“Only allow fast forwards.”

Page 76: Code reviews vs Pull requests

git merge --ff-only

@kannonboy

mast

er

“Only allow fast forwards.”

Page 77: Code reviews vs Pull requests

git merge --ff-only

@kannonboy

mast

er

“Only allow fast forwards.”

Page 78: Code reviews vs Pull requests

git merge --ff-only

@kannonboy

mast

er

“Only allow fast forwards.”

Page 79: Code reviews vs Pull requests

git merge --ff-only

@kannonboy

mast

er

“Only allow fast forwards.”

Page 80: Code reviews vs Pull requests

git merge --squash

@kannonboy“Combine commits on branch into a new commit on master.”

master

feature/JIRA-123

Page 81: Code reviews vs Pull requests

git merge --squash

@kannonboy“Combine commits on branch into a new commit on master.”

master

Page 82: Code reviews vs Pull requests

git merge --squash \

@kannonboy“Combine commits on branch into a new commit on master. Fail if master has any commits that branch doesn’t.”

master

--ff-only

Page 83: Code reviews vs Pull requests

git merge --squash \

@kannonboy“Combine commits on branch into a new commit on master. Fail if master has any commits that branch doesn’t.”

master

--ff-only

Page 84: Code reviews vs Pull requests

git merge --squash \

@kannonboy“Combine commits on branch into a new commit on master. Fail if master has any commits that branch doesn’t.”

mast

er

--ff-only

Page 85: Code reviews vs Pull requests

Merge Commit Fast forward Squash

Concise history

Lose context of how features evolved

Which should I use?

“Ugly” history

Full traceability

Hard to screw up

mostly some

--no-ff --ff-only --squash

@kannonboy

No merge commits

Verbose history

Requires rebasing

Page 86: Code reviews vs Pull requests

Pull requests

bit.ly/git-lfs

Sophisticated policy enforcement

Less flexible review content

DVCS had some limitations around file size

Choice of merge strategies

Multiple team members can author code under review

Git & Mercurial

@kannonboy

Page 87: Code reviews vs Pull requests

pull requests@kannonboy

Tim’s

tips fortop ten

Page 88: Code reviews vs Pull requests

1. One issue, one pull request

= @kannonboy

Page 89: Code reviews vs Pull requests

1. One issue, one pull request

# what’s shipping? $ git branch --merged

# what’s left to ship? $ git branch --no-merged

@kannonboy

Page 90: Code reviews vs Pull requests

master

IN REVIEW DONEIN PROGRESSOPEN

@kannonboy

Automatic Transitions

Page 91: Code reviews vs Pull requests

feature/JIRA-30

master

IN REVIEW DONEIN PROGRESSOPEN

Branch created!

@kannonboy

Automatic Transitions

Page 92: Code reviews vs Pull requests

feature/JIRA-30

master

IN REVIEW DONEIN PROGRESSOPEN

Pull Request Created!

@kannonboy

Automatic Transitions

Page 93: Code reviews vs Pull requests

feature/JIRA-30

master

IN REVIEW DONEIN PROGRESSOPEN

Pull Request Merged!

@kannonboy

Automatic Transitions

Page 94: Code reviews vs Pull requests

2. Minimum TWO approvals before merge

@kannonboy

Page 95: Code reviews vs Pull requests

2. Minimum TWO approvals before merge

3. Have 1.5x - 2.5x that number reviewers@kannonboy

Page 96: Code reviews vs Pull requests

Fewer reviewers find more defects

0

7.5

15

22.5

30

1 2 3 4 5 6 7 8 9

Def

ects

/ k

LoC

Number of Reviewers @kannonboysource: bit.ly/review-stats

Page 97: Code reviews vs Pull requests

More reviewers spend less time

0

7

14

21

28

1 2 3 4 5 6

Min

utes

spe

nt /

revi

ewer

Number of Reviewers @kannonboysource: bit.ly/review-stats

Page 98: Code reviews vs Pull requests

4. Use blame to pick reviewers@kannonboy

Page 99: Code reviews vs Pull requests

4. Use blame to pick reviewers

$ npm install -g git-guilt

# find blame delta for current branch $ git guilt `git merge-base master HEAD` HEAD

Alice Foo ++++++++++++++++++++++++(239) Bob Bar ++++++++ Eve Baz ------- Mira Ted ---------------- Bec Opal ------------------------(-159)

@kannonboy

Page 100: Code reviews vs Pull requests

4. Use blame to pick reviewers

bit.ly/suggest-reviewers @kannonboy

Page 101: Code reviews vs Pull requests

4. Use blame to pick reviewers

bit.ly/suggest-reviewers @kannonboy

Page 102: Code reviews vs Pull requests

4. Use blame to pick reviewers

bit.ly/suggest-reviewers @kannonboy

Page 103: Code reviews vs Pull requests

5. @mention specialists

@kannonboy

Page 104: Code reviews vs Pull requests

6. Stuck in review?

Make Tuesday & Thursday inbox zero days

@kannonboy

Page 105: Code reviews vs Pull requests

betterCode;

7. Move comments into code

reviewcomments

// comments// in code

@kannonboy

Page 106: Code reviews vs Pull requests

8. Build a team policy, as a team…

…and enforce it! @kannonboy

Page 107: Code reviews vs Pull requests

9. Add screenshots for UI/UX changes

(gifs / videos are even better) @kannonboy

Page 108: Code reviews vs Pull requests

9. Add screenshots for UI/UX changes

(gifs / videos are even better) @kannonboy

Monosnap GIPHY ScreenFlow

Page 109: Code reviews vs Pull requests

@kannonboy

Ask a programmer to review 10 lines of code, they'll find 10 issues. Ask them to do 500 lines and they'll say it looks good.@ G I R AY O Z I L

“”

10. Keep it concise

Page 110: Code reviews vs Pull requests

10. Keep it concise Se

cond

s pe

r lin

e

Lines of Code

1 line per second

100 lines per second

@kannonboysource: bit.ly/review-stats

Page 111: Code reviews vs Pull requests

Code Review vs. Pull requests

Need to review multiple repos at once

Not on Git

Heavily iterative workflow Literally everyone else

Dendrophobia

+

@kannonboy

(Traditional)

Page 112: Code reviews vs Pull requests

@kannonboy

bitbucket.orgBitbucket

atlassian.com/crucibleCrucible

gerritcodereview.comGerrit

Lookingfor

more?

Follow me for occasional Git &Bitbucket trivia