Just another Duke WordPress Sites site

Category: Courses

4 Things I Learned as a Programming Instructor this Summer

As courses are coming to an end, I want to reflect on 4 things that I learned as a programming instructor this summer. 

1. Every Student Deserves the Chance to Explore, Advance, and Succeed in Computer Science

10 years ago, my first Computer Science teacher told me that I wasn’t cut out for the subject, and because of that, I stopped programming altogether. At Duke, I frequently felt overwhelmed by the imposter syndrome how could I compete with my coding prodigy classmates when I just finally gathered the courage to pick up CS again in college? As my passion for CS and education grew over time, I went into this summer with a deeply personal goal: Become that inspiring first instructor who encourages students to further explore the ever-fascinating field. To me, every student deserves the chance to explore, advance, and succeed in CS, no matter their age or background. Learning CS undoubtedly helps students acquire valuable technical skills in our rapidly changing world. But more importantly, if taught right, the subject teaches problem solving, encourages creativity, and inspires innovation. To make sure my students are not discouraged while learning CS, I have done the following throughout my courses to personalize each student’s learning path: 

  • Varying Difficulties for Assignments:

For each assignment, I release two versions: one for those who feel less comfortable and the other for those who feel more comfortable. Students can submit either or both, in which I count the submission with the highest score. That way, struggling students are not overwhelmed and excelling students can still feel challenged by the problem sets. 

  • Small Group Office Hours and Individual Meetings:

As a huge proponent of creating meaningful relationships with students, I enjoyed holding office hours and individual meetings that allowed me to get to know my students better. I also thought it was helpful to be able to walk through problem sets and projects step by step with students. When I first started learning CS, I often felt lost when given a difficult problem and simply told to solve it. In office hours, I am able to show students how I approach a problem from scratch:

  1. Brainstorm program design through charts and graphs 
  2. Apply decomposition and abstraction
  3. Test functions incrementally
  4. Debug using print statements, test cases, and stack traces
  5. Evaluate program design and efficiency

I believe merely introducing these methodologies is not enough. By going through a practical example and voicing my thoughts out as I code out sample solutions, students can apply effective strategies that I use when they feel stuck in their own development cycles. 

2. Analogies are Amazing 

When the vocabulary is technical, students are less likely to trust that they know the answer, even when they actually do. Putting technical ideas into familiar, real-life settings effectively reduces the fear associated with classroom discussion. Thus, when I’m introducing new CS concepts, I make sure to draw on plenty of analogies to simplify abstract concepts and encourage further discussion. Since students are more likely to personally connect with these everyday examples, I find that they have a much easier time comprehending and implementing code later on. 

Here are some examples of how I use real life analogies to explain CS concepts: 

3. Creativity > Memorization

When I first learned CS, I spent most of the time memorizing templates in order to pass tests. Looking back, I didn’t understand the essence of CS. Having syntax and library functions memorized doesn’t automatically make you a great programmer. Great programmers are problem solvers and innovators, and it doesn’t really matter which programming language they use , because languages are just tools after all. With an innovative mindset, we can do so much more identify worthy problems, come up with transformative ideas, and implement tangible solutions. To be truly impactful, we must be innovative first. Thus, I put a lot of emphasis in fostering student creativity when designing my courses. 

  • Open-Ended Homework and Projects:

I structure the homework assignments that I release into two parts: 1. Guided subproblems that have step by step directions for students to follow. 2. Open-ended features that allow students to inject their creativity. For example, for a Java graphics assignment, the open-ended part was to create a mascot that will be optionally entered into a class-wide graphics contest. For a video game project, the open-ended part was to allow students to add background music, sound effects, and additional levels. While I provide some hints for general directions, the specific ideas and their implementations are up to each student to explore. 

4. Learning Never Stops

In my opinion, the best way to learn is by teaching. Here are some ways that I learned as I taught:

  • Being Challenged by the Unfamiliar: 

At times I was challenged to teach a topic that I don’t feel as comfortable teaching. Since it is crucial for a teacher to be able to demonstrate mastery of the topic and answer student questions eloquently, this responsibility motivated me to spend substantial time reviewing before I teach a topic for the first time. For example, when teaching memory, file manipulation, and image filtering, I thought my most familiar languages, Python and Java, abstracted away too many important low level details that illustrated how computer memory works underneath the hood. Therefore, I chose to teach this segment of the course in C, a language that I wasn’t too familiar with. To teach and come up with assignments in C, I spent a tremendous amount of time studying C style, libraries, pointers, and other features through online videos and resources. Having to teach the topic motivated me to learn more efficiently. 

  • Learning from Students 

