All dependencies should be injected (and possibly wrapped with custom interfaces, if they're libraries).
All globals should be configurable (most codebases I've seen have a ton of hidden globals).
All side effects should be isolated.
"Break any of these rules sooner than say anything outright barbarous."