Wednesday, May 19, 2021

Family Adventures with Dungeon Crawl Classics, Part 2: Reflection, Critique, and Future Directions

(This post is part 2 in a series about playing Dungeon Crawl Classics RPG with my family. Read Part 1 here.)

Playing through "The Old God's Return" was the longest RPG series that my family has played to date. As I mentioned above, this is partly due to the two-hour cap on session duration, which I think worked well for us. There were certainly some points where I was willing to go a bit further, but given the range of age and experience, I will call this a successful move. It helped that it was one continuous module, with a coherent beginning, middle, and end. This took a lot of pressure off of me compared to my experience with other games like ICRPGFate, and PDQ, where I had to do the additional prep work of making a story. 

One concrete lesson I learned is neither original nor particularly insightful, but I will record it here. I really should have copied essential material from the module into my little notebook, such as the tontuu's stat blocks. This advice is given by basically every RPG pundit on YouTube, but the truth is that I haven't run someone else's module in a long time. The sometimes month-long gap between sessions would have also meant that my notes would have been a good refresher of the essentials, rather than having to re-read the module as prep each time.

DCC RPG manifests the OSR aesthetic. The world is dangerous, and the heroes are pressed up against it. I understand the appeal of such systems, and I could see myself really enjoying a continuous campaign with players who understand that they should not get too attached to their characters. Regardless, conversations with my wife between sessions made me realize that there is a gap in the design. When facing a dangerous world, good luck is needed, but one would hope that wit counts for something. However, there were almost no points in the game where cleverness was rewarded: more often, it was just a matter of rolling dice. 

I would like to explore that in a bit more detail, drawing upon our experience with "The Old God's Return." It was a good idea for Seth to scout the area around the top of the floating glacier, but he failed the roll, so it was fruitless. The players know that he failed the roll, and that there was nothing they could do except move forward and hope, which led to Seth's first fall. DCC RPG has no concept of failing forward as one finds in games like Dungeon World. Fail-forward strikes me as a much better way to reward players for cleverness and creativity, not to mention narrative-centered moves such as roleplaying a situation to the point of personal danger. Later, when facing the wall of rubble, Seth again decided to scout, but this time he made the rolls, and it led to that cinematic ambush. When the dice are with you, it works, but when they are not, it can feel like punishment.

One could say "That's just the OSR aesthetic" and be only partially right because of one particular and excellent rule: the fighter's Mighty Deed of Arms. Whereas the other classes have a laundry list of abilities, the fighter has essentially just this one, but it is a doozy. On any attack roll, the fighter can try to accomplish some mighty deed, such as tripping the opponent, knocking away a barbarian's axe, or grabbing the magic chalice out of the sorcerer's hands. It's a strangely narrative moment in an otherwise statistical game. This mechanism accomplishes the stated design goal of differentiating the fighter from the other classes, which I consider a great success over the earlier D&D distinction, which was basically that fighters have bigger numbers.

Mighty Deeds of Arms introduces a contrast that highlights the lack of robustness in the rest of the system. The fighter is the only one who can use the environment to his advantage in combat, and while it's fun to be the thief who finds the trap, that happens rarely, and there's a lot of time in combat. Put another way, it may be more consistent for the fighters to just have bigger numbers. DCC RPG has no concept of 5e-style advantage or ICRPG-style hero coins: there is no mechanical way to encourage players to do something contextually interesting, so it boils down to who rolls well. By way of comparison, it's worth looking at Phoenix Point: Dawn Command, which had the best environmental interaction system I have ever seen. For each scene, it provides a list of items from the description that can be used to the players' advantage, but each thing can only be used once, akin to boosts in Fate.

Playing games like DCC RPG and PbtA games, players are often choosing from a menu of options. With DCC RPG in particular, there is a sense that if it's not on the menu, it cannot be done. This is not technically true, of course, in that a good DM will come up with a reasonable, systemically-appropriate way to handle special cases, but keep in mind that I am playing with a broad range of ages. I already mentioned how Joe the Cleric's player was clearly overwhelmed by the number of things he could do, and enough time passed between each session that almost nobody could remember how to read their own character sheets. An anxiety manifests in my wife, who claims that the family "is not good at" these games; as I have written about before, I think this is a sort of UX problem, where the system does not present itself as learnable. This came up in the final battle with Tjaptar, for example. When Joe commanded the Old God to flee into the woods, my wife started looking for interesting things that her character could do... but the only thing she could do was go attack the Big Bad, which is a false choice since it's the only one. Indeed, it's slightly worse than that: the party had earlier learned that Tjaptar's power was centered in his antlers, and that they should attack those. This meant that every shot had to be a called shot at -4, which for the party meant a success only on a natural 20, or, with about a 7% chance and restricted only to fighters, a successful mighty deed. The choice becomes really less than meaningful then: do you shoot Tjaptar in the regular way and have nothing good happen, or do you take a crippling penalty? You can see why morale was low at the end of the penultimate session.

