Tuesday, June 16, 2026

Summer Course Revisions: CS222 Advanced Programming

I always revisit my courses over the summer, but this year there are higher stakes than usual. Ball State has opted to change the calendar from 15 weeks of instruction to 14 weeks. There will be significant ramifications for curricula with long prerequisite chains such as my department has, but those problems will have to be tackled systematically later. For now, the immediate challenge involved shaving a week from an already packed semester. This coincides with two other major changes I have had in mind: reviewing the textbook and getting away from Canvas. I plan to give each a fair treatment in this post, although some details may be reserved for future writings or conversations.

My draft course plans are available online. Much of it is copied over from Spring for expediency. I would like to tighten up some of the lengthier sections, but for now, it will suffice. The projects will be posted when they are assigned, as usual. 

The Calendar

For many years, I used the first three weeks of CS222 to prepare students for the rest of the semester. This was followed by the two week project, leaving ten weeks for the final project. A few semesters ago, I expanded the introduction to four weeks, and this proved helpful, so I shaved a week off of the final project in order to keep two weeks for the warm-up project. To accommodate losing a week, I have decided to shave a week off of the final project. It will still be done in three iterations, and this means that the iterations themselves will be shorter. In turn, this means that we will spend a higher proportion of the final project on project administration (presentations, planning, retrospectives) rather than enrichment work.

It will have to be this enrichment work that is cut, and I have not yet made up my mind which two days will go. Most likely, it will be some of the practice exercises such as in-class code reviews or part of my week-long defensive programming exercise. I can move the "What We Learned" exercise back into the final exam slot, but then it becomes harder to use that exam as an objective measure of learning; it may turn out that I have to change the structure of the exam as well.

I am comfortable putting off some of these decisions. The second half of the semester is always more about my responding to the students' needs anyway, so I can wait until I meet them and see where their interests are.

The astute reader may notice that my draft course plans have no mention of achievements. I would not normally have one assigned until around the two-week project anyway, so for now I have left them off. Achievements are an engaging part of the class, and I love the idea of giving credit to activities that are normally out of the scope of a college course. However, it's also one of the easiest things to cut. Even though they use little class time, they occupy significant amounts of student attention. A week's worth? Perhaps. This is another decision that I am putting off until the last responsible moment, when I will have the most understanding of its implications.

A Book

The second edition of Robert C. Martin's Clean Code was released not long ago. It is twice the size of the first edition, and this alone had me concerned. The first edition is a classic, but it does show its age. Much of the criticism that is levied against it seems to forget to whom it was written twenty years ago. Still, not all the criticism is unwarranted, and this prompted me to look for alternatives.

One is The Pragmatic Programmer, which saw a refresh in 2019 with its 20th Anniversary Edition. I have always respected this book, and the new edition is strong. Re-reading it, though, I remembered how much it assumes of the reader. The tips are useful, but many of the details are left to the reader's experience-—and my readers lack experience! I noted a few particularly salient sections that I think my CS sophomores would benefit from, but I didn't see an easy way to use it the way I've used Clean Code.

The other alternative is Ousterhout's A Philosophy of Software Design. I got a copy of this book as soon as I heard about it, but I bounced off of it pretty quickly. The book presents itself as the sole source of design wisdom, which is already off-putting, but what really got me was Ousterhout's summary dismissal of Test-Driven Development coupled with an incorrect explanation of what it is. It's not hard to learn what TDD is, and if the author couldn't be bothered to cite a real source, then how much of the rest of the text should one take seriously?

Having put these two books aside, I decided to give a closer look to the new edition of Clean Code, starting with an inspectional reading. By golly, there's a 50-page appendix that recounts a conversation between Martin and Ousterhout! It was fascinating to read, especially since so much of it is criticism of the first edition. It inspired me to read the rest of the second edition, which does indeed address much of the criticism Ousterhout and others have levied against it. Martin is not explicit about why he devoted so much of the book to this conversation, and despite how much I enjoyed reading it, I wish he hadn't: the book could be more manageable and affordable without it.

