Slashdot Log In
Followup On Java As "Damaging" To Students
Posted by
kdawson
on Mon Jan 21, 2008 10:52 PM
from the many-are-called-but-few-are-chosen dept.
from the many-are-called-but-few-are-chosen dept.
hedley writes "A prior article on the damage Java does to CS education was discussed here recently. There was substantial feedback and the mailbox of one of the authors, Prof Dewar, also has been filled with mainly positive responses. In this followup to the article, Prof. Dewar clarifies his position on Java. In his view the core of the problem is universities 'dumbing down programs, hoping to make them more accessible and popular. Aspects of curriculum that are too demanding, or perceived as tedious, are downplayed in favor of simplified material that attracts a larger enrollment.'"
Related Stories
[+]
Professors Slam Java As "Damaging" To Students 1267 comments
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."
This discussion has been archived.
No new comments can be posted.
The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
Full
Abbreviated
Hidden
Loading... please wait.

@_@ (Score:5, Funny)
Re:@_@ (Score:4, Insightful)
Parent
Re:@_@ (Score:5, Insightful)
About all I can suggest is that students who are inclined to supplement their educations through their own creative pursuits will continue to surpass those who treat CS simply as a profitable skill set. If anything, simplifying CS courses will assist potential employers in identifying those who aspire to excellence in the field and those who are merely pursuing a career.
Parent
Re: (Score:3, Insightful)
Re:@_@ (Score:4, Interesting)
I had a great microprocessor teacher at college. He would use the Socratic method, not telling people how things are done but asking people and slowly building knowledge using the answers.
His classes were great. He would start by drawing some components on the board and then asking people how to connect them for some purpose. Some students would suggest things, he would ask the others if they could find a flaw, and so on. Many times he would follow a wrong idea on purpose so that the students could find the flaw by themselves some steps ahead. Then he would erase everything back to the bad idea and start again from there.
In the end of each class we would have a full circuit drawn and the greatest thing was, the teacher didn't explain it to us, we created the solution by ourselves.
I loved his classes but almost every one of my colleagues hated the teacher's guts. They preferred to be spoon-fed with information, and that teacher committed the worst of sins: make them think.
Parent
Re:@_@ (Score:4, Interesting)
Well, I see we'll just have to agree to disagree. Math was my favorite subject at Berkeley, and even though I got an EECS degree, I took a math course ever semester. I was part of the math club, and frankly just love it. I have a patent [uspto.gov] on super-fast simulation of diff-eqs using backwards trapezoid with direct computation of the future point. I was the first person to ever create a commercially usable version of asymptotic waveform analysis - AWE (which is not as good as the patent I linked to). I dabble in high-frequency transformer design because it uses cool 3-D optimization techniques. Anyway, trust me, I like math, though I'm just an engineer.
If China and India and Singapore want to churn out clones who can mimic smart people well enough to repeat their work, let them. To continue leading, we need creativity, not the arts/literature kind, and it needs to be nourished in children. I strongly disagree that prior to diff-eqs, math should be mostly rote memorization. Math can be fun and creative starting in Kindergarten. My kids go to Montessori school, where they teach the why's before the how's. It's not for everyone, but it certainly is for me in my family. Unfortunately, with "No child left behind", our country is headed in the exact wrong direction, focusing on the how's rather than the why's.
Parent
Re:@_@ (Score:4, Insightful)
Once in college, the Electronics 101 professor handed out a really tough equation to solve. However, our standard practice was to only write out the answer to six significant digits. I realized in about 30 seconds that only one term in the sums on either side could contribute any significant digits, and I had the answer in a couple of minutes. The rest of the class thrashed out a solution over multiple pages of computations, and only a few of them got it right. I thought the professor was going to give a valuable real-world lesson on how real engineers do things, but no... the next lecture was entirely about solving the math the hard way. He sucked as a professor... completely lacking in creativity (he was a French visiting prof... most profs at my school were quite good).
Parent
Re:@_@ (Score:5, Insightful)
I make a living as a Java programmer. I enjoy the work I do and feel that no other language/platform can even touch Java's capabilities in team and enterprise development. Even for single-programmer development, there are a lot of situations where Java is the solution to end all solutions.
That being said, I agree with the article.
As the author tried to explain, programmers need a solid foundation in data structures and algorithms before they should even begin looking at Java. The specific problem he calls out (which I actually feel only scratches the surface) is that Java offers such a featureful API that the programmer isn't forced to learn the basics. He is able to simply use a Hashtable, a Sort, a LinkedList, or whatever he needs without understanding why it works. Which is a very dangerous thing for someone training to be a Computer Scientist.
A much better approach is to force the student to work through lower-level programming before ever reaching a modern layer that abstracts everything away. Otherwise the student is liable to shoot himself in the foot at a much later date. (Primarily due to a lack of knowledge.) This is very comparable to many sports where expensive, advanced equipment can be an asset to a well-trained athlete. But in the hands of an amateur, the attributes that make the equipment powerful becomes liabilities - and even barriers! - to the athlete's success.
Parent
Re:@_@ (Score:5, Insightful)
You'll have to forgive me, but I must raise an eyebrow at this. While the (generically speaking) Java Platform has many potential homes, it has found no better home for its technology than on big iron. Its straightforward design allows for the Virtual Machine to automatically adapt to memory, processors, and optimize away sections of code at runtime in ways that a static compiler will never be able to match. In addition, Java's natural fault tolerance allows for complex multiuser applications that provide logical firewalls between each user. Except in cases of poorly designed code (extremely poorly!), no single user can take down the entire application.
If anything, Java is the ideal solution for Big Iron usage. Which is why I must ask you to clarify. There are certainly super-computing applications where Java is a poor fit. This is due the non-standard low-level design of the hardware that requires a completely different toolkit to take advantage of. (Like it or not Cell is a prime example of this environment.) Other than that exception, though, I have a hard time imagining where Java would be ill suited for Big Iron work.
I vehemently disagree with this statement. I deal with the incredible task of training amateurs on a regular basis. (Some are even degreed-idiots.) VB is friendly to these amateurs. PHP is friendly to these amateurs.
As I said, Java is a wonderful tool in the hands of an experienced programmer who knows what it is capable of. In the hands of an amateur or (sometimes worse!) an old hand who's not used to the tools that Java offers, using Java in your project is like asking for your company to be nuked from orbit.
I'm not offended. I'm merely perplexed. You sound like the type of fellow who should have a solid understanding of the platform. So perhaps I am merely misunderstanding your statements?
Parent
Re:@_@ (Score:4, Insightful)
This is probably where I fit. :)
Parent
Re:@_@ (Score:5, Insightful)
An excellent point, which does indeed refute the authors' argument. To furhter back your comment, I've done advanced algorithms in Java before; sometimes as just a learning experience. There are no barriers to going low-level if you want to. However, I did mention that I felt that their argument only scratched the surface.
My own argument tends to go farther down the line to the point of obtaining an understanding of how to code in the first place. What I have found is that a new programmer rarely knows how to put one line of code in front of another. (Yes, the mere logic of ordering statements often escapes them.) Introducing a new programmer to an object oriented environment at an early stage forces them to think in terms of "magic".
"Yeah, don't worry about that 'public class HelloWorld' bit. We'll get to that later."
"Trust me. You need to have that import in your code. Otherwise it won't work."
"We'll get to that main() method later."
"Why System.out.println? Don't worry, you'll understand that once you understand objects and fields and methods. For now we're just compiling a simple [ed: *cough*] Hello World program."
If these barriers were truly debilitating to a student, then we wouldn't have a problem. They'd learn what they needed to know along the way. Unfortunately, these barriers are far more insidious than that. The student knows this magic works without understanding how it works. So he's able to coast through a variety of tasks without ever worrying about it. Then when he gets to the real world... oops. You mean that wasn't actually magic? I needed to know what that did? But all I ever learned was some control structures! My professor didn't even make me format my code properly!
*sigh*
That's the scene I see far too often. A good programmer can't do a good job unless he knows why he's doing it.
"But AKAImBatman," you say. "Won't most kids going into school these days have prior exposure to programming?"
You are correct! Which makes teaching them the basics that much more important. Once again, when they muddled through as teenagers, they focused on WHAT they could do and not WHY they could do it. Code snippets and tutorials and IDEs abounded! They didn't need to KNOW what they were doing. Just fiddle enough and it will work!
If you take things down to a low level, the majority of the students will be forced to learn or find an easier major. If they already know what you're teaching, then great! They can help with the rest of the class. But if they don't, then they're learning something priceless. Either way, the knowledge is KEY to data structures. One cannot truly understand the intent of most algorithms and data structures until he's visited the metal of the machine and tried to work with the likes of strings, memory allocation, and low-level hardware control. That's when he truly "gets it" and 40+ years of computer science suddenly SNAP into place.
"Ohhhh, I get it! I really do! Hey, I had problem X a month ago that I could have solved if I had just..."
Best. Sound. Evar.
(P.S. In case you're wondering? C++ should NEVER be taught in school. Worst drain bramage you can do to a poor kid. Especially as his first language!)
Parent
Re:@_@ (Score:5, Interesting)
What were they?
Java solved these problems by looking to the most advanced technology in the industry, and packaging it in a way that was so straightforward and simple that it was the DEFINITION of the KISS principle. What were these wonders?
The productivity gains from these changes were astounding! But it didn't completely replace low-level coding in C/C++. Why? Because sometimes you needed to get down to the metal to make things work well.
Today, the JVMs have been optimized like crazy. They can automatically make a program run faster as long as you know how to work with the GC and data structures that it provides. If you fight it, your performance drops like a rock. If you don't know how to use it, you might as well be fighting it.
Yet how is a student supposed to know what the JVM is doing if he's never had to scrounge for bytes? If he's never had a practical need for a linked list? If he's never had to implement memory management? If he doesn't have the first clue how to balance a tree? If he can't understand how a garbage collector works? If he doesn't know what a circular reference is? If he can't explain what a pointer is and how a reference is related but different to a pointer? If he doesn't even know what "Turing Complete*" means?
Java as a tool can be sharper than any other blade. But it is a double-edged blade. If you swing it wildly, it will cut you. If you wield it like a master, it will allow you to attack your problems with precision and vigor.
As a side note, I wonder if it isn't time to start teaching students using virtual machines that replicate the limited environments of yesteryear? Not only would it force them into solving the low-level problems, but it would also provide them with the ability to visually inspect the state of the virtual processor, memory, and I/O. Much better than a simple stack-trace, wouldn't you say?
*Imagine a computer scientist with no knowledge of what "Turing Complete" means being assigned to design the future of computers. Frightening concept? Very. Perhaps Quantum Computing would already be here if we had a greater number of qualified scientists?
Parent
Re:@_@ (Score:4, Interesting)
Besides, the problem with Java is that it has a very rigid (i.e. inflexible) programming paradigm. There are many programs which are not best modeled by OOP, and this includes the procedural iterative programs that a student will most probably begin with. I've always wondered how instructors were able to explain away "public static void main(String args[]) {
I agree that C/C++ is too heavy on pointers and SEGV happy, but at least you can hide away those problems if you choose the right subset of C++ to teach.
Parent
Re: (Score:3, Informative)
Re:@_@ (Score:5, Insightful)
After all, the situation is not really surprising. I know very few people (if any!) that are *passionate* about accounting. Yet, millions of accountants worldwide reliably make the numbers add up. These unpassionate accountants do good services on average and make our economic system run smoothly; without them, it would collapse. I am grateful someone else is willing to do it, because I could not stand having to do it myself. Why would IT be any different?
I am sure someone will try to invalidate my point saying the IT-as-income people have negative productivity, and hence we would be better off without them. Well, considering how few of us there are, I doubt we could make up for the horde. And I am already overworked as it is
Parent
Re:@_@ (Score:4, Insightful)
I happen to agree with the good professor that the best thing you can do in college is to learn to think deeply and critically as well as communicate, though to my mind that speaks more strongly to a good liberal arts component of education than to the specific language choice within a CS major. You might not think think learning history or economics or English make you a better programmer, but they do. By learning different modalities of thinking, you become more aware of the strengths and weakness of your own methods. Not to mention that good engineering nearly always involves communication in the form or requirements and design. But I digress...
I don't know how you tackle this make the courses hard vs. make them accessible issue. The reality is that a demanding course will in fact turn off a lot of students, and that does represent in some way a failure of the university's mission. On the other hand a demanding course (especially math) make a much, much, much better programmer/engineer/computer. Think of all the hollering software pundits do about how a good programmer can be 10 times as productive as a mediocre one - this is true and a lot of the skill of that star programmer comes down to grasp of deep algorithmic and mathematical concepts. So what do you do about the fact that most people are neither prepared nor dispositionally inclined to deal with those demands when they are 18 years old and just entering college, particularly if their family and friends are not that academically inclined and can't help them keep faith and slog through hard and sometimes tedious preparation? What's most fair to the students? It's not all that clear to me.
Parent
Re:@_@ (Score:5, Informative)
Parent
I started with C/C++ (Score:5, Insightful)
God damn, what a difference.
To this day I am happy that I was able to have those two years of C, letting me get close to the guts of the OS, forcing me to think about what I was doing every step of the way. There is no question in my mind that it made me a better programmer in general, regardless of the language.
I feel sorry for the people that start - then never leave - a much higher level language such as Java.
Re:I started with C/C++ (Score:5, Insightful)
Parent
Re:I started with C/C++ (Score:4, Interesting)
Reminds me of the debate I often see in aviation: "tricycle gear" vs "tail draggers". Tricycle gear planes have a steering nosewheel, and two main wheels under the wings. Tail-draggers, the "old" way, have two main wheels in the front and 1 small wheel (the "tail dragger") on the tail.
It's considerably easier to land/takeoff in a tricycle-gear. But there are plenty of pilots who are dead-set on flying tail draggers because it makes them "a better pilot". Which, then, sparks another debate about whether or not new pilots should be taught on tail-draggers or tricycle gear.
In short, it all comes down to whatever the student wants. They can choose which way they prefer. Myself, I learned in a tricycle gear Cessna 172, and I don't regret my decision. Flying is fun!
Parent
Re: (Score:3, Interesting)
Re: (Score:3, Insightful)
As for Java, I think it's one of the most advanced languages in its balance between functional
Java is suitable for teaching CS just as C/C++ is (Score:5, Interesting)
Java has some advantages over C++ that are important for teaching programming: it has an established set of patterns that all libraries use, whereas in C++ there is no discipline, anyone can make anything in any way possible. For example, many Java libraries use the listener pattern.
Java treats exceptions correctly (despite of being boring to having to program around them), where is in C++ exceptions are not used, although they are available a long time now.
Another advantage of Java is its typing system, which covers a great spectrum of typing systems: it is strong, it is static, but it is also a little bit of dynamic when one uses interfaces. It's very important, and since OO is dominant these years and for the future, it's a very important aspect and Java is the best environment to teach and experiment on these issues.
Java is also suitable for teaching concurrent programming, due to its support for threads. In fact, a Swing programmer must already know threads, because a Swing application is already threaded right from the start.
So what is left? low-level system calls and system libraries are operating system-specific tasks, and have no place in the programming course, unless the course is about kernel programming. Manual memory management is a C/C++ specific task, so unless someone is required to program in those languages, it's not a requirement for today's majority of applications.
So, in conclusion, I believe that there is nothing wrong with teaching Java. I think the core of the problem is that they don't teach the fundamentals of programming (algorithms and data structures), not the language itself.
Parent
Turn turn turn... (Score:5, Insightful)
Really, when has a tool ruined the skill set of an industry? The worst a tool does is eliminate certain roles or industries altogether - and those who filled those roles will always complain (and sometimes revolt).
From the study of C and Java I can say that for 90% of the tasks I've taken on I've needed no more than Java (and Java would in fact be overkill).
This reminds me of the controversy when Feynman diagrams were first shown. These diagrams were a much simpler way of expressing complex summations - but the old-school (some pretty impressive names) felt that these diagrams were a dumbing-down and that the historical mathematics were the proper way to express these systems.
Always a new tech will simplify something and those who have had to trudge through the complexity will shoot-down its simplicity - this happened with the GUI, and I have a feeling about 84% of you are reading this statement on a GUI desktop.
There will always be benefits to be had from the classic way of doing things, but new tools enable people to climb to new heights. The brain only has so many cycles, If they don't need to be wasted with pointers and bleedingly-effecient machine code then save those brain cycles for algorithms and interface design.
Programming is different (Score:5, Insightful)
This reminds me of the controversy when Feynman diagrams were first shown. These diagrams were a much simpler way of expressing complex summations - but the old-school (some pretty impressive names) felt that these diagrams were a dumbing-down and that the historical mathematics were the proper way to express these systems.
Feynman diagrams are just another way of looking at things. It's another viewpoint of the same thing.
Java and C don't map so well. There are some things for which only C makes sense currently, such as driver development. Java is a virtual machine. Although it's possible to beat, mangle, and force java into submission and make it do those things, that's not what it's for. All those JNI libraries that Java needs to actually talk to your machine - they're written in C. AFAIK, nobody is writing an OS or even drivers in Java. I'd even bet that the first few implementations of Java were written in C/C++.
When Java is the first thing you learn, you learn sloppy IMHO. You just assume there is a garbage collector. You can allocate whatever you want, whenever you want, and not have to think about scope. If you ever do have to do some system work later on in your career - all of these notions will be new. You'll have to think about pointers, and the size of an object in memory, and how long you should hold on to it before you free up that memory. You'll suffer serious setbacks when it's time to program down to the wire.
Java is a beautiful language - my personal favorite - for application development, but application development isn't all there is.
Parent
Re: (Score:3, Interesting)
Java is fine to learn at College because of the reasons you cited i.e. the purpose is to get people actually building things that is relevant to industry.
Java is a horror at University because learning to code is NOT its primary (or secondary, or...) purpose there. The purpose of a University is to get people to be able to go onto a Masters and PhD and be able to do actual research. In this case, resea
Re: (Score:3, Insightful)
The point isn't that you should spend all your development cycles on pointers. The point is that even when you're using a language that handles that junk for you, you should have some idea of what
Get that college credit (Score:3, Interesting)
C is overkill for most people (Score:5, Insightful)
Give 'em a good mix (Score:3, Insightful)
Sure, some link lists etc in Java/whatever are fine, but also introduce them to some assembler etc.
If the kids are going to make a career of programming then an appreciation of what is going on under the hood is valuable.
Starting off easy (Score:3, Interesting)
I started (over 40 years ago) with an Algol variant and proceeded to Fortran. (C hadn't been invented yet.) As a professional programmer with a computer science style background (as opposed to the engineering style of today--an improvement I think), Scheme appealed to my
Truth (Score:5, Interesting)
I'm in one of Canada's biggest CS schools, and though I'm in engineering, I really do feel sorry for them. Many of the toughest courses in that program are now optional, and one can cruise by and get a degree only knowing the most basic algorithms (quick sort?) and data structures. Naturally, the only people who take the original challenging courses are the alpha geeks who live for that kind of stuff anyway.
Meanwhile people come out of the doors of this school knowing only Java and .NET, and then complain that the world of programming was not as interesting as promised. Hmm.
On the other hand, I'm in an electrical engineering-like program, and we only deal with assembly, C, and maybe C++ on the odd occasion. I love it. IMHO any self respecting programmer needs to at least KNOW how to operate close to the metal, if only so it makes them a better coder at the higher levels.
Re: (Score:3, Informative)
Well, a lot depends upon your eventual focus. Me, I started out in life on a Rockwell PPS-4 4-bit micro, eventually graduating to an 8080 and then the 6502, 6800, 6809
Does the language really matter? (Score:3, Interesting)
In a way, they were correct. Java was used, but we didn't learn Java. It could have been any language. We went over addressing memory quite extensively, and how objects are stored 'behind the scenes'. We could have really substituted any language and had the same results. Unfortunately, the results *were* the same: some students 'got it' while others just couldn't come to terms with any of it. I suppose now they are coming to the realization that there is no good way to make a difficult subject easier. Perhaps that is why they are coming up with an IT program...
With all that said, my university had yet to make the transition from 'everyone should know C and pointers by now' in the upper division classes. Perhaps that has been remedied now, but made things pretty difficult for those who weren't willing to put in the time. But the university is supposed to make you work, so I guess in that sense everything worked out fine.
What a "BS" degree really is (Score:4, Insightful)
The curriculum in a BS program, as I have always understood it - isn't designed to necessarily prepare you to enter the workforce with all the "hands-on" technical skills - no matter what discipline its in.
If you're to learn "hands-on" skills to apply towards work, that's what an associates degree, or trade-school is about
Look at it this way - if the world went post-apocalyptic tomorrow, and everyone "knew Java", we'd all be screwed, because no-one would understand all the theory and crap behind compiler design, OS design, carnal maps, finite automina and all the other "fundamentals" on which everything is built. Just like if everyone got their ACE automotive technicians certificates, we'd have no one who knew how to design the cars.
Now I'm not saying that universities don't try to balance out the BS curriculum with real-world, practical stuff - of course they do - but that's the idea.
In my view, school gives you the foundation, and it's up to you to apply it. Reality is, once you get out there, any specific tools, languages, etc. change so fast anyway - a BS degree teaches the foundation, and its up to you to build on it
Disclaimer: I'm an EE drop out - basically completely self-taught - the same rules apply - know the foundation - and your own your own from there.
Re:What a "BS" degree really is (Score:5, Funny)
Parent
Authors have a vested interest (Score:3, Informative)
Duh (Score:4, Insightful)
Let me be the first to welcome you to higher education.
Not mutually exclusive (Score:4, Insightful)
High-Level != Non-Innovative
I don't know why some people think that something can't be innovative if it's high-level. I frankly don't care whether something's written in assembly or JavaScript. It it brings something new and useful to the table, it's innovative in my book.
Different Skillsets, Different Challanges
Constructing a low-level system utility and architecting a large enterprise web-based application are two fundamentally different types of problems. It's true that students need to understand memory management and low-level OS concepts. But quite frankly students who come out of Universities understanding only this type of development consistently demonstrate a complete inability to design an enterprise web application using OO design patterns, SOA, and reusable components. There are significant technical challanges involved in this type of application development. They're just not the same as when you're living in the low-level world of systems programming.
Ever heard of reuse?
I don't know whether this guy seriously believes that students shouldn't be leveraging libraries in their code, but I've got news: that's the way the world works. It's true you should be able to dive into the low-level code if there is a specific need to, but nobody's going to pay you to reinvent the wheel (anyone who insists on implementing their own sorting algorithms in the real-world is probably a fool.) Reuse is something software engineering strives for, so why should we be painting it out to be something evil?
Besides, where do you draw the line? I know some people in the supercomputing industry that feel C is "too high-level and bloated". They would like to see students spending most of their time in Fortran and assembly. So...do we expect students to write all their software in assembly? Should students be designing everything using sequential circuits and skip the software alltogether? My point is that what's considered "high-level" is very relative, and there's no good justification to sitting exclusively any any level or another. Part of being a good engineer is knowing how to select the right tool for the right job. Sometimes that's assembly, and sometimes that's Java. As long as you're proficient in multiple styles of programming, you should be able to handle most anyth