Monday, January 24, 2022

Book Recommendations for Computer Science Goodness


A student emailed me the other day to ask about what books I would recommend they read for some "computer science goodness." They asked about books that I enjoyed and books that shook up how I thought about the field. I could have sworn I wrote a blog post about this in the past. Turns out, I wrote a post in 2016 about books that influenced my teaching practice. I was a bit surprised to find, on searching my blog, that I also wrote a post in 2011 about books that influenced my teaching practice. It's hard to keep these posts DRY.

My list here has some overlap with those other two lists, since a good book will often be multifaceted. Here's a quick list of titles that come to mind with very brief descriptions of why I like them. I've included links to sources or storefronts for reference; I don't make any commission on these. Since I don't have any other real ordering to the recommendations, I've provided them in alphabetical order by author.

  • Alistair Cockburn. Agile Software Development: The Cooperative Game. This book lays out an operationalized definition of what software development is: a cooperative game of invention and communication. It helped me think more specifically about the intersection of my knowledge of software development and game development. It also gives a good grounding in what "agility" means beyond buzzwords.
  • Allen Holub. Holub on Patterns: Learning Design Patterns by Looking at Code. While the original GoF book is undeniably influential, this is my favorite book on design patterns, since it shows how they occur in practice: nested within each other and inside of meaningful contexts. The book is showing its age, and I'd love to see a second edition that uses more modern language features. That said, the first chapter is one of the most brilliant essays on the meaning of OOP.
  • Andy Hunt and Dave Thomas. The Pragmatic Programmer. This is a classic book of good, practical, generally applicable advice for writing high-quality software.
  • Robert C. Martin. Clean Code. Amazing book about how to write high-quality software. The student who emailed me should have already read this, but I'm including it here for completeness' sake.
  • Peter Seibel. Practical Common Lisp. Like a lot of people, I was intrigued by Lisp when I learned it—and when I taught it! But I never quite understood how you would use it to build something substantial, something that wasn't just a classroom toy. This book explains not only that, but why macros and metaprogramming really are the cat's pajamas.

Tuesday, January 18, 2022

Writing tips are a surprise (CS222 Spring 2022 Assignment 0 Notes)

As I mentioned in my previous post, I rearranged the first three weeks of CS222 assigned work into six assignments. Part of Assignment 0 involved reading and responding to portions of the course plan. I did this with a quiz in the past, but now it was rolled into a larger "Assignment." I still feel like quizzing students over the course plan represents further infantilization of college students, I also can't deny that I've had less confusion around the policies in the course plan since grading student work about it.

I have spent significant effort over the years curating my Tips page, but I had never previously required students to ever engage with it. Sure, I encouraged and cajoled, but there was never anything graded that came explicitly and solely from that page. I changed that this year by adding a question to Assignment 0 asking students, "What surprised you on the Tips page?" 

There were a range of answers. A few students aid that while it was good advice, nothing there surprised them. Others mentioned that the presence of the page at all, or its attention to writing, were surprises. A few students referenced the checklists, indicating that they were thinking ahead to how they will know if they are doing what is expected in the future.

My favorite responses were those that referenced George Orwell's writing tips. The tips page includes a quotation from George Orwell's 1946 essay, "Politics and the English Language." It is a masterful essay, and you should take a few minutes to read it. While only a few students referenced it as surprising, one student was particularly clear* in their response, writing, "George Orwell's tips surprised me the most because they are just about the opposite of what I learned in probably every English class I've ever taken." In my feedback to this student, I indicated that I would love to hear more about this, but that's the kind of thing that rarely receives notice from students, much less a response. Perhaps I can use it to engage my classes in person, however, in those few awkward minutes between when I get myself set up and when the meeting begins.

* My first draft used the phrase, "hit the nail on the head," but then I realized that this violates Orwell's first rule.

Tuesday, January 4, 2022

Winter Course Revisions 2022: CS222 Advanced Programming

Regular readers may recall that, in the summer months, I write a series of Summer Course Revision posts. Here is a quick and uncommon Winter Course Revision post. A few days ago, I shared a reflection about Fall's CS222 class and pointed out some places to tighten the bolts. Over the last two days, I've pulled together some revisions to CS222 for Spring's two sections that I will be teaching. You can find some of the changes already on the course site, but others will wait until the course is underway.

