Showing posts with label agile. Show all posts
Showing posts with label agile. Show all posts

Wednesday, May 7, 2025

Reading "Fifty Quick Ideas to Improve Your User Stories"

I recently finished Fifty Quick Ideas to Improve Your User Stories by Gojko Adzic and David Evans. The book was strongly recommended by Dave Farley on his Modern Software Engineering channel. I have been using user stories for many years as part of my teaching and practice with agile software development, and I hoped that the book might give me some new ideas and perspectives. I read it with a particular interest in helping students manage game development projects.

The book itself is laid out simply: every two-page spread presents one of their recommendations. Each has a narrative, a summary of benefits, and then practical recommendations for getting started. From the title, I expected the book to be short and punchy like The Pocket Universal Principles of Design, but it contains a lot more detail. The authors are clear that the book is not an introduction to user stories; they assume the reader is already familiar with user stories and the jargon of agile software development. This is good for a reader like me, except that I had earlier lent the book to a student who was just learning the fundamentals. I would use a different resource for that purpose if I could do it again.

Here are suggestions from the book that struck me as potentially helpful to my teaching and mentoring. I have included the page numbers for ease of future reference.

Describe a behavior change (p14)

This is the second time recently that I have come across Bill Wake's INVEST mnemonic for user stories—that stories should be Independent, Negotiable, Valuable, Estimable, Small, and Testable. The other place was Vasco Duarte's No Estimates, which I wrote about earlier this year.

The idea behind this recommendation is to quantify change. For new capabilities, "start to..." or "stop..." are simple quantifiers. I feel like there's something useful in here for introducing students to user stories.

Approach stories as survivable experiments (p18)

This tip is all about the perspectives of what stories allow. I often see students mistake stories for traditional requirements, probably because traditional requirements look more like school. Framing the stories as experiments may help students see that this is more creative and exploratory.

Put a "Best Before..." date on stories (p24)

I wish I had thought of this one. I have mentored student teams where they have a story in the backlog that only makes sense to do by a certain date or milestone. It's an easy one to remember, and it falls into a common pattern in the book: make the stories your own.

Aside: It reminds me of the advice about managing my curriculum vita that I received from my colleague Mellisa Holtzman many years ago. She said that your vita is your own, and that you should use it to tell a story rather than slavishly follow a template. She was right, both philosophically and rhetorically. My university recently moved to using a one-size-fits-none digital solution, and I was disappointed that there has been no discussion about the impoverished epistemology of such a move. 

Set deadlines for addressing major risks (p28)

This is similar to the previous one, and it references it as a technique: one can use learning stories that have "Best Before..." dates.

The authors distinguish between learning stories and earning stories, referencing an old presentation by Alistair Cockburn. This is a nice distinction as well that I am sure I can use.

Use hierarchical backlogs (p30)

Having spent the last year mentoring three teams with flat backlogs, it made me miss story maps, and I look forward to going back to them. Story maps come up explicitly on page 36 under the recommendation Use User Story Maps, which is just after the recommendation on page 34 to Use Impact Maps. Gojko Adzic also wrote a book on impact mapping. I have read most of it and find it intriguing, and I can see how it could be useful in a business environment. It didn't strike me as immediately helpful for my needs teaching the game design and development or the basics of agile software development.

Set out global concerns at the start of a milestone (p40)

The authors acknowledge that user stories cannot and should not capture everything that a team has to do. Writing emails or reading applicant vitae are examples of crucial work that is not directly related to a user story. 

Cross-cutting concerns such as security, performance, and usability should still be discussed, but they should manifest as something like a checklist that accompanies the whole process—not embedded or wedged into a user story.

Use low-tech for story conversations (p54)

The recommendation for whiteboards and sticky notes comes as no surprise to me. What did surprise me was that they caution against using a room with a large central table. Such a configuration makes people sit and opine rather than converse, and what comes out of the conversation (what we often call the "user stories" themselves) are just markers of that conversation.

Diverge and merge (p58)

When user story analysis is being done by a large team, they recommend breaking the team into smaller groups. Each group comes up with examples of user stories, then the groups compare their results. They suggest 10-15 minutes of divergence. 

In last year's game production studio, one team was much larger than the others, and I recommended that they break down story analysis by feature domain. I wanted each group to have representatives from Computer Science and from Animation. It worked reasonably well, but it was slow, and there were still a lot of holes in the analysis: cross-cutting ideas were lost. (Also, most of the students didn't know anything about user stories, and some harbored significant misunderstandings.) Next time, I will keep this advice in mind and have them work on the same context rather than different ones. I regularly have students push back on this kind of activity as redundant but this is because they have not yet experienced the productivity drop that comes from realizing later that the requirements were wrong.

Measure alignment using feedback exercises (p62)

This one jumped out to me because it sounds like it came right from a book about active learning techniques for the classroom. 

During user story analysis, rather than ask if anyone has questions, give the discussants a sample edge case and ask them an open-ended question such as, "What happens next?" Each writes their response, and then the team compares them. This shows whether there is shared understanding or not.

Reading this gets me fired up to use it in all of my teaching from now on. That's awkward since I won't be teaching again until Spring 2026. That gives me all the more reason for this blog post.

Split learning from earning (p90)

As mentioned above, this separates two kinds of stories. Learning stories still need a concrete goal that is valuable to stakeholders. An interesting corollary to this advice is that every story should be either learning or earning; if not, it is not really a user story at all.

Don't push everything into stories (p98)

I foreshadowed this one earlier as well. They advise strongly against tracking non-story work with user stories. An example they give is insightful: if such work is tracked in the backlog, and the stakeholders sort the backlog, then they will deprioritize work that does not generate value. The non-story work won't get addressed, then, until it is a crisis, at which point it becomes the highest priority, so there was no value in having it in the backlog.

Avoid using numeric story sizes (p102)

The two-page spread summarizes some of the key arguments behind the No Estimates movement. Here, they recommend that if someone uses T-Shirt sizes, to only use at most three different sizes. Better, they prefer Goldilocks sizing: a story is either too big, too small, or just right. Their conclusion is similar to Duarte's: just count stories.

Estimate capacity based on analysis time (p106)

If we know that planning for an iteration takes 5%-10% of the iteration time, then we can timebox the actual planning and then only work on the things that could be covered in that planning meeting. That is, use the planning meeting's duration as a heuristic for the scope of an iteration. This is clever, and the authors acknowledge that the moderator needs to prevent the meeting from getting too far into the weeds.

Split UX improvements from consistency work

They recommend having UX changes explored by a "mini-team" that explores and prototypes. The output of this mini-team's work are the user stories for the whole team, not exhaustive design specifications. The work of this exploratory team is on the learning side of the learning/earning divide. The mini-team can slipstream back into the main team to help with implementation.

This interested me considering how often I see teams struggle with questions of gameplay and engagement. "Will this be more fun?" is a good design question that can be approached through prototyping. Unfortunately, my teams often want to do this work as if the answer is a fait accompli. I wonder if this recommendation, together with the learning/earning split, will help me frame better for them what it means to answer the design question with a prototype first. The outcome would be the stories for the whole team to actually engineer a solution. I suspect I will encounter much of the same resistance I mentioned previously, where teams assume working on the "product" is more efficient than working in prototypes because they have never seen a product fail under bad design or bad engineering. I think this is why I prefer working with students who have tried hard things and seen how mistakes have consequences beyond a scolding or a bad grade.

Check outcomes with real users (p116)

The authors proclaim this as potentially the most important thing a team does. The important corollary here is that this requires one to write user stories the way one approaches TDD, or even how one ought to design learning experiences: focus from the beginning on an assessment plan.

Thursday, August 22, 2024

User Stories, Being Able To Do, and Philosophy

