A helpful comment pointed me to Rusty Russell's Hard to Misuse Interface Levels rules (a play on "easy to use").
I've reproduced them here in one place, since I always seem to want to refer to it. See the original for fun examples. Higher is better.
- Impossible to get wrong
- Compiler/linker won't let you get it wrong
- Compiler/linker warns if you get it wrong
- Simplest use is correct
- The name tells you how to use it
- Do it right or breaks at runtime
- Follow the convention and you will get it right
- Read the documentation and you will get it right
- Read the implementation and you will get it right
- Read a mail list thread and you will get it right
- Read the documentation and you will get it wrong
- Follow the convention and you will get it wrong
- Do it right and it will break at runtime
- The name tells you how not to use it
- The obvious use is wrong
- Compiler/linker will warn you if you get it right
- Compiler/linker won't let you get it right
- Impossible to get right