Improving the evaluation of learning in a project-based class

I’ve been struggling for a few years with providing rich, authentic tasks for my computer science students and then having to evaluate their work.

My students learn a lot of skills quickly when solving problems they’re interested in solving. That’s wonderful.

I can’t conceive of a problem they will all be interested in solving. That’s frustrating.

In the past, I have assigned a specific task to my entire CS class. I tried to design a problem that I felt would be compelling, and that my students would readily engage with and overcome. The point has always been to develop broadly-applicable skills, good code hygiene, and deep conceptual understanding of software design. The point is not to write the next great 2D platformer nor the most complete scatterplot-generating utility.

Unfortunately, I could never quite get it right. It’s not because my tasks were inherently weak; rather it’s that my students were inherently different from one another. They don’t all like the same things.

I believe that students sometimes need to do things that are good for them but that they don’t like to do. They sometimes need the Brussels sprouts of learning until they acquire the taste for it. But if they can get the same value from the kohlrabi of learning and enjoy it, why wouldn’t we allow for that instead?

So I’ve tried giving a pretty broad guideline and asking students to decide what they want to write. They choose and they complete a lot of great learning along the way. Their code for some methods is surprisingly intricate, which is wonderful to see. They encounter problems while pursuing a goal that captures them, and they overcome those problems by learning.

Sounds good, eh?

Of course, they don’t perform independently: they learn from each other, from experts on the Internet, and from me. They get all kinds of help to accomplish their goals, as you would expect of anyone learning a new skill. And then I evaluate their learning on a 101-point scale based on a product that is an amalgam of resources, support, and learning.

Seems a bit unfair and inaccurate.

I asked for suggestions from some other teachers about how to make this work better:

  • ask students to help design the evaluation protocols
  • use learning goals and success criteria to develop levels instead of percentage grades
  • determine the goals for the task and then have students explain how they have demonstrated each expectation
  • determine the goals for the task and then have students design the task based on the expectations
  • find out each student’s personal goals for learning and then determine the criteria for the task individually based on each student’s goals

I’m not sure what to do moving forward, and I’d like some more feedback from the community.

Thanks, everyone!

Learn-practise-perform cycle limits learning in CS

Like many courses, the beginning of my current computer science e-Learning class looked like this:

  • Teach small skill
  • Teach small skill
  • Give feedback on practice work
  • Teach small skill
  • Teach small skill
  • Give feedback on practice work
  • Evaluate performance task

This separation of learning from graded performance is intended to give students time to practise before we assign a numerical grade. This sounds like a good move on the surface. It’s certainly well-intentioned.

But this process is broken. It limits learning significantly.

If the performance task is complex enough to be meaningful, it requires a synthesis of skills and understandings that the students haven’t had time to practise. In this case I’m evaluating each student’s ability to accomplish something truly useful when they’ve only had the opportunity to practise small skills.

If instead the performance task has many small components which aren’t interdependent, students never develop the deeper understanding or the relationships between concepts. In this case I’m evaluating each student’s small skills without evaluating their ability to accomplish something truly useful, which isn’t acceptable either.

And there isn’t time to do both. I can’t offer them the time to complete a large, meaningful practise task and then evaluate another large, meaningful performance task.

The barrier here is the evaluation of performance. It requires a high level of independence on the part of the student so that I can accurately assign a numerical grade.

So I’m trying something different.

Instead of these tiny, “real-world” examples (that I make up) to develop tiny, discrete skills, I started teaching through large, student-driven projects. I got rid of the little lessons building up to the performance task, and I stopped worrying about whether they had practised everything in advance.

The process looks more like this:

  • Develop project ideas with students and provide focus
  • Support students as they design
  • Provide feedback through periodic check-ins
  • Teach mini-lessons as needed for incidental learning (design, skills, etc.)
  • Summarize learning with students to consolidate

I couldn’t design a sequence of learning tasks that would be as effective as my students’ current projects are. They’re working hard to accomplish goals they chose, and they’re solving hundreds of small and large problems along the way.

They couldn’t appreciate the small, discrete lessons I was teaching with the small, artificial stories. They didn’t have the context to fit the ideas into. It was only when the project was large and meaningful that my students truly began to grasp the big concepts which the small skills support.

And now I don’t have a practise/perform cycle. It’s all practice, and it’s all performance. It’s more like real life, less like school, and it’s dramatically more effective. It’s much richer, much faster learning than the old “complete activity 2.4” approach.

Evaluation is very difficult, though.

Using Java and NetBeans to Teach High School Computer Science

First Question

Another teacher recently asked about my experiences teaching CS and for a description of the tools and language that I used. I thought I might share my response on here, in case anyone can add to the conversation.

First response

I used Java with NetBeans for development. This was my first time through the courses (ICS3U/3C) and it was by e-Learning, so I wanted to stick with something that was fairly standard. NetBeans was really flexible and was fairly nice for building GUIs as well. I hadn’t used a development environment with such effective refactoring capabilities before, so that was a treat. JavaDoc templates were generated automatically, and documentation look up was fast and reliable.

NetBeans_StartPage