Now, of course, I could have put a mystical amulet on the altar in the back of the room that was a nexus for Tjaptar's powers, and foreshadowed its existence, and given her the option of getting Joe to cleanse the evil altar... but now I'm doing the work of writing a module rather than the much easier work of running a module. Once again, if a group wanted exactly this kind of OSR experience, then more power to them, but looking at it as a designers and as someone playing with my family, I am left hungry.

My family has been talking some about the experience, and no one is clamoring for more DCC RPG right now. My wife insists that she does not like dice, although as the session report indicates, she was certainly the most emotionally responsive to their fickleness, the first to moan at a 1 and the first to squeal on a 20. I suppose one does not have to like that feeling, but an outsider watching the game would think it was her favorite part. Regardless, our conversations brought us back to more narrative-first games, and Fate in particular. I played a fun ad hoc session of Fate with the older two boys which I think they were excited to continue, but for which I ran out of steam. The whole family played one session of Fate together with a setting that only resonated to a few of us. In both cases, I feel like I was an amateur at running the game, moving too slowly through things that could have been left on the cutting-room floor. I was also improvising without much direction, while trying to keep the needs of the family in mind.

I think our next move will be to try Fate again, but with a few specific constraints. One will be to limit the duration of the game, which will be good for all of us—maybe especially me, so that my creative juices do not run dry. I will need to have in front of me a copy of the players' character sheets, because I realized that it was too much to try to remember their aspects from across the table. Another constraint will be to use a familiar setting. Our previous family game of Fate was about exploring an unfamiliar planet with a B-grade sci fi aesthetic. However, because the genre and setting were unfamiliar, most of the players had little sense of what they could do in that environment. Instead of introducing a fantastic new environment, we will definitely be choosing settings that all the family can understand. Fortunately, they read a lot, and so there are a lot of options. Unfortunately, our conversations have not led us to one that everyone is equally excited about. Part of me wants to do a medieval fantasy setting just because I have all these excellent miniatures that could be used with zone rules, and I know the boys can draw on their experience watching classics like Hawk the Slayer or the MST3K riffing of Cave Dwellers. On the other hand, I find myself thinking about Sherlock Holmes' Victorian London or Indiana Jones and wondering whether these can be laced with some fantastic elements and secret societies. I think if we focus on a one-off, then there won't be pressure to saturate the world, and we can see where that takes us.

Family Adventures with Dungeon Crawl Classics, Part 1: The Session Report

My family went through a Dungeon Crawl Classics RPG funnel back in February, and we decided to continue their adventures as level 1 characters. One of the outcomes from the family debriefing was that short sessions were better than long ones, and so we decided to proceed in two-hour increments. After reviewing some of the appropriate first-level modules I picked up through Humble Bundle, I decided on "The Old God's Return," which is 2013 Holiday Module by Michael Curtis. The adventure starts off during a cold winter solstice celebration, which seemed appropriate in mid-March when we started this module that, from the prologue, "can be completed in a single session." It ended up taking us four, but I have no regrets about the timeboxed session duration: everyone was able to maintain their attention much better, and breaking in the middle of a fight meant we could come back for a cliffhanger. The only tenuous division was between the last two session, where the party had started the fight against the Big Bad, and it certainly looked like they were all going to perish... but I'm getting ahead of myself.

(This remainder of this post contains numerous spoilers from "The Old God's Return.")

Our heroes include: my wife as the fighter Chioggia and then, played by the boys and in descending age order: Mord, the Wizard; Seth, the Thief; Joe, the Cleric; and Luck, another Fighter. 

