Posts tagged ‘programming’
No, Really – Programming is Hard and CS Flipped Classrooms are Complicated: ITICSE 2016 Award-Winning Papers
I only recently started digging into the papers from the ITICSE 2016 conference (see Table of Contents link at ACM Digital Library here). There were two papers that caught my attention.
First, the best paper award went to one of my former PhD students, Brian Dorn: An Empirical Analysis of Video Viewing Behaviors in Flipped CS1 Courses, by Suzanne L. Dazo, Nicholas R. Stepanek, Robert Fulkerson, and Brian Dorn. Brian has this cool piece of technology where students can view videos, annotate them, be challenged to answer questions from specific places, and have discussions. They used this for teaching a flipped CS1 class, where students were required to watch videos before class and then engage in more active learning opportunities in class. The real trick, as you might imagine and that the paper goes into detail on, is getting students to watch the video. I liked both the techniques for prodding students to watch videos and the fascinating results showing the relationship between watching the videos and learning.
ITICSE 2016 recognized two “commended” papers this year. I haven’t found the listing of which papers they were, but I did learn that one of them is Learning to Program is Easy by Andrew Luxton-Reilly. I enjoyed reading the paper and recommend it — even though I disagree with his conclusions, captured in the paper title. He does a good job of exploring the evidence that programming is hard (and even uses this blog as a foil, since I’ve claimed several times that programming is hard), and overall, is a terrific synthesis of a bunch of computing education papers (40 references is a lot for a six page ITICSE paper).
His argument that programming is easy has two parts:
- First, children do it. As he says in the abstract, “But learning to program is easy — so easy that children can do it.” That’s a false comparison — what children do in programming is not the same definition of “programming” that is in most of the literature that Andrew cites. The evidence that programming is hard is coming mostly from higher-ed CS classes. What is going on in introductory University CS classes and what children do is dramatically different. We saw that in the WIPSCE 2014 Fields and Kafai paper, and those results were recently replicated in a recent ICER 2016 paper. These are two different activities.
- Second, what higher-education CS teachers expect at the end of the first course is too much. He presents significant evidence that what CS teachers expect is achieved by students, but at the end of the second course. The paper from Morrison, Decker, and Margulieux supports the argument that students think and work very differently and much more successfully by the end of the second CS course than in the first course.
I see Andrew’s argument as evidence that programming is hard. The problem is that Andrew doesn’t define the target. What level of ability counts as “programming”? I believe that level of ability described by the McCracken Working Group, by the FCS1/SCS1 exams, and by most teachers as the outcomes from CS1 (these are all cited by Andrew’s paper) is the definition of the lowest level of “programming ability.” That it takes two courses to reach that level of ability is what I would call hard.
I’ve been reading a terrific book, Proust and the Squid: The Story and Science of the Reading Brain by Maryanne Wolf. It’s the story of how humans invented reading, how we teach reading, and how reading changes our brains (physically and in terms of cognitive function). Oral language is easy. We are literally wired for that. Reading is hard. We are not wired for that, and much of the invention of reading is about inventing how to teach reading. Unless you can teach reading to a significant part of your population, you don’t develop a literate culture, and your written language doesn’t succeed.
Much of the invention of written language is about making it easier to learn and teach because learning to read is so hard. Have you ever thought about why our Latin alphabet is ordered? Why do we talk about the “ABC”‘s and sing a song about them? We don’t actually need them to be ordered to read. Ordering the alphabet makes it easier to memorize, and learning to read is a lot about memorization, about drill-and-practice to make the translation of symbols to sounds to words to concepts effortless (or at least, all System 1 in Kahneman terms). This makes it easier, but the task of learning to read and write is still a cognitively complex task that takes a significant amount of time to master. It’s hard.
Programming is hard like written language is hard. It’s not possible to program unless you know how to read. Programming is particularly hard because the concepts that we’re mapping to are unfamiliar, are not part of our daily experience. We only see it as easy because we have expert blind-spot. We have already learned these concepts and made those mappings. We have constructed understandings of iteration and conditional execution and variable storage. It is difficult for experts to understand how hard it is to develop those concepts. The evidence of children programming suggests that most children who program don’t have those concepts.
I remain unconvinced by Andrew’s argument, but I recommend the paper for a great summary of literature and an interesting read.
Fun and interesting blog addressing the belief that mathematics is necessary for programming, a misconception that Nathan Ensmenger claims has reduced the percentage of women in computing. Sarah Mei goes into some depth addressing (and dispensing with) each of the three claims below
Specifically, learning to program is more like learning a new language than it is like doing math problems. And the experience of programming today, in industry, is more about language than it is about math.And my next thought, of course, was why doesn’t anyone else think this? Why do we still have this idea that math skills indicate programming potential, while language skills mean you should go into poli sci?Well, when I feel out of my depth, I usually start by looking for “official” opinions. So I looked for relevant academic research.
I found absolutely none, which is pretty flabbergasting. I found a lot of opinions, both from computer science educators, and from people in industry. Perhaps within academia, the link between math and programming is considered such an obvious truth that it isn’t worth confirming with research.It seems more likely, though, that this research exists, but not under the search terms I tried. Please let me know if you are aware of relevant papers.In the meantime, if we can’t have data, we can at least examine the conversations people have on this topic. Here are some things people often say when asserting that people must be good at math to be good developers.Generally, they fall into three categories:
1. “You need to know math to be a good programmer.”
2. “You need to learn math to get the skills you need for programming.”
3. “Plenty of programming is still math!”
It’s almost a race to the bottom — which do people care less about, learning programming or learning a modern language?
The teaching of computer coding should be prioritised over modern languages, according to a survey of British adults.
Twice as many thought teaching computer coding in school should be a priority than the number who saw Mandarin Chinese as more important. Coding was the top choice for 52%, against 38% who favoured French lessons, 32% Spanish, 25% German and 24% Mandarin.
The poll was published by code.org, a campaign to introduce children and parents to coding. It has created Hour of Code, a series of free tutorials designed to show students the basics of programming in an hour.
Eye Movements in Programming Education: Analyzing the expert’s gaze
Workshop at the 13th KOLI CALLING INTERNATIONAL CONFERENCE ON COMPUTING EDUCATION RESEARCH
Joensuu, Finland, November 13th – November 14th, 2013
Computer Science Education Research and Teaching mainly focus on writing code, while the reading skills are often taken for granted. Reading occurs in debugging, maintenance and the learning of programming languages. It provides the essential basis for comprehension. By analyzing behavioral data such as gaze during code reading processes, we explore this essential part of programming.
This first workshop gives participants an opportunity to get insights into code reading with eye movement data. However, as this data only reflects the low level behavioral processes, the challenge to tackle is how to make use of this data to infer higher order comprehension processes. We will take on this challenge by working on a coding scheme to analyze eye movement data of code reading. The links between low and high level behaviors will help computing science educators to design, realize and reflect on the teaching of code reading skills.
Furthermore, we aim to open discussion about the ways of explicit teaching of readership skills in computing education. Therefore we will discuss the role of reading skills in teaching programming, facilitated by position papers of each participant.
To participate send a mail to firstname.lastname@example.org. It is possible to participate independent of attending Koli Calling. Participants will get eye movement data of reading and comprehension processes of expert programmers, and a coding scheme for annotating the process. You will annotate the video, and reflect on the (perceived) intentions behind the visible pattern. Applying and refining the coding scheme on the data gives insight into the higher order comprehension strategies of the reader.
A short individual reflection and position paper of the results and perspectives for teaching programming is required by the participants [max. 2-3 pages]. As a result, participants will jointly prepare a paper with the data and the refined coding scheme.
Phillip Guo has a piece in Blog@CACM on how he tutored a single adult to learn to program. He contrasts it with the MOOC approach of teaching thousands. There’s another important contrast–between anecdote and data.
Phillip’s story is interesting and compelling. He raises some key insights, like the value of motivation to drive someone to come to a new understanding. But some of his claims are just too broad, like the one he boldfaced below in his original, “I don’t think there is any better way to internalize knowledge than first spending hours upon hours growing emotionally distraught over such struggles and only then being helped by a mentor.”
Phillip could be right. (I don’t think that he is.) But to suggest that there isn’t a better way based on the study of one learner is over-generalizing. There is a research methods for produce case studies, which is the closest research method to what Phillip did. There’s only so much you can claim from a single case study, though.
Brian usually did 10-15 hours of programming on his own before each 1-2 hour Skype call with me, so he always had plenty of urgent questions and newly-written code that he wanted me to help him debug or improve. If I had just given him lectures without any context, he would not have internalized the lessons as thoroughly. He would have probably nodded his head and been like, “uh huh, ok that makes sense … cool. what’s next?” Instead, because he was usually struggling with concrete, code-related problems before our tutoring sessions — often to the point of frustration and discouragement — he would respond more like, “OHHH, WOW! Now I totally get it!”, whenever I guided him over some problem that seemed insurmountable to him at the time. His joy and relief were always unmistakable. I don’t think there is any better way to internalize knowledge than first spending hours upon hours growing emotionally distraught over such struggles and only then being helped by a mentor.
Interesting question, beyond asking what is computational thinking: If you require “programming,” what counts as “programming”? The Chronicle asks, does typesetting in LaTeX count?
I’m interested in how the non-CS community will answer that question. What will programming look like for “everyone else,” the non-CS majors, those who aren’t professional software developers? I’m fascinated by CSound, the music and sound synthesis language. There are no looping structures, just go-to. If your first thought is “it looks like assembly language,” check your CS-informed biases at the door, please. If you don’t know what “assembly language” is, what is CSound? Almost none of the examples include looping or conditionals. But for me, it’s definitely programming. What is our bottomline of what is programming, and in particular, for what communities of practice?
We’ve discussed this before here at the blog, and I suggested that the definition of “programming” be broadly defined to include any creative work that gets a computer to work beyond its basic feature set. So, for example, learning to use MS Word to write a paper — while that’s important — would not count as “programming”, but learning to typeset a research paper in LATEX with a bibliography would (probably) count. Georgia Tech’s approach of using of media computation would seem especially attractive to students who wouldn’t normally count themselves among CS enthusiasts.
GasStationWithoutPumps did a blog piece on the newspaper articles that I mentioned earlier this week, and he pointed out something important that I missed. The Guardian’s John Naughton provided a really nice definition of computational thinking:
… computer science involves a new way of thinking about problem-solving: it’s called computational thinking, and it’s about understanding the difference between human and artificial intelligence, as well as about thinking recursively, being alert to the need for prevention, detection and protection against risks, using abstraction and decomposition when tackling large tasks, and deploying heuristic reasoning, iteration and search to discover solutions to complex problems.
I like this one. It’s more succinct than others that I’ve seen, and still does a good job of hitting the key points.
Naughton’s definition includes issues of cyber-security and risk. I don’t see that often in “Computational Thinking” definitions. I was reminded of a list that Greg Wilson generated recently in his Software Carpentry blog about what researchers need to know about programming the Web.
Here’s what (I think) I’ve figured out so far:
- People want to solve real problems with real tools.
- All we can teach people about server-side programming in a few hours is how to create security holes, even if we use modern frameworks.
- People must be able to debug what they build. If they can’t, they won’t be able to apply their knowledge to similar problems on their own.
Greg’s list surprised me, because it was the first time that I’d thought risk and cyber-security as critical to end-user programmers. Yes, cyber-security plays a prominent role in the CS:Principles framework (as part of Big Idea VI, on the Internet), but I’d thought of that (cynically, I admit) as being a nod to the software development firms who want everyone to be concerned about safe programming practices. Is it really key to understanding the role of computing in our everyday lives? Maybe — the risks and needs for security may be the necessary consequent of teaching end-users about the power and beauty of computing.
Greg’s last point is one that I’ve been thinking a lot about lately. I’ve agreed to serve on the review committee for Juha Sorva’s thesis, which focuses on his excellent program visualization tool, UUhistle. I’m enjoying Juha’s document very much, and I’m not even up to the technology part yet. He has terrific coverage of the existing literature in computing education research, cognitive science, and learning sciences, and the connections he draws between disparate areas is fascinating. One of the arguments that he’s making is that the ability to understand computing in a transferable way requires the development of a mental model — an executable understanding of how the pieces of a program fit together in order to achieve some function. For example, you can’t debug without a mental model of how the program works (to connect to Greg’s list). Juha’s dissertation is making the argument (implicitly, so far in my reading) that you can’t develop a mental model of computing without learning to program. You have to have a notation, some representation of the context-free executable pieces of the program, in order to recognize that these are decontextualized pieces that work in the same way in any program. A WHILE loop has the same structure and behavior, regardless of the context, regardless of the function that any particular WHILE loop plays in any particular program. Without the notation, you don’t have names or representations for the pieces that is necessary for transfer.
Juha is making an argument like Alan Perlis’s argument in 1961: Perlis wasn’t arguing that everyone needed to understand programming for its own sake. Rather, he felt that the systems thinking was the critical need, and that the best way to get to systems thinking was through programming. The cognitive science literature that Juha is drawing on is saying something stronger: That we can’t get to systems thinking (or computational thinking) without programming. I’ll say more about Juha’s thesis as I finish reviewing it.
It’s interesting that there are some similar threads about risk and cyber-security appearing in different definitions of computational thinking (Naughton and Wilson discussed here), and those thinking about how to teach computational thinking (Sorva and Perlis here) are suggesting that we need programming to get there.