Experienced developers typically have an appreciation of the SOLID (or other) principles - why we have them, how they help, ways of adhering to them etc. This may be as a result of having written poor code in the past, then written good code (where good is adhering to SOLID principles) and seen the tremendous difference it makes, or otherwise had the time and experience to see their value.
How can we begin to instil an appreciation of these things in to apprentice developers?
Currently, at work, I have a group of apprentice developers straight of out college (UK, 18+), with no CS or real programming background. The company has a decent training programme for them to run through, but I feel it lacks the induction to writing high quality code that we would eventually like for them to produce.
My current approach to teaching them about these things is to flag it up in code reviews when I see it. For example, when I see a class (or function) which has more than a single responsibility, I do my best to explain the single responsibility principle (why we have it, how it helps), show them where the multiple responsibilities in their code lay, then talk to them about how they might separate that out.
However, that approach doesn't seem to be sticking. I'm still seeing plenty instances of exactly the same thing I flagged up in code review.
Are there better ways of explaining and giving appreciation of the SOLID principles? Or is this simply something which comes with time and experience?