I want to talk about student placement a little bit.
The most obvious placement is if students have taken AP Computer Science. APCS has changed since I took it in the 2004-2005 school year. I only recently learned that they discontinued APCS AB in 2009 (according to Wikipedia, due to lack of student interest). What has continued is APCS A, which includes variables, branches, and classes, but not data structures or recursion. Without deliberately designing for APCS, our two-course core sequence breaks cleanly at OOP, with inheritance straddling the line. Our current policy is that doing well on the APCS exam (a 4 or a 5) allows students to take the second course.
Increasingly, however, I’m finding students who has computer science experience but who did not take APCS. For example, I currently have a student whose parents work in the tech industry, and so have spent the last year learning Java and Python by following books and online tutorials. Two different students are enrolled in Edx’s version of Harvard’s CS50, and one of them is asking if we will give credit for it. (It turns out Oxy does not have a “no online courses” policy, which made my life difficult.) CS50, in particular, uses C, which means students get a decent grounding in loops and arrays, but with no experience with classes and OOP.
This is a problem, because now the students can’t go directly to the second course, but half of the first course also fails to provide a challenge. The discussions I’ve read over from other schools advocate for erring on the side of letting these students catch up in more advanced courses. We have yet to offer the second course, at least after we restructured the curriculum last year, so it may be possible to accommodate these students. Even if the syllabus doesn’t change, I don’t feel classes are too difficult a concept to grasp, so the extra work may not be overwhelming.
Since we haven’t formalized a policy, the de facto result is that these students are in my CS1 course. I’m lucky that so far they have not directly affected the learning atmosphere in any serious way – for example, by asking questions that show they clearly know more, thereby intimidating other students. In fact, I deliberately pair them up with weaker students in lab, which provides an opportunity for peer learning. Groups with hetergeneous skill levels is still possible without the advanced students, of course, but the mutual recognition of their status between the student and me has led to valuable conversations about pedagogy.
The last thing I will say is that I have been watching how these students react to the material. While they are already familiar with loops, their computational thinking/problem solving speed is surprisingly not much faster than the best students who do not have any experience. Most of these students learned a language other than Python, but I don’t think that completely explains the lack of a gap. I don’t have a good alternate hypothesis, however, outside of the general notion that they have yet to internalize the structural and procedural abstractions of a seasoned programmer, which only comes with experience. For now, the short in class brain-teasers still make them think, and I take it as a sign that it’s at least not a complete waste of their time.
Looking ahead, I expect the number of self-taught computer science students will increase, as MOOCs and other online resources gain visibility, and I foresee formally deciding on the placement criteria soon. My current ideal is to get administrative permission for some students to take the course for half the usual credits, which would allow more granular placement. One can dream.