Look at the various things that go on in the world of programming:
- Pair programming
- Design and code reviews
- People self-learning the skills needed
The list can go on as well.
A lot of these translate into the same type of behaviors that occur in the trades like electrician, mechanic and carpenter. In all of these jobs you can get all the formal training you want, but a lot of the skills needed come from the on-the-job learning that you get over years of working.
Of course you have some positions that need a lot of the computer science aspect to make things work, much like designing an engine requires a lot of the technical book-learning. Most of the time though it’s just feeling your way through the problem.
Other jobs you go through training to learn a specific skill. In programming (and many of the other trades) you learn how to tackle problems in a very general way. Like other jobs, there are typically many different ways of approaching a problem.
The same way that the trades work through apprentice, journeyman and master in programming you go intern, programmer, architect.