Apr 28 2004
Adult Ed, Continued
Minus a three week holiday, I’ve been teaching an adult course in Java programming for the last 10 weeks. This has been… educational for all involved.
Three students—two of whom are retirement age, I believe. Only one of the three has any previous programming experience, and that was 15 years ago. They’re all many years from their last experience as “students.” Despite the small size of the class, it isn’t “easier” to teach—it is different, but the amount of work an instructor has to do (if you’re going to do a good job) doesn’t drop magically with fewer students.
I’ve been working from the Barnes and Kolling Objects First textbook, which is one of the best out there for teaching Java. I also rolled in some of the “Design Recipe” approach from HtDP, as that was the text I’ve worked with most before this course. In the first eight weeks, I did my best to do a lot of repetition of core concepts (for reinforcement), and I assigned a lot of code annotation/reading assignments.
I could talk about some of the things I think were successful so far, but I think the most enlightening things have been what might typically be considered points of failure. These are the points where I have learned the most about what I’m attempting to do.
- Not enough success early / success often
I forgot the full implications of what it means to be an adult learner returning to coursework after a long absence. My students are not accustomed to the kind of frustration that can result from attempting to do something new and different; university-age students walk in the door expecting things will be new and different.
I would give my students assignments, and encourage them to write me with questions when they were stuck. Most of them did not ask questions, and I wrongly assumed things were going well. After two weeks, I realized they weren’t; they were getting the concepts, but they weren’t connecting those concepts to the code they were writing (this is a persistent theme). In fact, they were having a very hard time actually writing code, which wasn’t obvious, as they were doing reasonably well reading code.
My point is they needed more feedback, sooner, and it needed to be positive.
- Asking questions is hard
Sitting 10 weeks into the course, I realize fully that there is a certain amount of pride or stubbornness involved for adult learners: “I should be able to figure this out!” I also think they don’t appreciate fully how hard the material is, and just how many questions they should ask. Of course, this implies that they know what to ask, which often they clearly didn’t.
- Failure to achieve automaticity
In reading Schools of Thought by John Bruer I was struck by his review of research on reading and writing. In particular, the fact that as accomplished readers, no working memory is used in the process of reading—it is as automatic as learned kinetic skills (playing scales on the piano after years of lessons, etc.).
My students can read code. They can’t read code automatically. They see
Foo x = new Foo();
x.something();
And they can tell me that Foo is a class, that x holds an instance of the class Foo (it’s an object), and that we then invoke the something() method on the object x. But that isn’t automatic. They have to think about it.
When I look at that piece of code, I immediately understand as much as I have just said. In fact, this is almost irrelevant to me—I’m already more interested in what kind of class Foo is, and what the something() method does. In short, I’m using my working memory for building up a picture of what they program does, as opposed to making sense of the code itself.
- Lack of context
My course is the last of the IT certificate. It doesn’t connect particularly well to the rest of the course. So, on a larger scale, it isn’t clear why they’re taking this course.
Within the course, I didn’t have a thematic arch for the 16 weeks. As a result, it wasn’t clear where we were going or what we were trying to achieve.
Both of these issues can easily be dealt with the next time around.
I do have some solutions in mind for a second run; briefly:
- Feedback early and often: Test harnesses
I started giving the students assignments with test harnesses built in. This way, as they wrote their code, they could first compile and see if it runs, and then they could run the test cases to see if it does what it is supposed to. This way, they get instant feedback if they’re on track, or off track.
This kind of quick feedback gives them confidence that they’re making progress. They really liked it in the most recent assignment, and felt much better about it as a result.
- Requiring questions
Perhaps I should not only have code reading and writing assignments early on, but also assignments where I force them to write possible exam questions, and they should provide (what they beleive) are plausible answers as well. If they can’t pose a question, then they should do their best to identify what it is they are confused about.
At the end of the day, I guess I’m thinking that some more reflective practice would help.
- Automaticity: Flashcards
How do you establish automaticity in reading code? Certainly, there is no literature out there on this concept; this is probably the first time anyone has connected the ideas in writing. So, I can only use the mechanisms I already know work: flash cards, memory games, and other simple exercises that are designed to reinforce small pieces of information in long-term memory.
When I started “programming” on the Commodore 128, I would copy long program listings from magazines so I could play some game, or use some utility. Eventually, I started writing my own little programs, and I would refer back to these listings to see if I could use things from them in my own code. Eventually, I managed to work out how to
peekandpokethings, which allowed me to do interesting things with long lists of data.Point being: it was by repetition and rote learning that I picked up a lot of things in the very early days. This must be a factor, and a significant one at that.
- Providing context
Anything. Something. Working towards an information system of some sort, be it a punch clock or an attendance register—anything that they can concretely understand and work towards. Something that ties together databases, HTML, scripting, and everything else that was in the course. Adding this kind of theme is relatively easy, however, so I’m least worried about this.
I’ll certainly revisit this. If nothing else, it has served its purpose as an external brain dump for me to share with my colleagues also working on the IT cert course.
I found myself sucked into a “recursion vs. state” debate last week. This particular debate was that it was easier to teach people about objects (as in object oriented programming) than to do anything that involves the word recursion. I maintain that the ordering in which material is introduced plays a significant role in a student’s ability to assimilate it into their existing knowledge of the world—and in this respect, students are no more prepared to think about a stateful, object-oriented universe than they are prepared to think about highly structured, and sometimes self-referential information (all of which is in the abstract).





My parents are on dial-up, but we had no problems. In fact, audio quality was better than some of my transAtlantic phone calls I’ve made in the past. They used the built-in microphone in their iMac, which was OK; a pair of headphones with built-in mic would be better (right) for audio quality, but by using the built-in mic, both my mother and father could talk to me, and both could easily hear what I was saying through the speakers in the PC. A genuine speakerphone.
What would ideally come next is video. This afternoon I’ll chat with Pete (who has a nifty video-chat camera thinger), and before then I’ll try and find someone with a video camera that I can use. From searching the web, my guess is that it won’t be possible for me to find the right hardware that quickly.