Usually I consider myself good at learning from my mistakes, but one particular mistake has taken me a long time to learn. What is the mistake? That adding a little complexity will result in a better and more maintainable system.
The complexity usually comes in very innocently; a little library, a custom select UI, an ORM. Or it can come in less innocently; a build tool (rip Grunt). When I first add it, I feel great about it. It solved my problem and made me feel like my co-workers should applaud the elegant thing I did. And time passes with it doing its job (hopefully well).
Slowly the landscape changes, more depends on the little spot of complexity I added, then one day some clouds roll in. A feature is needed or a bug is found, and it comes time to do the dreaded deed, maintain my old code.
This is when I always regret my silly added complexity.
Remembering why you made decisions is hard. Figuring out why someone else did it that way is even worse. If I have learned one thing in my career, it is to plan on things changing; team members will come and go, as will technologies. Just about the only thing you can do to help reduce the impact of these changes is to Keep It Simply Silly.