I’ve just had the privilege of teaching an Intro to Computer Science class for the last two Semesters at the University where I work. The class covered basic first semester programming topics, such as functions, loops, conditionals, arrays and hash tables. The class had about 20 students each semester and is designed for majors and non-majors. It is however, the a prerequisite that all majors need before taking pretty much any other course in the department. What a heavy responsibility! What follows is a list of musings about the experience.
1) What a joy watching a group of people, not know how to program a thing on day one, and by the end write good CLI versions of Hangman and Vigenere Ciphers.
2) “The Digital Generation” is a concept touted by people who don’t work with young people. Just because someone has a handle on the UI, doesn’t mean they know *anything* about how it works. How many people know how to drive vs understand the finer points of Multi-port fuel injection? So it is with the under 20 crowd and electronics.
3) Some folks take the Intro to programming course to cover a Math/Quantitative Gen-Ed requirement thinking it’s going to be easy. I try to dispel that notion on the first day and tell them this is a hard class, they’re going to be contorting their minds to work in brand new ways. The class ramps up slowly, so they don’t always believe me right away.
4) We forget how beautifully naive “normal” people are when it comes to how hard it is to write bug-free software. It’s not like writing a book or drawing a picture where there is value in nuanced meaning and imprecision. It’s more like concurrently writing and following a recipe for the most complicated meal you’ve ever cooked/invented and if one ingredient is off by even the most infinitesimal amount, your kitchen explodes and burns to the ground. I think the above is my new favorite analogy.
5) I make them use a central Linux server and write their Python in a plain text editor. I’m sure there are all sorts of people who are making a lot of money by trying to make programming “accessible to the masses” who would tell me that I’m doing the students a great disservice. I’ve looked at a number of these tools and programs and haven’t been impressed with any of them. Software Engineering is hard trying to dupe people into thinking that your magical method will make learning hard stuff super simple is disingenuous at best. The best method to teach *anything* is to start slow with the basics and work your way up. Its the same basic problem with math curricula designed to be easy — the result is kids who can’t think in an organized, methodical way — which is the basis for all science.
6) I had a Senior Art Major, who had put off her Quantitative Gen-Ed requirement until the last possible semester due to dread and ended up being one of the strongest students in the class. I think once she got her head around the problem space, the new language and the linux command prompt, she really dialed into the world of abstractions and patterns that is software development (and art) — it was neat to watch.
7) The coolest feedback I’ve gotten, from multiple students independently was, “This is my hardest class. This is my favorite class.”
8) Even Adjuncts get better offices than Full Time IT staff. I really don’t want to clean out my temporary office space. It’s big, it’s quiet and there is only one person in it — me.
9) I’d love to pursue this path, but it’s hard to get more letters after your name when you’re on good career path in industry.
10) Seeing people get into a bad habit early and being unable to break them of it, is frustrating. “How many times do I have to tell you guys? Don’t ‘break’ out your loops. If you using break, you’re doing it wrong.” If I teach the class again, I’m just going to forbid it. Also exit() to get out a function. From here on, those are worth a zero on graded assignments…For whatever that is worth.