Posts tagged ‘computing education research’

Is Liveness a critical factor in learning Computer Science? Context, motivation, and feedback for learning programming

My CACM Blog post for November is on the topic of Direct Instruction, why it’s better than Discovery Learning, and how we should teach programming “directly.”

I wonder about the limitations of Direct Instruction.  I don’t think everything can be learned with direct instruction, even with deliberate practice.

At SIGCSE 2016, John Sweller made a provocative claim (that I haven’t yet found in his published papers).  He said that humans must be able to learn higher-order thinking skills.  We’d be dead if we didn’t. However, we cannot teach them.  Students have to figure them out from experience. Is programming a similar kind of task?

I have been studying Spanish on a streak of over 600 days in DuoLingo now. DuoLingo is the best direct instruction I’ve ever had.  Everything I do is deliberate practice — it’s really good at figuring out what I’m not good at, and giving me more problems on that.  I am nowhere near fluent.  I know some words. I can read some. I’m getting better at hearing. I am not fluent.  Maybe learning natural and programming languages both require more than direct instruction.

What leads to fluency, in natural languages or programming languages?  I suspect that part of it is context and motivation.  You have to be in a position to want to say something (in a natural or programming language) in order to learn it.

But I also think it’s about feedback.  I don’t really learn Spanish well because I’m rarely in a position to use it. If I did, I’d get a response to what I said. Can anyone learn to program without trying to write some code and getting feedback on whether it works? The issue of feedback came up several times in the recent discussion about the relationship between teaching programming and teaching composition.

Steven Tanimoto talks about the value of “liveness” in a programming environment (see paper here), which is about the ease of writing code and getting different kinds of feedback on the code. Maybe Liveness encapsulates the kinds of things we need for successful CS learning. Of course, even “liveness” doesn’t give the kind of feedback that a human reader can, but it does shorten the feedback timing loop.

 

 

November 30, 2018 at 7:00 am 17 comments

What do I mean by Computing Education Research? The Computer Science Perspective

 

Last week, I talked about how I explain what I do to social scientists. This time, let me explain what I do to computer scientists. I haven’t given this talk yet, and have only tried the ideas out on a few people. So consider this an experiment, and I’d appreciate your feedback.

Let’s simplify the problem of computing education research (maybe a case of a spherical cow). Let’s imagine that instead of classes of Real Humans, we are teaching programming to Human-like Turing Machines (HTMs). I’m not arguing that Turing machines are sufficient to represent human beings. I’m asking you to believe that (a) we might be able to create Turing Machines that could simulate humans, like those we have in our classes, (b) RH’s would only have additional capabilities beyond what HTM’s have, and (c) HTM’s and RH’s would similar mechanisms for cognition and learning. (Carl Hewitt has a great CACM blog post arguing that message passing is more powerful than TM’s or first order logic, so maybe these should be HMP, Human Message Passers. I don’t think I need more than TM’s for this post.)

This isn’t a radical simplification. Cognitive science started out using computation as a model for understanding cognition (see history here). Information processing theory in psychology starts from a belief that humans process information like a computer (see Wikipedia article and Ed Psychology reference). Newell and Simon won the ACM Turing award and in their Turing Award lecture introduced the physical symbol system hypothesis, “A physical symbol system has the necessary and sufficient means for general intelligent action.” If we have a program on a Turing machine that gives it the ability to process the world in symbols, our theory suggests that it would be capable of intelligence, even human-like intelligence. I’m applying this lens to how we think about humans learning to program.

This simplification buys me two claims:

  • The Geek Gene is off the table. The Geek Gene is the belief that some people can’t learn to program (see blog post for more). Any Turing machine can simulate any other Turing machine. Our HTM’s are capable of tracing a program. If any HTM can also write code, then all HTM’s can write code. Everyone has the same computational capability. (If HTM’s can all code, then RH’s can all code, because HTM’s have a subset of RH cognitive capabilities.)
  • Learning of our students can be analyzed and understood as information processing. The behavior of Turing machines is understandable with analysis. HTM’s are sophisticated Turing machines. The core mechanism of HTM’s can be analyzed and understood. If we think about our students as HTM’s, we might reason about their learning about computing.

