As we approach the end of Spring 2022 semester,
I am already prepping for Summer 2022.
I will be teaching
CS 134: Programming Fundamentals
CS 200: Concepts of Programming Algorithms Using C++
I always like to try to improve my classes each semester and try new things to see if I can teach C++ more effectively, and I have some ideas for the classes I'm teaching in the summer.
- I want to have all the assignments prepped before the semester begins. I may do videos during the semester, but I want to have the assignments up and ready.
- I'm replacing quizzes with "Concept Introduction" assignments, which still use the Canvas quiz builder, but are more for introducing concepts and asking questions to make sure they understand.
- For CS134 and CS200 we're going to use repl.it for programming. In the past, I've had my CS200 students using Visual Studio or Code::Blocks as well as git.
- For CS200 we're going to first focus on writing command line programs that take in arguments.
- For both classes we're going to focus on storing and working with data before we get into control flow
So I'm replacing very traditional style quizzes with "Concept Introductions" using
Canvas' new quiz system and the "Stimulus" type to create text/images to go
along with a set of questions. I'm also using this with the "one question at a time"
view, but allowing students to back track. They can also take the assignment
multiple times to get a higher score, as a way to help them reinforce basic concepts.
What I'm hoping this does is basically give them a concise overview of what they would be reading in the book or watching in the lectures, but have a way that I can verify that they actually went through that information. Additionally, I'm adding questions based around common pitfalls so that hopefully they'll see the errors early on and I can reduce the amount of students getting the same common error and being confused.
repl.it and writing command line programs
Previously in my CS200 classes I've had students using Visual Studio or
Code::Blocks or, if on a mac, XCode and also utilizing git to back up and
submit their work to me. For this summer, I'm writing new exercises to
utilize the repl.it C++ editor, and also teaching them a bit about the shell
and writing command line programs.
I'm doing this first off to emphasize that a lot of programming is taking inputs, doing some processing, and generating some outputs. I think that this idea gets lost when students get too bogged down in designing a looping program that immitates how software we use these days work. By creating small programs that take in arguments, we are seeing that the program needs information as input to operate off of, and there can be some expected output or result.
Additionally, this will prepare them to see git in CS235 or CS250, and understand that git is a command line program and that we pass arguments into the git program like
Data first, control flow later
My current plan for my CS200 summer schedule is this:
- Unit 0: Welcome and setup
- Unit 1: Computer basics and history
- Unit 2: C++ basics (main, variables, data types, cin, cout)
- Unit 3: Storing data in structs, saving data to text files
- Unit 4: Storing data in arrays, loading text files
- Unit 5: Pointers and memory
- Unit 6: The INs and OUTs of functions
- Unit 7: Classes and object oriented programming
- Unit 8: Putting it all together
I don't have a dedicated section to control flow. Instead, I'm going to introduce bits here and there as we need them, and focus more heavily on building a complete program during Unit 8.
I'm doing this because I felt like students were getting too bogged down
and getting confused over how to structure a program itself, but I want
them to be focusing on the features of the language this early in.
When they take CS 235: Object-Oriented Programming Using C++,
we can focus more on the architecture of a piece of software at that point.
At this point in the class, I want to make sure they're comfortable with the idea of storing data in arrays and iterating over arrays, as well as the idea of storing like-data in structs early on.
A big hurdle currently is that in my classes students begin with variables, and then continue using their arrays like variables like this:
cout << "Movie 0: " << movieTitles << endl; cout << "Movie 1: " << movieTitles << endl; cout << "Movie 2: " << movieTitles << endl;
And sure, it can be useful to see the wrong way of doing something before seeing the right way, but it seems like if they get into the habit of doing it wrong at first there is difficulty pulling them out of that mindset. So, we'll see how this goes.
Testing and solving challenges
I've already had my classes focus on testing and writing test cases
for the past few semesters, with my CS250 utilizing unit tests to verify
the students' data structures work properly.
By focusing more on the "inputs" and "outputs" of a program, I'm hoping that
students will be able to see a problem and think of it in terms of the inputs
and outputs, and be able to effectively create test cases - BEFORE implementing
the program itself.
From there, I'm hoping to be able to have students work on challenging programs, but the challenge won't be from designing a program and menu and that structure, the challenge will be solving small problems that are essentially in a vacuum - or modular, like how a function should be designed. With a smaller overall program, students can test purely based on the inputs of the program without having to repeatedly navigate menus and re-enter data and go through a multi-step process to validate their work. That can come later on, like in CS235 (Fall semester goal: Really make them use the debugging tools!!)
Students being able to take a problem and then redefine it in terms of inputs and expected outputs will also serve them beyond my classes - it is a useful skill for any new challenge and during job interviews. I don't want them to see a challenge and feel intimidated, I want them to have a process they can rely on to begin analyzing the issues and developing ideas for how to approach it.
CS 134: Programming Fundamentals
I am planning on taking a similar approach with CS134, except not writing
programs with command line arguments... Or maybe I will, who knows?
But we're going to be working with Python in replit and still first
focusing on storing data before we get into heavy control flow.
I'm also thinking of having students work with some free APIs to see how modern software operates. Python has some great libraries that are easy to get started with, and I wish C++ had something built-in to do the same because I would love to show my CS235 students APIs. (I do teach my students to link a 3rd party library, but that's an optional assignment at the end of the semester. It's optional because I just can't help Mac students with this.)
Anyway, these are my big ideas for Summer 2022. I'm approaching this as a "new season" of CS 200,
and then my intention is to stick with the content throughout the next year and only make some
tweaks for quality and clarity. I end up redoing so much of my own work each semester, whether
that's adding a lot more documentation and testing to my courses, to changing to a
"Mastery, Satisfactory, Not Yet, Unassessable" style rubric
inspired by the Alternative Grading episodes of CD Ed Postcast.
At the same time, I need to give myself more of a break. I spent a ton of time on my class prep and teaching work, and I always want to make things better, clearer, more efficient, etc. but I don't need to be perfect... I need to pace myself lol.