Test should not need to change when private parts change; enables refactoring and optimization
Want to test code as it's actually used; not as you think it might be
Working through the public API to find the untested parts teaches you about code flow
Code that can't be reached can be deleted