Here are some of the research questions that I find interesting, within this framing.

How do HTM’s learn to program?

All HTM’s must learn, and learn at a level where their initial programming (the bootstrap code written on their tape when they come into our world) becomes indistinguishable from learned capabilities. HTM’s must have built-in programming to eat and to sleep. They learn to walk and run and decipher symbols like “A,” such that it’s hard to tell what was pre-programmed and what was learned. HTM’s can extend their programming.

There are lots of models that describe how HTM’s could learn, such as SOAR and ACT-R. But none so far has learned to program. The closest are the models used to build the cognitive tutors for programming, but those couldn’t debug and couldn’t design programs. They could work from a definition of a program to assemble a program, but that’s not what most of us would call coding. How would they do it?

How would HTM’s think about code? How would it be represented in memory (whether that memory is a tape, RAM, or human brains)? There is growing research interest in how people construct mental models of notional machines. Even experts don’t really know the formal semantics of a language. So instead, they have a common, “notional” way of thinking about the language. How does that notional machine get represented, and how does it get developed?

How do we teach HTM’s to learn to program?

You shouldn’t be able to just reprogram HTM’s or extend their programs by some manipulation of the HTM’s. That would be dangerous. The HTM might be damaged, or learn something that led them into danger. Instead, extending HTM’s programming can only be done by conscious effort by the HTM. That’s a core principle of Piaget’s Theory of Cognitive Development — children (RH’s and HTM’s) learn by consciously constructing a model of the world.

So, we can’t just tell an HTM how to program. Instead, we have to give them experiences and situations where they learn to program when trying to make sense of their world. We could just make them program a lot, on increasingly harder programs. Not only is that de-motivating (maybe not an issue for HTM’s, but certainly is for RH’s), but it’s inefficient. Turns out that we can use worked examples with subgoal labeling and techniques like Parson’s problems and peer instruction to dramatically improve learning in less time.

What native capabilities of HTM’s are used when they learn to code?

We know that learning to read involves re-using more primitive mechanisms to see patterns (see article here). When HTM’s learn to program, what parts of the native programming are being re-used for programming?

Programming in RH’s may involve re-use of our built-in ability to reason about space and language. My colleague Wes Weimer (website) is doing FMRI studies showing that programmers tend to use the parts of their brain associated with language and spatial reasoning. In our work, we have been studying the role of spatial reasoning and gesture in learning to program (see summaries of our ICER 2018 papers). We don’t know why spatial reasoning might be playing a role in learning to program. Maybe it’s not spatial reasoning, but some aspect of spatial reasoning or maybe it’s even some other native ability that is related to spatial reasoning.

How does code work as an external representation of HTM’s, and where does it help?

We can safely assume that HTM’s, like RH’s, would enhance their cognition through the use of external representations. Cognition and memory are limited. Even an infinite tape has limitations in terms of time to access. Human cognitive systems are limited in terms of how much can be attended to at once. RH’s use external representations (writing notes, making diagrams, sketches) to enhance their cognition. We’re assuming that HTM’s have a subset of RH abilities, so external representations would help HTM’s, too.

My students and I talk about a wonderful paper by David Kirsh, Thinking with External Representations (see link here). It’s a compelling view of how external representations give us abilities to think that we don’t have with just our brain alone.

How can program code be a useful external representation for HTM’s? When does it help, e.g., with what cognitive tasks is code a useful external representation? For example, a natural one is modeling and simulation — we can model more complex situations with program code than we can keep in our head, and we can simulate that model for a much larger range of time and possible values. Are there cognitive tasks where code by itself, as a notation like written language or mathematics, can enhance cognition? Here I’m thinking about the ability of code to represent causal relationships (e.g., as in Bruce Sherin’s work) or algebraic forms (e.g., as in Bootstrap) — see here for discussion of both.  I’m intrigued by the idea of the affordances of reading code even before writing it.

