Defensive practice.
WHAT PREVENTS MOST BUGS
Validating input at the boundary Failing clearly rather than continuing Small functions doing one thing Naming things accurately Running code frequently
WHAT ELSE HELPS
A formatter, removing style variance A checker, flagging likely errors Type annotations, where they aid clarity
WHAT TYPE ANNOTATIONS DO
Document what a function expects and returns.
Optional in Python, and checkable by tools.
WHERE THEY HELP MOST
Function signatures in shared code.
WHERE THEY HELP LEAST
Short scripts.
WHAT TO ADOPT FOR ANY SHARED PROJECT
A formatter and a checker, run automatically.
WHAT THAT CATCHES
Unused names Undefined names Likely mistakes Style inconsistency
WHAT IT DOES NOT CATCH
Logic errors.
WHAT CATCHES THOSE
Tests, and review.
WHAT TO ESTABLISH AS A HABIT
Reading your own change before committing it.