1) The personal quality that I found most helpful was simply a desire to help my friends. Before working as a subject tutor, I was constantly tutoring my friends in various classes, including one friend who I helped with math constantly for 4 consecutive quarters. It was natural to start helping random people through LSS because I had quite a bit of practice. This one is subject specific, but I found it much easier to teach lower level computer science classes since I have mostly mastered the basics. If I had to start college over with the knowledge I have now, I would probably get perfect or near perfect scores in CMPS 5c/5p/5j/10/12a, because the basics are most important in teaching the classes I teach. Being able to live-code is also good, since it makes it easier for tutees to see things on the whiteboard. Plus it’s a good skill to have in general, being able to know what code does by looking at it, rather than have to compile and test it first.
2) While teaching through LSS, I picked up a number of skills. The important thing for computer science (especially when the students are taking a programming class as a GE) is to equate it to math as best as possible. Computer Science isn’t typically taught in high schools, so they walk into class knowing nothing. However, they should have at least some algebra, so finding a way to make it equivalent to something they already understand is key. As far as personal skills, try to make sessions interactive. Often students just walk in and simply state that they know nothing about what’s going on and don’t know where to start (common especially in the first couple weeks). Be interactive, ask questions, make them draw out the program in a few lines of English (i.e. pseudocode) before you write any code. Don’t be afraid to make the person that never has an answer, answer a question. At the very least, someone else in the session will get tired of waiting and blurt it out, and that often starts a degree of group collaboration.
3) I have had 3 problems that I could call biggest difficulties. The first was that my very first student had Asperger’s syndrome. My advice: if LSS doesn’t give you any special training like they didn’t to me, don’t be afraid to run to the DRC and ask questions yourself. The second was the students who just don’t get it. I have had a couple of students who cannot retain anything programming at all, and I still don’t know if it’s because they don’t care or they just don’t have the mentality to pick it up. For those, I find it helps to get them 95% done with their programs and tell them what they have left to do. I don’t want them to be frustrated and give up, but giving them the program minus a couple of required features makes a big difference towards them completing the assignment at all in the first place. Finally, you have the know-it-all students. For example, I have one now who seems to think he’s right on everything and fights me when I tell him he’s wrong, just because he took CMPS 12a before and now he’s in 5p (and completely ignoring the fact that I might know what I’m talking about, because as of this time I’ve taken CMPS 10/12a/12b/20/25/101/109/148/179 and know a thing or two about code). For me, it’s very frustrating to deal with that level of arrogance, especially if your repeated attempts to show him why his way wouldn’t work get nowhere. I finally just resorted to over-complicating it. He tries too hard to make lists in Python work the same as arrays in Java, and it just doesn’t happen. I start writing things in C++ and make him look at the stuff gained by #include to see the closest equivalent structure in another language. That’s a case by case basis though, don’t consider that the catch-all for these types of students.
The most important learning experience I had was when I sat in on a session for CMPS 25. The tutor just asked the student what their assignment required, showed him what menu options could help him find the new features covered in class, and gave a couple suggestions. Granted 3D modeling is very artistic and programming usually isn’t, but I try to stick to that model, make the students tell you what to do and only write things on the board once they have agreed amongst the group that it is correct.
Rather than write a book, here’s just a list of things that I’ve found helpful that weren’t already mentioned above. The biggest thing is passion. I find programming super interesting, and I get really excited talking about it. I had one of my closest friends in a previous session, and she was complaining that I made the material too exciting. She wanted to hate programming, but I made it so rewarding that she was starting to enjoy it, contrary to what she expected to be like during the class. The absolute biggest thing to remember when teaching introductory programming (especially people who are taking it to fill a GE and never take another programming class), make it exciting. I promise your sessions will be so much easier. Another reason I like the introductory classes is that the assignments are easy to do, so I use my prep time to do their homework before I have to teach it, and then use that as a reference. It makes all the difference, or else you’ll get flooded with emails because the stuff you put on the whiteboard and never checked doesn’t work. Now, I find functions are the hardest thing to teach, and just a couple weeks ago I figured out a way to teach it without fail. I write something like this on the whiteboard:
(some random polynomial) 〖2x〗^2-5x+7
#done in python cause it’s what I’m doing most recently, but it’s easy to see if you don’t know python
def quadratic(a, b, c):
r1 = -b + math.sqrt(b * b – 4 * a * c) / (2 * a)
r2 = -b – math.squrt(b * b – 4 * a * c) / (2 * a)
return r1, r2
root1, root2 = quadratic(2, -5, 7)
I find its best to teach functions in this way because it does 2 things: it shows how to write a function for something they already know (and didn’t know was a function), and it shows them both parts: the equation for the function and what it looks like in code, and how to use it. They know the parts from math, so that parallel showing how a function is just a set of instructions to solve a specific problem suddenly makes it click. I haven’t had a single problem since I came up with that. To speed things along, I often go slowly over how to use and format output from print statements early on, but towards the end of the quarter, just write them. Same goes for all IO. If its new, spend a lot of time going over it. But if its week 7 in CMPS 12a, don’t even mention System.out.println(). They should have it by now. I also run into this issue a lot when teaching classes for Patrick Tantalo. He really likes math-heavy programs, using stuff like the Euclidian Algorithm or listing the first n prime numbers. It is key to understand the math, because you will get nowhere teaching the code if they don’t understand the math. That is why, early on in the quarter, I emphasize writing pseudocode for the assignment, so they know how to set it up. I do teach a lot of code, but my biggest thing is to teach the thought process. They may not understand every line you need for a program, which is why you are there. But if they know how to get it done and walk in with pseudocode and maybe the IO stuff done, it puts both of you in a better position for success. My biggest piece of advice, that comes up almost weekly, is that you don’t need to know everything. I personally am a very strong java programmer, but occasionally I’ll come across some code that I don’t know. Sometimes a student will ask me if what will happen if you write something one way or another. I don’t bring my computer to sessions, so I simply respond “try it.” That takes some of the burden off you, and encourages them to do a little bit of guess and check, which helps because let’s be honest, that’s what a lot of learning programming is. It also helps if you do know what the problem is. I once had a student that was working in Python and was wondering why the line:
print(‘some string’, someVariable)
wasn’t working. She was positive that she needed it to look like this:
print(“ ‘some string’, someVariable”)
I knew what it would print, but I told her to try it. Sometimes, experimenting with those little errors can tell you more than the teacher can. That’s all I can think of for advice, so hopefully you can find a few nuggets of wisdom in here to help you out. Best of luck tutoring!