Gratuitously Complicated Design
The mother of unclear and complex code is code that expresses a complicated design. Here I’m thinking about abstraction through mechanisms like inheritance, interfaces, and generic types with no apparent gains. Design patterns are also sometimes misused in a similar manner.
There’s a fine difference between a complex design that serves a purpose and one that simply shows-off designer expertise or guards against vague and unspecified requirements that might appear in the future. The agile programming community has taught us that paying upfront the cost of future-proof goldplating is a disastrous waste of programmer productivity. The design becomes difficult to navigate today, while the rewards may get reaped in the future.
So, when you encounter complex designs that fit our description don’t feel intimidated by what might lie beneath; simply lament the fact that somebody’s Pharaonic design ideas will cause you some everyday pain.