The other primary reason for the book's being so large is that it now includes abbreviated versions of two of Martin's other books, The Clean Coder and Clean Architecture. There is some convenience to having this content here, especially since the three ideas are not orthogonal to each other, but again, I would have preferred a tighter volume. More books, I say, not bigger books. Doesn't that seem more modular?

The best improvement in the second edition is that Martin is more careful in his chapter about comments. Almost all of my students have misread his chapter as an admonition against all comments, even though that is not what he says. When I push students to re-read that chapter more carefully, they have always come out with better understanding. The new articulation tones down the rhetoric, and I think fewer students will need a re-reading in order to get the main ideas.

The section that I miss is the old chapter 17, which was a long collection of code smells and heuristics. There was a lot in there that was not in the rest of the book, and it was all bite-sized, small enough for a sophomore CS student to recognize and think about.

I look forward to seeing how students react to this new edition. Expect an end-of-semester report, as usual.

An Edupunk Reaction

I have long bemoaned the problems of Canvas, and it keeps getting worse. A full treatment of this may wait for another blog post or some kind of SIGCSE opinion piece. For now, suffice it to say that an experience last semester was the straw that broke the camel's back, and I'm going full edupunk.

The new course has been built using Astro, which allows me to compose large portions of the course plan in Markdown. This makes it much easier to edit code samples and assignment sequencing than my previous, lit-html-driven approach. This does not represent a major change since I have not bound my courses tightly to an LMS since experimenting with Moodle in the late 2000s. One of my lessons there was don't bind your course tightly to the LMS.

In the past, my students submitted work through Canvas even though it was usually created either on GitHub or on Google Drive. Now, I will be skipping the middle man entirely. I plan to collect assignments through a form, and I will track grades in my own Google Sheets document. I used Apps Script to create a simple web view of the data based on the authenticated user. I already have students register a Google Account with me so that they can access the shared drive, so there's no extra administration required here.

My sheet looks like this:
Sample sheet

That row of sample data is linked to my own email address for testing; the email address is redacted for public posting. When I go to the deployed app, I get this report.
Progress Report WebApp

The layout is a placeholder, but it already exhibits the strength of having been created intentionally for pedagogic purposes. There is no coloring, there is no "grade so far," and there is no confetti. It is a simple report that a student can review in order to make decisions about what to do next. My plan is to embed this as an iframe right in the course site, but I haven't done that yet.

Technical note: I was a bit confused about Apps Script and web deployment, so I want to keep a note here for later. After the first deployment, one needs to revise the existing deployment in order to maintain the URL, not create a new deployment. The interface here is very strange. First, select Manage Deployments from the Deploy dropdown, then use the pencil button to make the deployment editable, then use the Version dropdown to make a new version. The description then can be something like a commit comment. Upon saving, the latest version of the script will become the new live version.

As for grading, I will do this Google Drive or in GitHub. I already have a workflow on Google Drive in which I leave comments in students work. I had been then summarizing those comments on Canvas, but now I can simply do that in Drive and record the grade into my spreadsheet. Similarly, for projects, I would clone the project, evaluate it, and type the results in Canvas; now, I will instead do that on GitHub, posting my feedback as an Issue. Existing privacy options means that none of this leaks out to the public: I simply use the permissions features already baked into Google Drive and GitHub.

My approach separates the concerns of (1) presenting course details, (2) collecting submissions, (3) giving feedback, and (4) presenting a dashboard summary from which students can choose what to resubmit.

As mentioned above, expect a full report here on the blog at the end of Fall. I know, you're probably wondering, "When are you going to get back on the Small Web and host your own blog?" I think this would be fun to pursue, but I'm also weeks into a very exciting, non-course-related summer project. I look forward to returning to it, but I may ride this momentum into planning my Fall CS315 course as well.

