Additional profile information on Alfred Thompson at Google+
The other day a regular reader of this blog (thanks Avi Burstein) sent me a link to an article titled Academic source code dust-up symptom of CS education ills. The short version is that a college student posted the source code from a school project to the Internet and his professor objected strongly. The professor was concerned that future students would be able to find the code on the Internet and turn it in as their own. The student believes that his right of expression allows him to post his work. Eventually an academic judicial affairs office sided with the student. Kyle Brady the student involved tells his version of the story on his blog. I don’t expect this to be the last of this sort of conflict though. And that is a shame.
I’ve been programming for school, for fun and to make my living for about 37 years know. And while I have learned a great deal from course work and from “book learning” I have learned even more from reading the code other people have written. In fact many textbooks include sample code. Certainly the books I have written have included sample code. But professional developers spend a lot of time reading other people’s code. Formally, informally and in any way you can imagine. They also look to reuse code. And they keep documentation around. Even today when much of what one wants to learn professional software developers often have shelves filled with books. Believe it or not they actually reference them too!
I don’t remember when I first heard someone say “real life is an open book test” but it really stopped me on my feet one day. It also influenced me as a teacher. While I often expected students to memorize some things and gave my share of closed book tests and quizzes I always expected students to take advantage of external resources for projects. That included the textbooks of course and the help files and programming language documentation. It also includes asking for help – though one does have to be careful about explaining the difference between getting help and getting someone else to do the work. And yes, even looking things up on the Internet. That’s how professionals work.
There are people, often great educators whom I respect, that want to put more limits on students. For example they want to avoid things like Intellisense (IDE features that show programmers options for function/method calls and parameters) because if means they don’t have to memorize as many of those things. I disagree because I see greater value in the experimentation and “accidental learning” that provides. But that is ok I think.
Stealing (or borrowing) code from the Internet is a real and justifiable concern for many people teaching computer science (well programming anyway). I would argue that faculty should know their students programming styles well enough to spot clear cheating just as English teachers can pick it up in student essays. Sure that is not very practical in sections of 300 but I don’t approve of sections that are too large for the instructor to know their students. (So there :-P ) IF you are going to have sections of 300 you are begging for cheating to occur so you should not whine when it happens. That doesn’t mean I approve of cheating – I don’t. But you already heard me write disapprovingly of overly large sections and cheating is one reason for that.
One thing I used to do with semester end projects was to have one on one mini-code reviews with each student. They would do a demo and I would test a few things. Then we would talk about the code. I came prepared and if there was code that seemed to advanced for the student or too different from their normal work I asked them to explain it. If a student can explain code in a way that makes it clear to me that they know how it works, can debug it, can modify it and can make it fit their particular application why should I care if they wrote it from a blank slate or took some ideas and code snippets from someone else? It would be like penalizing a student in shop class because they borrowed a saw.
School is about learning. It is not teaching students to work with one hand tied behind their back. It is about helping to understand what they read (or find on the Internet) not making them reinvent the wheel. I’ve blogged before that I think it is important to have computer science students read more code. IF they find student code on the Internet and learn something from that I think that is great. I suspect they’ll learn how not to do things more often that how to do things but that is valuable learning too. In the mean time there are a great many code samples on the Internet. Microsoft posts lots of code that answers the question “How do I?” (some links below) There are many other sites that do the same thing. Students will find sample code. But they will learn for it and that is what we’re all after isn’t it?
When grading student projects the easiest thing in the world is to assign a grade and give that as the sole feedback to the student. It requires the minimum amount of work and it satisfies the need to have something in the grade book. Doing that always frustrated me as a classroom teacher. I just didn’t see how a mere was contributing to the learning experience. And yet writing out detailed critiques and highly individualized essays just takes too much time. This is especially true if you assign a lot of projects and have a number of classes doing them. The minutes add into hours very quickly. It’s a problem.
What I eventually did was to create a little program that I used to help me grade. basically this program read in a comma delimitated text file that included comments – advice, praise, credit, things missing, etc. These comments would be displayed on a form with checkboxes next to them. I would check off all that applied and fill in a textbox that was provided for things I didn’t anticipate. As I reviewed the project I would check off the boxes and the grade would be calculated. I did have an option for tuning that somewhat but since I was usually pretty clear on what expectations were missing those requirements usually dictated the grade. I also allowed for bonus points. The results would be saved to still another file and/or printed out.
The students received a pretty detailed report on what they did right, left out, got extra credit for and so on. This was by no means perfect but it was a start. I was also able to look at the ending comments and get a good feel for what topics were covered well and which not so well. this was very useful to me in determining where review was required and where I needed to change things next time I taught that material.
There was/is still a part of me that would have loved to have spent some time individually with each student doing a code review of their projects. Not really practical I’m afraid. I did try to find some pieces of code worth going over with the class and I like to think that was helpful. And sometimes there was a student (or two) who really needed some 1 to 1 time – usually after school – to “get it.” Tough to find that time sometimes with students having sports and work and homework and ones one desire to have a life. But a lot of good learning (for me as well as the student) happened when those things did work out.
I wish we could always teach everything one teacher to one student but that isn’t practical. So we walk the line between enough and not enough. What sort of things to you do to provide more feedback in less time and effort on your part?
A while back the College Board dropped one of the Advanced Placement Computer Science exams – the so-called AB exam. (About 14 months ago and I wrote about dropping the APCS AB exam here) Ever since then there has been a lot of discussion about the AP computer science curriculum in specific and the high school computer science curriculum in general. The College Board is working on a ne AP CS exam. The current A exam is still going to be around and the word is that it is in for some minor changes. One of these is a possible change in name to “AP Computer Science: Programming.” Now cynics and critics (of whom I have been known to be one) might wonder out loud why not “AP Computer Science: Java” but that’s not likely to happen. In theory the language could change one of these days. But there is also a totally new AP CS course in the works. This one is likely to be called “AP Computer Science: Principles” though I don’t believe any of these names are set in stone just yet.
What is this new course going to be like? Well that is hard to say as the Commission the College Board appointed to work in it is just getting started. But if seems like “there’s interest in providing teachers with choices of what language they teach. ” Mark Guzdial who is on the Commission lays out some of the issues involved in a recent blog post called “Nudging Computing Education” In this post he says that an unlimited set of choices is unlikely. I have no doubt that he is right. He also talks about some of the pros and cons of some languages - C++/Java and Scheme.
Now all of these languages have their supporters and detractors. Personally I think anyone going into a career (academic or industrial) should learn C++ at some point. I am not a fan of it (or Java for that matter) as a first language. Likewise I know people who are having great success teaching computer science with Scheme but also know students who all but dropped the idea of taking additional classes because of bad experiences with that language. Truth is – no language is perfect. But most of us have our favorites. So now a pitch for my recommendation for a language to make the short list for the new AP CS Principles course- Visual Basic. Come on you knew that was coming. :-)
On the pro side Visual Basic has an easy to learn syntax. many students find the semi-colons and curly braces of C-style languages and the complex nesting of parentheses of Scheme confusing and frustrating. That seems, in my experience at least, to be less of a problem with Visual Basic. Or other versions of Basic such as Small Basic for example. Then there is the matter of graphical user interface programming. Sure it is not by itself that important a concept but it can be part and parcel to students experiencing success and creating something that looks and feels “real” and relevant. Getting students interested and letting them have fun should be an important part of a first programming experience. With Visual Basic this is simple, fast and easy. Done right an instructor can keep students focused on code and concepts while the students enjoy creating software they can show friends. Plus there are features in the IDE like Intellisense that make exploration and self-learning easy. I think that is a plus.
Now critics will say that it is a proprietary language and only runs on Windows. True. But that still means it runs on most computers that most schools have. Cost is not really a barrier because the Express edition of Visual Basic is a free download. Students can even get the professional edition for home use for free through the DreamSpark program. And even if a teacher doesn’t want to use it that is not a good reason, in my opinion, from excluding it from a list of options for other teachers to choose from.
People might argue for a C-style first language because the APCS: Programming course is in Java. I have two replies to that. One is that after several years of starting with Visual Basic and following up with C++ (as C-style a language as it gets) I found that students with a good foundation of the concepts had little if any trouble picking up C++ from as inadequate a teacher as me. The other possibility is to include C# on the list of accepted languages.
Why? Well because C# has the same ease of creating GUIs that VB has. The same powerful and helpful IDE that VB has. And the colons and curly braces others seem to love and cherish. So that is two languages I’m suggesting. I suspect that there will be some strong support of Python as well.
Python is a dynamic language that is seeing increasing use in education. So the question for the commission is how many languages for their list.
I would argue that C++/Java/C# are all close enough that to include one means you can probably include all three. Given how many people are using Visual Basic for non-AP courses and the desire to see this new AP course reach many more schools than the present exam I think it should be included as well. Even if you don’t buy all of my earlier arguments. Python and Scheme? Probably or some people will scream pretty loudly. So does the list look like:
We could do worse. The one monkey wrench in this list is Scheme. While the other languages are procedural/object oriented languages Scheme is a functional language. Things work a little differently (some would say a lot differently) with functional languages. I’m glad I don’t have to make that decision or worse yet write the test that includes Scheme with the other languages. Not that that isn’t a worthwhile goal.
So what do you think? Any language you would add or subtract? Anything your seriously object to? Leave a comment or better yet hunt me down at NECC and give me a piece of your mind.