I just encountered something so delightful that I wanted to share it. As I thought about who else would enjoy this, I realized that it may just me. I decided to share it here on the blog in hopes that I forget it, search for it, and find it again later. (It wouldn't be the first time that has happened.)

I guide students through a lot of user story analysis, including but not limited to games-related courses. Years ago, I noticed a tendency for them to write a user story statement like, "I want Mario to be able to jump." I am pretty sure I also used to write them this way, too. At some point, it dawned on me that players don't want Mario to be able to jump: players want Mario to jump. Once I realized that, I saw the strangely passive "to be able to" in practically all of my students' stories. I've been on the lookout for this structure ever since, finding it akin to passive voice in prose: best to be eliminated.

This morning, I found myself reading a part of the Summa Theologiae as part of research into classical definitions of vice and virtue. In it, Aquinas tackles the question of whether a vice is worse than a vicious act. His response, in Sum I-II, 71, iii, co., includes the following.

For it is better to do well than to be able to do well, and in like manner, it is more blameworthy to do evil than to be able to do evil.

There you have it: a classical argument against the passive "to be able to" in user stories. 

Wednesday, December 7, 2022

NaGaDeMon 2022: The Classroom Mob Programming Game

In a rare inversion of media, I already announced my 2022 National Game Design Month project on YouTube before writing about it here. The project is Classroom Mob Programming Game. Visit the site for all the details.

My inspiration came from playing Willem Larson's Mob Programming RPG with my students in CS222. I played it last Spring for the first time, prompted a pair of blog posts about the experience [1, 2]. I played it again this Fall with my students and had a similar experience. I wrote some about how I framed the project in my only other NaGaDeMon 2022 blog post. Here, I want to talk a little about how I brought the pieces together to finish my project last week.

I did not make a lot of progress on the project for the first part of November. I kept ideas simmering but did not put pen to paper very often. As I pulled my notes together, I also had to determine how I would playtest it. Normally, my family provides a convenient testing group, but this game was designed very specifically for my CS222 class. That is, the game was designed for sophomore Computer Science majors and minors who are studying techniques of agile software development. I also didn't want to use my own CS222 class as testers since we already spent two days on Larson's game plus another class meeting to debrief and review from the experience. Also, my students would not be good testers because they already know what the game is supposed to teach: fundamentals of mobbing.

I reached out to my two colleagues who are teaching the other two sections of CS222 this semester to find out if they would send students to an after-hours playtesting session. Turns out, they both independently invited me to come to their class meetings to present the game to the whole class. This was invaluable for two reasons: first, it gave me two opportunities on sequential days to do testing; second, it gave me deadlines by which I had to have iterations ready.

Here are some of the most important properties of my game as viewed in comparison to Larson's.

  • Support multiple teams mobbing in the same classroom at once.
  • More deliberately scaffold students toward good TDD practices along with introducing mobbing
  • Fully completable in a 50-minute class session
  • Rather than add new playbooks as players level up, they unlock new actions that earn them XP, but the number of XP needed for the next level also increases
My game has some PbtA sensibilities, but it looks less like one than Larson's. It's more of a traditional RPG in that you have a role and earn XP, but without the emphasis on playbooks and actions.

The first test went well, but there were several loose ends that needed to be tied up. I had created an ostensibly balanced scoring system to support competition between teams. In practice, it was too fiddly to compute, and some individuals computed their scores incorrectly while others simply threw up their hands and guessed. I almost completely removed scoring from the game for the second playtest, and I don't think anyone missed it. I wrote up a much simpler scoring system that is provided as an optional addition to the game. I fixed some errors on the handouts, but more importantly, I made significant revisions to the actions. The first group of testers had a hard time getting into a red-green-refactor rhythm, even with some gentle prodding from their instructor.

The second playtest went much better, with simpler scoring and better actions. Players don't just get more actions as they level up, but some of the actions actually change forms for better scaffolding. The best example is in the Navigator role, where there is a series of actions that evolves like this:

  • Level 0: Describe a desirable, failing unit test--the "Red" in "Red-Green-Refactor"
  • Level 1-2: Hold the team to the appropriate step of "Red-Green-Refactor"
  • Level 3: Complete a "Red-Green-Refactor" cycle

After the second playtest, I also completely rewrote the game's instructions to follow a more logical flow. Those interested in the details of the game evolution can always check out the commits made on Nov 29 and 30, the dates of the playtestings.

I am eager to use this variation on the game with my CS222 class next semester. I am also considering framing it as a research project, but I need to determine if I will have the spare cycles to pull that off, given my other responsibilities in Spring.

Thanks for reading! I would appreciate if you can help spread the word about this game to folks who may be interested.

Thursday, April 21, 2022

A second round of the Mob Programming RPG in CS222

This follows up on my epic post from earlier this week. I did indeed continue the theme of Mob Programming in Wednesday's class meetings, although I decided to skip the game entirely. Instead, I began each meeting with a recap of the strengths and weaknesses of Monday: they had learned the fundamentals of Mob Programming, but there were ways in which the game got in the way of the task at hand. I also shared with them my observations that they were trying to act like race cars rather than bulldozers and, in so doing, abandoned the values of TDD and Clean Code, which are the actual topics of the course. We kept the context of FizzBuzz, but we started again with a fresh project.

We used mobti.me once again but with only the two default roles, Navigator and Driver. I was unable to acquire a wireless keyboard in time for us to sit in a row and pass it down, so I copied the same series of names to the whiteboard as we used in the app. This way, students knew when their turn was coming without our having to go to the app's browser window first. I also ensured that audio was working properly before we began.

Another notable difference was that, believe it or not, I had fewer students in both sections on Wednesday than I did on Monday. I had expected the inverse, that those who skipped Monday would hear that there was something really interesting and engaging happening and that this would bring them back to class. (Insert laugh track here.) Instead, the Section 1 had only five attending students, three of whom had been there on Monday, and Section 2 had six attendants, five of whom had been there Monday. The new students looked a little intimidated, but it did not take long for them to integrate into the process.

Both groups got much farther into the project than they had before. Three factors seemed to contribute to their success: they had experience now with the problem (as Fred Brooks said, plan on building one to throw away, because you will anyway); they had experience with mobbing; and I had frontloaded to them a strong reminder to use TDD rigorously. We got through two complete rotations in the first class with time to discuss the experience at the end. We got through almost two rotations in the second class, but I cut off the last Driver-Navigator pair so we could share some conclusions. Between rotations, we took a few minutes to talk about how it was going.

In Section 1, they ran into two categories of problems. One was that the Driver sometimes acted as de facto Navigator, pushing their own vision rather than the mob's. Put another way, the Navigators still tended toward passivity rather than active navigation. We got to talk about this at the end of the class meeting, and I think the students got to a better understanding of this role. The other problem was slipping out of the Red-Green-Refactor rhythm, doing things like refactoring while writing a failing test, or going from passing tests to defining new tests. I shared my observation of this at the midpoint, and there was marked improvement in the second rotation. 

Section 2 was more able to hit the ground running. Various members of the mob held the team accountable to TDD in a more consistent manner. A few Navigators also engaged in improvised dancing while waiting for tests to run. Hey, why not? This group was clearly having some fun with it. They ran into a few problems with failing to meet naming conventions for test names, and toward the end, they headed down a path that would be fruitless, as they tried to factor out essential parts of a method: that is, they would have ended up factoring out every piece into a new method that does the same thing. I tried to help them see that the root problem seems to have been that they started working on a solution (adding a new method to handle something) without really agreeing on what problem they were trying to solve.

During the midpoint discussion with Section 2, a student pointed out that the mob "butted heads" over an issue of how to move forward. I smiled and told them that, back in my day, we just called this "having a conversation." Indeed, that's all it was: a group trying to determine which of two ways to go. It was interesting to me that the students saw this as some kind of competition ("butting heads") rather than the kind of formative argument we should be actively engaging with all the time in higher education.

I am very glad that we spend a second class period exploring Mob Programming. Although neither group fully completed the FizzBuzz problem, they got far enough in to see how a mostly-functioning mob should work. That is, I think it modeled the process sufficiently that a team could take this into their own project work, and crucially, I laid the groundwork to be able to use this in teaching my upper-division courses next semester. I definitely want to add this to my usual arsenal of CS222 tools, although I am not currently in the schedule to teach the course next academic year. That is, indeed, one of the reasons that I have written these posts, so that I can refamiliarize myself with these ideas later.

I am left with the question of whether playing the Mob Programming RPG first was truly necessary. It was useful for me, as someone who has never taught this technique before, to have something to deploy out-of-the-box. However, now that I've seen it in action and spent hours thinking and writing about it, I suspect that I could just start with an exercise like today's. It would be an interesting research study to conduct, although I am certain that the more guided experience a student has with Mob Programming, the better they will understand it.

Tuesday, April 19, 2022

Playing the Mob Programming RPG in CS222

I did something new in Monday's meetings of CS222 Advanced Programming: I had my students play Willem Larson's Mob Programming RPG. A colleague in the games industry turned me on to the idea of mob programming by way of the Mob Mentality Show.  More specifically, the RPG came up in this interview with Joe Justice about mobbing at Tesla. It was the first Mob Mentality Show that I listened to, and it was interesting to jump in with a discussion of how mobbing, which is usually associated with software development, was used for hardware development around electric cars.

Willem Larson was inspired to make a free PbtA-style RPG to teach Mob Programming. Now that scratches a lot of my itches! I encountered a few concerns while reading the rules, including the fact that the introductory script is very long: the amount of ideas presented orally to the team far exceeds what they can remember, especially when you consider that they also are handed three different role descriptions to process. There are certain parts of the instructions that appear incomplete or ambiguous, but rather than start by copy-editing and opening a pull request, I figured I should present the game as-is. Shuhari and all that.

I printed off all the playbooks, reviewed the rules, grabbed the handful of other required supplies, and set off to CS222 Section 1. I figured it was not feasible to plan on everyone sitting in a line, which is recommended in the rules, since I never know how many students are going to show up. I ended up using mobti.me, the first online mob timer I found when searching online for a web-based one. The rules recommend the people on the left and right of the Driver and Navigator help those two manage their XP acquisition, and so to adapt this to haphazard seating, I added the roles "Driver-Helper" and "Navigator-Helper" to the rotated roles.

We used FizzBuzz as our example. Before both classes and in accordance with the game recommendations, I set up separate starter projects. In both cases, I gave a failing unit test as follows:

@Test
public void testFizzBuzz() {
  FizzBuzz fizzBuzz = new FizzBuzz();
  String actual = fizzBuzz.valueOf(1);
  Assertions.assertEquals("1", actual);
}

Of course, without any implementation of FizzBuzz, the test does not compile and hence is "Red." The mobs then started with a failing unit test.

Section 1 proved to be a trial run. I presented the rules as written, answered all the questions, and let them go. Unfortunately, three problems quickly showed up. One was that I had entered the roles in an unhelpful order, which meant that players did not move as intended from Driver to Navigator. After seeing this go poorly, I understood why this sequence is preferable. The other problem was that I did not have the sound configured properly for the online timer. I assumed the problem was that the room's speakers were off (they were) or that my laptop volume was too low (it was). After doing this, though, we still didn't get sound, so I ended up running a parallel timer on my phone. The fact is I had forgotten that the audio buzzer is a configurable option in mobti.me, not a default. Finally, I also noticed that people started putting their badges up, but no one had called out the fact that they had earned XP. Yes, I had announced that when someone earns XP, they should say why; no, the students had no memory of this. It actually took me a while to recognize this error mode, and that put me in a sticky situation: should I interrupt and re-explain the rules? And if I interrupted, should I invalidate or keep the existing badges? I ended up taking the laissez faire approach, although in retrospect, I wish I hadn't.

By the end of one rotation, they had about six or eight badges on the wall, but none of them were authentically earned since no one called out their XP gains; crucially, this means that any student didn't know what valuable thing any other student had just done. Also, throughout the exercise, very few people in the mob participated. The Navigators never really did anything except, occasionally, ask for ideas. They mostly watched the Driver type in reaction to one or two voices in the mob as they talked through a proposed solution at the code level. When these people became Drivers, they just implemented their visions without any Navigator intervention, and as Navigators, they never interacted with the mob.

After the rotation, we had about fifteen minutes left in the class period, so we switched into discussion mode. I explained how I had come across the game, and that I had never played it, nor had I any personal experience in mob programming. I also admitted up front that I noticed them missing that important rule about claiming XP out loud, and I had held back on interrupting their flow. They seemed happy with my candor, and one student even thanked me afterward for running the game. When I asked for their comments, a student pointed out that it didn't feel right, that they didn't think there was a single point of failure, but that at the same time, the ideas weren't going smoothly from the mob to the driver. I pointed out that, if this was what was going wrong, doesn't that mean the Navigator was the single point of failure consistently? After a moment's hesitation, I think the class agreed, although the unwillingness to hold anyone accountable was palpable.

This led to good but brief discussion of the role of the Driver and the Navigator. I pointed out how what they learned in CS120 was, very likely, an antipattern: the Driver works and the Navigator watches. (Maybe we should call this the "Napigator Antipattern".) I pointed out how different the form is when the Navigator has to speak their ideas out loud in such a way that the Driver has to listen and translate it into code. Someone suggested that changing Navigators means that there is not a unified direction for the mob; I made the counterpoint that only changing the Navigator can mean that everyone understands the direction of the mob. Again, I got the sense that they understood it was more complex than it seemed at first blush, but it's hard to say if these particular ideas stuck with the students or not. (In writing this blog post, I did a little research, and it seems some people call it The Strong Technique of the Driver/Navigator pattern when the driver can only do what the navigator suggests. This gives me some nomenclature and resources for talking about how I expect my teams, and the teams in prerequisite courses, to work.)

I was more confident to start the game with Section 2. The same number of students showed up—eight—although more of them late for this section. (Tardiness always irritates me, but cases like this are the most egregious, when someone comes in and, while I'm speaking, loudly asks a friend, "What are we doing?") This time, when explaining the game, I made it clear and explicit, repeating the point that you can only mark the XP if you tell the mob that you earned it. During the pre-game Q&A, students twice asked questions about how they know if they have earned the XP, for cases such as "Listening on the edge of your seat." The answer was easy, and I repeated it verbatim from the instructions: it's up to you to decide.

This section launched right into action, and they clearly were enjoying themselves. Occasionally, someone would say with a smile, "I am listening on the edge of my seat!" There was much more clarity about the roles, as the Drivers acknowledged getting XP for ignoring directions from the mob that didn't come through the navigator, typed things they disagreed with, and asked clarifying questions. Indeed, I think it was in large part the diligent driving that held the Navigators to high standards. Of course, the having the right sequence in place helped too, with the Drivers moving into the Navigator roles before returning to the Mob. For example, a Driver who thought they were typing toward a dead end could, as Navigator, direct the next Driver how to fix it.

There was a lot more excitement and energy in the second section, with people moving around, taping up badges, jotting ideas on the whiteboards, and laughing as they called out their XP earnings. One emergent problem though was that, as roles changed, the new people would wait for things to settle down before starting the next round. That is, a round would end, conversation would stop, and folks would be moving around, cutting out badges, looking at higher level roles, and so on. Even though I encouraged them to just get started, stating that the mob was simply mobbing, the students consistently wanted to wait until everyone was settled and facing front before starting the timer. I wonder if this was because they wanted it to look like a class discussion rather than, well, a mob. This had the effect of significantly interrupting the flow,  killing the energy. It also had the practical effect of using up all our time: so much time was wasted during role rotation that we only had about two minutes for discussion at the end. Fortunately, the students stayed about two minutes after to wrap up the discussion. They also were very helpful in cleaning up the room, for which I am grateful, since we had a colloquium getting set up in the same room for the next hour.

Still, Section 2 did quite well, and with a final score of 31.


During our brief discussion, the students commented that one of the biggest problems with the game is that they spent most of their time looking at their role sheets to figure out how to get points rather than solving the problem before them. This is a serious game design problem, by which I mean it is a serious problem and it is a problem with a serious game. The mechanics of the game here are working against, rather than with, the learning objectives. Indeed, it tempts me to mold what Larsen has so generously provided from his intuition into something that is more rooted in theories of teaching and learning. 

Another student made a good observation about a hesitancy to interrupt someone else's flow. They said that in their final project team, they often felt like others knew what they wanted to do, and so the inclination was to not interrupt even if the direction was not understood. "I don't want to interrupt, and I'll figure it out later," is how the reasoning goes. Spoiler alert: later never came. This allowed us, as the previous section has done, to discuss the Navigator and the fascinating wisdom of rotating that role through the whole team. If everyone on the team can take a turn explaining where the team is going, then everyone understands it, and that means everyone is rowing in the same direction.

This leads me to the most startling observation of the exercise: my students did not come near to solving the problem. I've heard reports and studies about FizzBuzz is still an effective filter since most people who apply for a programming job cannot solve it. Surely, I thought in my naïveté, my students would be able to deploy TDD to come up with at least most of a solution. It was not the case.

Again, we must begin with a disclaimer that they were working under the distractions of the game. They were told, specifically, to try to get as many points as possible. In theory, the points should be earned while moving toward a solution to FizzBuzz, but especially in Section 2, many points were earned by doing the corresponding actions in a vacuous or even antiproductive manner. It's possible that their working memories were completely overloaded in thinking about the game rather than the problem. 

That said, I don't think this explains away all the different error modes that I observed, which suggested more fundamental problems. Both sections showed an alarming lack of rigor around TDD, a practice that is supposed to be a focal point of our work this semester. They are all supposed to be doing Beck-style Test-Driven Development throughout their nine-week projects. Judging from their submitted artifacts, many appear to be doing so. During the game, though, nobody wrote out a plan of test cases that would lead to success: they all started in with coding without any real plan. Indeed, despite the instructions specifically saying that Mob Programming should feel like a bulldozer rather than a race car, the game fought against this: the only way to get points fast is to work fast, so my students throw discipline out the window. I only noted one instance in which a student called out for a failing test to be written before production code. Otherwise, it was a kind of erratic hopping between writing tests and writing production code, with refactoring never really touched. Indeed, in one of the sections, a student said, out loud, in front of me, "Let's just skip refactoring and do it later." Spoiler alert: later never came. However, the horror of saying such a thing in front of the professor who has been proclaiming the importance of refactoring for 13 weeks also points to something subtle and important: I believe I was witnessing authentic student practice. That is, even though I was sitting in the back row, saying nothing, I got the sense that they were not performing any show for my benefit. I was seeing how they really work.

Common definitions of the Driver/Navigator pattern specify that the Navigator should be describing an approach, and the driver turns that into code. In the RPG, it is presented more bluntly: "... [T]he Driver’s job is to type what the Navigator instructs them to type. The Navigator’s job is to sift the ideas of the mob and instruct the Driver what to type." My students took this very literally: the Navigators told the Drivers what to type, keystroke by keystroke. Indeed, one student typed in exactly what the Navigator said, even though it was clearly a syntax error, and then claimed an XP for typing something they disagreed with. The clear problem with this literal interpretation is that it keeps all of the discourse at the level of keystrokes rather than ideas. No wonder they could not solve the problem if they were trying to do so at the level of parentheses! In other cases, however, it wasn't clear if students were being overly literal or if they really just couldn't translate an implementation idea to code. For example, one student said, "We need an 'if' statement: if 'i' is 3." The Driver then keyed in "if (i is 3)". It took over ten seconds for the Navigator to explain that what they meant was "equals equals." Notice here that they did not mean "equals equals" at all. They meant "i is 3," but that turns into "i==3" in languages like Java. This was a breakdown caused by the inability of the students to have discourse about the code at a reasonable level. Not knowing the names for punctuation symbols used throughout programming languages didn't help them either. It seems like a case where the masters have been lecturing them about the Parthenon, but they should have been lecturing about the optative.

I had hoped that my initial failing unit test would push the students to see a clear model-view separation in the problem, but that didn't happen either. I thought it would be obvious from our various class discussions that there is a model that computes the answer and a view that prints it out. The first group, after getting the initial test to pass, agreed to change the test case itself so that FizzBuzz's valueOf method should return an integer. I am still uncertain how they thought this would help. Truly, I cannot get my mind into a state where I can see this as useful, neither the specific change nor the idea that the test I would give them is somehow flawed at the level of static typing. Their implementation of valueOf just ended up being to return the passed-in value. They then added a second method, called isDivisible, that took an int and returned the String that should be printed for it. If you have any experience programming, this should boggle your mind, yet my students happily moved forward with this. Suffice it to say that the rest of their code made no real progress toward a solution, not in any deliberate, structured, or sensible way. If they were ever to get to a solution, it would have been essentially by chance.

In the second section, they started more sensibly, getting the first case to pass in the obvious way and then adding a test for the third word being "Fizz." In doing so, they (seemingly unknowingly) removed the code that solved the first test. However, when they went to run the unit tests, they only ran the new one, the case for three, which passed. I saw a clear regression defect, but they did not, as they immediately went on to writing the code for the "Buzz" case—without having run all the tests, without refactoring, and without writing a failing test first. At some point, several minutes later, someone in the mob saw that only one test was being run, and they instructed the Navigator to ensure all the tests were run. This, then, caught the regression. I suspect that the student who noted the oversight would have noticed it earlier had they not been face-down in role sheets. Of course, in a semester where we learned "Always run all the tests" on the second day of class, I hoped that this knowledge would be more widely distributed, but this seems not to be the case.

Perhaps the most important thing I gained from the Mob Programming RPG were the insights into how my students think and work. Techniques that I've shown them and required on their projects for months are clearly not part of their normal operating mode. That suggests that there really are a few anchor people who are ensuring the right things get submitted on a team, but that this is not being done in a way that the ideas are being disseminated. During the game, I saw how some strong voices could derail the whole team, moving in directions that were not just contrary to our principles, but not even syntactically valid. It makes me want to pull Mob Programming earlier into the semester, although I recognize a logistical problem with that: we're at a point now where about half the class does not show up and a few students have withdrawn. What started as 20-some students in the room has turned into about eight who show up regularly. We could not possibly finish a whole mob cycle with 20 in one class session, which means I would have to split it over multiple days and then deal with absences from the rotation. Mobti.me would not support this, but of course, I'm already imagining whipping up a more robust replacement in Flutter. I need to think about how to deal with this since the benefits of the exercise certainly seem worth the team, even if just for the discussion and my observation of real student practice.

Making my own Mob Programming RPG sounds like a great scholarly endeavor. I think using PbtA playbooks is a clever idea, but the mental load on my students was clearly too much. I am sure that professionals would approach the game differently than undergraduates. Anyone with a few years under their belts would be more adept at programming, communication, and coordination. Crucially, they would also be more familiar with holding each other accountable. My students are trained, well before they get to me, that they should never criticize their peers for anything they do or say. That is completely self-destructive for collaborative software development, of course, but my pointing that out does not change a cultural phenomenon. Students are also swimming in a sea of points, and so if they see that a particular action earns points, they will pursue it regardless of prudence. A good example is in Larsen's Rear Admiral role, in which a player can earn XP for speaking quietly in the Navigator's ear. Twice in the second section, students walked up to the Navigator, whispered something, and walked away, claiming XP. Yet, although what was whispered was actually good advice at the time, they did not regard whether or not the Navigator was in a position to hear or understand, and what the Rear Admiral had to say ought to have just been said aloud as part of the mob. My own hypothetical version of a Mob Programming RPG could capture not just particular learning outcomes of my curriculum, but it could also account for the spaces, headcounts, and population that I deal with regularly.

Looking to the immediate future, I would like both sections of the class to have the opportunity to deploy mobbing to actually solve the FizzBuzz problem. I plan to use another class period this week to repeat the exercise but without the game. That is, we can just do "regular mobbing", using the mob timer with a Driver and Navigator, and see if we can make progress. We will have to start again from scratch since the code from the end of each session is not worth saving. I am concerned that Section 1 may not have seen enough of the practical execution of mobbing, but I think I will try to keep the two exercises in sync rather than allow the two sections to diverge. I will need to start by pointing out the difference between the Navigator telling the Driver what to type vs. describing an approach that the Driver turns into code. Also, I will tighten up role transitions by ensuring that everyone knows the sequence of roles, either by finding a wireless keyboard to pass down a literal line or by copying the name sequence to the board so it's not hidden in a browser window. I am tempted to remind them about Red-Green-Refactor and model-view separation; my hope that they simply remember these may be in vain.

I know that we are all creatures of habit, and I do not expect that any team will make radical changes to their practices in the last two weeks of a nine week project. However, I hope that these exercises will get them thinking critically about their team experience, giving them something concrete to compare it to, and give them a vision for what might be possible. The role of this course in the curriculum is to prepare students for team- and project-oriented upper-division courses, and so I am eager to see how I can leverage this exercise myself as I start thinking about Fall.

This story continues in the next post.

Thursday, September 5, 2019

How I might teach using the Working Software Cycle

I've been out of teaching CS222 for several semesters now, but it still occupies my mind from time to time. This afternoon, I read the latest blog post by Ron Jeffries, which concludes with this:

There is a particular trick to the working software cycle, as I prefer to do it. It goes like this:
  1. Start with working software. Ideally an “End Card”, ideally bug-free, but something that runs. Your existing legacy product will do if that’s all you’ve got.
  2. Select a very simple next feature to do. No, that’s too big, even simpler. There you go.
  3. Write an automated example that will fail until that feature works, and then succeed. If it requires more than one example, go back to #2.
  4. Start programming: Run the example; add some code; run the example; every time the example runs, refine and improve the code a bit. When you’re satisfied with the example and code quality, that bit of feature is ready to ship.
  5. You’re back to working software, with a new feature. Go to 2.

It made me think about the nine-week project in CS222 and its three three-week iterations. Students always struggle with getting a productive rhythm of software development. Next time I teach the course, I need to think about Jeffries' idea instead. That is, rather than ask them to write up plans for what to have done in three weeks, have them come up with something to have done, say, by tomorrow. Make the loop even tighter so they can both expose their misunderstanding about planning and feel what its like to be productive. (Of course, they should also start in a bug-free condition, which is also a challenge for them!)

Also, putting this together makes me think I should write more often. We're wrapping up the third week of the semester, and I feel like I've been thrashing. That usually means its time to schedule reflection and writing time and hold myself accountable to the schedule.

Tuesday, November 6, 2018

Throwing paper airplanes to learn agile methods

My game programming class has started their final project, which is to be completed in two iterations. My intention was that they would deploy what they learned in the Advanced Programming prerequisite to develop good user stories and plans, but many of them asked specifically for some kind of lesson or activity to get a better understanding of agile methods in general and Scrum in particular. I spent some time yesterday searching for best practices here, but none of the canned exercises I could find satisfied my goals. I wanted something that would teach the basic structure of Scrum and include the use of a task tracking board. I ended up making some modifications to ideas I found online and deployed them in class today.

To start, I had them play this online Battleship game that is used by some trainers to get people—especially management—to understand the fundamentals of agile approaches. In the game, you can choose how many shots to take at a time before you get feedback about whether or not they hit. I had half the class work in a 40-shot increment and the other half work in 10 shots. As one would predict, the half with shorter increments had much higher scores than the others. Not only that, they were also done faster: the 40-shot students were among the last done because they had to be so judicious with their resources. I asked the class the difference between the two groups, and they correctly identified feedback as the key. I quickly explained how this is a decision we make when choosing, say, a waterfall-based or an agile methodology, and then we moved on.

I had them count off by fours to make four teams who don't normally work together, and I put each one in one of the "alleys" between tables in RB355. I drew a template task board, with columns for Story, Not Yet Started, In Progress, and Done, and had they copy these to their boards. I gave an overview of what would happen: a three-minute planning meeting that would generate tasks on sticky notes, followed by three three-minute "days" of a Sprint, followed by a review and retrospective meeting, and then another series just like that. They had seen some aspects of this before, so we were able to get right to work, and at this point, they were very curious about the activity we were going to do. I handed out their user stories, which are transcribed below, and after giving them about two minutes to read the sheet, we got into the planning meetings.

Product Backlog

Fleet
Build a fleet of at least four paper airplanes that satisfy the following criteria:
  • A plane must be folded from 8.5”x5.5” paper only. No additional material may be added and no extra material may be removed.
  • The nose of the plane must be blunted to avoid accidental injury.
  • The plane must have crisp, clean folds. 
  • A plane that satisfies the above conditions must bear all team members’ initials. This marks the plane as part of the fleet. Once initialed, a plane may not be removed from the fleet.\
Branding
Each team has its own name and logo.
  • The logo must be publicly displayed by the team on their board.
  • The public display must have each team member’s initials to indicate their approval.
Hangar
I have a hangar that indicates the starting position of my fleet. The hangar satisfies the following conditions.
  • The hangar covers at least 11”x8.5” of the floor and be at least 1/2” off the ground.
  • The hangar features the team’s logo.
Flight
Maximize the number of planes from the fleet that can touch the far wall while still in flight.
  • The hangar is no more than two floor tiles from a wall.
  • The plane thrower’s feet must not be more than two floor tiles from the wall.
  • Sliding along the floor to the far wall does not satisfy the flight goal. The plane must strike the wall while still in the air.
  • A plane that has met the goal is placed next to the hangar. No other planes may be next to the hangar.
  • Earn points equal to the number of planes that pass the mark minus the number of planes in the fleet that do not.
This is a customization of the "agile paper plane game" that you can find in various places online, such as here. All versions of the game I came across shared the property that each member of the team had to make one fold in planes. I did not like that approach, since that's not generally how (my) agile teams work. They don't have every piece of work move through every person like an assembly line, but instead, they rely on clear communication of both serial and parallel work. I also took inspiration from Lego4Scrum, where the tasks look a lot more like real software development work. I don't have the budget to buy enough Lego kits and have them sent via expedited shipping, so I combined the two ideas.

I provided both whole and half sheets of paper for their use, as well as the sticky notes and, after they realized that some of the sticky notes were not very sticky, some adhesive tape. The students got right to work and stayed within the bounds of what activities belonged in which timeslice. They were clearly and intensely focused, which made it both rewarding when a plane soared straight to the far wall and comical when so many of them flipped and flitted about before nosediving into the ground.

I noticed as they worked that some teams were using 8.5"x11" sheets to fold their airplanes, but I didn't challenge them on it right away. Rather, at the end, I asked them to review the conditions of satisfaction and have a chance to come clean. One team had recognized at the end of the first sprint that they were in violation of the airplane acceptance rules—one of the emergent leaders pointed out that he only read "8.5x..." and assumed the rest would read "11" and not "5.5". They made tasks to deconstruct their hangar and planes and recreate them to satisfy the constraints and did so in the second sprint. Another team had not read the conditions carefully at all and only realized they were in paper size violation when the other team told their story.

I asked each team to share stories about what changed between the two Sprints, and the results were fascinating. One team discovered the value of cross-functional teams. In their first Sprint, they distributed tasks and as a result only had two different plane designs, neither of which were making it across the room; in the second Sprint, they all worked on each piece and made more progress. Another team pointed out that they jumped into the plane-folding task with gusto because they were excited about that, but that their excitement was not actually producing anything that satisfied the conditions. That team added a more explicit research step in the second Sprint, which helped them vary their designs and produce more useful planes. I pointed out that Scrum allows for "spikes" that are used for just such cases. I wish I had taken better notes, because the other two teams also made changes to their process in such a way that highlighted core agile practices and attitudes, but now I cannot remember them. It's like I tell my students regularly: "I will remember this" is the primary fallacy we tell ourselves.

At the end, I asked them to share their insights about what they learned from the exercise that could be applied to their final projects, and the results of this were excellent as well. Topics that were brought up include the importance of making estimates (and in particular, of making them large enough), giving adequate time to planning, articulating tasks in a clear and measurable fashion, and keeping everyone aware of your progress on your tasks.

I was really surprised by how well the exercise went, perhaps in part because it's so unlike the kinds of things I normally do in class. I generally prefer to do and reflect on authentic work rather than small simulations or throwaway work, but here I think it let the students focus on the process rather than the minutiae of programming. I was really impressed by their reflections on the process and its implications for their project. My own professional preparation with agile software development methods allowed me to hear their stories and contextualize them within more general principles and rules.

There were a few things that I would change for next time. It wasn't clear to me that having a "Stories" task on the board mattered at all, or that anyone used it the way I intended. The exercise would  have been fine without it. A couple parts of the handout can be clarified. I had two students come up to me with what I would call "pointy" planes and asked if they were "blunt enough." I started telling them to use their eyes to measure bluntness: if it fits in your eyeball, it's too sharp. This was maybe a bit challenging to interpret, so maybe another measurement of bluntness is appropriate. In my description of the hangar, I meant that it should have a volume of at least 11"x8.5"x0.5" and be sitting on the ground, and I should have just said it that way. Instead, I worded it as 1/2" off the ground, which some students interpreted as elevated, like on a chair or table. One team was also unclear about whether it was the front or the back of the hangar that should be within two tiles of the wall, although this was also the team that tried throwing their planes at the near wall instead of the far wall, so I think this was an intentional trying to game the system and not an honest mistake. (We did not come back to the point that this one group tried to interpret the rules in their favor rather than seek confirmation or favor value for the customer.) Almost every team ended up having one person write each other team members' initials on their planes and logo, rather than what I intended, which was that each person inspect the work and then initial it. I can make that more clear.

That's the story of my game programming class today, finished writing just in time to go to my next class of the day. As always, please feel free to leave a comment about your experience with agile training games or ask about the activities of the day. I expect I will reuse the exercise again in a future course.

Monday, April 2, 2018

Burning down hours, burning up coffee

My game development studio decided, at the end of Sprint 2, to start tracking how many cups of coffee they consume from our communal Keurig each day. Truly, this is an exceptional team in terms of coffee consumption, and they recognized this might be an interesting bit of data to track. They finished Sprint 3 last Friday, and so today I tallied up the results on the coffee tracker, and I added a new vertical to the burndown chart:

The careful observer will note that I had a bit of trouble placing the dots, since we're measuring cups of coffee consumed on a different scale than hours burned down. Hours remaining are counted at the beginning of each MWF meeting, so the first data point is the total original estimate and steady leads to zero. For coffee, we're counting cups consumed each day, including the first and last days.

To facilitate smoother tracking for Sprint 4, I added a new right vertical to my template:
Time will tell if the right vertical axis values are correct.

Wednesday, December 20, 2017

Improving Collaboration with the Heart of Agile: Notes from Alistair Cockburn's Interview for 1st Conference

My students and regular readers will likely remember that I am a fan of Alistair Cockburn's work. His book on software development is one of the best I've ever read, and I have been reading his blog for years. Earlier this week, he linked to a video in which he was interviewed by the organizers of 1st Conference in Melbourne. The conference has refocused to emphasize Cockburn's latest conceptual model of agility, the Heart of Agile.


I listened to the interview while doing some painting, and a few things stuck out to me that I want to remember. First and perhaps trivially, Cockburn explains that he lives in different places for a few months at a time, traveling the world with two backpacks and a suitcase that contain his possessions. He travels the world like an old-world bard, sharing stories that he has heard along the way. I don't know that this is relevant to my teaching and professional practice, but it is interesting. I do believe that such a lifestyle would give someone a very different perspective on what the prevailing culture assumes to be true.

All the discussion of Heart of Agile makes me think that perhaps this is something I should introduce in my Spring courses, particularly the game production studio course. I have become an advocate of inspirational posters that are tied to team identity, things like having the vision statement or Sprint theme posted publicly so that we can look up and see it. Perhaps I can post something like this canonical representation of Heart of Agile in the studio space and see how students react.

There's a short discussion in the interview where Cockburn talks about how this model is not designed specifically for software development but for organizations in general. He hypothesizes that it was discovered in software development because we have a particularly keen understanding of what "deliver" means, but he goes on to explain how this model is being used also by NGOs. During this part of the interview, I kept thinking, "What if the university adopted this idea?" Cockburn points out that it always starts with micro-steps. I am not sure even what micro-steps the university could take, but that would have to be the topic of another essay. Actually, watching a part of the video again, I do know what it would be, since he talked specifically about what a big organization can do: center its budget upon improving collaboration. I think it's pretty clear that we don't do that at the university, and I wonder what it would look like.

Around the 25-minute mark, when asked what a good starting spot is for an organization, Cockburn describes an exercise focused on improving collaboration. As he discussed it, I had visions of running this exercise with student teams, either in the studio or in a class like CS222, where teams inevitably have to deal with the real problems of failed collaboration attempts. The exercise involves each person drawing a diagram of all the people they have to collaborate with to get something shipped. Mark each collaboration as whether it needs to be weak, medium, or strong, and label each one with the current quality of the collaboration on a 1–10 scale. Finally, pick out the two collaborations that you consider the most important, and name one thing that you personally can do to improve that collaboration. A second step would be to write two or three stories for each collaboration about a time that it has worked well; this leverages the idea that if we look for good, we can create more good. I can see both of these being valuable for the kinds of student projects I mentor, even though their collaborative networks may be a bit small. Their version of "deliver" is a bit different from an industrial sense, but as Cockburn says, the Heart of Agile should apply anyway.

The final element of the conversation that jumped out at my was the discussion of host-leadership. This was not a phrase I had heard before, and Cockburn praised the interviewer for his reference to it. Cockburn makes the claim that , "'Servant-leader' is an outmoded term that is not serving the purpose anymore." This surprised me, since I feel like I generally understand the concept of servant-leadership and have found it a useful metaphor. Host-leadership uses the metaphor of host, and the movement seems to be grounded in the book, Host: Six New Roles of Engagement. I have not read the book, but I came across this summary of the six roles, written by the book's co-author. The roles are Initiator, Inviter, Space Creator, Gatekeeper, Connector, and Co-Participator. Nothing about the description struck me as particularly novel, and I admit I have not searched for empirical evidence to support any of the claims in either model. I am left having to acknowledge Cockburn's vast experience in visiting many different organizations in many different places, and that he must be seeing dysfunctional organizations that need new metaphors. The space of my experience is so tightly limited to the classes and courses I myself control, I know that my perspective is myopic. Even the whole "Agile is Dead" meme—with the word "agile" being entirely co-opted for profit, and causing the necessity of finding the real heart again—is not something I personally experience, but only something I vicariously experience through readings, interviews, and discussions. Reading about host-leadership is not something high on my list of priorities, as I've become more interested in concepts of safety as expressed most concretely in Anzeneering. Still, I will have to keep my ear to the ground and talk to my network of friends and alumni in industry to hear how these ideas resonate.

Saturday, March 25, 2017

Adapting the retrospective format for a struggling team

My Spring Game Studio team has been having a bit of trouble hitting stride. We just finished our fourth sprint on Friday, but it was the fourth failed sprint in a row, with fundamental work incomplete and the executable release inadequate for end-user testing. I saw this coming late Thursday night, when I had a few minutes to manually test the build, and so the failure during the Sprint Review meeting didn't surprise me as it did some of the team members. It may be worth noting that I did post to Slack right away that I had discovered a defect, but several team members didn't see the message. In any case, I kept turning this over in my head as I tried to sleep Thursday night. I don't remember the last time one of my teams had four failed sprints in a row: what should I do to help them come together? My default Sprint Retrospective format involves distributing sticky notes on which students write and then post submissions to these four questions: What did we do well? What did we learn? What should we do differently? What still puzzles us? That format has been generally useful, and it has been specifically useful at helping me design interventions around specific needs. Given that the team has had three previous retrospectives, where the same issues kept coming up but were never really addressed, I began to think that a change in retrospective format was in order.

In the morning, I flipped through Patrick Kua's The Retrospective Handbook for inspiration. I think I had come across a reference to this book on Martin Fowler's bliki, but it had been some time since I read it. Kua describes a format called "Solution-Focused Goal-Driven Retrospectives," which he credits to Jason Yip—in fact, Kua's presentations is just a copy of Yip's blog post, so if you read that, you've got the idea. Two things struck me about this format, making me think that it would be useful for my purposes. First, by starting with "the miracle question," you can help the team think about observable properties of desirable end states. This does seem like it would lead to the identification of shared goals better than my traditional retrospective format. Second, it still results in measurable actions to do in the coming iteration to incrementally improve.

I rolled this out on Friday right after our Sprint Review meeting. We primed with the Retrospective Prime Directive, and I pointed out—honestly, hopefully not too judgmentally—that the team had four failed sprints in a row, and that I was changing the retrospective format to help them identify shared goals. I wrote the Miracle Question on the board: "Imagine that a miracle occurred and all our problems have been solved. How could you tell? What would be different?" There was a palpable sense of surprise and shock in the room. A few students gasped, some said things like, "Whoah... I don't know" as they started turning the question over in their minds. One even claimed that he did not like the question, but this was clearly said in way that indicated he did like the question: he didn't like the fact that it was so hard for him to answer!

When I use my traditional retrospective approach, I invite the students to organically form clusters as they post their notes, but the clustering is usually pretty loose. Themes that are distributed across multiple columns cannot be clustered at all. Most students get up, post their notes, then sit down, so it's really just the last few who are making clusters. For this exercise, we moved all the tables back so that everyone would have room to reach the board at once. Three or four students still retreated to the small gap behind the table, but I called them out on this and made them join the group at the front—and I'm glad I did, despite a little whinging from them. As they formed clusters around goals, I asked them to articulate the goals. This also was much more active than my usual approach, with students passing markers around, dividing big clusters, and revising each others' articulations of the goals.
The finished board with 13 shared goals
When I asked them to rank the team on a 0-10 scale in terms of meeting these goals, the first estimates were in the 4-5 range. Then someone suggested the team should look at how many of the goals they have actually met, and the estimates dropped to 2-3. It was an interesting moment of realization, that the team really did want to meet these goals, but they recognized that they still had a lot of trouble. This set up the third step of the retrospective perfectly: to bring the team back up by pointing out that 3 is still not zero! We listed off the practices we were following that were leading us toward our goals, with a team member serving as scribe on a side board.

This led nicely into a discussion of what specific practices we wanted to adopt to take our 3 to a 4 over the next short sprint. Most of the suggestions were clear and came to quick consensus. There was one that had some contention, though, as we tried to sort out the root of the problem. It started with a suggestion to clarify the conditions of satisfaction on the user stories, but when I looked at the conditions of satisfaction, I couldn't see that they were unclear. Of course, I acknowledged that I had written them, and so the root problem could have been that I was assuming domain knowledge that the team didn't have. The discussion raised a bigger problem, though, which I think was the real root: team members had focused myopically on completing the tasks that we had identified during sprint planning, but they never actually went back and read the story name and conditions of satisfaction as they considered validation. Hence, individual tasks were deemed to be validated when considered atomically, in a way that they would never have done if they had been held to the conditions of satisfaction criteria. The result of this was that the tasks were all complete but the story was not satisfied. We never did settle on a concrete action item to solve this, although we agreed that the discussion would make us more sensitive to the articulation of both tasks and conditions of satisfaction in the coming planning meeting. As I look back on it, this may have been a good opportunity to deploy Five Whys to try to get to root causes, but the truth is we were also fighting the clock at this point.

I think this format helped my team to articulate and discuss critical team issues that they had not been confronting before. Whether or not it makes an observable impact in the coming sprint will have to wait for a future blog post. I will need to think about adding this format to my tool belt. I am not sure if I want to replace it as my go-to structure, but I would like to try deploying it earlier with a team to see if it helps with the identification of shared goals.

Friday, July 22, 2011

Having an impact across campus

Following up on yesterday's post about stand-up meetings, I heard a great story today about an impact that the Morgan's Raid team has had in a distant corner of Ball State University campus.

Towards the end of the Spring semester, James Mitchell from the Career Center gave a one-hour workshop called "How to Market Your Immersive Learning Experience." This was in the middle of the sprint, so he observed the team hold one of their stand-up meetings before the workshop. This is the short meeting at the start of each work day in which each team member shares what they have done since yesterday, what they plan to have done for tomorrow, and what impediments are in the way.

Today is the last day of the Digital Archaeology Project, and James joined us to give the workshop to this group of students. He told me that he was so impressed by the Morgan's Raid team's stand-up meeting that he has pushed the staff of the Career Center to do something similar, with the hope of improving communication and camaraderie.

Score one for agile philosophy!

Tuesday, August 3, 2010

Planning Poker with Undergraduates

I have spent many hours working on the product backlog for Fall's Game Programming (CS315) class, in which the students will implement the Morgan's Raid game. Originally, I specified the story points for every user story, but I was concerned that my estimates were not representative, especially since my teams were comprised entirely of novices who are familiar with neither the technology nor architecture.  Following the advice in Clinton Keith's Agile Game Development with Scrum, I decided that a planning poker session could be the best approach for reliably determining story points. Briefly, in a planning poker session, each participant has a hand of cards, and each card has a number on it. For every user story, the participants choose and then simultaneously reveal the number of story points they chose, repeating until consensus is reached. This facilitates communication among stakeholders about the product backlog.

My backlog currently has about 70 user stories, about 25 of which are high priority. An ideal planning poker session would contain stakeholders with areas of expertise relevant to the project. When dealing with undergraduates, there are no experts, but the gulf between novice and expert itself provides a motivation for planning poker. Although I work with undergraduates regularly, I still find that I often make mistakes when estimating how long various tasks will take them, especially when integrating ideas that I have internalized but that are new to them. In a project involving a combination of object-oriented and entity-oriented design, Scrum, continuous integration, and unit testing --- all of which are new to the students --- there are ample opportunities for estimation errors! A planning poker session, I figured, could help us determine more accurate story points than if I did it myself. This would also be an excuse to explain the various parts of the experience to a subset of Fall's class, giving me practice and seeding the class with students who have already seen some of the ideas.

(A parenthetical story: Last night, my wife asked me about this morning's meeting, and I told her briefly what it was about. My brief explanation was completely insufficient, so I explained to her some principles of agile software development, Scrum, continuous integration, and planning poker. It seems that, despite the effort I have invested in preparing for the course, I only ever really explained it to her as "working on my spreadsheets." Explaining all of these things to her --- who has as much experience with these ideas as many of my students --- was a great experience for me. This also means that she probably doesn't read my blog, so I can safely write about her here, as long as we all keep our mouths shut.)

I sent out an invitation to some of the students I know who are signed up for CS315, using Doodle to find the time that most could meet. I wish I could have had them all, since I chose them for their breadth of experience and perspective, but the best I could do was Tuesday morning with four of the invited. This morning, one informed me he could not attend, and another did not show, so the meeting went forward with me and the two students. Not counting coffee and bagel time, we worked for about 90 minutes on the backlog and covered all the high priority items. I don't know anything about the programming skills of these two students, but I will say that if I have a class full of students as clever and motivated as them, this semester will be fantastic. As one might expect, the first few were a little rocky as I had to explain some of the background and we had to get a feel for the abstract measurement of story points. We quickly hit stride, and the story point negotiation revealed places where more detail or more stories were needed.

It so happens that all three of us at the meeting are gamers, and it was interesting to engage in planning poker as a cooperative game, especially given my recent interest and readings on software development as a cooperative game. Having this meeting face-to-face, it was fun to choose point values and hold the card face-down while waiting for the others to choose a value: there was the tension of anticipation, the climax of revealing values, and verbal and non-verbal negotiation, and the joy of consensus. In fact, in the few cases where we all chose the same value the first time, it definitely felt like a "win." The experience was a game in Huizinga's sense, especially in the construction of a time-boxed community of players in a shared experience. Qualitative technical communication researchers, take note for potential future research opportunities!

I am confident that the values we determined are reasonable and will give realistic measurements of teams' velocity. Based on this positive experience, I plan to have another planning poker meeting with some volunteers once we make progress on the high-priority user stories. I hope that the experience was as enjoyable for the students as it was for me. My only regret is that I did not take a picture of my awesome planning poker cards before I left, but they are in my filing cabinet for another day. Now if that's not reason enough to come back for more blog, I don't know what is.

Saturday, June 26, 2010

Agile methods and project management: the design of a project-oriented undergraduate game programming course

Earlier, I wrote about software architectural concerns for a course I am teaching in the Fall. In this 15-week course, I will be directing a team in the production of a history education computer game intended for Indiana's fourth graders. Specifically, the game explores Morgan's Raid of Southeastern Indiana. The game has already been designed, and I'm in the midst of writing the technical specification now. This tech spec will be used by the students involved in the game's production in Fall.

I am approaching this project with a modicum of trepidation. I have taught game programming courses in the past, managing teams of (if my memory is correct) five, four, and nine students. I have 30 students enrolled in Fall, an order of magnitude beyond the size of any team I have managed before. Beyond the sheer number of students, the distribution is not ideal: there will be ~30 Computer Science majors in the formal class and one Art major producing graphics. The artist is supported as an Honors Fellow and so can work up to 10 hours per week. Rather than dwell on what I would like to have, I need to focus on what to do with hand I have been dealt.

I have engaged in many conversations about this course, and I have received some wonderful ideas from both friends and friendly strangers. I am writing this post in order to foster further discussion with any interested parties and stakeholders, but before I go into the advice I have received and am considering, it is worth listing the invariants:
  • There will be 30 undergraduate CS majors and minors of mixed experience level. They will have taken at least the standard foundations courses for my department: CS1 and CS2 in Java, Discrete Math, Calculus, and Data Structures & Algorithms, also in Java. Most will have taken some upper-level courses, but very few (maybe only one) will have taken software engineering. By my guess, about one-third of the students will have been involved with a semester-long software development project in the past, mostly from either software engineering courses or my HCI course.
  • The class is scheduled for one-hour meetings at 2PM three times a week: Monday, Wednesday, Friday.
  • The class is scheduled to meet in a conventional classroom. Thirty people in one of those rooms is very tight, making group discussion awkward though not impossible. We do not have any single lab where the class could meet regularly.
  • I have to assign grades to the students.
  • I cannot "fire" a student who satisfies the prerequisites and is enrolled, though students may drop the class without notifying me, until about halfway through the semester.
  • We do not have a dedicated persistent space, although there are CS major labs that can comfortably sit 10-15 students at a time.
  • I do not have tenure.
In addition to the invariants, there are some possibilities:
  • We may be able to occasionally use the Schwartz Digital Complex learning pods room, which has six long tables for meeting and the capability to share screens across tables.
  • I may be able to recruit some additional artists and musicians through colleagues' courses in other departments, or potentially on-the-side work by students who want to enhance their portfolios.
  • There is a lab being renovated this Summer for use by students doing research-oriented coursework, primarily undergraduates involved in independent studies. We may be able to co-opt some of this space, but we would not have exclusive use of it (e.g. there are lots of whiteboards in the labs, but we cannot assume that what we write there will stay there for long).
I have not yet finished the technical specification, but right now, these are the specific technologies that I would like to incorporate:
Without further ado, here are some of the project management ideas that have come up in my discussions. More accurately, these are the distillations of numerous discussions as well as readings and previous teaching experience.


The students are working for me.

On the first day of class, I intend to inform the students that they are working for me, and they are obligated to work a minimum of 10 hours per week on this class. Experience has shown that students often balk at this, though I mention it in all my classes. The math is simple: 12 credit-hours is a full-time student; 40 hours per week is a full-time job; this is a 3 credit-hour class. What they get in exchange for their effort, of course, is involvement in a very cool software development project that will be distributed throughout Indiana and beyond.

A colleague in Art runs a true studio-based learning environment. He was concerned that, although his students had developed significant technical skill, they had not yet understood deadlines and time management across projects. His solution: pink slips. Early in the semester, in order to establish the tenor of the class, if a student did not meet expectations or deadline, he would literally give them a pink slip and tell them that they lost their job and will be replaced by someone who respects the team. Of course, this was really a teaching moment---he could not actually fire students any more than I can. However, he said that students understood the message and, from then on, worked more explicitly at managing their time.

Along these lines, I am still considering the educational implications of the quotation from Alistair Cockburn that I wrote about earlier:
Use an agile process with the smallest number of people possible to get the job done; let the rest of the people do anything they want just so long as they don’t interfere with the progress of the development team. (From Agile Software Development: The Cooperative Game, second edition. Emphasis in original.)
Several colleagues whose teaching I admire have recommended naming the group to remind the students that this is not a conventional class, but rather a collaborative production effort. To this end, I would like to have a catchy name for our studio along with a professional-quality logo. It would be nice to have student input on this name, but it's not worth the time it would take to hold a class discussion. I see two possibilities:
  1. Come up with a name and a logo this Summer and introduce students to it on the first class meeting. This will go along with the mental model of the students' being hired into the studio.
  2. During the first week of class, push all of this discussion into Google Wave, including gadgets for voting. This will get students used to using Wave for collaboration, including the use of extensions.


Students, teams, and roles

Students will work in teams, because that's how software is built. The bad news is that approximately half of the students will have no team work experience. The good news is that most of those who have worked in teams did so in my HCI class, and so they had a trial by fire.

Ship It provides very straightforward advice regarding a critical team component: have a tech lead, someone who has one foot in management and one foot in technical implementations. As for who is the tech lead, I plan to have students apply for the position. I have not met with anyone who has tried this approach in an undergraduate class, but the concept has met with approval of respected colleagues who teach project-oriented courses. I will need to clearly articulate what a tech lead's responsibilities will be, of course, so that students know what they are getting in to. Also, since I cannot pay them any more, I need to make it clear what the benefit is, both in terms of investment (e.g. resume-building) and short-term gains (e.g. grading policy). For example, one of the tasks of a tech lead would be to provide his/her own team members with periodic formal evaluations: these should be incorporated into the grade of both the evaluator and the evaluated.

I am currently torn between social or functional team formation. (These are terms I am making up; let me know if there is a more standard expression for this, PMs out there.) A socially-formed team would be formed by students who know each other or believe they can get along. This is appealing since efficiency and effectiveness of communication seem to be the main bottlenecks in software development. Socially-formed teams could decide amongst themselves what kind of tasks they would like to tackle. Functionally-formed teams would be formed of students who share a common interest, and that interest would determine what tasks they take. For example, students interested in the game UI could work together on the "UI Team", and there is now a more obvious development of team expertise in one area of the production. One of the complication of functionally-formed teams is that it presupposes that I know the relative efforts required for various game features, which I don't. All the advice I have found is industrial and so focuses on the relative numbers of people needed to get the job done; none deal with the university oddity of having to deal with whoever signs up for the course.

A colleague in architecture suggested that there are two clear ways to promote progress with student teams: competition and collaboration. In a purely collaborative model, each team has a part of the solution, and their desire to create and to be good citizens leads to success. In a competitive model, teams work on the same parts of a solution, and the best among them is chosen for the deliverable. With 30 developers, it should be possible to adopt a competitive model, but I worry that those students whose solutions are not incorporated into the milestones will lose heart. On the other hand, if a team is given a module that is required for the milestone, and that team fails to contribute anything useful, then the collaborative spirit of the whole team is brought down. So I am left with the question, how much redundancy is appropriate?

Team size is another issue on which I am uncertain. I need to have clear communication with all of the tech leads, and so there cannot be too many of them. For example, if every team had three members including one tech lead, then I would still have ten tech leads to meet with and ten teams bidding for tasks. Of course, teams can easily get too large as well. There is an agile solution here, which is to allow for team reformation and role swaps during the semester, but I would like to have a starting condition that is representative of good practice.



Agile and Scrum.

There are too many unknowns not to be agile. I previously wrote about Alistair Cockburn's statement that, given a team of all novices, agile is practically the only way to secure success.

Last time I taught the class, I managed the team of nine students using Scrum, following the advice from The Scrum Primer. We managed our product backlogs and sprint backlogs using an OpenOffice spreadsheet, and we started each class meeting with a "daily" (twice weekly) stand-up. This worked well with nine students in a twice-weekly, 75-minute metings, but it will not scale to 30 students in thrice-weekly, 50-minute meetings. Fortunately, Google Docs is here to save the day. Its seamless sharing of documents gets us as close to a public, persistent information radiator as we can get. We used Google Docs in my HCI class last semester to share MSF-style risk matrices within teams and with the instructor and teaching assistant, and it was a fantastic experience.

One of the professional developers I met at Google I/O referred to the "bidding" process of Scrum, with which I am not familiar. The way we handled tasks in my previous offering of the class was informal: whoever spoke up first got it, unless someone else challenged it. If I understood this developer correctly, though, they used a model where individuals or teams would bid on the number of hours it would take them to complete, and whoever gave the best estimate got the task. This is an interesting idea, but it assumes that the bidders have reasonable estimates. Conversely, one of the best results of the last game programming class was that students got better at estimating: they were quite poor at the beginning, and most had never had to formally estimate effort before. This learning was evidenced by the product burndown charts, which started very erratic, but did actually approach linearity towards the end of the semester.

One of the most overt practices in many agile methodologies --- and Scrum in particular --- is the daily stand-up meeting. Unfortuantely, it is impossible to enforce daily stand-ups among student teams, especially with class scheduled MWF. My hope is that teams will conduct informal stand-ups via Wave or other communication technology on Tuesdays and Thursdays, and that proper face-to-face stand-ups can be held within each team during regularly scheduled meetings. This is another area where Google Docs comes to the rescue: it's straightforward to put sprint burndown charts into spreadsheets and have students update their estimates each day. Team managers can keep track of whether their team is updating their estimates, and as an instructor, I can easily scan a column and see if any team has a pattern of failing to update their estimates and take action. Failure to update an estimate also has very little impact on the overall project management process, since an empty cell can be assumed to have no change since the previous estimate.

During face-to-face meetings, individuals will be responsible for giving their stand-up reports to their tech-lead-cum-Scrum-Master, and these students will give their stand-up reports to me. This allows for a convenient filtering of obstacles: if a student tech lead has an inkling of how to remove an obstacle from the team's path, he or she is free to do so. If not, then it gets quickly reported to me, and I can design an appropriate intervention.

In this model, I share the role of Product Owner with my research collaborator and project co-director Ronald Morris, but I also serve as a sort of Scrum Master of Scrum Masters. I attended a workshop at CCSC:MW a few years ago in which Dean Sanders described using Scrum in a systems analysis and design class, and he would literally wear a different hat depending on whether he was acting as professor, Scrum Master, or Product Owner. (Incidentally, this was the first time I heard about Scrum and its use for agile teams in CS education. CS education conferences are a great place to share these ideas, so I'll see you all at CCSC:MW 2010. Why yes, I am publicity chair of that conference.)

Thanks to Google, I serendipitously came across Clinton Keith's new book, Agile Game Development with Scrum, and my copy is already in the mail. Hopefully it will contain some more tips that I can adapt into the university environment.


I am the lead architect.


Even though we're agile, there is no misconception that assumes the absence of documentation or architecture. I am still doing significant design work up front regarding the core system architecture. This comes from Tim Ryan's advice for game design documentation, which I have also written about before. A lengthy discussion of software architectural concerns can be found in my previous post.

I am also planning on providing some boilerplate code for the architecture, which will provide a concrete example of good programming practices, including documentation, modular design, and unit tests. As mentioned before, these concepts will be new to many students, and so providing this code will allow for bootstrapping for less-experienced students. For example, I am considering leaving out some simple functionality from the code that I provide specifically so that teams can explore the space where the various technologies meet and also achieve a "little win" to build their confidence. This follows more advice taken from Cockburn's Agile Software Development book: start with a task that you know you can complete, then build an end-to-end prototype (i.e. walking skeleton), then prioritize by story points.


 Class Meetings


A future post will explore pedagogic implications of these designs, but allow me to say for the time being that this learning experience is being designed according to principles of project-based learning, along the lines of studio-based learning and 

legitimate peripheral participation. To me, one of the most inspiring aspects of legitimate peripheral participation is that apprentices learned more from practice with masters than from any explicitly didactic methods. 
With this in mind, then, class meetings are simply team meetings, and what we have to learn is completely reified in what we have to do.


Even though I believe that this is the best approach for this learning experience, it makes me a little nervous due to the departmental and university culture. Although the administration has made laudable efforts to promote the "Immersive Learning" brand, many faculty members --- including my departmental colleagues --- have different philosophies of education. Studio-based methods within pure project-based learning environments may cause ripples in the year that a decision is made about my tenure!


Closing Remarks


I am grateful to all those people who shared course design ideas with me, and I am excited about integrating some brilliant ideas about both software development and the science of learning into this experience. This novella of a post has taken me hours to write, but it has allowed me to crystallize many of the ideas that have been floating around my mind, and to identify the areas in which I still am uncertain.

I welcome feedback on all aspects of the course design. Loyal readers will be treated to a few more posts during Summer planning, and then regular reflections during the Fall semester.