NINA ZAKHARENKO
CODE REVIEW
SKILLS FOR
PYTHONISTAS
@NNJA
bit.ly/
djangocodereviews
Slide 2
Slide 2 text
LIVETWEET
USE #DJANGOCON
@NNJA
Slide 3
Slide 3 text
WHAT WE'LL LEARN TODAY [1/2]
> What are the proven benefits of
review?
> Setting standards
> Time saving tools and automation
options for Python
@nnja
Slide 4
Slide 4 text
WHAT WE'LL LEARN TODAY [2/2]
> How to effectively review code
> How to submit PRs for maximum
impact
> Use code review to build a
stronger team
@nnja
Slide 5
Slide 5 text
WHAT WILL YOU TAKE AWAY FROM THIS TALK?
> Novice - Comprehensive overview of
code review best practices
> Intermediate - Tooling &
automation
> Advanced - Hardest part – the
people factor
@nnja
Slide 6
Slide 6 text
NOT ONE SIZE FITS ALL!
> team size
> 2 vs 10
> product type
> agency vs in-house
> open source
@nnja
Slide 7
Slide 7 text
NOT ONE SIZE FITS ALL!
> defect tolerance
> high tolerance
> phone games
> low tolerance
> medical equipment
> airplanes
@nnja
Slide 8
Slide 8 text
CODE REVIEWS CAN
BE FRUSTRATING
@nnja
Slide 9
Slide 9 text
APPARENT CODE REVIEW FRUSTRATIONS
> Adds time demand
> Adds process
> Can bring up team tensions
> “smart” devs think they don’t need
it
!
@nnja
Slide 10
Slide 10 text
CODE REVIEW BENEFITS
@nnja
Slide 11
Slide 11 text
FIND BUGS & DESIGN FLAWS
> Design flaws & bugs can be identified
and remedied before the code is
complete
> Case Studies on Review5:
> ‑ bug rate by 80%
> ‐ productivity by 15%
5 blog.codinghorror.com/code-reviews-just-do-it/
@nnja
Slide 12
Slide 12 text
THE GOAL IS TO FIND
BUGS BEFORE YOUR
CUSTOMERS DO
@nnja
Slide 13
Slide 13 text
SHARED OWNERSHIP & KNOWLEDGE
> We’re in this together
> No developer is the only expert
@nnja
Slide 14
Slide 14 text
LOTTERY FACTOR
New Yorker: Can Andy Byford Save the Subways?
ENCOURAGE CONSISTENCY
> Your code isn’t yours, it belongs
to your company
> Code should fit your company’s
expectations and style (not your
own)
> Reviews should encourage
consistency for code longevity
@nnja
Slide 17
Slide 17 text
CODE REVIEWS NEED TO BE UNIVERSAL &
FOLLOW GUIDELINES
> Doesn’t matter how senior / junior
you are
> Only senior devs reviewing ==
bottleneck
> Inequality breeds dissatisfaction
@nnja
Slide 18
Slide 18 text
HOW?
@nnja
Slide 19
Slide 19 text
STYLE GUIDE
> Distinguishes personal taste from
opinion
> Goes beyond PEP8
> Should be agreed upon beforehand
> Example: Google's pyguide.md
@nnja
Slide 20
Slide 20 text
FORMATTERS
- autopep8
- Black
- YAPF
Slide 21
Slide 21 text
!
BLACK
DEMO @: black.now.sh
github.com/jpadilla/black-online
Slide 22
Slide 22 text
VS Code
> settings:
> "editor.formatOnSave": true
> "python.formatting.provider": "black"
> "python.formatting.blackArgs": ["--line-
length", "100"]
> VS Code Black support docs
@nnja
Slide 23
Slide 23 text
CONSISTENT CODE IS EASIER TO MAINTAIN
BY A TEAM
@nnja
Slide 24
Slide 24 text
CODE REVIEW SHOULD BE DONE BY
YOUR PEERS & NOT MANAGEMENT
@nnja
Slide 25
Slide 25 text
DON’T POINT FINGERS!
@nnja
Slide 26
Slide 26 text
WHEN CODE REVIEWS ARE POSITIVE,
DEVELOPERS
DON’T EXPECT THEIR
CHANGES TO BE REVIEWED,
THEY WANT THEIR
CHANGES TO BE REVIEWED.
@nnja
Slide 27
Slide 27 text
LET'S REVIEW: CODE REVIEW
FUNDAMENTALS
> Reviews done by peers
> Style guides & formatters for
consistency
> No blame culture
@nnja
Slide 28
Slide 28 text
HOW SHOULD
WE CODE
REVIEW?
@nnja
Slide 29
Slide 29 text
BE A GREAT
SUBMITTER
@nnja
Slide 30
Slide 30 text
No content
Slide 31
Slide 31 text
DON’T GET RUBBER-STAMPED.
@nnja
Slide 32
Slide 32 text
DON’T BE CLEVER.
READABILITY COUNTS!
@nnja
Slide 33
Slide 33 text
GOOD CODE IS LIKE A GOOD JOKE.
IT NEEDS NO EXPLANATION.
- RUSS OLSEN
@nnja
Slide 34
Slide 34 text
STAGES OF REVIEW
> 0: before PR submission
> 1: PR submitted
> 2: (optional) work in progress PR
(30-50%)
> 3: review almost done (90-100%)
> 4: review completed
@nnja
Slide 35
Slide 35 text
STAGE 0:
BEFORE SUBMISSION
@nnja
Slide 36
Slide 36 text
PROVIDE CONTEXT (THE WHY)
> What was the motivation for
submitting this code?
> Link to the underlying ticket/issue
> Document why the change was needed
> For larger PRs, provide a changelog
> Point out any side-effects
@nnja
Slide 37
Slide 37 text
YOU ARE THE
PRIMARY REVIEWER
> Review your own code as if it
belonged to someone else.
> Anticipate problem areas.
@nnja
Slide 38
Slide 38 text
THE PRIMARY REVIEWER
> Make sure your code works, and is
thoroughly tested.
> Don’t rely on others to catch your
mistakes.
@nnja
Slide 39
Slide 39 text
BEFORE SUBMITTING, TRY A CHECKLIST
@nnja
Slide 40
Slide 40 text
☑ SMALL STUFF
> Did you check for reusable code or
utility
methods?
> Did I remove debugger statements?
> Are there clear commit messages?
@nnja
Slide 41
Slide 41 text
☑ BIG STUFF
> Is my code secure?
> Will it scale?
> Is it maintainable?
> Is it resilient against outages?
Tip: Read The Checklist Manifesto
@nnja
Slide 42
Slide 42 text
STAGE 1:
SUBMITTED
@nnja
Slide 43
Slide 43 text
YOU’RE STARTING A CONVERSATION
> Don’t get too attached to your
code before the review process
> Anticipate comments and feedback
> Acknowledge you will make mistakes
@nnja
Slide 44
Slide 44 text
STAGE 2:
(OPTIONAL)
WORK IN PROGRESS
@nnja
Slide 45
Slide 45 text
SUBMIT WORK IN PROGRESS PULL REQUESTS
> Open them your code is 30-50% done
> Good idea for bigger features
> Don’t be afraid of showing
incomplete, incremental work
@nnja
Slide 46
Slide 46 text
WHEN CODE IS WORK IN PROGRESS
> Feedback to expect:
> Architectural issues
> Problems with overall design
> Design pattern suggestions
@nnja
Slide 47
Slide 47 text
STAGE 3:
ALMOST DONE
@nnja
Slide 48
Slide 48 text
WHEN CODE IS ALMOST DONE
> Feedback to expect:
> Nit Picks
> Variable Names
> Documentation & Comments
> Small Optimizations
@nnja
Slide 49
Slide 49 text
ONE PR PER ISSUE
> Solving multiple problems? Break
them up into multiple PRs for ease
of review.
> Solved an unrelated problem? Make
a new PR with a separate diff
@nnja
Slide 50
Slide 50 text
PREVENT REVIEWER BURNOUT
> Reviews lose value when they’re
more than 500 lines of code1
> Keep them small & relevant
> If a big PR is unavoidable, give
the reviewer extra time
1 https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/
bosu2015useful.pdf
@nnja
Slide 51
Slide 51 text
✔ CHECK CODE
WITH AUTOMATED TOOLS
@nnja
Slide 52
Slide 52 text
✔ LINTER
@nnja
Slide 53
Slide 53 text
> Coding standard
> Error detection
> Refactoring help
> IDE & editor integration
@nnja
Slide 54
Slide 54 text
!
PYLINT RULE: trailing-comma-tuple
foo = (1,
3,
4,
)
bar = 2,
# bar is now a tuple
@nnja
Slide 55
Slide 55 text
USE VULTURE.PY
TO FIND DEAD OR UNREACHABLE CODE
$ pip install vulture
$ vulture script.py package/
or
$ python -m vulture script.py package/
github.com/jendrikseipp/vulture
BE RESPONSIVE
> Respond to comments if you don't
agree with them.
> If you won’t implement the
suggestion, come to a mutual
understanding with the reviewer
@nnja
Slide 67
Slide 67 text
IT’S STILL A CONVERSATION
If there were comments, let your
reviewer know when you’ve pushed
changes and are ready to be re-
reviewed.
@nnja
Slide 68
Slide 68 text
DON’T BIKE-SHED
> back & forth > 3 times? step away
from the keyboard
> talk instead!
> record the results of the
conversation in the PR
> bikeshed.com
@nnja
Slide 69
Slide 69 text
VS CODE LIVE SHARE
Download Extension
Slide 70
Slide 70 text
FIGHT FOR WHAT YOU BELIEVE, BUT
GRACEFULLY ACCEPT DEFEAT.
@nnja
Slide 71
Slide 71 text
DON’T TAKE FEEDBACK PERSONALLY.
IT’S AN OPPORTUNITY FOR GROWTH.
@nnja
Slide 72
Slide 72 text
HOW TO BE A GREAT SUBMITTER?
> Provide the why (context!)
> Review your own code
> Expect conversation
> Submit in progress work
@nnja
Slide 73
Slide 73 text
HOW TO BE A GREAT SUBMITTER?
> Use automated tools
> Be responsive
> Accept defeat
@nnja
Slide 74
Slide 74 text
#1: BE A GREAT
REVIEWER
@nnja
Slide 75
Slide 75 text
@nnja
Slide 76
Slide 76 text
BE OBJECTIVE
“THIS METHOD IS MISSING A DOCSTRING”
INSTEAD OF
“YOU FORGOT TO WRITE A DOCSTRING”
@nnja
Slide 77
Slide 77 text
ASK QUESTIONS DON’T GIVE ANSWERS
> “Would it make more sense if... ?”
> “Did you think about... ? ”
@nnja
Slide 78
Slide 78 text
OFFER SUGGESTIONS
> “It might be easier to...”
> “We tend to do it this way...”
@nnja
Slide 79
Slide 79 text
AVOID THESE TERMS
> Simply
> Easily
> Just
> Obviously
> Well, actually...
Recurse Center Social Rules
Slide 80
Slide 80 text
... NOW, SIMPLY
@nnja
Slide 81
Slide 81 text
HAVE CLEAR FEEDBACK
> Strongly support your opinions
> Share How & Why
> Link to supporting docs,
stackoverflow, etc
@nnja
Slide 82
Slide 82 text
THIS IS NOT CLEAR FEEDBACK
@nnja
Slide 83
Slide 83 text
COMPLIMENT GOOD WORK
& GREAT IDEAS
@nnja
Slide 84
Slide 84 text
DON'T BE A PERFECTIONIST
@nnja
Slide 85
Slide 85 text
DON’T BE A PERFECTIONIST
> Don’t let perfect get in the way
of perfectly acceptable.
> Prioritize what’s important to
you.
> Usually 90% there is good enough.
@nnja
Slide 86
Slide 86 text
IT’S OK TO NIT-PICK
> Syntax Issues
> Spelling Errors
> Poor Variable Names
> Missing corner-cases
> Specify: Are your nitpicks blocking merge?
Save the nit-picks for last, after any pressing
architecture, design, or other large scale issues
have been addressed.
@nnja
Slide 87
Slide 87 text
Don't burn out. Studies show reviewer should look at
200-400 lines of code at a time for maximum impact2.
2
https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/
Slide 88
Slide 88 text
Limit reviews to 400 lines in 60 mins
to maximize effectiveness3.
3
https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/
Slide 89
Slide 89 text
TRY TO DO REVIEWS IN 24-48 HOURS
Slide 90
Slide 90 text
HOW CAN WE BE A GREAT REVIEWER?
> Have Empathy
> Watch your Language
> Have Clear Feedback
> Give Compliments
@nnja
Slide 91
Slide 91 text
HOW CAN WE BE A GREAT REVIEWER?
> Don’t be a perfectionist
> Avoid Burn Out
> Complete in 24-48 hours
@nnja
Slide 92
Slide 92 text
I'VE BECOME A MUCH BETTER PROGRAMMER
BY PARTICIPATING IN CODE REVIEWS
@nnja
Slide 93
Slide 93 text
CODE
REVIEWS
BUILD A
STRONGER
TEAM
@nnja
Slide 94
Slide 94 text
HIRING SENIOR ENGINEERS IS HARD.
YOU CAN HIRE JUNIOR ENGINEERS,
AND GROW THEM
INTO FUNCTIONAL PRODUCTIVE PARTS OF
YOUR TEAM.
- SASHA LAUNDY
@nnja
Slide 95
Slide 95 text
IF YOU’RE NOT DOING CODE REVIEWS,
YOU’RE MISSING A BIG OPPORTUNITY.
@nnja
Slide 96
Slide 96 text
REMEMBER...
> Allocate the time
> Develop, don’t force the process
> Not one size fits all
> Or a one stop fix
> Use in addition to tests, QA, etc for
maximum impact
@nnja
Slide 97
Slide 97 text
WHAT DID WE
LEARN?
@nnja
Slide 98
Slide 98 text
@nnja
Slide 99
Slide 99 text
REVIEWS DECREASE WTFS/M
BY INCREASING CODE QUALITY LONG TERM
@nnja
Slide 100
Slide 100 text
LESS WTFS ➡
HAPPIER DEVS!
@nnja
Slide 101
Slide 101 text
SLIDES:
bit.ly/djangocodereviews
PYTHON @ MICROSOFT
bit.ly/pythonazure
(ADDITIONAL READING ON NEXT SLIDE)
@nnja
Slide 102
Slide 102 text
RESOURCES & ADDITIONAL READING
> Top 3 Django Gotchas to Catch during Code Review
> Microsoft Study on Effective Code Review
> Code Reviews: Just do it
> Code Project - Code Review Guidelines
> Great Example Checklist
> Best Practices for Code Review
> Rebecca's Rules for Constructive Code Review
> My Big Fat Scary Pull Request
> The Gentle Art of Patch Review - Sage Sharp
> Watch: Raymond Hettinger - Beyond PEP8
@nnja
Slide 103
Slide 103 text
EXAMPLE STYLE GUIDES
> Python
> Plone
Google has many good, but strict style guides
at: https://github.com/google/styleguide
Doesn't matter which one you use.
Pick one and stick with it.
@nnja