The party arrived as guests of honor to the Winter Solstice celebration as guests of honor, as it was the anniversary of their having cleansed the "The Portal Under the Stars." This gave some background for how they had gone their separate ways to learn their first-level skills and spent their treasure. The party was interrupted by an attack of tontuu—strange, ice-cold, dwarf-like creatures who are the emissaries of the titular Old God. Mord unleashed burning hands onto one of them, revealing in the process that his mercurial form of this spell summoned otherworldly attention. While the magic did its job of crisping up a tontuu or two, the whole party felt as if someone, or something, was watching them. This seemed to freak out my wife, who is generally uncomfortable in not knowing the line between rules and story in tabletop roleplaying games. Indeed, here is a case where the mercurial magic gives no specific indication of the rules, but I started hatching a plot around it.

Joe the Cleric, being Lawful, decided to turn the evil creatures. He rolled an astronomical result that scattered the remaining tontuu, which gave him a strong feeling of efficacy.

The party accepted the blessing of the town's priest, gaining points of "sovereign fire" to be used during the adventure. In retrospect, this was a strike against the module, since this introduced yet another thing for the novice players to have to manage. I'm sure it would not have been a problem for veteran players, but I should have noticed this complication when reviewing first-level dungeons.

The party borrowed horses and chased down the the source of evil that was plaguing the region: a floating glacier that, unknown to them, contained the ruins of an ancient temple. The temple was dedicated to Tjaptar, a long-forgotten god who was using the tontuu to capture the children's souls he needed to grow in power. Classic Old God stuff, that. In order to reach the floating structure, Luck burned half of his sovereign fire points to adopt a fiery form, charge the one tontuu guard he could see, and then lower a rope ladder for the others to climb up. The youngest son was very excited about being featured here, and he still sometimes talks about the time his character flew in the air and punched out a bad guy.

The party climbed to the flat surface at the top of the floating glacier, where they could see the lone structure in the center: the nearly-buried top level of a ziggurat. They wisely had Seth scout the area before heading in, but unfortunately, Seth's player rolled poorly, and he walked right into an ambush. Three tontuu hurled spears at him, taking him down. Seth already had a low stamina, and although Joe healed him before he died, he lost a precious stamina point, dropping his max HP even lower. The party survived the ambush, and this ended the first session.

The next session had them descending into the temple. There were a few exciting moments in this middle chapter of their adventure. At one point, facing a pile of rubble, Seth's player made a series of successful checks to climb over and scout the other side, which allowed the party to set up an ambush of their own. This was especially helpful since both Chioggia and Luck were much better with their bows than with their swords, so a round of free missile attacks was appreciated by the fighters. During the battle, Mord cast flaming hands again, and this time, an otherworldly eye opened upon his forehead, peering through him into the temple.

During a battle with a particularly nasty creature, my wife fumbled an attack, giving her a -2 to her next roll. She really does not like dice, and so this was extra disheartening. However, her next roll was an 18, which was exactly what she needed to hit the beast, and she did maximum damage to it. When the creature was down to one hit point remaining, Luck's player rolled a natural 20, critically punching it in the face, again to much fanfare.

Joe the Cleric was unable to complete a single spell or healing ability, and he ended the session with a disapproval rating of four. That means that, on any future attempt, he had a 20% chance of something like critical failure and, potentially, the loss of his abilities.

In the penultimate session, the party unwittingly unleashed a dangerous monster from its icy prison, an frozen insectoid creature animated by the power of a nearby sorcerer. Chioggia charged across the room to defend the rest of the party, rolled a natural 20, and knocked one of the thing's pincers clean off.

This was also the session that began the epic showdown against Tjaptar. It began with Seth climbing a tree (yes, the temple was filled with strange underground conifers) to see what was coming up. Tjaptar  was aware of his presence and cast his "wood wyrding" spell, in keeping with the module's tactical notes. Seth had only three hit points, and when the arrows in his quiver grew spikes that shot through his chest, he fell to the ground with none left. Joe once again got to him just in time, selflessly burning two Luck to cast a healing spell to keep Seth alive. This made Seth lose yet another Stamina, disappointing his player. All these holes in his chest make him look like a short-termer.

There were two other creatures in the room with Tjaptar, one being a tough tontuu that kept two party members occupied by the doorway. The other was turned by Joe, which was hit by a timely critical hit by Luck; the fleeing of this creature let the rest of the party focus on the Big Bad. However, Tjaptar had already destroyed Joe's mace—his only weapon—with his wood wyrding, and Chioggia and Luck had dropped their bows and arrows in fear that what happened to Seth would happen to them. Mord blasted the tontuu with flaming hands, expecting to fell it, but its extra hit points further dropped the morale of the party.  Seth leaped up and landed a critical hit on the creature, but a poor roll on the critical table, combined with his low luck score, meant that he actually missed, which was a catastrophic twist. As the timer rang indicating the end of our two-hour session, the party was left without much hope.

