Wednesday, April 29, 2020

Reflection on teaching CS222 in Spring 2020

The most shocking thing about this past semester's CS222 class was how very normal it was. Just after the first iteration of the final project, campus closed down, but the overall arc of the semester was the same as it usually is.

I used the first three weeks to get the students started in Clean Code, TDD, and OOP as I usually do, transitioning into the two-week project from there. The one wrinkle in this plan was that the person teaching the prerequisite course did not introduce any GUI programming, which I didn't know until the third week of the semester or so. I expected them to have some exposure to it, and I thought about pulling back on some of the two-week project requirements. After reviewing them, though, and knowing how the purpose of the two-week project is more about setting them up for the final project than anything else, I decided to keep it as-is.

Their lack of GUI experience did not end up being insurmountable for such a simple project as the two-week project. The bigger impediment was that I started with the assumption that we would use GSON to parse some JSON data, but the JSON data we were getting from Wikipedia was arduous to parse in this way. It wasn't until near the end of the two-week project that I discovered and tinkered with JsonPath and found it much more fit for purpose. I need to remember, if I do a project like this again, to use JsonPath from the beginning.

Right after the two-week project, teams formed around four project ideas: a D&D character generator, a simple card game, and two variations on comparing data about professional NBA basketball players. RPG character creation tools show up periodically in the class, but I never really engaged this group with one of my favorite issues: the philosophy of character generation. Like every other team, they made something with no real soul, as far as I am concerned. It's not that the idea was bad: their killer feature was that the program filled out a PDF for you to print in the end. It's just that I find this kind of thing uninteresting from a design point of view. It was odd to have two separate groups doing NBA data analysis, but this was convenient for sharing tips between teams. The card game team essentially took a drinking game and digitized it, and there's nothing wrong with that.

The coincidence of two NBA teams brings me to another lesson learned. I could have had more interaction with these teams, and fostered more convenient interteam interactions, if I had set up a shared Slack server for all of us. Some of the teams used Discord and some just used text messages, but there was no convenient way for me to either monitor their discussions nor get teams talking to each other. I talked about this a bit in my Gane Studio reflection yesterday, and I think I could adopt a similar kind of idea here.

Once I made the decision to adopt an asynchronous, distributed approach: the teams had to keep working together on their projects, but I did not want to do remote lectures or require "attendance." Normally, what I would do in class during the last six weeks of the semester is set up exercises to help them succeed in the final project; I was able to accomplish these goals through graded assignments rather than in-class exercises. It's not the same, of course, but I feel like it accomplished the goals well enough.

There were corners that I cut, of course. The one I am saddest about is the discussions of design theory and human-centric computing. I would normally do more in-class exercises to help the students think about what it means to be user-centered vs engineer-centered, to reflect on their own processes, and to think about usability. We covered the minimal amount required by the syllabus, but I do feel like this is an area where sometimes students start to gain some insight into professional development or into the nature of design.

One of the things I had kind of forgotten about, or at least had not steeled myself for, was how very disappointing this class can be around week 12. This is the end of the second iteration of the projects, and I tend to be overwhelmed with a sense of confusion. I spend hours typing up feedback for the students and creating video tutorials (some public on Youtube, others privately shared). When I look at what the students submit, it makes me question the whole enterprise. Why bother writing up grading criteria and advice when students are not following it? Still, weeks later, it puzzles me, in a similar way to how students don't understand checklists in CS315.

One idea that's crossed my mind this semester is that I found myself describing the course as "giving students enough rope to hang themselves with." There's something both true and morbid about that. It's a course with a lot of freedom, and irresponsible students will cause themselves trouble—and worse, cause trouble for their teams. However, I don't think you can really address the course's essential questions without this freedom: you cannot explore what it means to be a professional unless you have the freedom to choose to act like one.

My colleague Huseyin Ergin taught the other section of CS222 this semester, in what I think may just be his second time teaching it. He has tried something new this semester, where every Friday he does a tutorial on a different topic, and students complete it with a concrete deliverable. In a sense, he has made every Friday into a lab day. I think this is a great idea, in part because CS222 is the first programming-oriented class without a lab in the curriculum. By putting in these tutorial days, he's not just teaching practical skills: he is helping transition them toward being more independent but without such a steep drop-off. I need to talk to him about how that went, and I'll think about if that's something I want to bring in.

I'm not scheduled to teach CS222 in the Fall. I'll have three different courses, so I feel like I have to once again abandon this course to memory. The blog is useful for this process, since I can come back and read these notes next time I teach it. However, it is a bit frustrating to think about improving a course but then have to just set it aside.

Those are my notes from the semester. The students are taking their final exams tomorrow, so I can post an addendum if there are any surprises. Otherwise, it's time for me to transition to thinking about what I'm doing this Summer and how I'll prepare for Fall.

5 comments:

  1. Can you elaborate on the problem with Gson that you made you switch to JsonPath? I've been using Gson as a default, and I'm curious what dangers lie ahead.

    ReplyDelete
    Replies
    1. Hi Chris! Yes, happy to do so.

      When you make a query to wikipedia for JSON data, one of the keys that it gives you is the page identification number. This is a generated number, and so you cannot match it with automatic binding. As a result, you have to take a node-by-node traversal approach to get around it. I talk through this approach in this video: https://www.youtube.com/watch?v=_kHKp_CuVQI. To be clear, if I *could* use the automatic binding feature, GSON would be the right tool for the job, but the nature of the data prevents it.

      JsonPath makes it relatively easy to specify a path "around" that key: it becomes hidden from the query because you know the names of the children you want.

      I hope that helps!

      Also, that post about exploring seven-digit numbers you made the other day was fantastic!

      Delete
    2. Thanks, I see now. The video was helpful. I wish I felt that lucid when recording!

      Delete
    3. Thanks! It's rarely done right in the first take or without editing ;)

      Delete
  2. This comment has been removed by the author.

    ReplyDelete