First, a disclaimer, this may end up as a bit of a rant. I was listening to the listener feedback episode on my drive home from the holidays the other day, and the discussion on computer science education interested me. I'd like to share a conversation I had with several CS professors a few years back. As a Virginia Tech alum, I was asked by my employer (IBM) to represent the company at an ACM programming conference we were co-sponsoring, at which VT and a number of smaller schools in the region were competing. I was talking with a few professors from some of those smaller schools about how they went about teaching the discipline and the topic of what programming language should be taught was brought up. One professor mentioned that he would really like to teach his intro classes using Lisp (I think it was Stallman who said even if you never use Lisp, it's still useful to learn it because it will teach you a lot about computer science in general), but couldn't because it would be impossible to get students to take it then. I (in the position as a programmer in a corporate setting) mentioned that wouldn't be such a bad thing, as it would help filter out students who probably should major in something else. Well, the professors were all horrified at that notion. Enrollment was already dangerously low, they told me, so doing something like that would ensure they would be out of a job in no time. Maybe a large, well known CS program could take a risk like that, but these were all professors at small private schools. The lesson I got from that was that in order for a CS program to be successful, unless you are MIT, it has to be very accessible. It can't just target those who will eventually be the über-programmers we want to be our co-workers. At first I thought this was the wrong way to go about it as this targets quantity over quality of our future software engineers, but I suppose they do have a point. Not everyone taking intro to comp sci is going to be a software engineer, just as not everyone taking intro to biology is going to be a biologist. In fact, it is becoming more and more important for members of other disciplines (especially, though not limited to, engineering and the sciences) to learn at least some CS. They won't have to write huge, multi-layer applications, but they may well need to write a short script to accomplish something on a computer. So as Bio 101 doesn't usually start out with teaching the complicated organic chemistry that is the heart of all biology, CS 101 also needs to start out at a much higher level of abstraction. And what is the most natural abstraction of CS? Well, depending on who you talk to, either objects or functions. I would personally side with functions, but much of that is tainted by how many problems arise with the common modern implementations of OOP. Functions are familiar, not just to mathematicians, but to anyone who as taken an algebra class. And the use of functional programming is not just useful to those who are working on massively distributed programming, but also to a scientist who needs to write a script to perform some computation of their data, or an engineer who needs to run calculations to test their design. In fact, anyone who has used grep should have no problem defending the utility of functional programming. Of course those students who (most likely well after taking CS 101) decide to specialize in it and become software engineers will need to learn a lot more, such as the internals of how all this "magic" stuff they used in their beginning classes really work. But I don't think that would be any more difficult than learning cellular biology or organic chem after having a high level overview of biology. So I suppose this is just a long-winded message about how whoever it was (I think Tor) who was arguing that you need to start at the bottom and learn up was wrong
Oh, and regarding the original listener feedback about using JUnit to launch programs for beginning students, I guess I have mixed feelings about it. One one hand, I worry that if students first see JUnit as just a way to launch "Hello World", they may have difficulty switching over to using it for real unit tests (I suppose I don't have an argument for that, its just more of a gut feeling more than anything else). On the other hand, I think using JUnit as it is intended would be very useful. If they write a program to compute the nth Fibonacci number, instead of exercising it in int main(...), write a JUnit for it. -- You received this message because you are subscribed to the Google Groups "The Java Posse" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/javaposse?hl=en.