About a month later, we were able to finish the adventure. This was in the second week of May, so the wintery theme had long since lost its meteorological synergy. Despite fear of a TPK, the players were eager to see how the adventure would conclude.

Chioggia and Mord faced the tontuu while the others engaged Tjaptar. Mord let loose another flaming hands, and this time, he got the most fearful result from his mercurial magic: the extradimensional being appearing before him. I was as surprised as anyone, and I realized at that moment that I had a rough plan for what to do if this happened, but I had not done the legwork. It turned out that, in "The Portal Under the Stars," it was Mord who had picked up the horn of the serpent guardian, Ssissurag. He still carried it with him, though he knew not what he could do with it. I made Ssissurag itself appear and offer Mord a bargain: the power of venom to defeat the tontuu in exchange for doing the serpent's will. Mord, being chaotic and fearing the destruction of the party and the success of the Old god, agreed. Ssissurag struck out, biting the tontuu and defeating it. In truth, it only had a few hit points remaining, but this was an excellent conclusion to Mord's personal story.

Meanwhile, the Old God was blasting the rest of the party mercilessly with a freezing blast, which was his inversion of flaming hands. Joe tried to heal himself and failed, raising that disapproval rating to five, and in the following round, he was finally able to successfully heal himself. The player was excited to play a cleric, but it was never clear to me that he understood all of his options and their implications. Indeed, several times we had to hold up the action to review his various skills and abilities. With the party losing hit points faster than they could injure Tjaptar, and after reviewing all his options, Joe decided to cast Word of Command, despite a 25% chance of disapproval from his deity. The player rolled an amazing 19 and commanded the Old God to "run," while gesturing away from the party. Tjaptar failed his Will save, and so after Joe's repeated pleas to his deity for help, the divine power finally flowed through him, and Tjaptar turned tail and fled into the trees. The party took some free attacks of opportunity, including Luck's landing a mighty blow. 

Chioggia grabbed his bow off the ground, lined up the shot, burned a point of sovereign fire to imbue the arrow with fiery magic, and let fly. The roll was a natural 20, and the critical table indicated that the target moved into the blow, taking an extra 1d8 damage. Chioggia's explosive arrow destroyed the Old God!...

But of course, this triggered the collapse of the ancient temple. That's just how these things go. The party climbed out of the temple, to the top of the disintegrating glacier. At this point, everyone had the five remaining sovereign fire points required to fly down to the ground except Luck: he had used five to be the one to fly up, and he had used one in an earlier battle to imbue his sword with flame. Luck tried to climb down the side of the glacier, but he failed his roll. His last chance was to make a Reflex save to jump to a chunk of descending ice, and he made it. The party had survived and saved the region.

That completes the story of my family's adventure in "The Old God's Return." Part 2 includes a reflection on the experience, a critique of the system, and some ideas for where we may go next with our tabletop RPG journey. You can read Part 2 here.

Tuesday, May 18, 2021

Memories of Pathfinder Society, seven years later

I set myself to cleaning my home office this morning, and I came across a few interesting odds and ends. In one dusty pile was a folder containing my Pathfinder Society notes from a trio of sessions in 2014. The sessions were run by friends in the Indy area who have since moved out of state. I don't expect I would ever need the character sheets and logs. It was fun to see them again, though shocking to see how many years ago that was. The sheets are in the recycling bin now, but I thought I'd share a few memories about the experience here.

These three sessions have been my only experience playing Pathfinder RPG. I was and remain an outsider to "the scene." I decided to play a paladin because I had a fun idea for a character and I had never played one before. It was only afterward that I discovered that paladins had a reputation within PFS as being for powergamers, which you'll see is a bit ironic. I decided to play a paladin in his mid-50s, a farmer who received a calling to be a holy warrior after his family was killed in a raid. I named him Craddoc, which was a name I pulled from online references to Lloyd Alexander's Prydain Chronicles; I had read those in my youth and was inspired to search there for names, though I have no recollection of the namesake's role in the stories.

