Be a Mentor
Developing software can’t be learned in a classroom. To be sure, there are plenty of things that you can learn in a classroom that are invaluable. But if you want to be a software engineer, you have to learn by doing.
When I showed up at M.I.T. as a freshman, I had learned computer programming at summer schools. My regular school didn’t have any computers (this was the early 1970′s). The only programs I had ever written were homework assignments, and little toys for myself. I had never worked on, or even read, anything large, or anything that needed to be maintained over time.
I was set to work writing an Emacs in Lisp for the Lisp machine. This was quite a big change! During my time as an undergraduate I wrote a lot of system software for the Lisp machine (and a little for the ITS timesharing system), and I think it was pretty good code, better as the years went by. But when I look back, I marvel that I was able to get going so quickly. I’m a pretty bright person but no genius; I know dozens of people personally who are way smarter than me. I now attribute it to two things. First, I read lots and lots of real software, studying it line by line. Second, I had a great mentor.
After Richard Greenblatt hired me at the M.I.T. Artificial Intelligence lab, my first task was to learn Lisp. I didn’t know how to go about doing that effectively. Greenblatt told me to write a chess program, and I tried that, but I found myself doing low-level array stuff (how does a knight move?) and it was just like programming in Basic again. I had observed that this guy Dave Moon seemed to be one of the very respected hackers (I use the word in its original sense) at the Lab, and although he seemed a bit unapproachable at the time, I asked him how to learn Lisp, and he told me to write a symbolic differentiator. That was a much better approach.
Moon was also working on the Lisp machine software, and there were only a few of us, so he spent considerable time helping me get up to speed. He reviewed all my code and gave me extensive feedback, and he answered all my questions. I read all of his code and did my best to emulate it. We worked very closely, even sometimes sitting at the same console taking turns typing.
For me, it was an apprenticeship. Although the classic “apprentice” that you read about in historical books spends years doing junky, boring work, whereas I was doing the good stuff right away. Although my reasons for personal bias are obvious, I think Dave Moon is one of the dozen best programmers in the world, and I know many others who have similar respect for his depth of understanding as well as coding abilities. To have stumbled upon having him as a mentor is one of the luckiest things that has ever happened to me.
I have tried to “give back” the good fortune that I’ve had. I’ve never had a full-time apprentice, but I have tried to help other hackers whom I’ve worked with. And this year I’m helping to teach a class in Java Distributed Programming at Harvard Extension School, providing several students with the first detailed code reviews they’ve ever had. I’ve also recently submitted my name to an M.I.T. mentoring initiative, volunteering to be a mentor. We’ll see what happens with that.
I’ve learned a lot from many people. Prof. Gerry Sussman at M.I.T. is a superb teacher, who has lots of apprentices. I never apprenticed under him, but I learned a lot from his classes and many personal conversations. Guy Steele and Tom Knight were also particularly influential. And I keep learning from my co-workers.
You don’t have to be a stellar hacker to be a fine mentor. Give younger people an opportunity to do real, production programming. Keep a close eye on their work and help them improve it. Help them learn the lessons that can’t be taught in classrooms: how do real software projects go, how do you work well with other hackers on a team, why it’s so important to strive for simplicity, and so on.
Ideally, find a promising beginner who you’ll be working with for a year or more, someone you’ll enjoy spending a lot of time with, and start mentoring him or her. You don’t have to say anything or make any formal offer. Just do it, and see how it goes.
December 30th, 2007 at 10:29 pm
I agree completely with the sentiments, but observe that it’s surprisingly
difficult to find a willing apprentice. Within my chosen domain (onlne
games) I’ve had a few nibbles of interest, but when confronted with
reality (ie; it ain’t easy) interest evaporates.
January 7th, 2008 at 4:57 pm
Sounds great to me!
What is that MIT mentoring initiative? Is it open for non-MITers in either mentor or apprentice position? How do you apply?
I’m looking for Lisp apprentices…
January 8th, 2008 at 7:59 am
Fare: Unfortunately, I can’t find the mail that I sent to MIT, answering their call for volunteer mentors. They have not gotten back to me (yet). I tried Googling to find it again, but there seem to be a lot of MIT mentoring programs, none of which looks exactly like the one I remember replying to. I’ll post something here when I hear from them again.
January 11th, 2008 at 7:16 pm
I’ve always wanted more mentoring than seemed available. I am not exactly a young man anymore, and I have written code in a production environment. However, I’ve always felt like I was groping around in the dark. Reading helps, but I’ve never had an experienced programmer around to give me feed back. How do I get good mentoring when I am physically isolated from good mentors?
March 6th, 2008 at 4:40 pm
To me, the connotation of being an apprentice is pretty negative. The idea of having a mentor interests me, but I am loath to commit to it.
I’ve almost registered through mentornet a couple of times, but I have always stopped before submitting the last form.
March 7th, 2008 at 1:42 pm
Dan,
I work at Continuing Ed., and I’m a student there as well. I want to thank you for your time and interest (even though I’m not in your class).
I’m an older student, didn’t major in CS (physics), and went to a school where the CS language progression was Basic, PL/1, Assembly – which also gives you an idea of how old I’m am. I’ve done a lot of Perl, am doing some Java now, but don’t program day to day in my job. I’ve looked at Ruby and Python, but I’m interested in Lisp, and can’t find a structured program for learning it outside of MIT’s Open Courseware. Do you know of any Harvard course that can serve as an intro to Lisp?
March 8th, 2008 at 11:22 am
Rich B: Sorry, I don’t know. At ITA Software, where I work, we teach new hires by giving them a copy of “Practical Common Lisp”, by Peter Siebel. It’s an excellent textbook. For other resources about Common Lisp, see my survey paper at http://common-lisp.net/~dlw/LispSurvey.html.
davidhilton: I had all the good parts of being an apprentice, without the traditional bad parts (having to do lots of boring labor and so on). You’re right that the word “apprentice” has some very negative connotations; it’s not the right word for what I’m trying to say here. My own relationships of this kind have always been entirely informal, so there was no commitment involved.
May 13th, 2008 at 3:29 am
Clearly one has to be always learning, but with an (informal) mentor the path should be clearer.
About being an “apprentice”, it shouldn’t have any negative connotation. For me, after being treated like the expert, I would love to be the newbie again… that would mean I have great people with me. (as they say: if you are the best in your workplace, move, because you’ll not learn)
I wish I had a mentor