Archive for July 8, 2019

Learning to build machine learning applications without code as an example of computing education research


Ben Shapiro shared a nice video that his student Abbie Zimmermann-Niefield made about their new paper at IDC. They built a system that allows kids to build applications with machine learning to detect (in this example) good from bad soccer passes.

The video (and paper) are perfect for IDC. It’s a wonderful example of giving students a new computational medium to build new kinds of applications that they couldn’t previously.  But the video also raised a bunch of questions for me.  Abbie at one point talks about users of her system as “learners.”  What are they learning?

David Moon put his finger on some of the issues for me with his tweet:

You don’t have to code to build ML applications.  But then, is it programming?  In the About page for this blog, I have defined computing education research as studying how people come to understand computing, and how to improve that process.  What are the students coming to understand in Abbie and Ben’s application?  Is studying how students come to build, understand, and debug their ML applications an example of computing education research?

I exchanged some messages with Ben, and came to an understanding of what he’s doing — which in turn gave me a new understanding of what I do.

In a blog post inspired by Juha Sorva, I suggested a refinement of my original definition.  “Coming to understand computing” means to develop a workable mental model or to learn a notional machine of a computing system. Programming is about intentionally defining a process for a computational agent to execute at another time. A notional machine is an explanation for the behavior of a system — it’s a teacher’s attempt to influence the mental model that the student is forming about the system.  I learned more about notional machines at a later Dagstuhl, and I’m excited to be attending a Dagstuhl Seminar this week where I’ll learn a lot more about notional machines.

Abbie’s participants are developing a mental model of how the system works — it’s not very elaborate, and it’s mostly wrong.  One student tells Abbie that she needs to have more both good and bad examples to make the system more accurate.  Okay, but why?

Ben says that they want to reach the point where students develop a working mental model of the system: About why they need to oversample some kinds of events, to be able to choose between different kinds of machine learning models, to be able able to judge what makes for a good data set, and to decide how to test the system to determine if it’s classifying all the desired inputs correctly.  Really, these are all the kinds of things we want students building any kind of program to think about — did I build this correctly (what I wanted it to be), how do I know, and how do I test to make sure?  Whether it’s by constructing data or by writing code, it’s still about intentionally defining a process for a computational agent, and then testing that process to determine if it matches the desired function.

It’s a fascinating question (which I expect we’ll be discussing this week) about what notional machines one uses to explain machine learning models.  It’s an important computing education research question: what mental models do students form about machine learning systems?  A different one is: what notional machines do we teach in order to improve the mental models that students develop about machine learning models?

Now, does it matter if students can’t see the code?  I don’t think so.  It probably matters for CS major undergraduates (which Ben, Peter, and Rebecca have argued elsewhere), but for the general population?  What does it mean to “see the code” anyway?

  • At a high level, I’m a big fan of block-based languages (as mentioned in a recent blog post about one of David Weintrop’s results). Block-based languages are also a higher-level representation of code.  That doesn’t matter. It’s still programming. It’s still computing.
  • At a low level, who really understand what their code does anymore?  With code optimization, processor prefetching, cache memory, and branch prediction, it’s really hard to know what’s really going on anyways.  Some people do. Most people don’t. And it really doesn’t matter.

The lack of code might make the notional machine harder to teach.  There is no code to point at when explaining an algorithm (see Amber Solomon’s work on the role of gestures in teaching CS).  Maybe you wouldn’t explain an algorithm.  Maybe instead you’d point at examples and point at key features of those examples.  Maybe. It’s an open and interesting research question.

So. Computing education is about helping students to develop mental models of computing systems. These models must be workable to the point of being usable for intentional construction and debugging. Studying how students build machine learning applications without code is also computing education research.

July 8, 2019 at 2:00 am 11 comments

Enter your email address to follow this blog and receive notifications of new posts by email.

Join 7,142 other followers


Recent Posts

Blog Stats

  • 1,729,798 hits
July 2019
« Jun   Aug »

CS Teaching Tips