Craddoc's companion was Absalom*, his faithful border collie who was the only other survivor from his village. Absalom was just a dog, and Craddoc was very protective of him. This confused some of the other players at the table, including the DM, who thought I wanted a war dog that could charge into battle and take some hits. In my imagination, Craddoc would patiently tell Absalom to sit, stay, and be quiet, and then he would charge into battle. Afterward, he would return and pat the good boy on the head, perhaps giving him a treat. 

This leans into one of the curious phenomena around the game. I was interested in a heroic journey, exploring the adventures of Craddoc and his companions. Playing with this group, it was clear that some of the others had more of a CRPG interpretation of TRPG. Indeed, once it became clear, the DM and I had a great conversation about this: his interest was in making an environment like World of Warcraft, where players do missions to gain loot, whereas I was approaching it as one who wanted to engage in a story. Seeing how the sessions unfolded, I got to understand that PFS was not really designed for what I wanted to get out of it, but I still enjoyed it. One of the most memorable moments was when the rest of the party was sneaking into a warehouse, which of course the paladin refused to do. I volunteered to "take care of" the guards at the front door. I am sure the players and DM thought this meant I would go attack them, but instead, I explained to that I wanted to greet them, get to know them a bit, and then use some of my treasure earned in a previous session to buy them a round of beers at a nearby tavern. Craddoc made friends with the guards while the others did whatever the quest required, and I got to enjoy a memorable story moment.

There was another interesting conflict between the PFS experience and designed and the players at the table. One of the players brought a carefree gnome adventurer to the table. This character was ostensibly modeled after Indiana Jones but combined with the recklessness of Daffy Duck. A particular moment I recall involved the party being in an icy cave, at the top of a long, descending tunnel containing unknown perils. The gnome decided to run to the front of the group, leap forward, and slide down to the bottom of the tunnel on his belly. In a cartoonish campaign, this would be a great move, but in a deadly fantasy setting, it seemed unwise. I played Craddoc as completely flummoxed at it, treating the gnome like one of his children, which seemed appropriate at the time. At the same time that Craddoc (the character) was flummoxed, I (the player) was also a bit confused. Was this the other player's version of narrative-first gameplay, or did his character have a death wish? It was never really clear to me, and this was our last session together.

I don't think I ever shared here the miniatures I used for Craddoc and Absalom. The "dog" is a wolf miniature from a ranger-and-wolf set, but I was pleased to see that with the right paint job, it works as a border collie. I chose the miniature for the paladin in large part because I could paint the hair and beard to convey his age. The original had a shield attachment on his left arm, which Craddoc did not use, so I just filed down the peg and did not include the shield. I believe that, to date, these are the only metal miniatures I have painted since my teenage years.

Absalom and Craddoc

* In my papers, I actually found two different character sheets for the dog. They had identical stats, but one was named "Merlin" and the other, "Absalom." The second seemed to be the more recent. Reviewing my game notes, I noticed that one of the other characters was named "Myralin," so I think I changed the dog's name after the first session to prevent confusion between these two nearly-identical names.

Tuesday, May 11, 2021

The CS222 Optional Summer Enrichment Exercises

In my earlier post, as part of my reflection on the Spring 2021 CS222 experience, I mentioned an optional summer enrichment program that I assembled for the students. The full document is in the course GitHub organization, and it contains some fluff explaining the context and goals. I decided to also copy over the exercises here, in case they are of general interest. The version on GitHub will eventually be discarded along with the students' repositories, probably the next time I teach the course and need to repurpose that organization.

Without further ado, then, here are the exercises that I designed to help students build their knowledge of data structures in Java while also strengthening the skills they learned in CS222. 
  1. Watch my video about developing a linked list with TDD. In the video, I mention several areas in which the sample problem is underspecified, such as not handling exceptional cases and not supporting remove-by-value. Make a list of those, then work through a complete linked list example using TDD. This will strengthen your knowledge of Java, data structures, and Clean Code.
  2. Using what you learned in that previous video, write your own implementation of array list. Note that the task list will be almost identical. The special cases to add will be where the internal array needs to be resized. For example, you should set it up so that your ArrayList constructor takes an argument which is the original size of the backing array. Then, make sure you test a case where you add more elements than fit into that array, in which case your implementation should be allocating a larger array behind the scenes.
  3. To get practice with recursion, try the exercises above with recursive rather than iterative solutions. My video shows an iterative approach, but anything you can do iteratively you can do recursively.
  4. Write your own library of ADT wrappers. For example, make an interface Queue that defines the behavior of a queue, then use TDD to write a LinkedQueue implementation that uses Java's LinkedList as a backing data structure, or ArrayQueue that uses Java's ArrayList as a backing data structure. Try it with Stack as well.