What makes programming worth learning for HTM’s?

Why should an HTM learn programming? Let’s assume that an HTM’s basic programming is going to be about staying alive, e.g., Maslow’s hierarchy of needs. When would an HTM want to learn programming?

The most obvious reason to learn programming is because you can get paid to do it. It’s about meeting physiological needs and safety. But, if you can meet those needs doing something that’s easier or more pleasant or has fewer barriers, you’ll likely do that.

Sometimes, you’ll want to learn programming because it makes easier something you want to do anyway. Brian Dorn’s graphic designers wanted to learn programming (see here) because they used Photoshop or GIMP and wanted a way to do that easier and faster. Maybe that’s about safety and physiological needs, but maybe it was about esteem or even self-actualization (if HTM’s care about those things).

Where my simplification breaks down: Real humans learn in situated and social contexts

Our learning theory about RH’s say that they are unlikely to start a new subject unless there’s social pressure to do so (see Pat Alexander’s Model of Domain Learning). Would HTM’s feel social pressure? Maybe.

As I described in the previous blog post, much of my work is framed around sociocultural models of learning, like Lave and Wenger’s situated learning. I use Communities of Practice to understand a lot of the situations that I explore. We can only go so far in thinking about programming as just being inside of individual minds (HTM or RH). Much of the interesting stuff comes when we realize that (a) our cognition interacts with the environments and situations around us, and (b) our motivation, affect, and cognition are influenced by our social world.

Setting aside whether it’s social science or computer science, I am still driven by a paper I read in 1982, which was five years after it was written: “Personal Dynamic Media” by Alan Kay and Adele Goldberg (see copy here).  I want people to be to use coding like they use other literacies, to create a literature, and in a casual, informal and still insightful way.  Mitchel Resnick often talks about people using Scratch to write a card to their mother or grandmother — that’s the kind of thing I want to see.  I want people to be able to make small computational models that answer questions, in the same way that people do “back of the envelope” calculations today. I also want great literature — we need Shakespeares and daVinci’s who convey great thoughts with computing (an argument that Andrea diSessa made recently at the PPIG conference which Felienne Hermans blogged about here.) That’s the vision that drives me, whether I’m using cognitive science or situated learning.

 

November 12, 2018 at 8:00 am 8 comments

What do I mean by Computing Education Research? The Social Science Perspective

As a new guy at the University of Michigan, I spend a lot of my time explaining who I am and what I mean by computing education research. In this and the next blog posts, I am sharing two of those explanations.

The first one was a six minute lightning talk to the University of Michigan School of Information. My audience was well-versed in social sciences, so I explained who I was in those terms.

I ground a lot of my work in Lave and Wenger’s (1991) theory about Communities of Practice. Let me create a symbol here to represent a community of practice. My symbol has a light boundary where novices engage in legitimate peripheral participation, there is a darker area where full-fledged members of the community work, and the core where the experts live who represent the values and practices of the community.

When people think about computing education research, they mostly think about this community of practice: software development. How do we help students join the community of practice of software developers? That’s an interesting question, and I have done some work there (e.g., on how students come to understand multiple class object-oriented systems, like Model-View-Controller), but that’s not my focus.

Let’s set that community of practice aside (lower left), and consider another that I’m much more interested in: end-users who program. I’ve taught thousands of liberal arts, architecture/design, and business/management majors to program using Media Computation, a contextualized approach to computing that focuses on their interests and needs. I worked with Brian Dorn as he studied graphics designers who learn to program. End-user programmers are far more numerous than professional software developers. They use programming for different purposes, so we would expect them to use different practices, languages, libraries, and tools. That’s why we developed JES, a Python programming environment for our future end-users who are programming with media. I’m very interested in understanding and supporting the practices of end-user programmers.

