What you MUST avoid (but we've all done)
Tangled flow, jumps (GOTO), and chaotic dependencies. Impossible to maintain without breaking something.
A class that "knows everything" and "does everything". Thousands of lines and infinite responsibility.
Hardcoded values without context. if (status == 3) ... (What is 3? Error? Success?)
Classes with no life of their own (e.g., excessive Utils or empty Managers) that only invoke methods from others.
"If you have a hammer, everything looks like a nail". Using the same technology (e.g., Web) for EVERY problem.