November 16, 2005
In Software Training Sucks: Why We Need to Roll it Back 1,000 Years, Rob Walling makes a compelling argument for abandoning traditional training classes in favor of apprenticeships:
[Why not] use the time-tested approach of trades that have been doing it for years? Let's take an electrical apprenticeship as an example: in the United States today, the International Brotherhood of Electrical Workers (I.B.E.W.) trains thousands of electricians every year. They learn through two distinct experiences:
- Attending night school during the week to learn the theory of electricity.
- Working days on a construction site where they're able to gain experience applying the theory to the hands-on construction of a building
His first day on the job an apprentice is paired up with a journeyman (an experienced electrician), who shows him the ropes. The journeyman typically talks the apprentice through a task, demonstrates the task, has the apprentice perform the task, then gives feedback. Listen, watch, do, review.
With software it looks like this: the mentor evaluates the task at hand, be it writing data access code or building a web-based user interface, and holds a white-board discussion with the apprentice (listen). Next, the mentor might write sample code demonstrating a particularly difficult or confusing concept (watch). At this point the mentor sends the mentee off to gain their own experience writing code (do). And finally, the mentor should review the code, providing positive and negative feedback and suggesting improvements (review). Listen, watch, do, review.
[..] the key to any type of apprenticeship is the "do" step. Most software training gives you the listen and watch, but the "do and review" is what inspires growth and advances skills. The beauty of apprenticeship is that it tackles theory and experience in one fell swoop. And it's easier than you think.
Instead of a loose confederation of tribes, maybe we should be cultivating apprentice, journeyman, master relationships in software development.
The mixture of theory by night and real world coding by day is particularly compelling. Maybe this is why I've seen so many talented interns turn into amazing developers – they're working on real business code while getting the computer science courseware theory, too.
Being a good mentor isn't easy, though. I have difficulty mentoring developers who are too far apart from me in skill level. I'm too impatient. If you're putting football players together on a field to scrimmage, don't mix professional players with high school players. The skill disparity is too great for them to actually play football together. And how can they learn without playing the game? Now, if you throw some college football players in the mix, it's on!
Posted by Jeff Atwood
I got some of the ideas from Ken Auer who has written about software apprenticeship.
I've had this thought myself on many occasions. Programming, in this era, is primarily a trade, or perhaps more accurately, an artisanal craft; the idea of 'software engineering' is still more talk that reality, and will be for some time to come.
Ironically, though, one effect of this would be to *increase* the exposure to theory for most programers. The vast majority of coders have little formal training, and for those who have, it mostly focused on specific skills in then-current languages. Those schools which focus on theory tend to produce theorists, not actual practicing programmers. 'Software engineering' generally comes out of a third group, usually managers whose primary expertise is in data processing and database management. These three groups rarely communicate much, leading to a disconnect between how computers are modeled, how programs are designed, and how they are actually written. I'm not certain that an apprenticeship system would bridge this gap, but it certainly would have a better chance of doing so than continuing with an approach that is known not to work.
Excellent thought and I agree. I was lucky enough early on to have people review and analyze my output. I've always enjoyed folks' blogs and when they post their code (such as this one). I've learned a lot from Jeff personally through his code and his attitude toward coding in general. I wish I could work with more seasoned developers so I could learn more from them. I find myself trying training classes (they usually suck) and reading articles/books and trying it on my own. It was nice that Microsoft gave away Visual Studio .NET 2005 and SQL Server 2005 at their launch event. It's nice to have my own licensed copy to try things out (in between work/family/grad school/personal time).
Early on I learnt a lot of my skills and practises on the job, learning from others who had been in the industry far longer than me.
I'll bet that doing the mentoring is a good way to crystalize the journeymen's knowledge and help them grow into being masters too.
This would also help to widen the salary differntial between new and seasoned developers. We all know that this "on the job training" is required and should be factored into the employee's starting salary. However, management seems to want to turn a blind eye toward this nowadays and reduce salaries across the board while axing any formal training procedures.
I think this is substantially the same argument made by Pete McBreen in his "Software Craftsmanship" book.
I wrote a rant about that some time ago when I was working on a typical "dailywtf" project. It kind of goes along the same line, although I think I put it a bit more bluntly. :)
Yes, yes, yes. Without planning it, my training was along these lines. I was working full time as a junior maintenance programmer while going to school almost full-time. I did a lot of school projects that ended up being used at work and I did much of that coding at work. I was getting feedback and real-world experience at work and theory at school. Perfect blend.
When I read this post, I was reminded of a story told by a friend about a co-worker, a developer. The guy had a CS degree from a good college but had no sense about development. He could really only program things he was specifically told to do and didn't do a very good job of that. My friend, not a software person, isn't in the position to mentor or give feedback to this person, so he's going to continue to be a bad programmer. Pretty sad really.
funny that you should have mentioned this....
in germany any job that you don't have to attend university for (doctor, lawyer, etc.) has job training similar to what you described.
except that in germany it's 3 days of work and 2 days of school in the first year, then 4 days work 1 day school in the 2 following years.
personally i think 3 years is too much, and i don't think the schools are trying hard enough to teach things. but then it is quite difficult to teach numerous people with vastly different levels of knowledge.
I've just been reading the same thing, Joel. Actually, just two days ago, one of the developers at work with suggested them as excellent reading for me during my apprenticeship (I'm about two weeks in right now). I'm actually blogging about my experiences, but my stuff's nowhere near as well-written and entertaining as those.
I am doing an internship at Adobe right now, they do a great job of this
I wholly agree with you on the apprenticeship. There is only so much you can learn from a book before having the hands-on experience. Many times experience is much more valuable than book learning.
I think that schools should offer both design and development degrees because there's nothing more frustrating than trying to understand coding when you're a designer. Even though devs will look down at designers and think they're better than them, that doesn't mean they're smarter, it's just that our brains are wired differently. It's hard for instructors too because we all learn differently.