In class, I try to maintain a passionate tone and ask the right questions as I lecture. Students often reciprocate with active participation and sometimes their responses or follow-up questions help me learn something that I wasn’t aware of before! It’s perfectly normal to not know something even as a teacher. When I don’t have a confident answer to a question, I preface that I am not completely sure, give students my preliminary thoughts, and try to find out the answer through a quick Stack Overflow search together. This way I not only make sure that I don’t spread misinformation, but both my students and I also walk away learning something new. Inside and outside of class, hearing different takes on a concept and seeing diverse code implementations to solve a problem exposed me to a wide range of perspectives, enhancing my own understanding. Every time I teach, I gain a newfound appreciation for the subject through my students. 

I am a lifelong learner passionate about education and technology. Throughout the process teaching programming, I was able to help others gain technology literacy, improve my own knowledge, and create long lasting relationships!

Programming Methodology

I vividly recall my mother sending me to a coding class when I was in middle school. There, I was taught C, a rather low-level and intricate language, especially for beginners. I hated it. The teacher made us memorize templates but never explained why coding related to our daily lives or how we can solve a hands-on problem with programming. In addition, surrounded by classmates who have much more coding experience than me, I was constantly discouraged and eventually refused to take any Computer Science electives all throughout high school. I simply decided CS wasn’t for me. At Duke, I started out as a Biomedical Engineering major, took a CS class just because all my friends were taking it, and to my surprise, realized how fascinating it can be. By the end of sophomore year, I even became a CS major myself! Reflecting on my winding journey, I wish I had a passionate and supportive mentor who could introduce me to the world of programming using interesting examples and fun projects. Now that I have the necessary knowledge and experience to teach introductory-level CS courses, I wanted to give back to my community. That’s why I designed “Programming Methodology”, which I am currently teaching from June to August in Taiwan.

Course Promotional Flyer

In addition, the design of the course is also based on my experience tutoring several high school students in AP Computer Science (AP CS) this past year while in Taiwan. Throughout the tutoring sessions, I noticed that quite a few students were lacking significantly in coding fundamentals and had no idea about good software engineering practices despite having already taken the majority of a one-year AP course at school. When I casually conversed with them, they complained about how the AP CS course at their high schools “taught to the test” and focused heavily on the intricacies of Java syntax instead of teaching a problem solving mindset. When asked about school projects, I vividly recall one of my tutees saying how he had almost zero experience building anything “that actually works” since “the teacher just told us to write down code on paper to prepare for the paper-based AP exam”. He had no clue what an IDE (integrated development environment) was. At this point, I realized that CS education in Taiwan can be improved substantially to encourage more kids to develop an interest in programming and go into Computer Science careers. Traditional Asian education has a stereotype of focusing heavily on memorization instead of creativity. I had a vision to change how coding is taught in Taiwan and allow students to realize that they are capable of innovating.

I went to work. Meeting with my business partner (a Stanford graduate who is also passionate about CS education) every week, we discussed our visions and came up with course material together. Inspired by Stanford’s open-source CS106A course, we spent countless hours creating engaging lecture slides that included interesting analogies to help students digest more abstract programming concepts. From utilizing Karel the Robot’s tasks to teach basic control structures to introducing memory & scope through a tragic “Romeo & Juliet: Java Version story”, we wanted to make coding less daunting and more fun! We agreed that the goal of this course is not to teach students everything about the “Java language”. Instead, the goal is to teach students how to break down a complex problem and implement code using good software practices to boost not only performance, but also readability and reusability. I also envision this course to encourage students who have little to no programming experience and motivate them to further explore the endless possibilities of CS.

Here are some interesting assignments that students will be working on throughout the course!

 

Control a robot (Karel) to complete a set of tasks (such as producing a checkerboard pattern out of any rectangles)

 

Enter a graphics competition with classmates and create a mascot using Java’s Graphics Library

 

Build a customized arcade video game from scratch

I’m super excited about working with diverse students and putting them together in teams to complete innovative projects. Stay tuned for more updates about the course on this blog!