code quality. patch quality
TRANSCRIPT
Code qualityPatch quality
Malcolm [email protected]
Code Quality Matters
“Have you ever written a library before? It's like people seeing you in your underwear. You gotta make sure it's clean.”
Do The Basics Properly
Yr Doin' It Wrng!
● If the word “print” is still in your patch– Similarly for the phrase “import pdb”
Yr Doin' It Wrng!
● If you don't have a test or a really good reason
– Your reason is never going to be good enough.
– Fail before; pass afterwards
Yr Doin' It Wrng!
● If you think “PEP 8” is the name of a new
energy drink
How Hard Can It Be(tm)?
● They're called patches for a reason.
● Go to the top of the project tree.
● Then: svn diff (or git diff or ...)
– “svn add” works locally
● Even if you're a translator or a documenter.
Code style is somewhat opinionated
Your opinions don't matter(that much)
Read the contributing document
Code is...
●Written once
●Read many, many times
Comments should last
Comments should be correct!
Fix problems not symptoms!
Symptom fixing...
The template code below will cause an infinite memory-eating loop if context_processors.auth is enabled. My main issue with that is that it was incredibly hard to debug for me, when I passed my own 'perms' queryset to a template....
{% for perm in perms %}{% endfor %}
Ticket #8182: Infinite loop iterating over PermWrapperInfinite loop iterating over PermWrapper
django/contrib/auth/models.py | 22 ++++++++++++++++++++++django/core/context_processors.py | 5 +++++docs/authentication.txt | 11 ++++++++---
3 files changed, 35 insertions(+), 3 deletions(-)
Where else does it happen?
Warning: may be hard!
Author: mtredinnickDate: Thu Jun 26 11:01:21 2008 +1000
... This is the same problem as [7597] but for values() field specifications, so this covers the second case where Django adds extra stuff to the select-clause.
r7740
Author: mtredinnickDate: Mon Jul 28 04:16:17 2008 +1000
...
Fixed a missed case of promoting table joins when using disjunctive filters.
r8107
r8783
Author: mtredinnickDate: Mon Sep 1 18:43:55 2008 -0700
...
Fixed an oversight when I first fixed ordering on nullable foreign keys.
r8853
Author: mtredinnickDate: Tue Sep 2 06:52:07 2008 -0700
....
+ def promote_alias_chain(self, chain,...):+ """+ Walks along a chain of aliases, promoting the first+ nullable join and any joins following that. If+ 'must_promote' is True, all the aliases in+ the chain are promoted.+ """+ for alias in chain:+ if self.promote_alias(alias, must_promote):+ must_promote = True+
Know your limitations
The crowd is smarter than you!(the code mostly works)
“Here is a trivial patch”
Translation: “here are some bugs I thought you should have”
Research is not a four letter word
● Django runs out-of-the-box on databases.
Plural.
– SQLite, MySQL, PostgreSQL, Oracle
● External backends, too
● Separate solution approach into pieces
– It has a chance of working and here's a good
start.
– It has a perfect implementation.
● Django runs on multiple operating systems
– Windows, Linux, Mac, ...
● Some things are hard
– File handling, locking, ...
– Character encoding
● Best defense is “don't do that”.
● Next best is a good offense (Research!)
● There are RFCs.
– They apply in this universe.
● There are competing specs
– Real world software beats paper
● There are contradictory requirements
– Duh!
Python needs research, too
● Pickle has mulitple protocols:
– 0 and 2 are important
● __len__() is eeevviiilll
– With good reason
– Swallows exceptions
● TypeError
● Others (Python 2.3, Python 2.6.0 – 2.6.1)
● Unicode matters. So does UTF-8
Always contribute!
Best beats perfect