Let’s keep that community of practice in consideration, and next consider a different one: High school teachers who teach computer science. They’re not about software development, either. They’re going to do something different (different practices) and have different values. High school teachers need to learn efficiently because they don’t have a lot of time to learn, and they want to learn effective methods for their students. Here’s where we work on ebooks, and subgoal labeling, and Barb’s Parsons problems. I’m interested in how we make computing education efficient and effective, and in understanding the underlying cognitive mechanisms at work. Why do some things work better for learning programming than others?

Here’s another community of practice I care about: scientists and engineers who use programming as a new way to do science. Again, different practices and values than software developers. How do we best support them?  What tools do they need for their practices?

I would like students to have the same advantages as scientists and engineers, to be able to use code as a powerful and executable notation. Lately, I’ve been particularly focused on pre-calculus and economics. I know it’s stretching Lave and Wenger’s notion to think about classrooms as kinds of community of practice, so maybe the real community of practice is economists and professionals who use Computing. My specific interest is the edge of the community of practice, constructing legitimate peripheral participation for students who might use computing to aid in their entrance into the field. When does programming help with learning something else, and why does it help, and how can we make it more effective (e.g., use the best parts of programming that have the greatest leverage on supporting learning)?

So let’s consider these communities of practice.

This is a really weird picture, from Lave and Wenger’s perspective. I’m saying that programming is a practice in all of these communities, but it’s different in each one. We actually do know practices like this: Reading and writing, and the use of mathematics.

I suggest that programming is a literacy. (I’m not the first, of course, and I don’t make the argument nearly as well as my colleague, Yasmin Kafai.) It’s a way of expressing thought, communicating with others, and testing and exploring new ideas.

And that’s what makes computing education a social justice issue. If we have really invented a new literacy, we need to make it available to everyone.

November 5, 2018 at 9:00 am 10 comments

Novum Organum: The original “How To Not Be Wrong”

When I visited with Alan Kay and Bonnie MacBird in June, one of the ideas that he got me thinking about was Sir Francis Bacon’s Novum Organum (1620, wikipedia link), for ‘new instrument of science.’ Bacon understood human tendencies for bias long before behavioral economics. His book was the prototype for the modern popular book “How to Not Be Wrong: The Power of Mathematical Thinking” which advocates for mathematics as an approach to addressing human biases and limitations.

Bacon aimed to construct a foundation for real science, a body of knowledge that we could trust despite the fact that our minds are weak and that we are easily swayed. He lists four “idols” — the biases which keep us from thinking objectively and scientifically. Wikipedia has a short description for each. A couple that I found particularly striking:

  • Idols of the tribe: The things we get wrong because we like to see things at human scale and in regular structures. I read these as including the ideas we like because everyone else likes them, like picking a programming language because it’s popular and not because it suits the task.
  • Idols of the cave: The things we get wrong because of our unique education and background. Bias due to privilege (and assuming that everyone else has the same privilege) seem to fall in here.
  • Idols of the market: I just kept thinking “computational thinking” here. Idols of the market include words “which spring from fallacious theories” and “that are the result of imprecise abstraction.”  Unsupported theories of transfer and terms which we can’t actually define and test are part of Bacon’s warnings about “the market.”

I haven’t read the whole document — it’s available on Project Gutenberg, but it’s tough going.  I have found that Bacon talks about issues not in the Wikipedia article that are are significant today. For example, Bacon decries making decisions based on too “few experiments” which is explicitly a concern addressed in the efforts to replicate prior results (e.g., article here).

I keep thinking about what Bacon would say about computing education research. CER has some deep research questions it’s pondering (which I plan to address in some future blog posts). How do we make sure that we’re doing Science and not just following our Baconian idols?

October 29, 2018 at 7:00 am 1 comment

How Google is supporting computing education research

Google in August made five awards to support computing education research (see announcement here).  They are not huge awards, and they’re all fairly short time frames. But what I’m impressed with is how Google is doing their investment in computing education research.