The lists of activities have been reorganized into numbered assignments. Many students last semester used ad hoc numbering in their submissions. This made me realize that the activities really didn't have any number or name, which made them hard to reference. Organizing the first three week's activities into seven distinct assignments also means that it's clearer to students what is eligible to be resubmitted: rather than refer ambiguously to "non-quiz activities," I can simply reference "assignments."

The two first-week quizzes have been rolled into existing assignments. Realistically, I don't expect anyone to resubmit these assignments, so that's not an issue. What is an issue is that Canvas' quiz-grading interface is awful, especially if you mix objective and short-answer questions. That problem can be avoided by just having students submit traditional assignments instead.

The two-week project, while not yet posted, will go back to its original form of having the same set of requirements for the whole two weeks. I've experimented with a colleague's idea of changing requirements halfway through, specifically of adding a GUI to a console application, but I think I want to instead emphasize making simple GUI applications. These are more motivating to the students, and you can still talk about model-view separation.

I added two achievements. One is Tool-Maker, which is awarded for writing a program that computes CS222 course grades. Some students worry about this, and this achievement gives me a place to point them that should serve two purposes: satisfying their obsession and giving them practice. The other achievement is one with a tongue-in-cheek name, Venerator of Elders. This can be earned during the final project by a CS222 team having a capstone team help with acceptance testing. I had a team last semester do this, for what I think was the first time, and the results were amazing: the upperclassmen had sympathy for the CS222 students but also knew how to pound on their software to show them where it needed fixing up. I hope that codifying this into a relatively easy achievement will make it happen more often.

I also tweaked some other achievements to let them earn more than the usual number of stars. Previously, an achievement like Jammer (which is earned by participating in a game jam or hackathon) said it could earn an extra star, but that's not equitable with respect to a student's investment in time: participating in a game jam takes much more time than, for example, interviewing a capstone team or going to the career fair. Now, Jammer and Open-Minded both clarify that they can earn significantly more stars—double or more. I don't know if this will encourage more students to, say, participate in Global Game Jam, but at least it will adequately reward those students who do.

For the final project, I plan to have the students submit weekly status reports, similarly to how I handled them in the back half of CS315. I have not yet decided if I want to replace the self- and peer-evaluation system with something that is zero sum.

I decided not to switch to specifications grading. I may reconsider this over the summer, but my inclination keeps taking me back to the fact that I have thought a lot about grading already, and triage grading has great advantages, despite not being trendy. Indeed, maybe not being trendy is an advantage when it comes to education.

Last Spring, we had no Spring Break, which gave us an extra week between semesters. That was nice. I am feeling fairly well rested from the break, although there are several things on my to-do list that didn't get close to done. I started but didn't finish an experimental game, and I didn't pick up my paints at all. Still, I can feel the semester coming, and I'm eager to meet my students and see my colleagues again.

Sunday, January 2, 2022

The Games of 2021

Another great annual tradition here in blogland is reflecting on the board games I played in the previous year. I am a little later to the tradition than usual, in part because yesterday, I spent the day in a family game jam. It seems like a January 1st game jam has got to be a good way to start the year. The result is Salvage Scavenger, our first game in 3D and our first project since last April. As usual, the code is available online if you'd like to check it out.

But enough about that! Back to the games.

Last year, I logged 478 plays, which is almost 50 fewer than the previous year. This was spread over 87 different games, which is also fewer than last year. There are a few factors here that I think contributed to the downward trend. One of them is, of course, the continued pandemic, which has hindered the ability to get together with both friends and family to play games. This particularly affects the variety of games, since it's often playing with friends or distant relatives that allows me to try something new. As for the number of plays, I can't help but think wistfully about how just a few years ago, we would play board games basically every night. Now, my oldest son is involved in community activities, gone at least twice a week at meetings. My youngest two sons have a later bedtime, which means that by the time they are processed, there's not really time or energy to get into anything serious with my wife and older sons. We're stuck playing during daytime hours, but even there, the kids are involved in a lot more than they used to be. It's all good, of course, and we're still a far cry from being empty nesters; yet, I do yearn for those old patterns, looking forward each night to a different lovely game. Also, honestly, the Epic Game Store giveaways probably ate into some game time as well, as I feel like I may have spent more time this past year playing video games than the previous year. I don't log that rigorously, but you know, Cyberpunk 2077 doesn't play itself.

