I taught 4 semesters of CPSC 110 (Computation, Programs, and Programming), the introductory course to programming concepts at the University of British Columbia between September 2016 and December 2018.
As of January 2019, I decided to try my hand at TAing for an upper-level course instead, and since I enjoyed CPSC 304 (Introduction to Relational Databases), this was my first choice. I'm really excited to solidify my understanding of relational databases by sharing my knowledge and experience with students!
This course is a required course for all students interested in majoring in Computer Science and related degrees, and remains one of the most popular courses at the university. In the 2018-19 school year, 1607 students were registered in the course, with many more on waitlists. For perspective, around 12000 students were accepted to an undergraduate program that year.
Being a Teaching Assistant for this course is an experience unlike any other: not only is the number of students taking the course each year enormous, it also allowed me to connect with students from diverse backgrounds, from experienced programmers to those without any knowledge of tech. At UBC, you're required to take CPSC 110 before applying to major in Computer Science, so it was interesting working with students who are still gauging their interests and abilities in computer science.
The course itself covers the core concepts of computer science, using Racket, a general-purpose programming language in the Lisp-Scheme family. Racket is also used in the upper level CPSC 311 (Programming Languages), since its macro facilities make it simple to write language parsers and interpreters.
Topics covered include:
The lecture portions, which in-class students watch on their own time, can be found for free as a two-part MOOC on edX (part 1 & part 2).
During my time as a teaching assistant for CPSC 110, I learned some valuable lessons about education, and thought a lot about ways to teach effectively.
Not all teaching methods will work for students. It's very important to understand and acknowledge individual learning styles, and do your best to cater to them.
Because of the uncommon choice of language for an introductory CS class, even students with prior programming experience struggled to grasp the concepts when put into a functional programming paradigm. However, I noticed that this seemed to level the playing field between programming beginners and veterans in terms of succeeding in the course.
To cater to both types of students, I made sure to observe the vocabulary students would use when describing their solutions during labs, and further probe to understand their background. For example, many students would use terms like "variables", "parameters", or "declare" in the beginning if they had prior experience.
It's important as a TA to be able to gauge a student's knowledge quickly, so explanations can be tailored to a specific student. With experienced students, I focussed on drawing parallels between Racket and the language they've used before. With beginners, I made sure to use analogies to real-life situations, and explain pictorially (I find that those are helpful for understanding program execution).
In my TA evaluations, many students have given me good feedback on using diagrams to explain concepts; by using diagrams and explaining verbally while drawing and writing down key concepts, this appeals to both auditory and visual learners. After explaining the main ideas, I let my students experiment with the new approach on their own as I move on to the next students.
Especially in Computer Science, imposter syndrome is prominent in school, academia, and industry. There are always students who seem to be "naturals" at Computer Science - they stay ahead of course material, finish three-hour labs an hour early, have personal projects, and just seem to get CS.
It can be very discouraging for students to struggle for a long time, but witness their peer complete the same work in minutes. When you're in that situation, it's hard to recognize that their peer may have reviewed the material beforehand, may have had prior experience, may have taken classes on the topic, or a million other factors.
Imposter syndrome comes with feeling like you'll never be as good as these "CS gods", no matter how much work you put in. This greatly affects a person's ability to learn: for fear of being wrong, you ask less questions, stop experimenting, and become afraid to try new things. And this is really really really bad – these are the things learners must do to grow and improve.
As a TA, it was my job to make all students feel emotionally and psychologically safe. I admit that I, too, have struggled with imposter syndrome on many occasions, and still do. However, this puts me in a position to empathize and offer solutions that have worked in my experience. Students have to feel empowered to take risks, and understand that failure is okay.
When asking questions, I noticed that many students would become nervous when errors appeared while showing me, or if something didn't work as they intended. I emphasize that these are totally normal. Sometimes, I tell them about all the compile errors I ran into on my assignment the other day, and laugh along with them. Then, I direct their attention to reading the error together with them, and working out possible solutions by dissecting the messages.
By doing so, I put the focus on possible solutions instead of their capabilities or skills. I make sure they understand that errors and mistakes are totally normal (and more common than they think!) so that they're never afraid to just keep trying.
Racket and CPSC 110 are useless. You don't use these in real life.
I've heard this said so many times, often in the first couple labs. It's true that Racket isn't used in most software shops, but I've used the concepts I learned in this class more times than I can count. My passion to share this has brought me to always be on the lookout for opportunities to talk about the importance of 110 concepts.
When students see a TA being enthusiastic, it's easier for them to also gain an interest in the topic. If the TA seems bored, they'll think less of the topic and possibly put less effort into learning. Professors are may seem unapproachable to many students: their time is limited, with how large the classes are, and they may also seem intimidating. Teaching Assistants are very likely the most common interaction a student has with the course, so it's very important that a TA conveys interest in the subject they are teaching.
To be a great teacher, you have to have genuine passion. Passion is contagious!
When I first starting teaching, I was afraid to lose credibility by not having all the answers, but further along, I realize that sometimes, it's better to be honest and just admit that you don't know, but you'll get back to them. Obviously, you can't always not have the answers, but it's okay to show vulnerability once in a while.
By admitting that you aren't perfect and also make mistakes, we build a stronger relationship with the student. And it's also a great reminder that as teachers, we are also still learners.
In teaching others, I've also grown immensely.
Being able to write code takes a set of skills, but explaining it to another is a different skillset as well. Communication is an essential part of engineering; as part of a team, I'm always required to listen and understand others, as well as present my ideas and contributions.
I've also improved my ability to read and understand others' code – a necessary part of working in any team. Dissecting another person's implementation has actually taught me different approaches to problems.
Being a teaching assistant is difficult and frustrating at times, but the lessons learned from doing so and the relationships I've built over the years make it so worth it.
I'm looking forward to new approaches as a Teaching Assistant for CPSC 304, as well as using my experiences to better student education. Onwards to more growth and learning!
Thanks for reading! If you enjoyed this, feel free to connect with me via