If your making mistakes like over engineering are you actually a good developer then if that is part of what bad code is. Maybe you fall into the expert begginer at that point
I'll take a noob who doesn't understand basic syntax all day every day vs. the dev who finds a way to make everything complex. At least in the former the damage is limited.
Good dev's understand how to simplify complex problems by breaking it into smaller components. Bad devd add complexity to already complex problems.
Breaking down complex problem does not simplify it, you merely move the complexity to the graph of dependencies between smaller components.
I've seen this a lot. Where it is broken down so much that it involves mental gymnastics to follow whats going on. It also results in Spaghetti-code with fragmented functionality.
In my experience, projects using Java are the worst offenders here.
It can happen when a really good coder gets bored.