Here are the games that got at least ten plays during 2021:

  • The Crew: The Quest for Planet Nine (29)
  • Xia: Legends of a Drift System (27)
  • The Quacks of Quedlinburg (26)
  • Clank! (25)
  • Thunderstone Quest (25)
  • MonsDRAWsity (24)
  • My City (20)
  • Oceans (20)
  • Crokinole (14)
  • Dune: Imperium (13)
  • Arcadia Quest (12)
  • Kingdomino (12)
  • Lost Ruins of Arnak (12)
  • The Lord of the Rings: Journeys in Middle Earth (11)
  • Mage Knight Board Game (11)
  • Pandemic Legacy: Season 0 (11)
I am surprised at that first entry, since we haven't had that to the table since March. Honestly, I thought it was fine, but I didn't love it like some people did. On the other hand, Xia is on my short-list for Gestwicki Game of the Year. I picked it up after hearing accolades about it from the Arydia kickstarter, and my family has loved it. The older set enjoys playing full, 20-point games, and the younger boys can join in 60-minute timed or lower-point games. Quacks and MonsDRAWsity are my other two candidates for this illustrious and completely made up award. I'll mention too that after playing a bit of Wingspan and Oceans recently, I came to realize it's the latter that's my current favorite tableau-builder.  Of course, Clank remains a staple around here for accessible and fun deck-building. 

It's worth pointing out the twelve games of Arcadia Quest here represent two campaigns with my third son, who is now old enough to get through the game. He's done a fine job, and it's been fun to go through the game again with a full four players. When my youngest son is old enough to play, well, I don't know what we'll do. Will they do a campaign without me?

I am still a little grumpy at Journeys in Middle Earth; after spending all that time painting the expansion, we played one of the two campaigns and found its ending to be frustrating and badly designed. We haven't picked it up since, but maybe we will in 2022.

We played a few tabletop roleplaying games this year as well. The data for these are not counted in the total plays discussed above. Earlier this year, we played five sessions of Dungeon Crawl Classics as part of a funnel and a scenario, and more recently, we have played two sessions of Raccoon Sky Pirates. I'm not sure if we'll see more RPGs in 2022 or not, but I hope they are still well represented. Like so many games, they are hard to get to fit exactly into all family members' sweet spots. 

My h-index is 27, meaning there are 27 games that I have played at least 27 times. 

As usual, let's wrap up by looking at all-time plays (at least, "all-time" since I started logging in 2016). I'll just be looking at games with at least 30 plays, which is a higher cap than last year but keeps the list a little more manageable.
  • Clank! (83)
  • Crokinole (75)
  • Kingdomino (74)
  • Thunderstone Quest (71)
  • Gloomhaven (61)
  • Race for the Galaxy (64)
  • Animal Upon Animal (56)
  • Carcassonne (56)
  • Camel Up  (49)
  • Arcadia Quest (48)
  • The Quacks of Quedlinburg (47)
  • Quiddler (47)
  • Rhino Hero Super Battle (43)
  • Pathfinder Adventure Card Game (all versions) (40)
  • The Crew: Quest for Planet Nine (40)
  • The Lord of the Rings: Journeys in Middle Earth (39)
  • Labyrinth (38)
  • My City (38)
  • Runebound Third Edition (38)
  • Reiner Knizia's Amazing Flea Circus (34)
  • BONK (32)
  • Mage Knight Board Game (32)
  • Massive Darkness (31)
  • Terror in Meeple City (31)

Note that this year, I still combined both the original and new core sets of Pathfinder Adventure Card Game, but I did not roll together the Clank and Clank Legacy stats. I'm on the verge of recycling my copy of Clank Legacy since, with the campaign over, it's just so much more trouble to get to the table than one of the core games. Fond memories, but maybe too much effort for the amount of shelf space. It's fun here to see games I really enjoy growing to expand over ones that are locked in time, like Animal Upon Animal. There was a time when this was the easiest game to get to the table with young boys, but now, everyone gets much more excited about something like My City

That's it for this year's report. I hope I get to join you at the game table in 2022!