Design Smells

Rigidity: A design is rigid if a single change causes a cascade of subsequent changes in dependent modules. The more modules must be changed, the more rigid the design.

Fragility: Fragility is the tendency of a program to break in many places even when a single change is made. When developers try to fix those problems, the new problems occur and the modules are getting worse and worse the more they are being fixed.

Immobility: Software is immobile when none of its parts can be used in other systems because the risk and effort involved with separating those parts from the original system are too great.

Software viscosity: Viscosity refers to the ease at which a developer can add design-preserving code to a system. If it is easy to add new code to the program while maintaining the design, then the program has low viscosity and that's the right thing.

Needless Complexity: Code base is needlessly complex when it contains code that is not useful. Just to take one such case is developers try to anticipate future requirements and changes and put into the code parts that do not have to be there at the moment and probably never used in future.

Needless repetition: Same code appears in different locations, every time with slight change. This makes system hard to understand and maintain and it is sign that developers are missing abstraction.

Opacity: It is a tendency of software code to be difficult to understand. Codebase that evolves over time tends to become more and more opaque with age.