Bad Predictions for CompSci needs
June 2, 2003
Starting this fall, the College Board's Advanced Placement exam for Computer Science will shift from its current focus on C++ to use Java as the programming language for the test. I suppose it's good to see the requirements evolving to reflect real-world demand for skills, but I can't help but think that a more accurate preparation for business use of computer technology would require the use of a simple scripting language to tie together larger pieces written in multiple programming languages. This model is common to the LAMP platform and to many parts of the .NET and Java ecosystems, and is much more likely to lead to a career path in integration, management, or planning of technology deployment. These skills will be especially valuable in the market that these kids are graduating into after college, where many fundamental programming tasks in languages like Java and C/C++ will be outsourced overseas to countries like India, Israel, and Russia.
I'm not ignoring the importance of classic programming skills or the fact that applications and frameworks created in those languages are essential. They're critical, but just as we've seen with the hardware they run on, which is also critical, they're subject to being commoditized. In short, teach them to lead and to see how to connect pieces, not just how to make pieces. Anything less is selling them short.
23 Comments
Leave a comment
- Earlier: radical inventions!
- Next: Today Anil Writes About The Weather

I think you're placing undue weight on the importance of the specific programming language, rather the importance of algorithmic thinking, which (I would hope) the AP test is supposed to measure. Most of computer science consists of skills that are independent of computer language - an feel for how to split a complex task into small simple tasks, some kind of intuition for relative running time and memory requirements, the ability to bootstrap yourself up into higher levels of abstraction.
I think a fair analogy would be an AP Art exam that required all students to do some hour-long studies in charcoal. While it might not be the medium of choice for many of those taking the test, it could still give an idea of their mastery of perspective, line, negative space, composition, and all sorts of other things that aren't taught or tested in art classes anymore :-)
I agree with your emphasis on tying disparate pieces together, but I think that any programming course (and test) worth its salt would test those skills. They can come up within a single language just as they come up within a complex environment, except without all the cruft of strange syntax and configuration issues.
Java is a relatively clean setup. Testing LAMP might put undue emphasis on memorizing function call names and configuration settings, rather than testing the ability to think and build. Of course it's possible to create an atrocious exam based on Java, but that won't be the fault of the language.
I took AP Computer Science A this past year, the last such under C++. I started out the year in basic boom-boom Computer Programming (programming in simple "C"), but was allowed to jump into AP halfway through the year.
Keep in mind that the AP Computer Science exams are meant to be introduction level courses and that the Computer Science exams are among the least popular of the AP exams. It isn't in College Boards best interest to make it too much more complex because College Board is a for-profit organization. If it becomes too more complex, they'll lose money as a result.
While most of the skills learned are how to simply do certain things, there is additional emphasis on using other functions. There is a marine biology case study, where one had to know what each function did to answer several of the multiple choice questions and answer a free-response question. Without knowing the marine biology case study, the AP exam's grade will ultimately be lower than what it should be. So in away, it does address your focus on what a programming class should be. However, if one knows how an individual function works, it becomes easier to link multiple functions together.
My university has been using java as its main programming intro class going on 3 years now.
The college board is just catching up. Not really news.
Why one way or the other? Why not both?
Lots of higher ed. places are creating / have in place two different kinds of degrees today. One degree is more oriented towards the hardcore mathematics and theory parts of CS, the other degree is more oriented towards specific tools, deployment / development, etc.
Now, the utility of having two degree programs remains to be seen, along with employer adoption of the different kinds of graduates. A favorite quote from a friend at Sun, overheard during a meeting: "What hell is an MIS major, and why would I ever bother hiring one?"
I took AP Computer Science A this past year
Wait a minute, there's kids reading this site? Shouldn't you be out smoking grass and having pregnancy scares?
I think the important thing to do in HS programming courses is to teach basic programming skills. I'm just a dumbass aerospace engineer, but you know ... I think they need the basics taught to them like I needed the basics of physics and all taught to me while I was in HS.
I had a solid basics in calculus and physics [including the AP curricula] before I finished HS, and it made studying engineering a relative breeze. Most of the people I know that took AP CS were either already good programmers or got exactly nothing from the curriculum.
Why not Perl? Java's a dead language. Perl's the only way to go baby!
I took the apcs exam in '95, it was in Pascal then, I was pretty pissed when it moved to C/C++ :)
Like a lot of others have said, the test is much more a measure of how to think in computer science then how to do any one language. However, It worries me a bit that its going to Java, in my APCS class, we did things like implement our own linked lists, binary trees, etc - can that really be taught the same way with java?
The point of a CS curriculum has never been to teach marketable, real-world skills; the point has always been to learn Computer Science. Java is relevant to CS not because it's a language that's widely used for enterprise application development, but because it's a (relatively) clean, straightforward object-oriented language. You can teach students Java as a quick prerequisite course, then use that as a basis for actual CS without it getting in the way too often.
Things like "How to make a Web site with Apache and MySQL" aren't a part of any CS curriculum, ever; they're maybe part of an community college job training track.
(And Erik: Absolutely you can implement linked lists and trees in Java. That the J2SE's class library already includes implementations isn't a hindrance to that any more than C++'s STL was a hindrance to implementation in C++. Students might bitch about writing a linked list when Java already has a perfectly fine one; but writing a linked list has always been wheel-reinvention, so.)
Anil - I think you might be overstating somewhat the near-future prevelence of outsourcing code to "2nd world" economies. I know a computer scientist or two, and they've told me that all the code they get from Romania and/or India is utterly worthless and has to be discarded.
I also work at a somewhat successful software firm, and we've done plenty of tests and found the same thing - there just are not many good programmers in Eastern Europe or Asia. The code that comes back is just worthless.
For testing and call centers, however, they're great - just not for real programming.
I just want to concur with all the posters that pointed out that Computer Science is not (necessarily) about practical applications, but about the theoretical underpinnings of digital computing, and how to solve real-world problems in what is an inexact and discrete representation. Using a popular language makes sense to avoid issues of unfamiliar syntax, etc, but the exact language used is irrelevant to the skills that are hopefully being tested.
I went to college and all I got was this lousy Pascal.
Great. More encouragement for Java brain rot.
Having hired a programmer whose first/primary language was Java (but later learned and was supposedly proficient at C/C++), and having him introduce numerous memory/refcount leaks into the code, and having had to eventually let him go (and hearing of other anecdotes like this) taught me an important lesson: never hire a programmer whose first language was Java to do "real" programming.
These folks are unfortunate victims of "Java brain rot" - having their brains get used to and wired with Java crutches - a sad consequence of colleges switching to Java (for purely fashion reasons AFAICT) as the first/primary language taught/used in computer science classes.
Mr. Head: You might more accurately call that "memory managed language brain rot", and decide not to hire anyone whose first language is Java, C#, VB, Perl, Python, or... well, any modern language.
Have fun with that.
Anil, we've got to do something while our partners head to WalGreens for the pregnancy tests, and I always figured your site as top-notch entertainment! I'm on the edge of my seat here, and you think it's because of a "pregnancy scare!"
If they really wanted the AP course to prepare a student for Computer Science, they would teach Scheme.
First, on the AP test: they should test in whatever language high schools either are or should be teaching.
Second, on your jobs going overseas to the developing world:
I'm an American working as a programmer at a multi-national in China. Other than some build scripts, my team's code is all C++. Quite a bit of it's crap, but I would say no more than in the big American companies I worked for before.
The problem in China (and presumably other developing countries) is that while they're able to program, there are very few programmers here who grew up with computers, so their base of experience isn't as broad. Also, they look at programming more like the EE's I worked with in the U.S. (a means to an end) as opposed to those brought up in the rigor of good CS program where elegance is valued and writing good code can be an end in itself.
But, at one fifth the cost, you can't complain too much.
Don't sweat it, though. We still need many, many more engineers and programmers to deliver on the appetites of what people really want. This is not the automobile business, where there are only so many autos people can buy every year.
The change from C++ to Java makes me wonder: how long have they been considering a transition?
When I took the AP Computer Science exam in 1999, I got the distinct impression that they had been waiting a number of years to drop Pascal and the change had been pretty ugly. At its heart, the test still emphasized applying algorithmic knowledge and creating fairly simple code.
I have a few friends who had a minimal knowledge of C++ and still did well; one even forgot how to code a particular section and got most of the points by describing his algorithm.
Regardless of language, these tests aren't going to prepare high school students for the business use of computer technology; that would be the role of a software engineering course. CS is still logic and algorithms.
Wait a minute, there's kids reading this site? Shouldn't you be out smoking grass and having pregnancy scares?
I do both.
When you take the test do you hand write out code? That seems a little tough. I've written my fair share of code, but I like to write in a decent program (BBedit's always good) with reference material near (especially for PHP which just has a million functions).
My highschool never had any good computer courses, but I was able to get out a year early so it's all good. My college now still doesn't have much in the way of good computer courses. I guess I'm just an O'Reilly snob. :).
Mr. Gales: I just took the AP CompSci AB exam a few weeks ago (and I took the A exam last year). Yes, you do write out code, but usually, a problem is broken into about three parts, and each part involves writing a function to solve a problem, which tests the ability to create an effective algorithm. Often there is also the use of a particular data structure accessed in different ways by each function, testing whether you can incorporate linked lists, trees, stacks, queues, matrices, and/or dynamic arrays (they supply the code for some of these) effectively into an algorithm, and whether you've paid enough attention in class to get the syntax mostly correct (they aren't going to kill you if you mess up a pointer declaration slightly for a tree, for instance). The code in the functions shouldn't (theoretically) be more than about 20 or 25 lines of code, so it's not really a hardship. It's kinda fun, actually, as they have some very interesting problems (in my dorky opinion)...
PLC: I know a computer scientist or two, and they've told me that all the code they get from Romania and/or India is utterly worthless and has to be discarded.
If that's the case, it wouldn't make for good economics to outsource work to these regions. But there's plenty of offshore "real programming" occuring in those regions.
I have to say this post has seemed to have a little bit of an affect on me. I'm an Information Technology major at the Rochester Institute of Technology, and it seems as though they have taught us pretty well how to manage and create applications developed in their core using Java.
However, I've taken it upon myself to learn other languages as well, as I've realized no one wants you solely for Java. They started on a C++ track, then switched to Visual Basic, and have now rested on Java. I found it very easy to learn, but the overhead in its use has actually confused me when learning languages without the dot syntax or such long-winded method calls.
Perhaps it's me, but I think the point of any fundamental language being taught (no matter what it is) is the prepare you for learning more on your own or in the classroom. What they teach you is a foundation, a basis for you to build upon. At least that's how I see it.