Code Reviews vs. Pull Requests

57
TIM PETTERSEN SENIOR DEVELOPER ATLASSIAN @KANNONBOY Code review vs Pull requests

Transcript of Code Reviews vs. Pull Requests

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

Code review at Atlassian

2006

2007Atlassian acquires Cenqua, starts using Crucible

Page 3: Code Reviews vs. Pull Requests

TO O L I N G T H R O W D O W N

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

T H E V E R D I C T

Agenda

Page 4: Code Reviews vs. Pull Requests

n. koâla tēaQuality

Page 5: Code Reviews vs. Pull Requests

CodeReview

Photo: Yogi (Flickr)

Page 6: Code Reviews vs. Pull Requests

Better Code

Shared Knowledge

Team Ownership

Page 7: Code Reviews vs. Pull Requests

G = 1

R+1

Developer guilt

Page 8: Code Reviews vs. Pull Requests

Team Ownership

Page 9: Code Reviews vs. Pull Requests

Better Code

Shared Knowledge

Team Ownership

Page 10: Code Reviews vs. Pull Requests

Types of code review

Page 11: Code Reviews vs. Pull Requests

Pull requests

Code review

Post-commit

Pre-commit

master

for/master

Gerrit

Page 12: Code Reviews vs. Pull Requests

Criteria

Creation Iteration HistoryCollaboration

Page 13: Code Reviews vs. Pull Requests

Pull requests

Post-commit

Pre-commit

master

for/master

Gerrit

Page 14: Code Reviews vs. Pull Requests

Pre-commit review

dev [email protected]

mastermaintainer

Page 15: 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;

Page 16: 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

Page 17: 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

Page 18: 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

> >

Page 19: 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

Page 20: Code Reviews vs. Pull Requests

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

Pre-commit review

dev maintainer

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

Page 21: Code Reviews vs. Pull Requests

Iteration

master

Page 22: Code Reviews vs. Pull Requests

Pre-commit reviewLinus Torvalds*

Module maintainers

File / driver maintainers

[email protected]

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

Page 23: Code Reviews vs. Pull Requests

Pre-commit review

Junio C Hamano*

[email protected]

* Also an oversimplification

Page 24: Code Reviews vs. Pull Requests

Pull requests

Post-commit review

Pre-commit review

master

for/master

Gerrit

Pre-commit reviewVersion control agnostic

Simple and decentralized

Easy to keep ‘000s of people in the loop

Plain text diffs

One contributor per patch

Difficult to iterate

Have to manually merge work

Page 25: Code Reviews vs. Pull Requests
Page 26: Code Reviews vs. Pull Requests
Page 27: Code Reviews vs. Pull Requests
Page 28: Code Reviews vs. Pull Requests

Flexible structure

master

master

patches & untracked files

commits

branches

specific filesmultiple repos

Page 29: Code Reviews vs. Pull Requests

Iterative review in

Page 30: 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

Page 31: Code Reviews vs. Pull Requests

Pull requests

Post-commit review

Pre-commit review

master

for/master

Gerrit

Post-commit reviewSupports popular CVCS and DVCS

Flexible review content

Easy to iterate

Have to manually merge work

Need a separate VCS host

Hard to enforce process

Page 32: Code Reviews vs. Pull Requests

Gerritand DIFFY The Kung Foo Review Cuckoo

Page 33: Code Reviews vs. Pull Requests

Gerrit is very “Git-y”

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

http://localhost:8080/

Page 34: Code Reviews vs. Pull Requests

for/master

master

reviewers approved?

verified (build passing)?

Dev team

fetch

push

Gerrit

Page 35: Code Reviews vs. Pull Requests

From: Gerrit Code Review - A Quick Introduction

+2+10-1-2

Page 36: 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://...'

Page 37: Code Reviews vs. Pull Requests

“squash commits first”

for/master

push

push --force

push --force

Page 38: Code Reviews vs. Pull Requests

From: Gerrit Code Review - A Quick Introduction

Page 39: Code Reviews vs. Pull Requests

Pull requests

Post-commit review

Pre-commit review

master

for/master

Staging area

GerritSophisticated policy enforcement

FOSS project built in Java, on JGit

Clean commit history

Steep learning curve to use & administer

Iteration is a little awkward

Git only

One contributor per patch

Page 40: Code Reviews vs. Pull Requests

Branches only

master

master

patches & untracked files

commits

branches

specific filesmultiple repos

Page 41: Code Reviews vs. Pull Requests
Page 42: Code Reviews vs. Pull Requests

Iterative review in

Page 43: Code Reviews vs. Pull Requests

Pull requests

review before merging

> Code review

Passing build

Reviewer sign-off

Ready for deployment

Page 44: Code Reviews vs. Pull Requests

Pull request == IssueIN REVIEW DONEIN PROGRESSOPEN

Branch created!

Pull request created!

Pull request merged!

Page 45: Code Reviews vs. Pull Requests

Two developers about to press the “Merge” button

@kannonboy

Page 46: Code Reviews vs. Pull Requests

mas

ter

Pull requests Mailing list / Gerrit

Page 47: Code Reviews vs. Pull Requests

Merge Strategies

Page 48: Code Reviews vs. Pull Requests

--no-ff

--ff-only

--squash --ff-only

--squash

--ff

Page 49: Code Reviews vs. Pull Requests

git merge --ff

master

feature/JIRA-123

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

Page 50: Code Reviews vs. Pull Requests

git merge --no-ff

master

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

Page 51: Code Reviews vs. Pull Requests

git merge --ff-only

master

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

Page 52: Code Reviews vs. Pull Requests

git merge --squash

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

master

feature/JIRA-123

Page 53: Code Reviews vs. Pull Requests

git merge --squash \

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

master

--ff-only

Page 54: 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

No merge commits

Verbose history

Requires rebasing

Page 55: Code Reviews vs. Pull Requests

Pull requestsSophisticated policy enforcement

Choice of merge strategies

Multiple team members can author code under review

Git & Mercurial

Less flexible review content

Page 56: 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

+

(Traditional)

Page 57: Code Reviews vs. Pull Requests

bitbucket.org

Bitbucket

atlassian.com/crucible

Crucible

gerritcodereview.com

Gerrit

Lookingfor

more?

@kannonboy