Teaching high school students Computer Science (part 3)

My final day teaching

Posted on 2017-06-01

Abstract

I decided to spend an extra day to help wrap up the course and give some advice to students as to how to solidify their knowledge of Computer Science and Python, whether it's through side projects, revisiting the course material on my course website, or through learning how to ask the right questions when they're doing one of the two.

Key Takeaways

Some of the things that I had told boiled down to the following:

  1. Comforting them if they feel discouraged by the difficulty of programming
  2. The importance of problem-solving skills over memorizing syntax
  3. Time management and To-Do lists are key to both staying motivated and clear-headed
  4. Coding helps you understand CS theory and CS helps you understand coding
  5. How to determine the feasibility of a project by looking for libraries and documentation

"I know the basics of Python but I don't really know how to code yet."

I let students know that one's first language is always their most difficult and it requires a lot of knowledge in different areas to get started. A lot of courses, MOOCs in particular, are very helpful for learning the basic syntax of a language, but not so much learning where to go from there, how to bridge the gap between "Intro to Programming" and "Intro to Data Structures and Algorithms", which marks only the beginning of the steepening learning curve that many Computer Science programs (CSE at UConn included) have to offer.

I chose to have them learn Python because the syntax is very clear and emphasizes the importance of clean, readable code. In doing so, I was able to help alleviate the problem of balancing between learning Computer Science, problem-solving, etc, and fighting with their first language just to iterate over a list, for example.
They were able to focus on problem-solving in plain-English before translating their solution to code, allowing them to tackle their learning one thing at a time.

Using a calendar and a to-do list makes time-management "Infomagical"

I fell in love with using digital calendars and to-do lists as a way of guiding my learning, clearing my mind, and making sure I could finish my work in time to catch a breather. I first decided to do so when I started listening to Manoush Zomorodi's NPR podcast Note to Self on my December 2015 trip to Cambodia. She had just announced an experimental program called Infomagical, which was intended to help people clear their minds and feel more productive and at ease while doing so.

I feel that my motivation to do better in my CSE classes skyrocketed since then, and that my mind didn't feel as cloudy when I tried to solve new problems. By using lists to keep myself from losing brainpower from trying to remember things and solve problems at the same time, I felt liberated. It felt like if I put in the time and effort, my work would pay off.

Coding helps you understand CS theory, and CS theory helps you understand coding.

I spent the first 3/5 of my undergraduate career upset that the theory I was learning wasn't making me a better software developer. The problems seemed contrived and I couldn't wrap my head around them. It wasn't until I started doing more side projects that I started to see when I would use Set Theory, Finite State Automata, and Lambda Calculus (my roommate thought I had finally gone insane, looking at lambdas and parentheses scrawled all over my notebook's pages).

It was only when I started doing side projects that I came across problems that became easier with an understanding of CS theory. Set theory helped me reason about the algorithms I was designing and also to write SQL queries. Finite State Automata helped me better understand lexical analysis when I took a Compilers course as well as how to write better regular expressions. Lambda Calulus helped me better understand SML and functional programming, which sparked my interest in Coconut, a functional programming superset of Python that supports tail-call optimization and pattern-matching.
It even makes me want to learn Haskell to better solidify my knowledge of functional programming and thereby improve my Python coding.

Side projects gave me an appreciation and understanding of CS theory that make me want to learn more and become better acquainted with the material I learned in college. At first I didn't even know where to start when it came to doing side projects because we spent so little time on software development, learning how to find libraries, etc. Doing a lot of different tutorials and breaking down the steps such that you can apply the lessons in a totally different project did wonders for eliminating the Imposter Syndrome caused by a sharp jump from "Intro to Programming" and "Intro to Algorithms".

What would I have done differently?

Looking back, I would have preferred to have made this course longer, such that I could spread out the material more. I think that the material moved too quickly for students even though I thought I kept the exercises simpler. The students were more tripped up on the syntax, and attempting to access files relative paths that they wouldn't be able to access. All in all, students that really were interested in learning programming put in the extra effort needed to understand the exercises. I believe that given more time and more guidance, they would feel more confident in their abilities.

Final Thoughts

I start my new position as a "Propulsion System Analyst" or a software developer at PSI on Monday. I still have a lot to learn, but I'm confident that I'll be able to and I want to do what I can to help my peers build their skills as well. I hope to be able to return to Fairfield Warde for another course, whether it's a repeat of this course, or a project-oriented course that uses all the skills built in this one.