This is a *really* good synopsis of various things to watch out for when doing object-oriented programming. Some of the non-OO examples are applicable to any kind of programming language. The idea behind "code smells" is that there are some specific instances that may be symptomatic of a larger issue in the code. This article bridges the gap between the symptom and what is really at fault. There is also a link to a specific guide that matches the problem with the refactoring technique to solve it.
Comments, Long Method, Long Parameter List, Duplicated code, Conditional Complexity, Combinitorial Explosion, Large Class, Type Embedded in Name,Uncommunicative Name, Inconsistent Names, Dead Code, Speculative Generality, Oddball Solution, Temporary Field, Alternative Classes with Different Interfaces, Primitive Obsession, Data Class, Data Clumps, Refused Bequest, Inappropriate Intimacy, Indecent Exposure, Feature Envy, Lazy Class, Message Chains, Middle Man, Divergent Change, Shotgun Surgery, Parallel Inheritance Hierarchies, Incomplete Library Class, Solution Sprawl.
Coding Horror: Code Smells