At one point I was making an object loader and didn't understand what hashmaps and hashtables were. I was making mistakes, debugging constantly and the complexity grew over my head.
I sketched out a quick 'n dirty class diagram and how everything related. Whenever I got stuck or confused, I'd look at the class diagram. I'd see where I was and noted to myself what I already implemented and what still needed to be implemented. I also asked myself if I was stuck with a high level (UML) issue or more a low level issue (not understanding a certain datastructure).
That class diagram was my rock and emotional support in coding up that object loader. So UML does have its place: if it gets too complex, but you know the design, draw out a UML-like diagram (or other diagramming methods) and it'll allow you to not have the high level picture in mind: it's right behind you on the whiteboard.
Other than that, yea proper UML has never worked for me.
I don't see a lot of value in UML's standardizing +,-,#,~ as access specifiers, vs just using the relevant language keywords.
Generally, unless people are using CASE tools, I tend to see them draw non-conforming diagrams that just roughly resemble what the UML spec says, and that is almost always good enough.
Diagrams are good, but having to worry about N different type of arrow heads, if a line should be solid or dashed, semi-obscure access symbols, etc is not good. and strictly speaking if you are not concerned about those things you are not actually using UML.
The exception is that nobody can ever convince me that a UML-style usecase diagram is better than alternatives like user stories.
The problem was also that the prof was always modelling some accounting/business "problems" which we also had no idea/experience about. So it was about learning couple of things all at once with very fragmented information. It was a disaster of class, and turned me off out of both UML and OOP. The latter I'm still sour about.