Consider it CC BY-SA 4.0, which is how I've been licensing all my public educational resources lately. I think it was on the SIGCSE mailing list that I saw someone exhort the community to be explicit about their licenses, and being a fan of Free Culture, I think it's a great idea.

Reflecting on CS222 Advanced Programming, Spring 2021

It was good to teach CS222 in person, although I have had enough of rotational attendance, face masks, and physical distancing. All of these things significantly inhibit learning, and I'll be glad to see the back of them.

One of the most significant challenges this semester was not apparent when we started. There are always some students who feel that they are not proficient with Java, but I assure them that the prerequisite courses build in enough Java for us to make sense of the readings. Transfer students often come in without Java experience at all, but I point them toward The Java Tutorials, and that's enough for them to be able to read Clean Code. As the weeks went on, though, it became clear that this cohort was different. It became clear that they had done very little programming of any merit in the prerequisite course, that it had really not prepared them for CS222. This put me in a bad situation: I am still beholden to the learning objectives of my course, even if those teaching the prerequisite course did not hold up their part of the curriculum. 

I tried using the existing achievements system to address the deficiency. I introduced a new one based on in-class examples that was really about practicing Java along with CS222 course concepts: namely, Optimas, which was to use TDD to develop a Roman numeral converter. Only a handful of students attempted this, which was good for them. It was not clear to me that other students were willing to put in the effort to make up for their deficiencies. Indeed, while there are usually some obvious slackers on teams, I feel like there was a lot more dead weight on teams this semester, people who, from looking through git logs, didn't seem to do anything significant on the projects.

It was in the last few weeks of the semester that I felt like I could see all the issues more clearly. Just before the third iteration of the semester project, I put up a required video about project planning. The video was under ten minutes long, and it was designed to help them understand how quality can be maintained only by managing scope. Two weeks after posting this required bit of instruction, I happened to be on my YouTube Studio page, which showed me that this video had only three views. There were 28 students enrolled in the class.

This became fodder for our last-day discussion, which had a tumultuous design. To summarize the major talking points, I mentioned that a student had referred to my feedback as "brutal," so I asked them to reflect on how honesty is mistaken for brutality. I showed them the CS121 learning objectives, and I told them that I had looked up their grades for that course, which were all A-B grades. My question for them was, "Who is brutal? The one who gives you honest feedback so that you can meet the objectives, or the one who gives you an A grade when you have not met them?" Then I pulled the rug out from them, pointing out the low viewership on the exact video that was designed to help them do their best in the final iteration: the blame is not external to them! In this way, I tried to show them that, like all of us, they are victims of their environment, but also like all of us, they have the opportunity to overcome it—but many did not take that opportunity.

All that is to say that there were a lot of ups and downs. The grades were, overall, very low, since many students never resubmitted anything from early in the semester, most teams only met some of the final project requirements, and many students did not engage with the achievements. One could blame pandemic malaise, but the fact remains that this cohort of students will struggle to move forward through the curriculum. I put together an optional summer enrichment program for them, consisting of a series of exercises designed to reinforce CS121 data structures knowledge while strengthening their CS222 skills as well. Given their low engagement, I honestly do not expect many to pursue it, but at least I feel like I offered something to them in the face of a systemic failure.

One of the things this made me reflect upon, though, is potential holes in my grading scheme. I had a student who seemed to be willing to do anything for credit except work on the project. This student completed achievements, wrote essays, praised teammates, but never seemed to write a single line of code. Indeed, to be honest, I am not certain that this student can write code at all. Yet, the student could have earned a C- and moved forward in the curriculum. It makes me realize that, after many years of having basically the same grading scheme in CS222, perhaps I should revisit it, perhaps in light of some of my work on checklist-based specifications grading, as I use is Game Programming.

