tl;dr:4 common types of premature abstractions often seen in codebases resulting in unnecessary complexity: (1) Responsibilities are abstracted too granularly. (2) Design patterns are used without real benefit. (3) Performance is optimized prematurely. (4) Low coupling is introduced everywhere.