Google started their process by asking Paulo Blikstein to poll the field and write a report summarizing the state of computing education research.  I blogged about that report here — I liked it.  I thought he covered a lot of ground in a small space, and he pointed out important open research questions.

Google wanted to hear from researchers directly. So they held a workshop with a bunch of researchers (some involved in Paulo’s report, some outsiders) to talk to them about what were the pressing research issues we saw and what we’d recommend Google should do about them.  (I was there, and mentioned the workshop in passing in this blog post.) So, first they educated themselves (and the community) with Paulo’s report, then they brought in more voices to respond to the report and point out other issues.

Now they’ve made their awards. The process is interesting because they engaged the community, at multiple levels. They didn’t just hire the people away from their campuses to come to Google. They made external awards, so that the faculty keep teaching (which we desperately need with the exploding enrollments). I hope other companies make note of the process and consider it as a model.

 

October 22, 2018 at 7:00 am Leave a comment

A high-level report on the state of computing education policy in US states: Access vs Participation

states-policyInteresting analysis from Code.org on the development of policies in US states that promote computing education — see report here, and linked below.  The map above is fascinating in that it shows how much computing education has become an issue in all but five states.

The graph below is the one I found confusing.

urm-access

I’ve been corrected: the first bar says that where the school’s population is 0-25% from under-represented minority groups, 41% of those schools teach CS.  Only 27% of mostly-minority schools (75%-100% URM, in the rightmost column) offer CS.  This is a measure of which schools offer computer science.

The graph above doesn’t mean that there are any under-represented minority students in any CS classes in any of those high schools.  My children’s public high school in Georgia was over 50% URM, but the AP CS class was 90% white and Asian kids.  From the data we’ve seen in Georgia (for example, see this blog post), few high schools offer more than one CS class. Even in a 75% URM high school, it’s pretty easy to find 30 white and Asian guys.  Of course, we know that there are increasing numbers of women and under-represented minority students in computer science classes, but that’s a completely different statistic from what schools offer CS.

I suspect that the actual participation of URM students in CS is markedly lower than the proportion in the school.  In other words, in a high school with 25% URM, I’ll bet that the students in the CS classes are less than 25% URM.  Even in a 75% URM high school, I’ll bet that CS participation is less than 75% URM.

Access ≠ participation.

Source: The United States for Computer Science – Code.org – Medium

October 12, 2018 at 7:00 am 10 comments

Closing the gaps is the real challenge in computing education (CIRCL Meet Mark Guzdial)

Meet_Mark_Guzdial_–_CIRCLThe Center for Innovative Research in CyberLearning (CIRCL) did a Perspectives interview with me (thanks, Quinn Burke!) that appears here.

I got to talk about the range of things I’ve done, what I’ve been surprised by and not surprised by, and what I think the big challenges to come in K-12 CS education.

In hindsight, it’s not a surprise that we’re having trouble closing the gaps.  There are increasingly more teachers who can teach CS, and there are governors and the Tech industry pushing for more CS Ed.  But in between, there are principals that don’t buy it, and the classes in the schools are few and tiny.  Most Schools of Education are still not players in promoting CS education. I predict over 85% of kids in Georgia (at least) are not getting a single experience with CS.  The percentage of schools having CS is getting higher, but real experience with CS is low.

As you might imagine, I focus on the need for more research and for reducing inequities. We have made a lot of progress on computing education, and we can make more progress still.


N.B. as Shriram points out in the comments, our claim for FCS1 about “language independent” is really about “multi-lingual.” I’ve asked CIRCL to update the piece, and I’ll try to be more careful about what I claim for FCS1 and SCS1.

 

October 1, 2018 at 8:00 am 11 comments

Older Posts


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

Join 4,352 other followers

Feeds

Recent Posts

Blog Stats

  • 1,587,035 hits
December 2018
M T W T F S S
« Nov    
 12
3456789
10111213141516
17181920212223
24252627282930
31  

CS Teaching Tips