Why we ought to teach Java: Computing education and social practice
We’re re-examining/reconstructing our reading list for the qualifying examination for our PhD in Human-Centered Computing. One of the papers I’ve had the chance to read (and re-read — it’s a dense piece) is by James Greeno, Allan Collins, and Lauren Resnick, three top-notch education researchers.
Greeno, J., Collins, A., & Resnick, L. (1996) ‘Cognition and learning,’ in Berliner, D. & Calfee, R. (eds.), Handbook of Educational Psychology, Macmillan, New York: 15-46.
They contrast three views of education, which are paradigm shifts in the Kuhnian sense. It’s not that one is better than the other. One looks at different things than the other, creates different theory, leads to predictions about entirely different things. The first was behaviorist/empiricist — learning was observed responses to stimuli. Behaviorism explains a lot, and can lead to strong predictions. The second is the cognitive/rationalist view, the view of learning as have knowledge structures in the brain. This was the view started by Piaget, and it has had the greatest impact on schools. The third view is the “situative/pragmatist-sociohistoric.”
A third perspective on knowing focuses on the way knowledge is distributed in the world among individuals, the tools, artifacts, and books that they use, and the communities and practices in which they participate. The situative view of knowing, involving attunements to constraints and affordances of activity systems, suggests a fundamental change in the way that instructional tasks are analyzed. The change is away from analyses of component subtasks to analyses of the regularities of successful activity…When knowing is viewed as practices of communities and abilities of individuals to participate in those practices, then learning is the strengthening of those practices and participatory abilities.
This is the perspective described in Lave & Wenger’s classic Situated learning: Legitimate peripheral participation (also on our HCC reading list). The situative view is most powerful in describing learning in naturalistic settings, from apprenticeship to life-long learning (e.g., how professionals get better at what they do). An important difference between the situative and the cognitive is in defining “what’s worth knowing.” The situative is focused on learning how to participate in a community of practice, to be part of the discourse and activities of a group of people who work towards similar sets of goals in similar ways.
Computer science education is feeling the tension between the cognitive and the situative today. I see it in the discussion about Greenfoot. We CS educators talk about our foundational concepts, and we talk about learning the tools of our community. We say that “We don’t teach languages, we teach concepts,” but then we talk about our courses as “the C course” and “the Java course.” Once, the community of practice in computing was mathematics and electrical engineering. That’s what people knew and talked about, and that’s what we now call our foundational concepts. Today, there is a huge community of computing professionals and scientists with lots of activities and tools. They have a practice and an on-going discussion. Knowing the common knowledge and practices in use in computing today is not vocational — it’s about being able to communicate with others in the practice. Java is the the most common language in the discourse of computing education today. No computer science undergraduate is educated without knowing it. This fact has nothing to do with what languages best make evident the concepts of computing. This has everything to do with being part of a community.
What we teach in our Media Computation data structures book when we teach about simulations in Java is absolutely harder than when I taught similar content in Squeak. But it’s harder, in part, because we’re dealing with how to make this work around the strong typing in Java, and we’re making sure that students understand interfaces. Those are worth knowing, too. Strong typing and interfaces are part of what the community of practice of computing values and talks about today. Students are not well-educated if they cannot be part of that conversation (even if only to say that they don’t like the existing practices!).
As a computing educator, I have a responsibility to stay informed about the activities of computing — in part, that’s what Stroustrup is arguing when he says that professors ought to be building software. I have a whole collection of recent computing books on my shelf that I’m still working through. There are books on Ruby and Lua, Django and script.acul.ous. Are these the right ones? I don’t know. They’re my best guess, and once I read up on them, I’ll have a better sense of whether I think they’re worthwhile. I should be able to talk about the best ideas in tools used by practitioners in my community, the community that I work in and that my students will work in–and importantly, critique them. Part of my job, in the Lave & Wenger sense, is to exemplify the center of the community of practice for my students. To do that, I have to be able to speak the language in that community of practice.
I’m not arguing that Java is a great language, and I’ll continue arguing that Java is a poor beginner’s language. But our students do need to know Java, because Java exemplifies the current ideas and practice of our community. Our students are not well-educated if they can’t participate in that discourse. That’s why it is important for us as computing educators to learn how to teach Java and how to motivate the learning of Java. Not teaching them Java is not an option. Not teaching them Java leaves them uneducated. Not teaching Java only means that our students will be at a disadvantage. Our students don’t win because we refuse to play the game.
An argument from the cognitive perspective (the one I grew up in) is that students who have a strong set of concepts, who understand the core of their field well, can easily teach themselves the current tools and practices of the community. That may be true. What we know about transfer suggests that it’s true. I want to believe that’s true, but I realize that I’m crossing paradigms. I do recognize that the knowledge of the language and tools don’t come for free. Yes, Ruby is like Smalltalk — but just because I know Smalltalk, doesn’t imply that I know Ruby. Just because I know English and Latin and French, doesn’t mean that I know Spanish. It might be easier for me to learn a related language. But I still have to do the work to learn it.
All the tools and languages in common practice in computing today have important ideas embedded in them from some smart people — and maybe some less-important ideas from some not-so-smart people. But they are the ideas that our community is talking about. I’m not a fan of strong typing, but I realize that my students need to know what it’s about, because there are reasons why it’s part of our dialogue today. E.D. Hirsch writes books about “cultural literacy” and has made up long lists of the vocabulary that children need to know at various ages. One can critique Hirsch’s approach for being uninformed by the cognitive. Students need to know the concepts and have the knowledge structures to think about these ideas appropriately, not just know the words. But a focus just on the concepts leaves one open to a reasonable situative criticism. Our students must also be able to talk to the practitioners in our community.
We absolutely need to create better computing education. Java is a poor beginner’s language. We have to continue to critique and develop our practices. Our students are going to join this community, and that involves not just having a set of powerful knowledge structures. It means knowing the language and common practices of this community. Java is important to learn for the situative learning goal. The goal of an education in computing is a set of concepts and the fluency in the languages and practices of the community.