Recently an article by Dr. R.B.K Dewar and Dr. E. Schonberg called "Computer Science Education: Where Are the Software Engineers of Tomorrow?" really got some discussion going. The authors brought up a lot of what they see as problems in computer science education and they placed a good bit of the blame on using Java as a first programming language.
There was a lot of discussion on the Advanced Placement Computer Science mailing list, a lot of professional developers I know also sent it around, and of course there has been discussion of it in various blogs. I highly recommend the response by Michael Kölling, Senior Lecturer at the Computing Laboratory, University of Kent. Michael and I have had our disagreements in the past but his discussion of this article is pretty much spot on.
The complaints that Dewar & Schonberg make against Java are just as valid (or not) against the .NET languages like Visual Basic and C# BTW. But the real problem is not the first language but the overall curriculum (which is one of Michael's points.) The problem is not the tool but how it is used.
As I see it the university curriculum has gotten too big and complicated. No one wants to leave things out but there is limited time in a four year degree. Some have talked about making more CS programs five years long. That has some problems. The answer I see it to move more computer science into the high school grades.
Think about what it would be like for a math major if his first exposure to algebra, trigonometry and geometry was in the freshmen year in college. Unthinkable isn't it? And yet for many students that is essentially what we do with computer science. We have computer science majors who never took a programming or other real computer science course in high school. Or perhaps they took one course - maybe APCS or perhaps a BASIC programming course. Is it any wonder that CS 1 is a very basic sort of course? Is it any wonder that retention is such a problem?
High school students should have the opportunities to do more. I know that they can do more. I have had many students over the years who took two full years of computer science, learned several programming languages, and were well prepared to jump in at a higher level than many of their peers when they got to college. I know many other teachers who have had the same experience.
Wouldn't things be a lot better in college if students arrived knowing how to program and program well? Wouldn't it be better if the first CS course majors took is something that sophomores (or second year students) took today? I think so.
Of course there are difficulties. There is a real shortage of well-trained CS teachers in high schools. And of course there is a lack of standards that allow students to get graduation credit for computer science courses. So this is not an easy situation. But I do think that we have to start thinking of computer science as a liberal art and find ways to teach it more and better in high schools.
I would love to see AP CS use C or C++ by the way. Great stuff. Pointers is important for example. But as a first language C++ is not a good idea. The first language has to be able to build interest and cover the simpler more basic concepts. Moving the AP CS program to C++ (again - I taught C++ as an AP language in the past) would not be a good idea without previous course requirements using a better first language. Just my opinion - I'd love to hear others.
[Note: I see that Barb Ericson has a nice reply to the origional article here at the CSTA blog.]
"Where are the software engineers of tomorrow?"
India and China. Obviously, you haven't been paying attention. Maybe you should have more high school courses in Mandarin and Project Management. Make sure those future IT workers can create a Gannt chart in Microsoft Project and we should be good to go.
Sample question on a high school computer science test: If it is 3:00 PM in Peoria, what time is it in Bangalore?
One of my rules for programming is that "You can write well structured code in any language. And you can write horribly structured code in any language". I think I'm going to have to extend this to "..and you can also give good programming courses using any language and you can give lousy programming courses using any langauge".
The way I see it, the choice of language probably contributes to around 30% of the chances for success of the course. The context, the relevance of the content and (most imporantly) the way it is presented and supported, all make up a much greater proportion.
The most imporant thing that you need to consider is "Why are we teaching this stuff, what will the students use it for?". If you start from there you can decide things like whether and when to teach pointers, what emphasis to place on pre-built code etc etc.
Without a solid context for the teaching there is no point in arguing which language is better for the job.
If you are looking for a strategy to teach what I would call "proper" programming, having done this for a while, I would simply say that you must start with algorithms so you know what computers actually do, and then bring on abstraction, classes and all that stuff as a solution to a problem of organising your data and behaviours.