"How do you learn how to use a code base?" a very simple question from a junior developer that has prompted a lot of thought. To be honest it's been a while since I was last at that point and it's so long ago I can't remember learning a new code base. But my advice was to learn and study the code, run it change it, see where it breaks. Do the same with other open source projects to deliberately learn how to learn code bases. Also do this outside of work, where there isn't the same pressure to deliver or perform.
Apparently that wasn't a great answer as I got the reply, "What if you've got a life?", so a little motivation was in order :-) I've written about this before and point 3 from a W.S. Humphrey quote in my previous blog post on motivation and management was "the training and support to enable the work to be properly done". There are various training courses and sites available for teaching specific skills or technology but not as many on the support side of what is expected and how to get there.
"On Being A Senior Engineer" by Allspaw (an engineer at Etsy) is a very good round up on expectations of what characteristics a senior engineer has. It introduced me to the concept of the "mature engineer" and has a wide range of sources covering cognitive biases, the Dreyfus model in skill acquisition and much more.
Another good resource for a novice developer learning their craft is the References from Habits of a Responsible Programmer by Anders Janmyr. Here he talks about good habits for coding, using tools, managing environments and working in projects.
Between those two posts there is a lot of varied and complex skills to master, where should you start? The BCS has a framework of skills and job roles, but they are a bit vague. How strategists level up - The Undercurrent Skills Maturity Matrix by Clay Parker Jones is a good example of a company looking at this problem and what they need to help guide people in their development, because it is specific to the company and deliberately measurable it seems a lot more useful to me.
Uncle Bob has writtten a blog post on the support and guidance novices need during their development, drawing parallels with other crafts and professions:
This is the way any reasonable trade or craft works. Interns don't do heart surgery upon getting their medical degree. Lawyers don't litigate supreme court cases upon getting their law degree. Electricians don't allow novices to wire up houses without supervision. Plumbers don't allow novices to connect all the water pipes in a house without supervision.
So make sure that you're in a supportive environment with people that will help you learn from your mistakes. A major lesson to learn is that it never works first time the main difference from a novice and an experienced programmer is how you respond to it, that's where the skill lies.
Finally ... make sure you're having fun!
Edit: The 3 Legs of an Architect an excellent blog post on the interaction between Skill, Impact and Leadership as architects gain seniority.