Two other items are high on my list of changes to consider for the future. One is that analysis of git logs makes it obvious that many teams—the poorly performing ones, not coincidentally—have inconsistent progress throughout the iteration. Reflecting on this, I think it is in part due to the institutional brainwashing and the anti-thinking promoted by tools like Canvas. To wit, if I have an iteration deadline three weeks away, Canvas shows it behind anything else that is due sooner. It gives students the illusion that the work is distal, when it is in fact supposed to be consistent throughout. Put another way, Canvas makes it look like the increment has a deadline rather than that there is consistent work to be done. One way around this is to abandon Canvas altogether for this kind of work, but I would still have to put grades there somehow. Another way is to institute something like weekly labor logs, as I did in game design last semester, so that students see something due each week. That sounds like the tail wagging the dog, but I wanted to mention it here for the next time I prep for CS222.

The other thing that really has to change is my articulation of a "critical component" in the increment presentations. I have used this terminology for years, and despite how much time I spend reminding students and describing the requirements in text, there are always people who get it wrong. I think this is in part a naming problem. I think I will change the name of that aspect to "Teach Us Something." It is a bit cumbersome to talk about "the Teach Us Something requirement," but I think that will resonate better in more students' minds.

Friday, May 7, 2021

Reflecting on CS490 Software Development Studio, Spring 2021

It was an interesting experience teaching CS490 Software Development Studio this past semester. This was the second year of my experiment in letting students pursue their passion projects. The first year was intended as a one-off, but with the pandemic, it seemed a bad time to try to bring back the element of community engagement. However, next year (Spring 2022), we are already approved and funded to do another community-engaged project with Minnetrista, and I'm really looking forward to that. It means, though, that any breadcrumbs I leave for myself here may not be followed for some time.

We started the semester by having each student participate in two rounds of pitches, we spent some time building prototypes from a subset of these, and by the middle of February had set on three projects to pursue. All three were completed and published to

The students followed the distributed methodology that I put together early in the semester. The only major edit I can remember from the semester was removing Trello as an option, since it didn't support the rest of the process as clearly as HacknPlan. At the end of each iteration, each student had to submit a statement that they had met the nine-hours-per-week labor commitment and that they had followed the methodology to the best of their understanding and ability. I thought about having them keep labor logs, as I did in game design last semester, but I decided to go with the more lightweight periodic self-reports instead. This kind of self-reporting is always open to dishonesty, given that grades were connected, but I did not have any sense of this as an endemic problem during the semester. Most students reported that they met all the goals all the time, although some admitted to cases where they were not on point. 

Last Spring, the teams started up in person and then had to move online, and I felt like we had a good working relationship throughout. This semester, we technically had a room that we could use, but that would have been extremely awkward for presentations, conversations, and collaboration. We ended up moving almost everything online, including pitches, work days, planning meetings, and presentations. Given the constraints of the alternative, it was better in all ways. We only met face-to-face a few times during the semester for whole studio meetings. 

A result of this is that I felt very much "outside" the group, and there was not a real sense of community between the teams. The most surprising way that this manifested was on Slack. Originally, different teams used different communication channels, but this was hard for me to manage and prevented people from reaching out for help across teams. I brought everyone together into one Slack instance, but people, by and large, ended up staying in their team's channels anyway. I used the #general channel to share thoughts, ideas, reminders, and the like, but I am not sure that anyone else ever really used it for general studio chat. Put another way, there was no general studio chat. A few people posted links on #random, but even that was really quiet, devoid of any good memes. It makes me wonder, if I were to run a course this way again, should more effort be spent on building up a sense of commonality, or should more effort be spent helping teams become self-sufficient and independent.

Early in the semester, I required that each team come up with a vision statement, explaining to the students that the main value of this is to be able to say "no" to good ideas. The rest of the semester was essentially just a series of sprints, then, in terms of what students were required to do. I advised the teams toward good practices of early playtesting and setting a feature freeze date, but I did not require either of these. Conversations with the teams, including our whole-studio semester retrospective meeting, make me wonder if it would be better to frontload some deadlines around these. For example, part of the methodology could give a date by which the first playtesting is expected, so that teams can move toward this.

Now, in some ways, I see this as inherently dysfunctional. I explained to all the teams—more than once—that "done" meant tested, and so for gameplay issues, "done" meant playtested. I talked about the relative merits of internal vs external playtesting, but I got a real sense that this was falling on deaf ears. When mentoring one, large team, I am active in the regular maintenance of the task board and discussion of "done", and the students get this; without this, I think the teams fell into a conventional undergraduate perspective about it, that "done" meant something much less rigorous. It is possible, then, that this another case where one method might work well for whole-studio projects and another one for small-team projects.