One final logistical note, for my own future reference: Making these changes took me about four full-time days, not counting reading time. I had used Astro before, for my CS390 page last semester, and I had never used Apps Script. I wanted to track that here so I can come back to it, expecting critical discussion in Fall about purported vs. actual justification for calendar changes combined with the increased work required of faculty with respect to ADA requirements.

Tuesday, May 26, 2026

A few notes on branching, microbranching, and pants

I am wrapping up work on a preproduction build of a digital gamebook that has me writing a lot of interactive fiction. After exploring my options and spending a few days on a custom engine, I landed on using ink. I have enjoyed working with it, and after a short learning curve, I find that it really does help me focus on the writing. That is, although it has a formal syntax that one must deal with, it mostly stays out of the way.

Coincidentally, a friend recently pointed me to the Game Narrative Kaleidoscope podcast. I just finished listening to the sixth episode's interview with Kate Gray. Two bits caught my attention that I wanted to capture here on the blog so I don't forget them.

The first is just a simple turn of phrase that the interviewers and guest all knew but that was new to me: the distinction between planners and pantsers. Writers of interactive fiction seem to identify as one or the other, the former being those who plan out their story carefully before writing and the latter being those who go "by the seat of their pants." In my case, I had sketched a quest structure with a few important branches, but once I got into writing, I really found that I could pants a lot of it.

The other was a distinction Gray drew between conventional branches and microbranches. She pointed out that many use "branching" to refer to the big, game-changing decisions that a player makes during play. However, there are also lots of smaller decisions one can make, particularly in dialog, that can serve other purposes. Often, this purpose is merely performative, allowing the player to choose a voice for their character. Other times, it is used for subtle worldbuilding. The important thing is that they are not important things, and Gray discussed how much she enjoys attending to them.

This struck me since I spend a lot of time with my students talking about how, in game design, decisions should be meaningful. A decision that is not meaningful is a false choice. Of course, that's a sort of ludological perspective, and it's true in the cases where it applies. Gray's interview gave me a vocabulary to talk about those other kinds of choices, the ones that only matter to the player and not necessarily to the game.

I have been playing Heaven's Vault in part to try to see through the experience to the ink layer below. It presents a lot of microbranches, some of which seem to have long-term impact on the game but many others of which are decorative. The dialog is all brief and punchy, no more than one or two sentences before another choice is made. It has a good rhythm. I am trying to understand the game in the context of other playful narrative experiences. I have been enjoying my page-a-day adventure calendar more than I expected even though it has very few decisions and no significant branching; after all, the next day's page has already been printed. I also picked up The Raiders of the Dune Sea, a gamebook that, at first glance, seems to favor longer narrative passages.

In my preproduction prototype, I have some scenes with lengthy text passages and some with frequent microbranches. Once I pull it together, I need to get it in front of some different representative players to see which best carries the themes I am exploring.

Friday, May 1, 2026

A new way to start classes

Now listen! and before I start,
give me your hearing and your heart,
for words will quickly disappear,
if they aren't heard in heart and ear.
Some men will hear and then commend
things that they cannot comprehend.
Their sense of hearing lets them hear it,
but once the heart has lost the spirit,
the words will fall upon the ears
just like the wind that blows and veers.
The words don't linger there or stay;
in a short while they fly away,
if the unwary heart's asleep,
because the heart alone can keep
the words enclosed. The ears, they say,
are just the channel and the way
by which the voice comes to the heart.
But the heart's able to impart
the voice that enters through the ears
unto the breast of him who hears.
So he who would hear me must start
by giving me his ears and heart,
because, however it may seem,
it's not a lie, tall tale, nor dream.

Chrétien de Troyes, Yvain, the Knight of the Lion, translated by Ruth Harwood Cline (University of Georgia Press, 1975), lines 141–164.

I am thinking of reciting that passage as a way to start next semester's classes.

Thursday, April 30, 2026

Reflecting on CS390, Spring 2026 edition

