In a more general view, having skilled peer developers that have extensive knowledge in the field I am working on and are willing to mentor. I did my BS in a dual system that consisted of half a semester studying and the other half working in different teams of a software company with ~150 devs. During this time I had two or three very good mentors who not only made sure I am doing the right thing but also showed me how to do them correctly. This meant mainly reviewing the architecture and code I came up with and telling me when I was doing bad practice and how I should do properly. I think the situations I learned most in my whole studies were when one of these mentors refused a review or help me some higher level problems until the flaws they found in my code weren't fixed. This made me develop a feeling about if the approach I'm taking might be a bad idea and what to do instead that I can most often trust to a certain degree.
The other thing is to go beyond the basic tutorial steps for advanced technology like datastores, queueing systems and such. To me, this works best when I have the option for using them for a certain case that is (or will be) more or less important for production. I think gaining brief information about different frameworks etc. without wasting too much time before you need them is very important to know your options but you only fully understand the characteristics and problems behind them once you put them to an extensive and got hit by their pitfalls.
In a more general view, having skilled peer developers that have extensive knowledge in the field I am working on and are willing to mentor. I did my BS in a dual system that consisted of half a semester studying and the other half working in different teams of a software company with ~150 devs. During this time I had two or three very good mentors who not only made sure I am doing the right thing but also showed me how to do them correctly. This meant mainly reviewing the architecture and code I came up with and telling me when I was doing bad practice and how I should do properly. I think the situations I learned most in my whole studies were when one of these mentors refused a review or help me some higher level problems until the flaws they found in my code weren't fixed. This made me develop a feeling about if the approach I'm taking might be a bad idea and what to do instead that I can most often trust to a certain degree.
The other thing is to go beyond the basic tutorial steps for advanced technology like datastores, queueing systems and such. To me, this works best when I have the option for using them for a certain case that is (or will be) more or less important for production. I think gaining brief information about different frameworks etc. without wasting too much time before you need them is very important to know your options but you only fully understand the characteristics and problems behind them once you put them to an extensive and got hit by their pitfalls.