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.