I taught CS390 Game Studio Preproduction after a year off, and it was to have been the beginning of a three-semester sequence. However, there was an administrative error: an overestimate of the number of students who would need the sequence meant that we had two sections of CS390 running but only enough students to justify one. The compromise with the administration was that we would collapse the two cohorts into one. For various good reasons, mine was the sequence that was cancelled, so my small number of students will be joining with another cohort for next year's production sequence. 

I open with this story because it cast the whole course in a strange light. My original plan for the course was that I would be preparing them to work under my supervision next year, and I had set up scaffolding to support that growth. When I found out that these students would go to another faculty member, I realized that this aspect of my plans were essentially moot: the other faculty member and I have different approaches. At one point, I laid out on the board a list of topics I had planned to introduce and enforce on the preproduction students, and I left it up to them to vote on which things they thought sounded interesting. In the end, the only one they voted for was a bootcamp on command-line git, but I don't even think that "stuck" since I didn't have any follow-ups or see students working through comprehension; many seemed hooked on WYSIAYG GUI tools instead.

It was a good group of students, and it was fun to work with them on the journey. The first several weeks, we explored ideation and prototyping. There were a few concepts left on the table here that I think are absolutely worth pursuing. They ended up settling on two designs to move forward through the formal preproduction process. These were presented to my Games Advisory Board, who generously volunteered their time to give feedback to the students. This pitch presentation was one of the three major deliverables of the course, the other two being a vertical slice and a concept document. All the details, of course, are in the course plan.

This was my third time teaching this course, and a major change is that I did not require reading Lemarchand's Playful Production Process as I have in the past. This was an experiment to see how the students would do with less structure. I am not sure I have a strong conclusion. Parts of it are really powerful, and I found myself missing them. I did not miss the niggling doubt of whether a student actually read and thought about the content. I feel like if I brought the book back, I would need to do it in the way I evolved my handling of Clean Code in CS222, incorporating more explicit instruction on how to take notes and how to transfer from the text to the task at hand. I will need to revisit this before Spring 2027, when I expect to teach CS390 again.

I invested a lot of time during my sabbatical trying to come up with a good concept document framework. I blended together some of my favorite aspects of the old Tim Ryan article, Lemarchand's book, and Sellers' Advanced Game Design. It mostly worked, but there were three pain points in students' documents that I think I can alleviate by improving the recommendations. 

The first relates to project goals. Lemarchand has a whole chapter on this topic where he distinguishes between experience goals and project goals. I abstracted that into what I called design goals, but I think I would do better to just adopt Lemarchand's approach (which he credits to Fullerton, I believe). My students obviously struggled with the idea of making goals for the player's experience. They kept listing their own goals instead. That is, they talked about means where the goals should be about ends. For example, a team mentioned drafting as a core mechanism because they wanted drafting, but they didn't talk about the question that drafting answers. Curiously, this should tie back to MDA, which I know we talk about a lot in CS215 as an analytical tool, but perhaps we need to emphasize it more as a generative tool. Curiously, even after I pointed the teams specifically to Lemarchand's examples from Uncharted 2 in his book, the teams still did not seem to get it. In fact, I realized that they didn't get it in the same way that my CS222 students kept wrapping up technical requirements as user stories instead of doing proper user story analysis. It makes me wonder whether this idea, of user-centeredness or player-centeredness, ought to be a program-level learning objective, at least of the GDD concentration. (I was tempted to put that previous sentence in bold, but that looked really aggressive. Do you think I'll remember this otherwise?)

The second pain point was that I did not have an equivalent of Lemarchand's macro chart. He puts it as part of his "game design macro," which is equivalent to my "concept document." Without such instruction, the students waved their hands around things like how many levels there would be and what powerups might be available. Both teams, loving them as I do, really dropped the ball here: they both described games with a scope that was essentially unbounded due to their lack of quantifiable analysis. A macro chart really would have helped them face the work to be done, especially if I had pushed them to include incidentals that they tend to forget, such as marketing materials and playtesting time. I don't think an entire schedule is necessary, but the macro chart makes one face facts.

