In days bygone, most trades had an apprentice system. You had a master or masters who led a shop, some journeymen who did a lot of the work, and apprentices who learned the trade and swept up all the little (or physically demanding) work no one wanted to do.
I see software as more trade than engineering profession. It has a basis in science, mostly in math, but the day to day is more guided by craft principles than by what I would call engineering. The line is fuzzy, but most of these lines are.
I’ve been building software professionally since 1995. After 20 years doing this, I have some opinions on the state of the craft and things that would make it better. One thing that would have been very helpful way back then was a mentor or a master to show me the way.
I vividly recall looking at Java for the first time, not understanding a lick of what I was looking at, and running to the library to look for books on Object Oriented Programming. The books I found were heavy on theory, but pretty light on actual practice. Figuring out how to make something dance took a lot of time and lot of mistakes. The line I recall was this:
Car car = new Car();
Looking at it now, it reads “create a new instance of a Car on the heap and assign it to the variable car, which is of type Car.” Back then it read “you just said the same thing three times, wtf.” Coming from a mostly Windows / Visual Basic background, even little things like the case-sensitivity were pretty weird. I didn’t know C at that point and had no basis for understanding.
With the Internet, and Stack Overflow especially, figuring out how to do a thing has gotten a lot easier. But there’s a balance. SO makes it easy to find some code that does approximately the thing you want, but it doesn’t proffer understanding.
A mentor would ideally offer both and an ongoing relationship. You can piece things together from SO and the Internet, but it’s no substitute for working with folks who know their craft day-in and day-out. It’s easy to have big holes in understanding.
We’re doing a bit of this through code reviews on wp-calypso, but there’s nothing formal. I’m not sure it needs to be formal, but it might be interesting to try.