"A lot" doesn't mean "good" even there is a lot of something good. You should know when to stop.
One of the worst thing I've ever done as a developer is over-designing. I've overdone many other things too, but over-designing is probably the number one. Like many other words the word "design" is overloaded. In software development world it usually means a structure of classes or the process of creating this structure. For example,
Design Payoff (from Martin Fowler's
Design Stamina Hypothesis) has always meant for me that "if you have a good structure, you will be able implement a lot of stuff; if you have no structure, you're out of luck".

I can't say for sure whether this diagram implies "design" not only as structure but also as activity. Probably, the main point of it is just "payoff line". If you redraw this diagram in terms of "features per iteration", you will get something like this.

From this diagram it's easy to see that the amount of features you can implement with "good design" is
limited. This is kind of obvious thing which, probably, every developer knows very well from he's own experience.
"Design" as the process of creating "design structure" comes to play every time you want to implement something which turns out to be cumbersome or very hard to do with current design. This is what I blame myself most of all. First off, it's the amount of time spent redesigning. I do not claim it to be true, but thinking about last several months for me the following dependency seems to close to reality.

After a certain point the harder you try to "improve" design, the worst result you get. In other words, there is also a
limit of much effort it's worth spending on design. The worst part of it is that determining how close you're to "masturbation point" is always a judgment call. Basically you don't know where you are on the curve. Even when you feel you've crossed the point, there is always temptation instead of
Killing Your Darlings to continue in hope of getting some insight and turning things right. Spending more time redesigning something doesn't necessarily mean that design becomes more complicated. It can become simpler but less appropriate. It's also true that the time you spend designing is the time you could've spent adding new feature. The only good way I found to avoid this is to add feature with minimal changes and then consciously
experiment with design ideas. Or
just wait.
Going meta, this can be applied to other areas like code conventions, static code analysis or
static dependencies rules.