I never had a programming mentor or a source code review. Overall I think it puts you in a weird place. In companies with lousy developers I am the same or better than their senior developers (I refer to these as senior developers with x years experience). But in companies with great developers I am worse than the junior developers (I refer to the seniors here as senior developers because they can write great software). Probably my problem solving skills, algorithm abilities, and database abilities are at or beyond the level of a typical senior developer (and I have the requisite x years of experience that most recruiters are trying to fit me into a senior developer job....). But my ability to design/architect code is way behind even a good mid level developer. So basically the code I write ends up a mess in the end. It works, but then when you want to go back and change it, you have to put forth a great mental effort and it is very demotivating. While I am excellent at writing code to solve problems, I don't do much to separate UI from business logic from data access logic. And when I make attempts to do this things take too long that I get pushback.
So essentially you need a senior developer to mentor you who is a senior developer because he/she can write great software. Many shops do not design/architect (by design I don't just mean big design up front, I mean refactoring to a design as well) so you really need the right place (essentially they, like all the places I worked as a developer, use the architecture pattern big ball of mud). Basically you get a bunch of giant procedures with tons of if statements to wade through and many times global variables. Object Oriented places are a little better but even then you get objects with a few gigantic methods that you need to wade through. Unfortunately I don't really know how to avoid a ball of mud yet at all... So as I look for my next job I am trying to ask probing questions to figure out if they have a ball of mud or not....
I have both an undergraduate/graduate degree in computer science I can tell you that they do not teach you how to design/architect programs really...just the basics (I already knew the basics, so aside from some advanced algorithms college did not do much on the programming front). And on your home projects generally they are not big enough to really bite you for lack of design/architecture knowledge. Most things I want to do at home can be done in a few lines of Python/Perl. Even a quick GUI to a database is not that hard to do in Python/Perl/Java and mixing the presentation, with sql library calls/etc. is not likely to bite you because the business logic for home stuff tends to be quite simple... I have read the books on design patterns (head first and the gang of four), object oriented design (head first, object thinking, and technically the two design pattern books fit in here too), refactoring, patterns of enterprise architecture, etc. and yet you really need to apply these things under a mentor in order to learn them.
So essentially, if you give me a test asking me about object oriented terms (interface, abstract class, polymorphism, encapsulation, etc..), I'll pass. And yet knowing the terms and doing a good object oriented design are two vastly different things. Now I can even pass design pattern trivia. And yet knowing the patterns and knowing when to use them are two vastly different things.
Overall there seem to be developers who just want to get something done. They do not want to talk about making code better, as long as it is done even if you cut/pasted/cloned entire programs they don't care. Then there are those who care about code being clear, simple, maintainable. They will emphasize writing frameworks and refactoring things. If you need to clone a program to make another similar program they will advocate rewriting the original program to separate out the common part into a library and then using that library in both programs. By not being mentored by one who wants to write clean maintainable code you are missing a lot.
The design/architecture of big systems most architecture books say can only be learned by working with experienced architects. Even the agile books advocate working with someone experienced to pick up agile (agile coaches). Even stuff like unit testing, refactoring, test driven design, etc. would be good to pick up in a team by more experienced people. But if you are always on your own and have not worked with many examples of good code, it is hard to see the value in these things or even to apply it. If you go to management let's try unit testing, they will argue and say no unless you can show a business value. And not having done most of those things professionally it's hard to argue that you are an authority on it. I suspect after having worked with some more experienced developers writing cleaner/more maintainable software there is a better position to argue for some of the practices with management. Also it's about sanity. Working on a big ball of mud is very de-motivating. I'm not sure the situation with clean code, but it would be great not to have to work so hard to figure out what is going on with code and not to have to worry about what every change might break.