First a disclaimer: I don't really know if this question fits this website, but I still find it a relevant question not just to me but for other people which are beginners. If the question can be improved to fit here, please point out int comments. If it doesn't fit, let me know also and if possible let me know where this can be discussed because I didn't find any good forums for this.
I've learned to program in 2009 when I studied PHP. Later in 2012, I moved to C# and .NET. Anyway, coding isn't the problem, writing down algorithms isn't my problem. My actual problem is to know what has to be coded to achieve a requirement and where it has to be coded.
Most courses out there available on the web tackle the how - how to write code in a certain language, how to use some sets of APIs, etc. That's not my point here.
In these years I've read a lot about a bunch of things: object-oriented analysis and design, design patterns, domain-driven design and so on. I understand for example the SOLID principles, some of the main ideas of DDD like the necessity for engagement of domain experts, the development of a ubiquitous language and so on. I would dare say I a theoretical background at least reasonable.
But when it comes to practice I feel like I'm a disaster. Some time ago I needed to continue the development of a financial system that was already being developed by someone else. It's that kind of "old system" developed with C# and WinForms. It was the first time I picked a project with real domain complexity, with lots of business rules and so on.
I confess that when I receive the requirements most of the time I think "how on earth can this be done?" - I have no idea on how to even get started working on the requirements to figure out what has to be done. My main confusions I believe are what I must code, what classes, interfaces and where each piece of logic goes, on which class each thing must be. The problem is that I don't know where to start.
Most of the times, with quite a lot of thought I end up with some ideas, but I never know how to judge if my idea is correct or not.
I mean I don't think this is a lack of theory, as I said I've read about a bunch of thing on software architecture and object orientation I was recommended but it didn't help much in identifying what must be done in practice.
So how can I learn to really do object oriented design? What I want to learn is: given requirements know how to get started working on them in a process that leads to finding out what has to be done and where each piece of code belongs. How can I also learn to judge if my idea is correct or not?
I believe fully explaining this as an answer here would not be possible. What I am looking for, however, that may be according to the site style are answers just giving an overview and pointing some references (books, online courses, etc) that can be used to expand the ideas and really learn these things.