Professors Slam Java As "Damaging" To Students 1267
jfmiller call to our attention two professors emeritus of computer science at New York University who have penned an article titled Computer Science Education: Where Are the Software Engineers of Tomorrow? in which they berate their university, and others, for not teaching solid languages like C, C++, Lisp, and ADA. The submitter wonders whether any CS students or professors would care to respond. Quoting the article: "The resulting set of skills [from today's educational practices] is insufficient for today's software industry (in particular for safety and security purposes) and, unfortunately, matches well what the outsourcing industry can offer. We are training easily replaceable professionals... Java programming courses did not prepare our students for the first course in systems, much less for more advanced ones. Students found it hard to write programs that did not have a graphic interface, had no feeling for the relationship between the source program and what the hardware would actually do, and (most damaging) did not understand the semantics of pointers at all, which made the use of C in systems programming very challenging."
About the Authors (Score:5, Informative)
Edmond Schonberg, Ph.D., is vice-president of AdaCore and a professor emeritus of computer science at New York University. He has been involved in the implementation of Ada since 1981. With Robert Dewar and other collaborators, he created the first validated implementation of Ada83, the first prototype compiler for Ada9X, and the first full implementation of Ada2005.
They don't say "Java is bad" (Score:2, Informative)
By the way, C (yes, the one without "++") is still my favorite language.
Biased? (Score:5, Informative)
Dr. Robert B.K. Dewar, AdaCore Inc. (President)
Dr. Edmond Schonberg, AdaCore Inc. (Vice President).
The article by some weird coincidence slams Java and praises Ada.
Salt, please...
PS, Ada is mainly alive in the Military/Aerospace industries where projects can last 20+ years.
Re:About the Authors (Score:5, Informative)
Students found Ada a relatively simple language to start with (if you choose an appropriate subset)
Java can have more overhead for a beginning student
Lecturers are often tempted to push a lot of "stuff" in intro subjects
Java GUI motivates some students to get more involved
Many of my students regretted that Ada would no longer be taught in first year (having quite enjoyed it)
No matter what you start with, teaching students to be better programmers takes more than just a language. Each language allows you to teach a specific set of skills, and Ada is not bad for teaching some important SE skills (IMHO).
I think pointers are overrated as a first year concept, and can wait for later years.
Re:You have to start somewhere... (Score:2, Informative)
Re:Pointers, References and Performance (Score:5, Informative)
try {
int fds[2] = new int[2];
pipe(fd);
} catch (memoryAllocationErrorOrSo) {
}
Why does this need to be so complicated [...]
Misleading concept ... (Score:2, Informative)
C, Lisp, and ADA are all different types of languages.
I think the best way to learn programming is not just by mastering one particular language, but going by the programming principles; Just like if you learn to play a guitar, you can learn other the strumming instruments easily.
Languages like assembly and machine code don't require learning one just needs a manual while programming.
Re:software engineering != computer science (Score:3, Informative)
The modern secure variants of strcpy() solve it by requiring additional parameters where you pass e.g. sizeof(dest) and sizeof(src).
Re:tasty (Score:5, Informative)
During the second year we took a class that taught C/C++ which basically taught pointers and memory management. In my upper level courses like operating systems and graphics, it was all C and C++ from then on. I think this gave me a pretty well rounded education.
When I was done, I had used a number of tools (languages) to learn a variety of CS topics, and felt that I was well prepared for the industry.
Re:software engineering != computer science (Score:3, Informative)
Re:Pointers, References and Performance (Score:4, Informative)
Of course, because while it's possible to run out of of heap space (implying a possible OutOfMemoryError), computers have had infinite stacks since the 1960s. Simply by moving the memory over to the stack, you can't possibly run out anymore! It's brilliant!
Hint: it's all the same memory. Your desperate desire to have the bytes come out of the "stack" bucket instead of the "heap" bucket is simply irrational.
Re:Java == Jobs (Score:3, Informative)
Maybe I'm not reading this right, but a binary 1 (as in 00000001) interpreted as a two's-complement integer is positive 1, not negative 1. -1 would be 11111111. Maybe this doesn't have much to do with your point, though.
Re:Java == Jobs (Score:3, Informative)
A single binary 1, would be -1 in 2s complement. You are talking about bytes, as in 8 bits. He is talking about a single bit, for which the two values are -1 and 0. The key word in the description is single.
Couldn't agree more... (Score:4, Informative)
I list them because they hold a lot of wisdom, and wanted to draw special attention to them for such as well.
When I was in college I got really ticked at the level of theory - there was too much of it. It wasn't balanced well enough with implementation; and as I looked around, I noticed that was pretty common place among academic institutions (colleges AND universities - and I'm not talking about trade schools either). That was before they moved their curriculum to using Java for the first couple classes; and after they did, I had already heard some stories about the upper classes getting some of these "new" students and not being able to focus on the class materials because they had to teach these students C/C++ first and the students had a harder time getting it. (Not so the other way around.)
That said, I've started thinking about how I would put together a curriculum for teaching computer programming/science/engineering. (I'm not talking about computer _hardware_ engineering, btw.) I even did some tutoring after college. So what would I do?
I'd start students with a language that can be used to teach the real basic skills and concepts (variables, functions, etc.) - even vbscript could be used at this level; but I'd also quickly move them on to more advanced concepts (in the case of vbscript, it would only be used for a couple weeks at most), moving from language to language to bring not only a depth of concepts and understanding, but also a breadth of computer languages and kinds of tasks. I'd also ensure that somewhere in the curriculum students would be exposed to Assembly, and have found that even a small exposure makes a big difference in programming styles and philosophies for programmers.
Furthermore, I'd break the curriculum into two parts. One part would start from the ground up; and the other would start from the top down. Both would be required of students. The idea being one part would be more focused on the theoretical, while the other would be more focused on the substantial - implementation. Both would work together to produce a well-rounded student. Additionally, it would be designed such that students that wanted to work on operating systems would simply follow the one from start to end; while other students would be able to leave for more focused courses at the layer of their choice. (Students wanting OS would still have other courses for focus work too, btw.) The primary idea being that even a web-app developer needs to know the underlying systems, and even the OS developer needs to understand the abstractions of the web-app developer.
I'd also have the overall curriculum be far more software engineering focused. Yes, if people want to really be computer "scientists", then they could do that; but industry really needs software engineers, not computer scientists. Real programs require engineers, and sadly, this is strongly lacking from most all academic computer programs. (Some have changed it, but not many.)
I'd also think that this approach would be very favorable to the authors of TFA and the comments I've linked. The ideas probably need a bit more refinement, but the general approach would be sound - and it's not what academia is doing today by any stretch of the imagination.
FWIW - While I am relatively young (college grad of 2003), my main strength is C prog
Re:Pointers, References and Performance (Score:3, Informative)
With a modern GC, allocating on the heap is basically the same operation as allocating on the stack anyway: just advance the top-of-heap pointer. Not really a performance issue, unless you're running it inside a tight loop where you want to avoid triggering a collection.
Re:tasty (Score:3, Informative)
If you are interested in doing real OO, I'd recommend using the Perl OO Framework called 'Moose', which you can install with 'cpan Moose' is you have a reasonably modern Perl (you might need to sudo that command, btw.)
Moose is a full meta object system with introspection, Roles (sort of like Interfaces on steroids), and a neat syntax. check out the tutorial at:
http://search.cpan.org/~stevan/Moose-0.33/lib/Moose.pm [cpan.org] (which is the lastest version as of this posting)
There's also a very active IRC channel at irc.perl.org#moose
If you like Perl but feel envious of languages with more strongly defined OO systems, I really recommend looking at Moose. It's a big step forward for the community and give you one of the nicest and most productive OO systems around.
Re:Pointers, References and Performance (Score:4, Informative)
And because it's like that, you have heap allocations for every non-atomic data type, which is really the opposite of performance.
Not really, no. The just-in-time compiler performs pointer escape analysis for the allocated objects and only uses the heap for the ones where heap allocation is actually necessary; the rest use the stack regardless of how the programmer wrote the declaration.
Admittedly, it's taken a while for this optimisation to be included, but it is there in the latest versions of Java.
third incarnation. (Score:2, Informative)
http://www.adaic.com/standards/05rm/html/RM-TTL.html [adaic.com]
Martin