The third is that I did not require them to go deeply into what Sellers calls the detailed design. I can see in my own documentation that I shifted toward narrative explanation of core loops using Chambers' approach, but I cannot recall why I stopped there. I don't want to go as far as Sellers' formal system modeling, but I think more documented details would have helped communicate the interactions among systems. During the pitches, one of the board recognized that a project had simple systems with multiplicative effects: that's the kind of observation I want my students to make about their own projects, not for a third party to point out about it.

Taking all that together, it points to something crucial that I need to remember next time I teach the course: push the students to make smaller games. I am not sure how to quantify or enforce that, but it has to be done. They just don't have the experience to interpret subtle or even overt feedback in this regard. Baxter-Webb brings this up in a helpful video, arguing that people making "indie games" need to be familiar with what small games are like. If my students are coming in inspired by large games, they will be thinking of making large games. There may be opportunities here to require a more structured research phase to help set expectations.

For the "final exam," we met and talked about the semester. After some open discussion, I gave them three questions to answer, one at a time, and we went around and shared answers to each. It was a wonderful conversation; I could write a whole blog post about how the students articulated what they learned. The final question I asked was what advice they would give to their past selves or to new students coming into preproduction. The answer that sticks in my memory is to think of game design as making a gift for someone else, not as tinkering for yourself. This wraps up a lot of the meaningful conversation the students and I had about design goals, experience goals, playtesting, humility, and risk-taking. 

That covers the major parts of what I learned from teaching the course this past semester. I am grateful to have had a small group that worked so well together; I look forward to watching their projects from afar during their senior year. In the meantime, I will put this train away, knowing that I will be able to dig it back out in late Fall, when I get ready for the next group.

Reflecting on CS222, Spring 2026 Edition

I had a fun cohort of students in CS222 this semester. Each team designed a final project of the "connect to a Web service and do something with the data" variety. In many ways, their foibles and experienced were akin to past students, but something that stood out to me was how well they asked each other questions. It is not clear whether I have done something different to foster this; one possible factor is that I have improved the requirement that teams give a technical lesson as part of their presentations.

We cover a lot of ground in CS222, and so I am concerned that next time, I will have only fourteen weeks of instruction rather than fifteen. The university is changing the academic calendar as of Fall 2026, and it will be hard to find a week's worth of work to remove. Also, students coming in will have two fewer weeks of classroom experience programming; given that many students do not do much independent practice, this will have a significant effect on downstream courses. Coincidentally, I just got out of a meeting this morning where we talked about how much more we want to teach within the undergraduate major, and yet we will have eight fewer weeks in which to do what we are already struggling to fit in.

My course requires students to read and evaluate "project code," which is a term I define but that a majority of students don't understand. Either they don't read the instructions or they lack the ability to distinguish between code-for-learning and code-to-do-something. As a result, many of them look back on their own code that was just purely pedagogic; others find code on GitHub, which I recognize is a leap of faith, but they look at code that is just someone else's classroom or tutorial project. This leaps out to me upon inspection, but because they have only ever read pedagogic code, I don't think they recognize it. Hence, rather than just refine by definition, I think I need to point them toward specific examples of projects that are appropriate. I hate to do this because there is so much code out there and I want them to find projects that are interesting to them. Yet, despite this encouragement, almost no one has ever done that, so maybe that's a dream not worth chasing. I would need to set up some guardrails to prevent two students from evaluating the same block of code, which is also something I am not keen on. Perhaps I need to set up some kind of draft.

I have had a note in my planning spreadsheet for some time to remind students that a good way to think about SRP is responsibility to whom. Also, though, there's a second edition of Clean Code out now that I haven't read yet. I need to see if the new edition is worth switching to, especially around explanations of OO principles that often trip students.

