There is a meta-concept behind software development that underpins everything, something I’ve been trying to pin down and give an appropriate name.
The gist boils down to this, every behavior in every program comes from somewhere. Programming builds layers of abstractions on top of each other and having ways to quickly determine which abstraction a behavior is coming from is absolutely crucial to being a good developer.
For example, take the humble web browser error page. You can learn a lot by looking very carefully at them. The HTTP status code means something, the text of the error means something. The look of the error page itself means something.
All except the last can be Googled. In the process of Googling to find helpful information, don’t just look frantically for someone else that’s had exactly the same problem you’re having and their resolution. You also need to understand the problem space you’re dealing with.
Any relevant Stack Overflow threads you find will have extremely relevant information that can help point you to a resolution if you can just sit still for a few minutes and digest everything people are saying on the thread.
Don’t be afraid to dive into documentation. Good documentation, which you’ll find on the biggest projects, will have sections on “doctrine” or “architecture.” These high-level conceptual documents are incredibly useful for giving you a quick 1000-foot perspective on the whole project. If you spend some time reading it and digesting it, you can then start targeting the relevant parts of the main documentation that are relevant to your problem.
In short, the main thing that trips software developers up is the reluctance, inability, or sheer plain laziness to not go to the effort of reading the map to the terrain they’re trying to navigate. You can do better by paying very close attention to everything you see and seeking to understand where it lies on your map so that the map you have in your head of how everything works gets richer and more detailed over time.