Along with vision statement articulation, external playtesting, and feature freeze dates, another item I have contemplated including is a style guide. Many of my teams have gone without these, but I have been inspired most recently by Ben Humphrey's talks and blog to think about the UX problems my students face. When there is one team, with good fortune, we have an artist who sets up a palette, fonts, and visual style, but even that is not guaranteed. Still, I think students understand that releasing a game using the engine's default styles is a faux pas. I do not want to push every team toward design bibles, but I think there might be some value in at least articulating a basic style guide early in the process.

I am proud of the work these students did, and honestly, their reliability and hard work enabled me to redirect efforts toward the unexpected picking up of CS431 these past few weeks. I hope they do not feel abandoned, but I consider myself fortunate that I had a CS490 group so consistent that I could trust them to wrap things up on their own.

In closing, I would like to share a final thought about the semester. Due to scheduling constraints and all the chaos of the pandemic, the CS490 class this semester was overloaded with technical people, mostly CS majors. I also had some of the most motivated and talented technical teams I have ever seen, and I actually think that's a separate issue from the first. That is, I had more technical people, but I also had better technical people. It was great to see these students deploy lifetime learning skills to teach themselves how to move forward on these different projects. The only downer for me, then, is that I didn't have these people together to work on a community-engaged project! I cannot help but think of what we could have accomplished if we had been able to all be together, in RB368, with coffee and donuts, meeting up for game nights, working with a community partner. 

Wednesday, May 5, 2021

What We Learned in CS222, Spring 2021

Each of my two sections of CS222 were split into two attendance groups. In the final meetings last week, after something of a sermon on professionalism and responsibility, I led them through a reflective exercise. I prefer to do this during a final exam, with everyone present and the wall papered in giant sticky notes, but alas, the pandemic makes this impossible. I set a timer for eight minutes and invited each student to make a list of what they learned. Then, I opened Google Docs and wrote down any item that the students shouted out.

After doing this for each attendance group, I collated the lists to form a master list of 173 items. These were put into a form, through which I invited the students to vote on the eight that they thought were most important. Unfortunately, only 14 of my 28 students responded, but of those who responded, these were the top items along with their vote counts:
  • Clean Code (10)
  • DRY (6)
  • GitHub (5)
  • Red-Green-Refactor (5)
  • SRP (5)
  • TDD (9)
Clearly, some of these overlap. SRP is a part of Clean Code, and Red-Green-Refactor is a core practice of TDD. The overlaps do not bother me because different articulations have different meanings and connotations to the students. In their final exam, they will be able to choose one of these items and write an essay about how they learned it. These essays are always fun to read, providing me a little window into how students are engaging with the course material.

In the list this year were two items that I do not remember seeing before. One of them was "A professor who teaches differently doesn't make him bad." I was momentarily dumbstruck by the comment, and then I wrote it down and told the student that I would take it as a compliment. It's an interesting comment. It shows that the initial reaction that this student had was that because I teach differently, therefore I must be bad. By extension, then, people who teach "regular" must be good. I assume here that the student meant quality of teaching and not moral quality. Continuing the analysis, the student experienced a change of perspective: somehow, during the semester, something internally changed in the student that made them recognize that their original idea was false. To be clear, the student didn't say that I was doing a good job, only that I was not doing a bad job, but I think it's implied here that my good just looks different from what they considered "conventional good." I am left wondering what was the event or what was the catalyst that allowed the student to change their thinking and whether there are long-term gains from this shift in perspective. If there are, will the student be able to remember CS222 as a turning point?

When I put together the survey, I originally had all the elements in alphabetical order. However, this left that previous item as the first one in the list, and I got to feeling self-conscious about it. Of course there would be items on the list that a student had not seen before because no one is in all attendance groups besides me. However, it felt like I was fishing by putting this one first. I ended up rewording it to "Just because a professor teaches differently doesn't make him bad," which got no votes.

The other item that I do not remember seeing before is "About some of the people who wrote the Agile Manifesto." One of the underlying themes of the class is that software development is for and by people. During the semester, we talk about the Agile Manifesto, and we also separately talk about Robert Martin, Alistair Cockburn, Kent Beck, Ken Schwaber, and Jeff Sutherland. I'm sure I mention that these men were original signatories of the Agile Manifesto in these discussions, but the point is their other work. I am pleased to see that a student recognized that these people are part of the theme of the course. They are not just a bundle of names and facts, which I think is a common way for undergraduates to consider such things, but real people whose work made a difference.