My final note is about the final exam. Many years ago, it comprised only reflective questions, and those gave me an insight into the student experience. A few semesters ago, I was concerned about students blowing steam, and so I added a content question as well, to make sure students could express some of the fundamental class topics. One of these questions has been perennially challenging to articulate correctly. Essentially, the question is trying to see if students understand that they should be able to make a list of unit tests they have yet to write and that these should be SMART. The trouble is that if I remind them that each step has to be SMART, then I have given them the answer. What happens is that students will say that their first step is to "write some tests," for example. That is not wrong, but it also doesn't illustrate what I'm trying to get at. Relevantly, I think many student teams continue to struggle with this idea throughout the semester, that they should always have a goal to work toward. TDD is supposed to push them in this way, but in practice, many fall back on old habits of just plowing forward without discipline. So, I think this points toward two other action items for me: first, to use more class time to have them practice articulating what their immediate next steps are, like Kent Beck does in Test-Driven Development By Example, and also then to use a similar framing to ensure that they can do this individually, as an outcome of the class.

Monday, April 27, 2026

Reflecting on CS215, Spring 2026 edition

Introduction

It was a delight to teach CS215 Introduction to Game Design this past semester. I had not taught the class since Fall 2022, and I didn't realize how much I missed it. I had a really wonderful cohort of students, as good as I could ask for. They were eager with questions and comments. More than once, I was just warming up a story, and hands would go up with thoughts and reactions, before I even got to the good stuff. I am glad to have these students in the program and look forward to watching them over the next few years.

The class was overall a great success. I followed my tried-and-true approach, using the first half of the semester to go through readings and exercises that helped lay out what is known about game design and the second half to work on final projects. 

Course Structure

As in the past, I still feel like there are missed opportunities to help students deploy the ideas from the first half into the second half. One complication is that, because students design their own projects, there's no way to know which ideas from the first half will be salient to their work. I would like to get them thinking more about this, but at the same time, I don't want to add more load without a good reason.

The one universal is the iterative design process. This came up in informal meetings among the faculty who teach in the CS GDD concentration, and we agreed that it is the most important objective for students to meet. Currently, my final project structure recommends a particular sequence, but I do not mandate it. I wonder if it would help the students learn the importance of playtesting earlier if I required them to do it earlier, the way that I require acceptance testing in CS222 for example.

Player Logs

I asked the students to complete five player logs during the semester. These logs involved briefly describing a game they played and reflecting on what they learned from it. Because we were working in the analog game design space, I required that at least half be analog games or digital interpretations thereof. My hope is that they would be playing games anyway and that this would help integrate their personal and academic experiences. Judging from their selections, I think many chose games for this exercise, although curiously not the ones I suggested as good starting points. I did not ask them to explain why they chose the games they did, but I might ask that in the future. No one should be choosing a knock-off of Uno over a brilliant design like Carcassonne.

The player logs were evenly spaced throughout the semester. This had the advantage of appearing elegant on the calendar but the disadvantage of colliding with other deadlines. Of course, many students did the work right before the deadline, but this meant it competed for attention with other work rather than complementing a continuous practice of study. I may need to reframe the exercise as either formal assignments or as the building of a portfolio that is routinely verified.

I realized too late that there was an opportunity to tie the player logs into the final projects. Next time, for late-semester player logs, I should require that the game be related somehow (mechanically, thematically) to their final projects. A lot of the students admitted to having explored a genre in which they had little experience, and this could be a way to help them understand the design space they are in.

Design Logs

Once again, I required my students to maintain design logs during their final project. I love this idea, and I am sure it helps them think through their practice. However, I think I can make the progress a bit smoother. For example, I required them to follow a particular document structure, but many struggled to read and follow the instructions. Rather than be indignant about this, I could provide a template to remove some friction. Similarly, I gave them some latitude as to what specifics go into the design logs, but they probably lack the experience and wisdom to make this decision well. I have them read Dan Cook's article, where he appropriately provides some guidance but no rules. I think I should give them a few more rules in the spirit of shuhari.

Workshopping

We used six weeks of class for workshopping. I split the class into four groups, and since we met twice a week, each group had three days to focus on workshopping their games. Each presenter took a section of the room, and the rest of the class moved among the stations. For the first round, this was done ad hoc; I set a timer, but moving was a recommendation, not a requirement. We ran a little postmortem after that iteration, and the students liked the ad hoc groupings but not the optionality of rotation. Thereafter, groups had to move when the timer went off, and it went well.

