Followup On Java As "Damaging" To Students 626
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.'"
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.
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.
Re:@_@ (Score:4, Insightful)
Re:@_@ (Score:1, Insightful)
I started with Pascal, then moved on to C/C++, assembler, etc. I wouldn't say Pascal had "damaged" me. Similar uses of Java should get similar results. Right tool for the right (in this case, teaching) job.
C is overkill for most people (Score:5, Insightful)
Re:I started with C/C++ (Score:5, Insightful)
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.
Two things (Score:2, Insightful)
C/C++ gives a nice inside view to the core of the machine and you have to learn all the good stuff you mentioned, but I still think the best way to understand programming as an abstract exercise is through some Lisp variant. It forces you to think about data structures and exposes to a whole different way of programming, which is quite useful.
Then you mentioned you feelt sorry for those who started with Java, but then I really feel sorry for those who started with VBA...
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.
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 anything you need to.
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.
Comment removed (Score:4, Insightful)
Computer Science (Score:1, Insightful)
People who are uninterested in the nature of computers chose interpretive languages. People who are interested in computer internals use a directly translatable language like C, Assembler, or C++. This is not a value judgment, it just is.
IMHO, computer science is not about theoretical virtual machines, but the practical implementation of complex concepts on limited physical computers. The way I see it, the former is masturbation and the latter is sex.
Re:Get that college credit (Score:2, Insightful)
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.
The usual, yes and no. (Score:4, Insightful)
The "no" is with regards to comp sci being for a certain kind of person. It's for a certain kind of perspective, but anyone can learn to see things from any perspective they choose. It's not equally easy for all people, so the more people you want to have that perspective, the more appealing you need to make it. But that is very different from changing the perspective, which is what fee-driven universities tend to do. No. Leave the perspective alone. Then how to make it more appealing? After all, everyone hates numbers, right? Wrong. In fact, up until about the ages of 11 or 12, you'll find something like two to three times as many people absolutely love numbers, algebra, equations, algorithms and problem solving. (This is based on the fact that the number of boys who like maths stuff remains unchanged, but girls go from outnumbering boys as geeks younger than that to being virtually non-existent soon after.) If you ask people (and I have) over the age of 18 about their experiences in learning maths or science, guess what! You rarely hear complaints about the subjects themselves - it's almost invariably the teachers.
So? So, if you want to double the number of CS students and revert to a tough, purist syllabus, all you need to do is replace all the middle school teachers with people who have an interest in the subject and a passion for educating the students, rather than an interest in the paycheck and a passion for the students. Doesn't seem too tough.
(Of course, it's easier if the teachers are payed a living wage, or better, so that you can recruit talent rather than whoever is on the scrapheap of life.)
Re:Turn turn turn... (Score:3, Insightful)
Java not the problem (Score:4, Insightful)
I agree with the professor's statements -- mostly. The fact is that Java is not to blame, a lack of rigor and mathematics is. I love Java, not because of all the wonderful graphical fiddling, but because J2EE is a great server-side environment. I have taken the trouble to understand all of the server-level stuff before abstracting it away into an EJB; I understand what work the server is doing for me, and know how to fine-tune that behavior if necessary. Likewise, students should have to write GUI code in a text editor before learning how to use the IDE to save time. Anyone who expects to do any serious software engineering definitely needs to take a course in Algorithms. Math should not be ignored, as it is quite often the mathematics that is packaged up into a neat application, invisible to the end-user.
It's true, you can teach people how to use an IDE like a software application, and you will get "programmers" that can put together a basic program with no problems. Ask them to start debugging, add complex features, etc., however, and they have no idea how to begin. I've no problem with Prof. Dewar lambasting these people as they are a large problem in IT today. However to simply point the finger at Java (or .NET for that matter) misses the point entirely.
Re:Pascal (Score:2, Insightful)
Re:@_@ (Score:1, Insightful)
Yes! I couldn't agree more. As for Java dumbing down education, that's a huge crock. Educators who pander to the most gifted (which I feel they should) typically fail to understand that software in the real world is developed by teams. Java provides those teams hand-rails to guide them towards productive collaboration. C++, in contrast, provides pistols, cannons, nukes, potato guns, and super-glue with which to shoot oneself in the foot. The author attacking Java has piss poor sense for what we need here in the real world.
Re:I started with C/C++ (Score:3, Insightful)
As for Java, I think it's one of the most advanced languages in its balance between functionality and the ability to debug and maintain the code. The simple syntax feels a little limiting at first, but after maintaining some code for a few years you grow to love it. Parsers are trivial and thus all the IDEs have powerful analysis and refactoring tools, and it's very easy to see what's going on. The object model is simple and operators almost always do the same thing all the time. I really don't miss slugging through dozens of obscure
However, I honestly don't know what learning CS is like in Java, as I went to school just before the "big bang" of Java, WWW, ubiquitous e-mail, etc. I could imagine it being a little harder to learn some of the data structures and algorithms, since the ones included in the language are so rich. And threading and concurrency is so much easier in Java than almost all the languages that came before it I'm not sure whether current CS students even know what dilemnas philosophers faced at round eating tables.
Re:@_@ (Score:3, Insightful)
I do not blame the professors on this issue. America sends completly unprepared kids from high school to college so they can get a job afterward. For an example see:
http://www.youtube.com/watch?v=Tr1qee-bTZI&NR=1 [youtube.com]
Re:Duh (Score:2, Insightful)
Re:I started with C/C++ (Score:1, Insightful)
Now, should I feel sorry for you because you started in a higher level language such as C, rather than mastering assembly language first? Or because you may have missed writing the microcode for a simple microprocessor prototype built with simple logic chips?
Should the previous generation pity me, for not building my own logic circuits out of triodes, or creating ingenious analog computers out of gears?
There are always roles for those who know the fundamentals, but over time the bulk of the work shifts to more advanced, high-level tools. Remember that the generation before you can always teach you something valuable, and that the generation after you will give you some good competition for your job in a few years --- and they'll teach you a thing or two as well.
Re:@_@ (Score:2, Insightful)
Sorry about being so acidic over a stupid parent. I spent eleven years of my youth in hell in a backwater Georgia school system where original thought was the enemy of the school. I don't blame professors on this issue. I blame the stupid backwards hicks.
Re:Computer Science (Score:2, Insightful)
Analysis of algorithms, theory of computation, numerical analysis, syntax and semantics of computer languages . . . there is a long list of theoretical topics which sometimes aid in "practical implementation of complex concepts on limited physical computers" but which merit study even if they don't currently contribute directly to that end. Just like mathematics, there may be eventual applications which less limited computers will allow, or the process of studying these things will provide tools and insights into current problems.
Even in the "practical" world, the real question is "Which is the right tool for the job?" Interpretive languages are sometimes the right answer (though I'm not sure that Java is ever the right answer myself--I try to be open-minded on that). I think they are particularly the right answer in the early stages of learning computer programming and often in "exploratory" or prototype work. For a professional programmer it's important to have a repertoire. For a beginner or a non-professional, "Bus error: core dumped" is a little harsh. And no one should have to use the horror that is C++.
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.
CS Degree Means Writing Javas, not Using Them... (Score:3, Insightful)
Re:Could be worse (Score:3, Insightful)
See? Java has very limited expressiveness. People are taught what's hot today. Tomorrow, different languages are hot, with different paradigma. Or, they get a job where other paradigma are important. Now, see how hard the people have to try to adapt.
If all you ever got taught was to use a hammer for everything, you will have a hard time adapting to a scalpel.
the right tool for the right purpose... (Score:5, Insightful)
The first course on programming is where you can turn off a lot of students if the language gets in the way (weird syntax, a compiler with cryptic error messages, a mammoth virtual machine, etc.). If all you want is teach variables, conditions, loops, and simple data structures in order to solve simple problems, why not use something like Python, Pascal or Scheme? Let's please leave concerns like the understanding of computer architecture and efficiency (C) and software engineering (Java) for later courses. The C-centric crowd needs to understand that Turing is not married to von Neuman: understanding of pointers is not necessary for computing and algorithm design (hello Lisp?). The Java-centric crowd needs to understand that, for some, programming is just a tool (for problem-solving) and not a discipline (software engineering).
And this does NOT mean I'm promoting the dilution of the curriculum. In fact, because students would get up to speed faster, you could solve more complex problems earlier, and actually hit those issues of efficiency and code reuse that C and Java are respectively supposed to solve. They will then be ready to enjoy and understand those courses that follow.
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?
Re:@_@ (Score:4, Insightful)
This is probably where I fit. :)
Re:I started with C/C++ (Score:2, Insightful)
This is dumb. Very dumb.
A programmer needs to think about what he is doing every step of the way, regardless of the language he is using. You know, to implement an algorithm (the steps). On the other hand, memory management is an implementation detail. If the problem at hand isn't about memory management, having to think about it is in fact a handicap. I know that I would rather focus my mental powers on solving the problem at hand than wrangling pointers, or allocing and freeing memory. If I'm learning about recursion, I don't care what the kernel is doing, or how the compiler and linker resolve memory addresses, or function pointer syntax. In fact, I want all that implementation crap abstracted away, a la Lisp and Scheme, or Ruby and SmallTalk, or even Java.
Granted, there is a time and place for things like C. College isn't it, unless it's for a course in operating systems, compilers (though I'd prefer Scheme for this purpose), or some kind of electronics engineering, where stuff like memory management is actually relevant to the subject. And even then, the essentials can be taught in less than a week. Assembly programming alumni at your school probably decried C's introduction to the curriculum. Too dumbed down. Access to system libraries and "low level" (ha!) system calls and powerful APIs is too easy. Etc ad nauseum.
Me? I started with Perl, of all things. My first project was a data analysis tool for a friend's Linguistics thesis as a college senior -- rather fitting. Moved on to Ruby (with ATLAS C libraries) for research in data mining algorithms. Later moved on to Scheme for an introduction to functional programming, and Erlang for more work in distributed data mining algorithms. Picked up some C and PPC Assembler somewhere. I'm not even defending Java in the classroom. I don't have any particular opinion about it, except that I dislike statically typed languages. Mere preference.
IDEs and EJBs (Score:3, Insightful)
There are two major influences that has caused this change :
* IDE's
* EJB's.
IDE's are not for me, but here is what I'd say are the pros and cons.
pro : easy code navigation
saves time typing
UI development
debugging is easier
con : leads to code concepts like MyAbstractFooBarFactoryFactoryBean
debugging takes longer (_look_ at what you've written, dammit)
gets you further from what the machine is actually doing
EJB's. I have yet to find a real live person who thinks these are a well thought out idea.
I won't shooting at this particular fish in a barrel, but I think its changed the java culture in the following ways
* reliance of configuration files, with the express purpose of "making it easier so you don't have to code...just change the configuration". What do we wind up with? Logic that is spread far and wide and removed from the actual computer program.
* layers and layers of 'ghost' classes that really don't do anything but pass the buck. Some call this a framework. I call it Kafkaesque.
* XML, including the trifecta of embedding logic in configuration files in a language thats
> weak in human editing
> a horrible space hog
> poor in expressing trees
> overkill for 98% of what it is used for
Re:C is overkill for most people (Score:2, Insightful)
Re:@_@ (Score:1, Insightful)
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!)
Re:Java not the problem (Score:3, Insightful)
It is called Computer Science. What has gone wrong with the CS field that it is now turning out people to work as network administrators? What does that have to do with science? If you can't survive 2 years of calculus (or something of similar standard, it doesn't have to focus on calculus, perhaps group theory, algebra, statistics, discrete mathematics, etc), you shouldn't be doing any kind of science degree.
Computer science != software engineering != information technology. But it seems that computer science programs have lost their purpose. It was happening at the school where I was too, by third year it had become a haven for the lazy and less bright students that couldn't handle the workload at physics, mathematics, chemistry etc. This was 10+ years ago, so I expect it is even worse now. I can see the day when computer science gets thrown out of the science faculty, actually. Perhaps into business/commerce, or even away from the university sector completely, into a vocational training school.
Java is not beautiful (Score:1, Insightful)
And yet, interestingly, an OS has been written in Lisp. The first implementation of at least a few major languages (Lisp, Smalltalk, Logo, even Javascript) were written in Lisp. There's no reason a properly-designed HLL can't be used for an OS or drivers or, yes, even its own first implementation.
I eventually learned C, and it made me a better programmer, in the same way that learning any new language makes me a better programmer, even though I'll probably never use it again. When I learned Java, I don't feel it made me a better programmer.
Lisp has a GC, but that doesn't mean you don't have to think about scope. In fact, with all the indirection you can do in Lisp (and which the standard library offers on a silver platter), you think about these things a lot. In Java, you have basically "C with a GC". If you want another layer of indirection, you make
Alan Kay's team tried to write Croquet in Java, but ended up giving up and switching to Squeak instead: Java's meta facilities just weren't up to snuff. These aren't shallow problems like "the programmers were newbies who didn't understand pointers". These are deep problems that require deep solutions.
Java is not bad because it's high-level. It's just bad. It's the embarrassment of the HLL world.
Re:@_@ (Score:2, Insightful)
As a current "IT" student, I have to wholeheartedly agree with this. Just last week, I was in a Data Structures class and we were sorting our first array. The guy beside me, instead of writing the bubble sort that we'd been using in previous classes (the intended solution), nearly the first thing he did was pull up the Java documentation and find the Arrays.sort() method. I asked him about it, since we were working on a team. His answer? "Why write out a sort when Java provides it for you?"
To be fair, Java is far from the only language susceptible to this. The C++ STL has sort methods, and I'm sure most other languages have similar features. The real problem is that programs are moving away from programming fundamentals in the interest of getting to the advanced things that employers want. I took the AP Programming classes/test back when it used C++, and I learned things there that we *still* haven't gotten to after two years in the degree plan.
I don't know that it's the specifics of the algorithms that is really what is missing, though. I think the real loss is that students aren't spending time reading through the algorithms and learning how to analyze code, leaving them less able to step through their own code when their Java Servlet won't start up or their Bean disappears. One thing I run into when helping others is that they really can't say what the code they just typed is actually doing either algorithmically or under the hood.
But then, I do hail from a small(er) former community college. YMMV, I suppose.
Teaching Java - Prefer Python (Score:4, Insightful)
I thought it would be good to teach Java. Problem is that you are forced to make everything a class. That means you have the choice of either teaching all the principles of objects in the very first lesson - even before variables, or telling your class to ignore all the cruft at the top while you try to teach the basics. Even then basic things like keyboard input and outputs require in depth explanations of the Java API. I spent most of my time trying to explain why everything was so complex in Java.
Bottom line; the best language to teach programming is Python in my experience. You can write a one line hello world easily and teach all the basic principles of programming. I don't agree that languages like C should be taught first, as they tend to overwhelm students with details of the language rather than the principles. Python certainly isn't an endpoint. A professional developer should know several languages, even if they are not 'commercially proficient'.
The problem with Python, to be brutally honest is the poor quality of the documentation. I'm not talking about core Python so much as libraries. Often I get libraries and then spend ages trying to find references about how to use them.
Tools != fetishes (Score:3, 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.
I have also made my living for the past ten years as a Java programmer. Before that I was a C programmer, and before that I was a LISP programmer. There's no doubt whatever in my mind that of those languages the most powerful, productive and expressive is LISP. However, there's equally no doubt in my mind that any high-level language is primarily a means to communicate with the programmer who has to maintain your code after you, and if it doesn't achieve that goal then it fails.
Many languages have strengths. Java was designed as a special purpose language for programming the low-power, processor and memory-poor devices. For everything else it is compromised by those design goals. But it has the great strength that it is now a lingua franca that many people in the industry can read and understand.
If you're fetishistic about your tools - if you believe that one particular language (normally the one you're familiar with) is somehow better than all others, then you are fundamentally a poor programmer. A good programmer can pick up any Turing complete language and produce good code - and, more importantly, can assess the strengths and the weaknesses of those languages. But in the end, any language is merely a tool, and every Turing-complete language can be used to achieve exactly the same results as any other Turing-complete language.
Me? The most interesting new language I've seen for a while is Scala [scala-lang.org].
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.
I, frankly, don't agree with the article. Firstly, Java has nothing to do with the case - it's a complete side issue. As a pedagogic language, Java has some merits; it's simple, reasonably orthogonal, and has very clear syntax for expressing structure. And it's just as easy to write a course using C++ which uses only very high level graphical toolkits as it is in Java. The issue isn't the language used for teaching (although I'd prefer to see students introduced to a range of languages); the issue is what is taught. A Java-based course, on the other hand, which takes the student through designing their own compiler in Java (not for Java) and then onto considerations of 'Just In Time [wikipedia.org]' compilation will teach as much or more basic computer science as a course which teaches compiler design in C.
If you think you can stick with the programming technology you learned in college for the rest of your life then you're in the wrong industry, my son. The core skill of a programmer is learning new technologies, not rehashing things in familiar ones.
Re:@_@ (Score:3, Insightful)
"Trust me. You need to have that import in your code. Otherwise it won't work."
"We'll get to that main() method later."
Whereas the standard C "hello world" example will of course be perfectly obvious to any rank programming beginner due to the fact that people are born knowing all about functions, header files, and libraries, whereas objects and classes are something they have to be taught.
Re:Programming is different (Score:1, Insightful)
At least those people are:
http://jnode.org/ [jnode.org]
Re:@_@ (Score:3, Insightful)
Personally, I would go for a language with an interactive REPL environment, preferably one that allows/encourages functional style (Scheme, Python, Lua, etc.) to learn the concepts of computer programming. Not many programming languages can teach you that faster than a good Lisp dialect. C would be a distant second.
Re:@_@ (Score:2, Insightful)
Here's a great test for your kids math teacher: Why is a negative times a positive negative? I asked every math teacher I knew in Georgia, and got nothing but blank looks. So, one day as a kid I sat down and worked it out, and discovered a lot about multiplication in the process that my teachers never knew. By college, I understood basic math operators well enough to recognize addition and multiplication in my digital electronics class: AND is multiplication, and XOR is addition. It then became obvious how to convert any boolean equation into a canonical AND/XOR sum of products form just by doing basic arithmetic. The poor kids who just did the monkey education thing can't even check their answers to see if the units are right and that the value is of the correct order of magnitude.
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
Re:@_@ (Score:2, Insightful)
Spoken like someone without much math experience. Until you get *past* diff-Eq, virtually all useful continuous math is wrote memorization (except perhaps proofs...that's mostly covered in geometry). Further, it's pretty much all memorization of algorithms. If you're not teaching algorithms, you're not teaching kids to understand math.
Further, if you're not teaching the most efficient mechanism for arithmetic, you're not going to set anyone up to be able to do advanced arithmetic in their heads - which is necessary for the intuitive leaps needed to understand quite a few proofs. Do you expect all the famous mathematics papers to be rewritten to coddle you because you didn't learn arithmetic?
The monkey-see-monkey-do portions of US education are GOING AWAY. The rest of the world still has them, but the lack of them is killing math and science education in the US compared to its peers. Creativity does need to be encouraged at an early age - which is what literature, music, and art do. Losing those would definitely be worse than losing science or math, IMHO. We need to not lose those.
But we can't shift creativity into early science or math education. You've got to just memorize things for a really long time in those areas before you can start contributing actually useful creative notions.
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).
Re:@_@ (Score:3, Insightful)
30 x 20 + 1 x 20
Her complaint that it takes time and does not make the students proficient and quick in calculations. But that method teaches place values and shows that the product can be found by addition.
The traditional method that she seems to advocate just teaches a rote way of getting the result without making the students understand how they ended up with the result - kind of like the 'lattice method' which she rightly criticizes.
Re:@_@ (Score:3, Insightful)
For those who will be dealing with low-level programming (and certainly every college will have plenty of courses to teach them), there is a curriculum to teach it to you. But, and as one of my professors stressed, computer *science* is a *science*. The ability to debug pointers is hardly the de-facto starting point of computer science. Linked lists, stacks, queues, etc. are. And you can teach that in any language and really, it's better to start with Java (or some other language with a GC) and just require students not use the API data structures.
You then get into all sorts of nice things like theory of automation, neural-p systems, algorithm scaling, etc. *NONE* of which requires intimate knowledge of low-level programming.
If one chooses to go the route of programming, by all means, most CS programs offer that tree of study. But the idea that somehow, those skills are the "core" of CS is very narrow.
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.