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:
This is a companion discussion topic for the original blog entry at: http://www.codinghorror.com/blog/2005/11/software-apprenticeship.html
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 know I am replying to a very old thread but I’ve read some of these articles of software apprenticeship. They are amusing diary entries of a new employee about his apprenticeship in a software firm.
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.
I consider my foray into this field as an apprenticeship, first and foremost, no analogy, no synonyms.