I gave them a feedback structure that I learned from Lemarchand's Playful Production Process. Any feedback during workshopping had to be framed as, "I like..., I wish..., What if...?" The students who tried this loved it, but some were too eager to give advice without the framing. They desired some kind of accountability, so I decided that we needed a magic word that could be invoked: what better for a game design course than "xyzzy"? If anyone heard feedback without the format, they could say, "Xyzzy!" and the hearer would have to re-frame their discourse. I think I was the only one who actually used this, but it was a good reminder to have on the board.

Similar to the feedback structure, starting in the second iteration, I asked students to begin each workshopping session by giving their elevator pitch and stating their design question. This was not always followed, and a little more accountability could have helped here, akin to the magic word for feedback. Students also struggled to articulate a design question, but I did not give much guidance here either. Many students came in with questions like, "Is this fun?" despite our earlier conversations about the danger of the F-word. I think this is a place where I can help them develop better practices and tie together the two halves of the semester. For example, I could give them a template like, "What mechanic can I add or remove in order to improve [emotion] from playing my game?" or "What goal can I add for [player type]" These would require students to think about their games in the context of the theory we studied rather than falling back on colloquialisms like, "Is this better than that?" 

Along those lines, I wonder if it would help the students to articulate design goals, to be explicit about what their game is supposed to do. This is something my preproduction students have struggled mightily with, and I don't know if this means that it should be introduced earlier or that it requires more wisdom than many new game designers possess.

Rules

I was initially surprised when, reading their final submissions, that their rulebooks were low quality. Many were missing fundamental details so that it was clear that the rules articulations themselves were not tested. My evaluation rubric enthroned a clear rules articulation as being a requirement for a good grade on the final project. I reflected on the course and realized that most of the students had completed the semester without ever reading an actual rulebook. For their player logs, they either used a digital interpretation of a game such as Board Game Arena or they were taught a game by a friend. Digital adaptations are deceiving here because software prevents players from doing things that they ought not do whereas in a tabletop game, you are only beholden to the laws of nature and localized miracles.

The students had never worked with the genre of game rules, and so clearly I could not hold them accountable to that genre's standards. It still bothers me that the CS majors in particular did not deploy their programming knowledge to write clear rules anyway, since rulebooks are essentially programs run on people, but that doesn't change the fact that I did not scaffold a good learning experience to make them good at it.

Being able to articulate the rules should be part of the class. After all, I encouraged them to think about posting their work on itch.io or someplace similar, but if the work is unclear, then it may do more harm than good. Next time, I need to think about this particular deliverable the way that I handle other incremental development tasks: give them a scaffolded experience with deadlines for draft submissions and/or rules-based playtesting.

Tuesday, April 21, 2026

What we learned in CS222, Spring 2026 edition

I worked my CS222 students through my usual semester reflection exercise today. I gave them five minutes to write down everything they learned this semester that was related to CS222, then we set a timer for 30 minutes while they offered items and I wrote them on the board. For some reason, we only had nine people in class today, but these nine came up with 88 items. I was going to give then six votes (because ceil(lg(88))=6), but a student in the front agreed with me that five was more symbolic, so they got five votes to mark the items most important to them.

The distribution of votes was unlike any I have seen before, and this may be because of the low attendance. Two items rose quickly to the top, with five and four votes respectively, but the next classification were with two votes, of which there were six. After a brief reflection, I decided to seize the opportunity and go ahead and mark all eight of these as "top items" for use in the final exam. These items, and their vote counts, are as follows:

  • Clean Code (5)
  • TDD (4)
  • Version control (2)
  • Using an API (2)
  • SRP (2)
  • Coding with a team (2)
  • Red-Green-Refactor (2)
  • Always run all the tests (2)
There is clearly some overlap among these, but that is fine. I look forward to seeing what the students have to say about these topics in the final exam.