Recently, I’ve been thinking about how I pick up new programming skills. There is a fairly substantial body of empirical work on how novices learn to program, but fairly little stuff out there that I’ve seen (please correct me, if I’m wrong) on how intermediate or expert programmers pick up new languages, tools, etc. As I thought about it more, I realized that for me the hardest part of learning some new set of programming skills is getting to the “Hello World” — just getting the basic functionality of the toolkit, language, environment, library, etc. to work. Once I’m there, it’s just a matter of trudging through the documentation and forums to get it to do what I want, this part is fun, but getting to the “Hello World” is frequently just frustrating.
Here’s the general process that seems to happen for me:
- I think, “Wow, this toolkit / language / environment / plugin seem like a great solution to the current problem I’m facing. I’m going to try it out!”
- I go to the new toolkit / language / environment / plugin page to download and follow instructions to install.
- I try to run the most basic thing in context of the problem that I’m facing (essentially, “Hello World”) and I immediately have problems with some sort of dependencies, environment issues, weird errors with vague description, etc.
- I Google and madly scour the forums to try address said problem, usually coming up with a set of 5 or more possible solutions. Then either, (1) one of these solutions works, (2) I get stuck but I find somebody to help fix it, or (3) I decide that it’s not worth the pain and just solve the initial problem with some suboptimal work-around.
I am getting a bit better about this over time, but it’s still a big problem for me. I was definitely not taught about this process in classes, where the teacher or TA essentially sets everything up and help troubleshoot. Overall, this process can take anywhere between 1 day and 2 weeks — so it’s not a trivial time expenditure and frequently discourages me from trying new things. However, it wasn’t until I started doing this (sometime around the beginning of senior-level as an undergrad) that I really began to feel like a real programmer. Up until that point, I felt like I was playing in a sandbox — I could do the things I was taught to do, but I couldn’t really get creative with Computer Science.
So, I’d like to propose three ideas for the future:
- Investigating barriers to picking up new programming skills for intermediate and expert programmers. I think I’m not the only one who struggles with the above process. I’d love to observe and interview programmers as they are setting up a new tool or get started with a new language. I think there’s a lot to be gained by understanding the challenges faced before getting “Hello World” to work.
- Creating classes that focus on building competences around quickly picking up new tools / languages / environments / plugins. At Georgia Tech, we have “Build Anything” classes that focus on rapid prototyping of physical devices. I think it would be useful to have a “Code Anything” class sometime around Sophomore or Junior year of undergrad. I think it would help build and cement the students’ identities as programmers and would support their independent exploration in the future.
- Making the process of getting started easier. Of course, I can encourage toolkit creators to do usability studies of the setup process until I’m blue in the face — it’s probably not going to happen. But, what about an App-store of sorts for plugins / toolkits / libraries / etc. for common IDEs? I’ve never had a problem installing an App on my iPhone and getting it to run (and my friends with Androids are pretty happy with their Marketplace experiences as well). What would happen if there was a similar vetting process for creating toolkits / plugins / language environments / etc. for programmers? I don’t know how hard it would be to do this, but surely there are some steps we can take in this direction?
I acknowledge that my approach here is completely naive. I hope that you guys can share your experiences and your knowledge of previous approaches to this general topic.
Great Post. I have had same issues and one very recently. IMHO, trending programming languages like Javascript, jquery, PhP etc… are trying best to minimize dependencies. The community around these programming languages are making improvements to the IDE to support learning at any level. Some examples are live coding, code complete, dependency warnings etc.
[Something in the lines of this: http://www.youtube.com/watch?v=PUv66718DII, This also reminds me of some work done by Ben Shneiderman (placeholder for citation :P) ]
Secondly, I have personally found teaching design patterns first to myself [and to Gatech undergrads as their unfortunate TA] very useful in understanding and even while libraries which can be adopted by others. Some of the recent promising trends are towards the Model-View-Control (MVC) framework which seems to take away lots of pain in learning and adapting code. I would definitely recommend looking into them if interested.
As a programmer (sic) , lots of issues that you addressed are indeed true and AFAIK there are some efforts trying to solve that (eg: GitHub, Wikis, Stackoverflow etc.. ) but definitely there is lot of opportunities and scope for improvement.
Just my 2 coconuts worth 😛
Thanks, Nachi. I think that knowing how to program (e.g., design patterns, things like MVC) are helpful, but usually only after you get through the “Hello World” pains. All the design patterns in the world are not going to help you if you can’t get your program past the import statement (or some low-level equivalent).
I appreciate the effort of some languages to reduce dependencies, but I think that also reduces how frequently you can add new features to that language. And, I actually think that Javascript is a better example of a language that has a BILLION different libraries, kit, and tools (e.g., http://javascriptlibraries.com/). I think they encourage rather than discourage this. The question is, how painful is it to get any given one of these working for something you’re trying to do?
Hi Lana,
There’s not been a lot of work in teaching new languages to intermediate/advanced programmers. John Anderson and Mark Singley explored some of these themes at CMU when they taught Lisp, Prolog, and Pascal and explored how to make that most efficient. Design patterns may help with intermediate/advanced students (though probably not with beginners).
Mike McCracken had a goal of getting students to “code without fear” in GT’s undergrad program. I don’t think it really worked. I’m not convinced that many of our frosh really learn to program all that well.
I’m interested in this question from another direction. Work by Caroline Simard when she was at the Anita Borg Institute found that mid-level female technical managers were challenged to progress in their company, in part, because they didn’t keep updating their technical skills. Women still tend to bear the brunt of family responsibilities, and mid-level male technical managers spend that additional time learning new technical skill sets. At the executive level, technical ability is less critical. At mid-level, it still matters a lot. If you want a team to move your platform to Ruby on Rails, do you want the technical manager who has learned Ruby and Rails, or one who hasn’t yet? So there’s an interesting challenge: How can you make most efficient learning of new technical skills, where you can assume significant technical proficiency already? Can we fit the learning into the 20-30 minute chunks of time between putting kids to bed and collapsing asleep yourself?
Interesting questions, Lana!
Cheers,
Mark
Thanks for the insight, Mark. That actually makes me think of another interesting question. What KIND of knowledge of a new language, tool, etc. is most useful for different positions on a team? Obviously, if you are the lead programmer, you need to know the language inside-and-out and have had a lot of practice using it. But, if you’re a mid-level manager, maybe you only need a general understanding of the opportunities and challenges the language provides and be able to know how to best support those that actually use it.
Actually, that kind of makes me thing of the work you’re doing in helping high school teachers learn to program well enough to teach it but without necessarily spending hours in front of an IDE each night…