Some other CS teachers use Eclipse, JCreator, or something else. NetBeans does have an Android development plugin, although I haven’t used it. If I were to teach the grade 12 course, I might consider focusing on Android development with the Android SDK/Studio IDE. There is a lot more to think about for app development, but I think there would be a significantly increased level of engagement. Also, those skills should be highly marketable for students if they pursue programming or software engineering as a career.

AndroidStudio

If you want to see what it look like while I was coding and developing user interfaces in NetBeans, I have a bunch of videos in a playlist on my YouTube channel.

It was helpful to have the students building GUIs right away in some respects. However, because they didn’t already understand objects when they started this, it was difficult in the later stages of the course to have them create GUI elements programmatically instead of with drag-and-drop tools. For example, one student was creating a game that required playing cards to be displayed, but he needed to create (up to) 52 UI objects to represent them. That screams arrays/lists, but he didn’t know how to instantiate those elements based on what we had already learned. I might try a slightly different approach, rather than changing IDE though.

If you have specific questions I can answer, let me know. I’ll be teaching this course again next year, so talking about this is good for me too! If you want the content/activities I developed, I’m happy to share that as well.

Second Question

Later the teacher asked about whether I had used Python, and if I had thoughts about Python vs. Java. Here’s what I said:

Second Response

I haven’t worked in Python, but I understand that it is fairly powerful and straightforward. I talked to the other CS teacher here and he recommends Java, and I think I do too.

Some points to consider:

  • Python has very forgiving syntax; the argument is that this may allow students to focus on concepts.
  • Java is strongly- and statically-typed, but Python is strongly- and dynamically-typed.
  • Java has a longer history, so there are “more” resources available for support (might not matter – “enough” and “good” are more important than “more”)
  • Java is used for more application types (desktop, web, Android, non-computing devices) and is available on most platforms.
  • Python tends to be used server-side – it’s a scripting language.
  • Python applications tend to be shorter
  • Python uses indentation to describe code structure; Java uses braces.

I use Java because I’m used to it, I understand it well, and it’ll be a nice transition to mobile development for the kids.

Let me know what you decide – it’s interesting!

Your turn

If I have made a mistake above, or if you have thoughts about IDEs/Java/Python/Android/etc., please add a comment and I’ll pass it along!

#CS teachers: I need help developing an inquiry task

I am trying to develop a task for my online ICS3C/3U Computer Programming/Science class, and I need the students to be deeply “engaged”.

I return again to my latest, favouritest definition for student engagement: “A student is engaged in learning when they feel a compulsion to pursue the learning apart from external motivations.” That is, not just for marks, and not just because Mr. G said they have to. I want them to want to learn.

So I want the students to pursue their own interests as much as possible. I believe giving students the freedom to choose will be a lot more likely to kindle that compulsion I want to see in them, and will result in deeper learning and, rather importantly, more fun for all of us.

My challenge is figuring out how to frame that task so that I give them

  • enough latitude to pursue whatever interests them (knowing that I can’t predict these things!)
  • enough guidance to help them formulate their plans (so they can learn from the experience)
  • enough restrictions to ensure that they are learning for this course (since I have to assess and evaluate them).

So I’m a little stuck. I’ve created an openly-editable Google Doc with their learning goals and my initial thoughts. I would be very, very pleased if you would take a look and add comments, ideas, criticisms… anything that can help me move forward with this. I’m trying to plan very carefully to minimize the chance that this wastes my students’ time and effort, and to minimize any unnecessary frustrations they experience.

Here’s the document; please share widely: Learning Computer Science Through Inquiry

Much thanks in advance, from me and from my students!

Accessing student interests in ICS3C/3U

I’m thinking about trying to tap into the students’ interests in my online computer science course. We’re at the point now where the [up-to-date] students have enough of the basics to be able to pursue topics of their choosing.

I was considering making a discussion forum/topic where they can share ideas they’re interested in, and then encouraging them to pursue that learning. I’m not sure how to word it, or manage it, or what exactly I hope to get from it, except that it’s important for students to take charge of their own learning. Maybe several students will have similar interests and be able to pursue them together.

Suggestions are welcome ;)

Introductory Computer Programming in Java – video playlist on YouTube

I’m teaching ICS3C/3U online right now, and I’ve been making videos for my students to learn from. I realize there are good resources online for this stuff already, but there are three reasons I’m making my own instead of curating other sources:

  1. The Java language has evolved, so some things are done differently now (e.g. String comparison)
  2. The development environment has had major updates (NetBeans)
  3. It’s nice to personalize things for my students so they can connect with me a little better

I’m trying to post my videos to YouTube as well as in the virtual Learning Environment. I don’t want to use just one or the other; YouTube is blocked in some school boards, and the vLE is harder to access from a mobile device. Crossposting seems like a good idea.

If you’re interested, here is the playlist I’ll add to this semester. I’ll warn you that they’re not “polished”, although that’s partly intentional: I don’t have time for a lot of re-takes, and I want students to see coding errors and their fixes too.

https://www.youtube.com/playlist?list=PLfd-5Q3Fwq0WGwNp-Ef9OubhMxwM8bROj