Followup On Java As "Damaging" To Students
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 Java and I turned out just fine.
When I entered college I was started on C/C++. I learned a lot about memory management, pointers, low level system calls, using system libraries, etc. Two years into college they changed everything over to Java.
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.
Love sees no species.
I think there is a difference between dumbing-down and simplification.
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.
Read my Very Short "Stories"
Core stack? What the heck's a core stack? Does that mean get a backtrace out of a core dump?
It doesn't help that the only Advanced Placement computer science courses in high school are based on Java. If it's really a problem, it should be addressed here first. Never really did see why they moved away fro C++.
Imagine teaching MapReduce in Java.
I wonder if automotive engineers went through the same bitchfest right before the modern mechanic was born? 'Damn kids these days just want to learn how to change the oil in their car, they can't even build their own fuel injector!'
At the University of Washington, where I am a student, the introduction programming courses teach Java. These courses seem to serve two purposes. A number of majors outside of computer science require them for the general background knowledge of how computer languages work. They also are prerequisites to entering a CS major, so they serve to weed out people who really don't belong in a technical major. Although I don't care much for Java itself, there are a number of benefits to using it in these introductory classes. First of all, when you're working with a bunch of noobs, it is really nice to have the platform independence that Java offers. Secondly, all of the libraries, at least from my experience, are extremely well documented. But most of all, most of the people that take an introductory programming course won't ever reach the level of sophistication that C requires, so teaching C would be kind of overkill. And those of us who really will continue on to work requiring C, really shouldn't have a problem learning it.
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.
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...
I got into University during the change from C++ to Java. The reasons that the professors gave was that they were wasting so much time with concepts that weren't critical to the class. They claimed with Java, they were able to focus on algorithms and data structures.
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.
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.
Humans are apes.
Nice troll, though.
CS should be made as difficult as possible to keep the numbers of graduates low. This may not be what CS department officials want to hear, but it would be the right thing to do. Right now, the biomedical sciences suffer from a serious glut of highly trained PhDs that find they need to extend training by 4 to 8 years as "post-docs" without solid prospects for long term employment.
While this may be great for the advancement of science, it makes for a pretty bad professional situation for scientists who still looking for work in 2-year appointments at the age of 35+. Moreover, average biomedical post-doc salaries are less than what a fresh BS in engineering would make. Biomedical sciences have suffered from an overabundance of training funds and from a drive for departments to have cheap labor in the form of hard working grad students chasing the carrot of a PhD. So they (1) outsource lecturing to part time lecturers, (2) train more biomedical scientists, (3) shrink the size of permanent faculty. Moreover pressures from tightening NIH funds exacerbate these problems.
In short, training should not be easy or overly encouraged. Colleges should provide training based on market needs and discourage weaker students from saturating highly technical fields.
If CS departments can weed out potential programmers by making their curricula tougher, they should really do it. This would ensure that CS people were actually talented and devoted to the trade and that compensation in the future would remain commensurate with training, unlike in the situation in the biomedical sciences.
Just callin' it like I see it.
Think of how much deeper the understanding of Objects, ER diagrams, ... will be for those students who started with Java.
Which will be more useful in the end, a bit more understanding of low level programming or a bit more understanding of ERP?
They're pretty up-front about it, but it's worth noting that the authors here work for AdaCore and have a vested interest in getting people to use their language. (Notice how they keep talking about the importance of teaching "languages like C++ and Ada" and the section about why Ada is the best programming language ever.)
Aspects of curriculum that are too demanding, or perceived as tedious, are downplayed in favor of simplified material that attracts a larger enrollment.
Let me be the first to welcome you to higher education.
I'd rather have someone respond than be modded up.
I learned Java before I learned C++, and I didn't know anything about memory management. I had to learn it the hard way with C++.
Obligatory blog plug: http://www.caseybanner.ca/
He means checking the actual magnetic core. You can do this with a magnetic compass from your Boy Scout kit.
Engineering is the art of compromise.
I don't see why students can't learn both Java (or C#, etc.) and C. I first learned Java in my undergraduate days, then in the second year we learned C++. After that we were pretty much expected to learn whatever language we needed with minimal instruction. It's not like CS programs need to do only one or only the other.
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.
-James
Really, isn't that what the dweebs are for?
I find it ludicrous that someone with a CS degree would not understand how computers really work at the hardware & software level to whatever level of detail required by the task at hand. Anything less is just pure BS.
rhb
I was taught how to handle pointers in QBASIC when I was in junior high.
The assignment was to implement a linked list. The instructor had us initialize an array which represented our memory block. The program then had to perform all the standard linked list operations, handling memory allocation and all that crap.
The choice of language may seem odd, but consider that QBASIC is what we had available. All our DOS computers already had QBASIC on them, and we could use it without having to shell out the big bucks for a C/C++ compiler (none of us was aware of DJGPP at the time, though I later used DJGPP to teach myself C++).
Now, if the problem is that students aren't being taught memory management, then that is obviously a problem, no matter what language is being used.
If you had super powers, would you use them for good, or for awesome?
I bet the olde-tyme professors who taught these whiny new professors complained about C and C++, pining for the good old days of punch cards. Is it really any surprise that a move to higher-level programming construct has tradeoffs? By making your language easier to understand, you:
1) Open it to a much wider audience, improving adoption rates among would-be programmers.
2) Increase the number of applications written because it's supposedly more expressive (or less tedious).
3) Increase the number of poorly-written programs due to the generally poorer skills of your programming community.
There can be no doubt that there's a point of diminishing returns. I'm trying to imagine a graph in several dimensions but failing miserably due to my poor calculus skills. Some of the possible axes:
* Language expressiveness
* Number of applications written
* Application efficiency
* Users served
Or something like that. In my mind's eye, this graph would plainly show that writing in assembler results in amazingly fast code but is such a pain in the ass that nobody ever does it any more. Likewise it would show that Ruby is great for fast prototyping but sucks in certain colossal and demanding production environments. This sort of tradeoff seems obvious to me.
I often wonder if there is some way that an elegant, expressive programming language might somehow be more tightly coupled with the underlying hardware. Seems to me that the multi-core concept should have come much sooner. We need some kind of Isaac Newton/Einstein/Turing type of guy to really take a good hard look at the relation between hardware and programming language and see if there's a better way.
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.
Engineering is the art of compromise.
It's not just Computer Science. When it's not being dumbed down, it's often falling victim to tenured professors who are incompetent. That's what happened to us at my alma mater. We had some brilliant professors who were tenured, couldn't communicate, and frequently were so slothful that you couldn't practically learn from your mistakes. We'd get homework from the first few weeks back halfway between the midterm and final in some cases.
I graduated with a 2.8 GPA overall, and about a 2.5 GPA in my major. That was mostly because projects were usually 10% to 20% of our grade. One exam was usually worth all project work combined. Our valedictorian, a girl who could regurgitate raw data on exams, but could barely write hello world in any language, had a 4.0 in Computer Science.
A big problem that I saw was the hand-holding. Professors don't feel confident because of the crop of students they have, in just telling students that figuring out their development tools is their problem, not the professor's obligation to teach them.
I've been in the business for more than a couple decades now, and what I see is the same old problem:Interpretive languages vs Compiled or assembly languages. Make no mistake, Java and .NET are "interpretive" languages. Argue all you want about this or that special case, but the intention and design of these environments is the elimination of physical hardware.
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.
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.
Weaselmancer
rediculous.
Before I retired from the military, I taught an Air Force ROTC course for four years (BS/MS Comp Sci), where I routinely tutored engineering/comp sci students (cadets) in programming. I was amazed that engineering students were being taught Java (in their junior year) instead of C/C++ (who writes drivers in Java??). Also, they (the grad assistants) weren't even teaching about debugging: inspecting/evaluating, breakpoints, etc., leaving the poor students absolutely helpless. After I explained these, I told them to "gently" prod their profs/TAs for this information as its fundamental to delivering even functional software on a reasonable schedule (of course more to it, but these were new students) and all deserved to understand it. I had even heard anecdotal stories about students changing out of engineering BECAUSE of the java course-- why?!? Dumbing down the curriculum isn't going to help, but teaching (truly teaching it and helping ensure they understand it)-- you have to know how a linked list works (and even better, Big-O, etc.) before you just start slapping together your java using the standard libraries these days. You have to know about profilers, and should know fundamentally (not that its practiced that much) formal specs. If anything, make them more rigorous on the comp-sci side. The senior level shouldn't be when they learn about software engineering methodologies beyond waterfall-- these should at latest be a fall junior topic, if even a sophomore level. Most of all, teach them THERE ARE NO SILVER BULLETS (Rapid Development, McConnell: MS Press). My two cents.. JC-CM
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.)
It's a small world and it smells funny; I'd buy another if it wasn't for the money; Take back what I paid (SoM)
we'll have people use nice visual interfaces where they can point and click and do fancy graphic stuff and have fun
I love the shell and CLI tools just like any other Unix geek, but I couldn't help but wonder if this quote had anything to do with this previous slashdot post.
Other than this text, there is no discernible information contained in this sig.
That all computer work is the sane as yours. The Net? Desktop? O/S? Embedded?
60% of my tasks are ASM and C. That is all the CPUs will handle.
How much did Microsoft pay this guy? c# is supposed to be just like Java, why doesn't he criticize c#?
Most of my classes right now are in Jave. I do most of my Co-op in C. OS-stuff, and lots of pointers. Most of my co-workers are computer engineers, and I'm a Compsci major instead. The algorithms interest me most, and are most interesting in my studies. That's where Java's been nice to me; abstracting levels so I can really understand the Algorithm quickly. However, it doesn't help much with software engineering. I've never needed to implement a new algorithm.
So I'd have to agree that Java doesn't you be a better software engineer. But I'd disagree that it makes you a worse Computer Scientist.
And in my department, C.S. ins't a professional degree; its not part of a tech school, not engineering. It carries similar weights to a physics degree as opposed to a M.E. degree. Algorithms are the focus. Implementations are an exercise. The program isn't geared towards making good programmers. Its geared towards making good algorithm developers.
This is why things are getting more and more bloated. I learned in basic and was quite glad when I got to c that I was learning something closer to what actually goes on. I had 3 Pascal classes in HS and shortly into them I found out just how powerful Assembly really is. Luckily I had a teacher that let me use that knowledge with inline statements on assignments. Things just worked, and worked quickly.
.NET, but I know for a fact, there's no GOOD reason to have to install a 120MB .NET install for some of the simple control panels and apps that are out there (ATI, I'm looking at you...). I remember when people tried to make their programs smaller and more efficient, finding ways to both put it on a floppy, and run quickly on slow hardware. Now these young whipper snappers use some high level interpreters and say screw the extra cycles, Proc's are cheap. Corps aren't worried about running quickly, or taking up small amounts of memory with elegant programs. They just want it released. Now. No time to dilly-dally on making "good" code, just gotta keep cranking it out. If it's slow, just up the requirements. I long for the days of assembly and low level programming...
There are trade offs to be made. Sure you can probably hack something together using less lines in Java or
-=JML=-
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.
"Please describe the scientific nature of the 'whammy'" - Agent Scully
I saw that too, and like the young engineer in the story, I also have no idea what a core stack is - despite the fact that I've been programming for nearly two decades, in environments from x86 assembly to .NET, and I know my way around a debugger. I assume he meant a call stack, maybe one saved in a core dump, but I can't help envisioning a pile of antique magnetic memory units.
This seems like an example of the "old people have funny names for things" principle, not "Java makes you a bad programmer". I bet the young engineer wouldn't know where to buy oleo or Prince Albert in a can either, but what the hell does that prove?
Visual IRC: Fast. Powerful. Free.
I guess I would be one of those who started out in Java. I go to one of the most popular universities for computer science in Canada and when I started my post-secondary education, had never touched a programming language. Naive me wanted to try it because "I liked video games". Now, I nearly flunked out first year as it was completely the opposite of what I'd expected and I was so frustrated with it - yet it was accessible enough that after trying a generic slate of courses, I came back to give it another shot. You know what? I fell in love with it. From then on, I kept wanting to learn more, more, more. I was hooked - looking back, java helped lay the foundations for a solid programming STYLE. Now in my final year, we still have java courses - which I think is absolutely fantastic for teaching abstract concepts - so that you're not worrying so much about implementation details, however we've really only had 2 or 3 c/c++/assembly courses, which I find absurd. These days, if you want to learn that sort of thing, you have to do it on your own time.
All this rambling to say - I don't think it's so much the courses that are offered - anyone can slip by with enough tact - but it comes down to a persons motivation for learning. Are they genuinely interested or are they just in it for the paycheck?
Sounds like someone is having a bad nigger day.
at least it's not a myminicity link
I took two graduate compiler courses from Prof. Dewar at NYU in the late 70s, which had a huge influence on me. First, he was a great teacher -- passionate about his subject, very knowledgeable, and drawing on long practical experience. Second, he was one of the authors of SPITBOL (Speedy Implementation of Snobol), the best implementation of my favorite language of the day. A really unique, very elegant language. Third, he was involved in the design of a research language, SETL, in which sets were a primitive type. Fourth, SETL was the jumping off point for his lectures on macro compiler optimization, which were expressed in concise, elegant set expressions. And he had his students visit and talk about using SETL to optimize itself. His courses were one of the great learning experiences of my life.
I remember the transition from cards to terminals.
It was generally though of as a good thing(TM) (if you've ever had the misfortune to use cards, you'd know why) though there was some whingeing about whether people would get careless and do less desk checking since it was so *easy* to just edit and run.
As for C (C++ didn't come until much later), this was thought of as a really good thing - basically an Assembler with all the bookkeepping done for you. To an Assembler programmer, whose life is basically pointer arithmetic, C is pretty nifty. There were and still are knocks against C from the FORTRAN crowd because C code is harder to write optimizing compilers for and slower than Fortran in some situations. But back in the early 80's, it was all Fortran IV and '77 (if you were lucky) and a lot of very ugly spaghetti code. The control structures in C allowed for modern structured programming with only a small hit in performance.
The equivalent that you are looking for to Java is PASCAL which almost forced modular programming. PASCAL was a great language for teaching but it never really penetrated into the science world as C did. Probably because it was too slow and too limited or because PASCAL programmers just weren't very good since they never learned memory management or pointer arithmetic (see the Java parallels..?).
Personally, I think if you learn Assembler or C/C++ you learn a superset of skills that allow you to learn and use whatever language that is best for your situation. A C/C++ programmer has no problem moving to Java or Perl/Python but it often doesn't work the other way around...
It is hard to take him seriously if he does not know that 42 is the right answer!
Preparing people for the "real" world in a university is actually very bad idea. Why ?
Because you don't really know what the world is going to be like in 5 years from now. Will we still use single/double/quad core machines ? Will our network connections be still limited by 1 Gbit ? Will people be done with coding web applications and move to something else (like video, CAD or realtime control) ?
Spending 4 years to acquire knowledge that will last for the next 5 is not efficient at all. If, on the other hand, you became fluent with math you can adapt pretty easily.
Why the focus on Java? Because it hides low level execution details? Well, those are important to learn. But if you are taking an Algorithms course, why should you need to take the time to worry about platform specific execution details? Shouldn't you be more focused on the general applicability of the algorithm itself? I am curious what this guy would want used. Maybe all introductory courses should be in various assembly languages? Make sure those freshman have a good understanding of how the machine is actually doing stuff, who needs high level language abstractions! He complains about students not knowing what a compiler does, but frankly, I don't recall any of my introductory courses( in C) teaching any specifics of what the compiler did. I learned that in a class....devoted...to...compilers. Should universities no longer teach any functional programming either? After all, functional languages are very high level, and not even commonly used in commercial applications. I guess since we don't have to worry about pointers in them they have to go too though *sigh* and I really loved LISP and Haskell. If colleges are not teaching the theoretical aspects of Computer Science there might be a problem. If you could actually get through a 4 year CS program doing nothing but wiring together Java libraries, there might be a problem. Using Java to teach basic object oriented programming concepts is fine, a much better alternative than the bastard child of object orientedness that is C++. I think they might be better off using something like Smalltalk, but if not that, Java is a fine alternative to C++.
. . . my entire educational experience in college was augmented by drinking large quantities of java - I turned out just fine! Come to think of it, sometimes I had Dewar's in my java . . . ew.
My son's high school programming class starts in Python and finishes the year in Java. In previous years, they have started in Scheme. His instructor says that since they switched, he sees much more experimentation and "programming for fun".
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 aesthetic sensibility, but especially at the high school level, making it fun is much more important. Plenty of time to "graduate" to the drudge work of Java (yes, I've been paid to use it) and the painful bugs of C (used it since 1976, sworn bitterly at it, defended it valiantly against all detractors and it's still the one I'm most proficient in).
Basically, when I started programming, a high percentage of computer users were programmers. These days, that percentage is vanishingly small. High school and introductory college courses should reflect that and focus on basic computer concepts well-learned by being fun enough to just fiddle around with.
But it is a *terrible* teaching language.
I've you're looking to put something together quickly, to run on lots of platforms with minimal resource requirements, Java is just fine. It's not ideal for all cases, but it's a tool that should be in almost all programmers toolboxes. That said, someone who learns Pascal, then C, then C++ will be able to pick Java up with ease. Someone who learns Java first will have to unlearn a lot of bad habits before they learn anything else.
RAD tools in general are terrible as a teaching tool. Real programmers need to skin their knees on things like pointers, memory management, and even just basic input without library assistance.
Further, the best introductory languages are those that have no practical purpose, so that the student is encouraged to move on to something else as they gain confidence. This helps them gain the flexibility to easily pick up other languages. If they learn Java, there's an inclination to stay there and stop learning.
I'm sure the assembly language professors said that C/C++ was not "real" programming. When you get past memory management, linking, etc. you're in a different problem domain, one that most students might not understand. It's the world of modeling mass software, using design patterns to achieve goals. Problems are across a much broader scale at this level: like distributed across networks, inside the core of an organization's business logic. These problems are not necessarily easy to solve and definately not easier than low-level problems. After you trust the high-level language has your back, you can inject yourself into a whole other world of problem solving. You cannot say these people are just "cobbling" or not real computer programmers.
If there is anything that I have learned in the past 10 years of writing code (since before high school), I have learned that the following sequence of learning is ideal.
1. HTML/CSS/JavaScript - Get acquainted with web programming. None of that Nambly-pambly BBCode crap that they offer on MySpace.
2. Python - I wish I had got into this before I learned C++. Good for learning about shells if you decide to switch to Linux or BSD, especially if you decide to create your own website through a webhosting provider that uses SSH.
3. C/C++ and/or PHP/MySQL. - Playing with the big-boy toys at this point. The safety net that points 1 and 2 provided has been lowered.
4. OpenGL or Assembly Programming. - Really advanced programming! OpenGL is high-level. Assembly is low-level.
From there on, the sky is the limit.
The Rapture is NOT an exit strategy.
A good programmer has the flexibility to use the right tool for the right job. Java has it's place, and it does overlap somewhat with other languages.
Most absolute statements are bullshit. Java can be a suitable replacement for C or C++ in almost all cases. That doesn't mean it's the best tool for the job.
no one is "pining for the good old days of punch cards".
Drop the deck? Go back to start.
Insert an new level of indentation? Well, the first time, you can just indent by two instead of four, or one instead of two, but there's an obvious limit. Of course, Fortran doesn't need indentation because you have label numbers and Gotos!
And don't fold, spindle or mutilate--or let them get even a little damp. The accounting staff at the university kept the account data on cards because it was more "dependable" than tapes. Then the government asked to audit the computer charges for some research projects. The boxes of cards stacked like cordwood for a few years in the air-conditioned computer room repeatedly jammed the card readers. Someone learned a lesson and started keeping the data on tape.
That is how a computer geek would look at masturbation and sex, isn't it?
If you're trying to build things relevant to industry, Java isn't really a good choice unless you need to do it as fast as possible, and support multiple platforms without any additional work. Colleges need to teach their students the flexibility they'll need in the real world.
Universities, on the other hand, could just as well be using a chalk board. If you're just doing research, you simply need to prove your point. It doesn't have to be particularity efficient. Java is a good choice for this because it's easy to use, and extremely forgiving of programmer error.
The main problem today is there is confusion between Computer Science and Programming. Computer Science as it's supposed to be is for learning algorithms to solve complex problems in a logical and optimized way. While the practical side of this indeed involves programming, many theoreticians go their entire lives without coding one single thing on a computer.
The problem lies in this notion that Programmer == Computer Scientist. Which isn't and shouldn't be the case. I could go on, but what really needs to change is the perception around what is to be expected from a computer scientist versus a software engineer versus a computer engineer versus someone who's taught how to program. Indeed there are curriculum based in hardcore coding in C/C++ and then there are others where are based in theory and use Java. It really depends on the school, its research focus, and its quality.
I'll stop rambling here.
Java isn't just an incremental improvement, and C isn't some dusty old tool no one uses anymore. Both are in active, parallel, use for different purposes. Programmers need to be able to do both.
I went to college about 27 years ago. The favorite language of the staff was Pascal, a language with no pointers, which was interpreted (using some kind of "P-code" virtual machine). Even though all the computers were running UNIX, there was a strong anti-C bias. This was UC Santa Cruz, btw, not some wimpy junior college.
The only reason I know anything about C / C++ and pointers is because I chose to learn C in my spare time. The program there emphasized theory, not practical programming courses.
I can't tell you if the modern curriculum is watered-down compared to 27 years ago. What I can say is that I would take a Java programmer over a Pascal programmer any day. Even though I am an old-school C programmer, Java is now my language of choice.
There's a difference, and the difference is not so subtle - everyone can see it.
Hints:
1. A ballooning enrollment
2. A higher drop-out in senior years
3. An increasing amount of CS students who are downright horrible at mathematics and statistics
But, fortunately for you, the teaching methods managed to work anyway. Obviously, you managed to learn Java and C#.
The point of education is to teach you to learn on your own, not to develop any specific skill set. It sounds like it was successfully.
Had your situation been reversed, it almost certainly wouldn't be. (Or at least you would have had far more difficulty adjusting to the real world.)
Gads. Every year, there's a solid 20% of them who whine and bitch and moan. Little fucking losers. I try to explain to them that "People who don't know theory work for people who do" but that doesn't seem to sink in.
So,I have to dumb down the class just to get them to pay the least bit of attention. forget about memorising names and dates. If I can get them to leave the class learning a few ideas like "Hegemony" or "Encode/Decode" or get them to look at ANYTHING around them with a critical eye, I consider my work well done.
I'd love to go sprinting along with stuff, but every time I do that, the imbeciles freak out.
Sometimes I think we have too many people in the university system, and not enough working in the fields.
Like the potato fields.
RS
Shoes for Industry. Shoes for the Dead.
I am one of those "fake" programmers building web and database apps with VB, ASP, JavaScript and the like. FWIW, have I never referred to myself as a "programmer" of any type, as I suck at math and have no formal training in CS. I just use tools that are easily accessible and best allow me to make myself a more valuable to my employers. Every once and a while I get the bug to read-up on something like C++ or even Assembly but it is soon obvious that these are not relevant to the problems I was trying to solve and I would rather do other things with my time.
The author strikes me as a typical "You kids have it easy -- I used to walk to school in the snow uphill both ways" type who resents the fact that his formative experiences are no longer relevant. How does the field progress if everyone is forced to retrace the same steps from the same start point? That is not to say that his specific concerns are invalid. But it seems to me that the evolving state of software requires a broader range of programmers. If Java introduces people who will never become excellent programmers to programming concepts, why is that a bad thing? There are many roles to play, and hardcore math geeks can't fill them all. Rather than chase everyone else out of the field, perhaps the next step is for schools to adpot a more sophisitcated approach to organizing their CS programs.
I see an advantage in distributing programming skills as widely as possible. Being able to create my own tools makes me much more useful to my employers, and the combination of business knowledge and programming knowledge make my overall skillset more difficult to outsource. Win-win. Even a programmer who "only" knows Java is infinitely more useful to society than a technophobe with a Liberal Arts degree (speaking as a non-technophobe with a Liberal Arts degree).
I have been programming computers for almost 20 years and IMO it's a shame that C and Java have come to dominate this field. C was invented with the main purpose of writing operating systems. It is powerfull and flexible and therefore it is overkill for the vast majority of programmers who only need to get simpler jobs done, particularly for people who do not work in high tech (most people do not work in high tech). Java is even worse because it is like C without the goodies. C is good to understand what programming is really about but it's way too complicated and too cryptical for that purpose. I am not saying that we should go back to Fortran (although Fortran has been greatly enhanced, with pointers and such) but languages such as Delphi or Ada are much better suited for most purposes because they are more intuitive and therefore easier to learn and use.
Hmm. I found this telling:
Most of my interviewers at MS could not answer the question... what does an object method look like in memory versus a static method?
and
They're certainly wizards with ... code optimization.
These tell me that they're leaving a lot on the table.
And of course Pascal should not be overlooked as one of the big sources of dumbing down computer science.
Interesting note; thanks.
I'm thinking that a good CS Degree should give you the background in compilers, machine architecture and structures, languages (in the theoretical sense), so that, you could write your own cheesy VM + byte code compiler for a senior project.
This is my sig.
Students in CS related fields need to learn low level languages! Primarily because it teaches you about the operating system the CPU, the memory etc.
In the workplace it often makes sense to use languages like Java since it does in fact speed up the development process where program speed is not a major factor. But it is much harder for someone to go from Java to C/C++ then to go from C/C++ to Java and for that reason I think I would be a big mistake to only teach Java.
I am also disappointed by the fact a lot of researchers in various fields limit themselves to interpreted or high level languages for writing distributed programs. They buy for example a $10 000 000 cluster running "insert interpreted/high level language name here"!!! They know nothing of C or C++ and will argue to the death that "insert interpreted/high level language name here" is faster or just as fast as C/C++. You know you have problem when your researchers dont bother researching best solutions to their problems! Btw what happened to making custom vector units for specialized algorithms using FPGA's 10x-1000x speed improvements anyone?
At the end of the day the more you know the better your solution to a problem will be. Ideally someone in a CS or CE related field should be familiar with at least the following areas Processor Architecture, Compiler Design, Assembly, C and C++, Real-Time Programming, Operating System Development, Data Structures, Software Engineering, "insert popular high level language here".
Seriously why should we limit ourselves to Java anyway? And could you really call yourself a Computer Engineer or Computer Scientist without knowing anything about lower level processes that are invisible in higher level languages?
Someone who learns Java as a first language is going to have a fair bit of difficulty moving on to other languages. There will be a lot of bad habits and faulty assumptions to unlearn. It's a perfectly valid tool for an experienced programmer, but it's terribly damaging to a novice.
I doubt very much you're research project will involve designing an entire OS from the ground up. In most cases, you'll just be whipping something together to prove a point. Java is fairly good for that.
Bare metal programming is usually a bad idea in AI research. Simulated environments are almost always a better option. If they're not, there's no reason you can't write a library for hardware control and provide bindings for whatever language.
Pascal FTW!
Not very useful, but it combines allows students from shooting themselves in the foot, yet allows it when it's required.
Java is bad, at least according to my profs. Not because of reasons stated here on /. but because it is becoming too complex (with new syntax and features) and unsuitable for teaching basic concepts as of Java 1.5. For this reason from this year the freshman are being taught Python as well as Java, with Python apparently being 'as good as Java was'.
I go to a Carleton University, Canada and have to say that we are taught a lot of Java, but we also have a number of courses in C++, C, and Assembly. All of these are mandatory. However, I feel that Java is a great tool for teaching students OO concepts and Design Patterns, while C and Assembly are a must for understanding underlaying system architecture, operating systems, compilers, etc... so I don't feel that my education is in any way dumbed down.
In my opinion, it is important that a student be proficient in a programming language of each generation (ASS, C, Java) before they can get their degree. Denying students any of these is unforgivable.
Of course I must point out that I am enrolled in Software Engineering and not Computer Science, and that in my first year we lost almost 40% of students, who found the program too challenging.
again, he goes off on Java and claims it is all bad for everyone because they'll end up graduating and only knowing how to cobble libraries of Java parts together. WTF, what university is ONLY teaching Java for a CS degree? He could say the same thing about Ada and pretty much not change another word in his bashing of Java and it would be just as true.
There's validity to some of what he says but his continued bashing of Java is just bull IMO. He must have Java envy or something.
LoB
"Anyone who stands out in the middle of a road looks like roadkill to me." --Linus
I don't actually get this. C programming is conceptually very simple. The most difficult concepts for a beginner are, I think, data/function pointers and structs, and these concepts strike me as conceptually very simple compared to the levels of abstraction involved in OO programming (inheritance, etc.)
I find the concepts of OO programming intimidating. I am an experienced C programmer, particularly on the PalmOS platform where I am involved in a number of non-trivial open source projects, and I've done some pretty hard programming in Z80 and 8086 assembler, eking out every cycle, implementing low level Z80 libraries for an embedded device (Sharp Wizard 7xx), and writing email-safe 8086 code (at some point my printable-ASCII-only uudecode.com binary was included in the comp.sys.binaries.ibm.pc starter kit).
I learned to program C shortly before C++ became popular. I started learning C++, but didn't really need it for anything I cared much about.
So I think it is quite a mistake to think of C as harder than java. Granted, some tasks are easy in java and hard in C. But to program in java, or any other OO language, can involve rather harder conceptual thought, while in C it just takes grunt work (more than grunt work to do it efficiently and elegantly, of course). Likewise event-driven GUI programming seems to me conceptually significantly harder than writing console utilities.
So I don't think teaching java should be thought of as a dumbing down. From point of view, C is the easy stuff.
Both C and Java have their purposes. I'd use C to teach pointers, memory management, recursion and maybe even complex data structures and algorithms. I'd use Java to teach OO. I would also go back to C when teaching operating systems, and to Java when teaching design patterns and software development methodologies. But I believe that neither should be used as an intro to programming.
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.
"In our tactical decisions, we are operating contrary to our strategic interest."
Maybe you should read this paper, which arguably (1) established the discipline of computer science and (2) is about an idealized, theoretical machine.
$META_SIG_JOKE
Why you should learn C or C++ instead of a language like Java first. 1. If you know C or C++, you already know a lot of Java. 2. C/C++ teaches you about the Processor and Operating System. 3. Linux is written in C do I really need to say more? 4. Java does things for you. Can you imagine not knowing to multiply and having to use a Calculator for everything? Now imagine a Computer Science Student that doesn't know how to use pointers! 5. Forces you to understand memory management. 6. Java and Real-Time programming is blasphemy! Java is a nice language but it is not a general purpose language. Show me something in Java that can't be done in C/C++ and I'll show you a liar. I can however, give many examples of things in C/C++ that cannot be done in Java.
My university taught primarily in ada. Horrible language, it really did handicap the students. As seniors they were still writing command line programs that asked the user to space pad their input. What was I the physics major who had avoided the cs department like the plague doing? Just writing a multidimensional action minimizer complete with 3d graphing engine in C. Yeah Ada sucks. I will say however that they did switch to Java after I left. I think that was probably an improvement, but I do agree that it makes students lazy. But at least they aren't fighting the language.
Well.. maybe. Or Maybe not. But Definitely not sort of.
I haven't looked at a core dump in 25 years. This is some old fart complaining because he thinks the younger programmer keeps hiding his flowchart templates.
I can imagine that some of those profs have never written really big systems. Java C#, etc. really start to give back as your system scales up- managing concepts with hundreds of classes, instead of a dozen classes and boatloads of C functions, like a lot of past systems (and many current operating systems) do. Concepts are modeled in small tight collections of classes, which can be used independently. And fast compiles, great IDE's and not being able wreak havoc on your processes memory obviously help too. But hey, go ahead and use eMacs, vI, and limit yourself to 10,000 line machine problems. Great. We will NEVER scale up to the next level of programming that way.
The java of today has a vastly different feel of the java of 12 years ago.
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
Why Java when starting out?
.cpp file instead of the .h file).
The fail-fast easy to debug style. Java is a powerful functional language that blows up in your face as soon as you did something stupid (such as indexing outside of an array). It tells you where you did it and makes it difficult for you to write code that is not correct, but works anyways. I was trained initially on C++, and even though our teachers didn't let us touch 'new' until the 3rd quarter. We still had hour + long debugging sessions figuring out what went wrong for simple things like forgetting a ; after a class definition (which would often cause the compiler to complain about the
The CS program at my University is a joke and apparently it is as I have always feared: my University is on par with CS programs at other Universities. Partially you can blame the Universities, but mostly you have to blame the students. Let me tell you why:
I've been programming since I was 8 when my father (who has worked for IBM since before I was born) taught me C (I am now 25). My Junior year in high school (10 years ago), I stopped using Windows and started using Linux, and have never turned back because I immediately fell in love with Bash.
When I went to school, I started as a Music Major and actually stayed one for quite a while, but I was never very good at it since, instead of practicing my sax for three hours a day like I was supposed to be doing, I was coding about six hours a day. In my first three years of college, I taught myself Java, Lisp, Ruby, and OCaml, and not just the languages but the libraries as well. I read everything I could find about algorithms, data structures, software engineering (URL, Design Patterns, etc.), compilers, theory (FSAs/PDAs/TMs), and even some true graphics programming (ray tracing). All of this I learned from the internet, completely isolated from any direct contact with other computer science professors or students. I did it because I wanted to learn it because it was interesting, and not because anyone told me I had to.
When I realized I was going to starve as a musician I decided to get a minor in CS, since it was something I had always just done for fun, and it would look good on my resume. My first month into the minor, I was already tutoring seniors in their classes, and simultaneously laughing at how easy their assignments were and being horrified that they couldn't do them. I had done more complex projects for fun and threw away the code because I didn't think anyone would want such trivial junk. I quickly found out that I had essentially put myself through a CS degree on my own and completely by accident!
The next semester, I changed majors, was in senior level classes and was actively involved in a research project with one of the professors. Whenever I got an assignment due in two weeks, I would complete it in class, and then spend the next two weeks implementing it in other languages and extending it to something that isn't incredibly trivial. For example, we had two weeks to implement a Turing machine, and because the majority of the class couldn't do it, it got extended to almost a month. I wear shirts from ThinkGeek and my peers don't get the jokes. When I pull up a terminal their eyes glaze over, as if I'm performing some mystical black magic.
The point is that any and all the information for the CS degree is out there and publicly available, but the students are simply not willing to go out and find it. I think the only positive thing I have gleaned out of the CS degree is what they are stripping from the degree programs: being forced to take the advanced math classes. My math classes taught me how to think formally about something that has always been intuitive and have been the most enlightening classes I have ever taken in college!
Whenever I get frustrated with my University or my peers, I just reread theses and remind myself that there are others out there:
http://www.pbm.com/~lindahl/mel.html[The Story of Mel]
http://www.pbm.com/~lindahl/real.programmers.html[Real Programmers Don't Use Pascal]
Also, the point of the above article is by no means a new idea. Edsger Dijkstra said it over a decade ago in one of my favorite EWDs:
http://www.cs.utexas.edu/~EWD/transcriptions/EWD10xx/EWD1036.html[On the Cruelty of Really Teaching Computer Science]
colleges are universities.
The field of computing has expanded in all direction, even inwards and backwards.
You simply can't stuff all the important wisdom into a 3 or even 5 years.
In the olden days all they had was their math books and assembler, and
life was simple.
My suggestion: Make computer science hard and interesting again,
and provide a different education for those who are allergic to math and metal,
they might still become productive, and much needed, high level programmers.
The know-it-all computer guru is becoming outdated. Just as know-it-all philosophers
became outdated once we started doing some serious sciencing.
There are always exceptions. Have you looked at the Android platform? It's very nice and could fulfil that promise.
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.
... 'built into' the hardware to some extent, and by language, I mean you can translate raw machine code easily to other languages or 'plug' a compiler into a development machine and know what is going on and get an idea of how the machine is actually working, complete 3D visualization of the data flows, etc when you need it, while still coding from a higher abstract language, a real programming language (expert tool) should allow 'entry point' (i.e. layered access, to say assembly, etc) and manipulation within the language itself. Code needs to become 'adaptive', and not 'static' as it is now.
The biggest thing holding comp-sci back is the ability to know what your code and data is doing and where it is going overall from disk to controller, to memory, to cpu, wherever. I agree with the professor on assembly language, but the whole problem is that assembly is 'divorced' from the language itself, when it should be an intimate part of the language *when you need it*. One should be able to set a flag - if platform equals x, use assembly routine y (if multiplatoform) etc.
Data and computing have exact counterparts in the world of urban planning for waterways/sewage, or in electronics with enregy flows of energy in basic electronic circuits, whether one wants to admit it or not. I imagine the visualization tools for Electronic engineering or urban planning would shed some light on the horrible state of tools and compilers.
IMHO the major roadblock is the lack of hardware -- tool integration, they should really be co-developed, updated and integrated where needed.
And yet, interestingly, an OS has been written in Lisp.
Yeah, I've heard of it. Isn't it called Emacs?
Ba dump bump! Thanks, I'll be here all night. Try the veal.
Weaselmancer
rediculous.
A few years ago I taught a class in Java. I program in Java professionally, so I know it is a powerful language. In learning Delphi I developed Object Orientated skills which easily transferred to Java. The main principle of Java is protecting the developer from themselves, with strict typing and automatic memory management. The main problem with C/C++ is programmers stuffing up memory allocation. Right now I manage a project that has C++ code, and we still deal with unexplained fatal crashes and such like. Anyhooo....
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.
Introductory programing in MatLab. Hows that for inefficient? But then again people who just want an advanced calculator, and isn't interested in millisecond efficiency MatLab is just a million times easier then real programming.
IMNSHO, computer science is about improving the ability of computing devices to do work. Different languages are valuable in different ways. Languages closely related to computer internals are useful to deal with low level functionality. More abstracted languages are better for getting things done quickly without having to write a ton of low level code, and a quality optimizing compiler can write lower level code as optimally as the best human coder.
To say that lower level languages which relate more to the hardware are somehow better misses the point. A computer isn't an art piece, it's a tool. High level languages are legitimate CS material because they facilitate certain types of work better. If I can spend 5 minutes writing code in a very high level interpreted language to do something that would take a week to write in Java or a month to write in C++ or years to write in assembly, unless I really need every ounce of efficiency I can get out of the program I'd be nuts not to use the high level language, and my employer would be nuts to pay me not to. This is not to say that interpreted languages are always better; indeed, they're not. But, in some cases they are, and in those cases, no matter how much you like lower level languages, you're just wasting your time by using them, in the same manner that no matter how much you may like a zippy little red two seater sports car, it's lousy for transporting a family of 8 to grandma's.
There's no excuse for an outright incomplete CS program. Blaming the choice of language doesn't make the program any better. Here at my university (Northern Michigan University), we use Java for the first year of courses, before moving on to C, a nice survey class (introductions to LISP, Prolog, and such), and finally upper-level courses using whatever language is most suitable. Introducing students to programming through Java has harmed nothing, in my opinion. In Java, it's entirely possible to understand the basic concepts of pointers. Granted, you can't do the neat little tricks with pointer math, but those kinds of things are hardly wanted for introductory courses anyway. As for programming with a GUI, all I have to say is "Welcome to 1990." The Average Joe using a computer has been familiar with GUIs for at least two decades now. I personally love the command line (its power, especially for use with scripting, is unmatched), but for some programs, especially in my field (custom programming for small businesses), you need a GUI, just because that's all the user will be able to use. To concentrate on command-line programs throughout the short four years of college is hardly a service to the student. The code behind the GUI is still code, and today's students need to master both aspects. Regarding garbage collectors, they are perfectly acceptable as a programming tool. Yes, a perfect programmer will be able to delete his own objects more efficiently, but that's no reason to remove a useful aid from use when it just doesn't matter. A small program, where most of the processor is wasted waiting for user input, can afford to run a garbage collector, especially if it means the program is ready for use earlier than expected. Use that time for testing, code review, or interface design, instead of wasting it writing unnecessary routines. Reading this article (and re-reading the original), I am constantly reminded of another site I saw, discussing the state of CS programs, as compared to bricks. It's titled "A Degree in Brick Science", and is available at http://www.flounder.com/bricks.htm. This article discusses the same problems as Dewar does, but finds an entirely different conclusion: the underlying problem is how the universities arrange their CS courses. This makes far more sense than blindly blaming the current language of choice for introducing new students to the joys of programming. In my opinion, any CS program worth the name should cover all the topics necessary. What language they use is inconsequential. This is the same rejection of a new tool that has eliminated BASIC from the repertoire of most schools. I learned BASIC first, left it, and have not returned. I took with me the knowledge of how to break up large problems into small ones, and turn those small problems into individual steps to form a final program. I took my experience with boolean logic, my love for string manipulation, and my frustration with stupid mistakes. I moved on. It has not made me less of a programmer at all. Rather, it made me better. I learned quickly my strengths and weaknesses, and have carried them with me. I see Java in the same way: It provides a place for eager students to explore the possibilities without needing to know the details of the theory. Of course, the best programmers will always be the ones who know both. In our push for more theoretical knowledge, we must be careful not to do what Dewar has done. We must not ignore progress in exchange for upholding antiquated traditions. We could take Dewar's argument to an extreme, and claim that we should teach students to set 64 switches at a time to program a modern processor. This would quickly be rejected. Yet it is a more pure way to program, to actually have to think about the individual wires. Assembly language is a tool to make machine code easier to write and understand. C++ is a tool to make assembly easier to write and understand. Why must we stop there? -Sarten-X
You do not have a moral or legal right to do absolutely anything you want.
The important bit here is the word "Science". You can be a fabulous programmer even if all you know is BASIC, and you can be a very good computer scientist without being able to write good applications. The goals are completely different.
It's like the distinction between engineers and scientists in general. Engineers have been educated to do practical work: building houses, bridges, ships, software - they may have learned advanced techniques, but of course with a view towards practical applicbility. Scientists on the other hands are not there to primarily make practical work - yes, it sounds funny, doesn't it? As a scientist you are supposed to investigate the unknown, and since you don't know what that entails, you have to understand things at a much more basic level. In computer science it means you need to know not just algorithms and a programming language, but also systems architecture, microcode, the mathematical models relevant for programming etc etc. In fact knowing how to program well is about as relevant to a computer scientist as 'being good with numbers' is to a mathematician; ie not entirely irrelevant, but there is a lot more to it than that.
And that is why Java may be a less than perfect language for teaching CS - it isolates you from the physical machine and protects you from the pitfalls in C and assembler - a good idea in a production environmennt, but not if those are the things you need to learn about. In a way you can say that it the job of the scientist to make all the mistakes and find a way through the wilderness. After that the engineers take over and build a proper road.
When I did my degree in my first year we had a module in Micro Electronics Programming (Assembly), a module in OOP (Java), and a module in Operating Systems Management.
I was luck enough to learn C and C++ off my own back in collage before I went to Uni. I do believe that splitting up the three components (whilst good for people who haven't come from an IT background) did leave me slightly bored with the whole thing.
If they had used C++ for the whole first year I would have felt a lot happier. That said I also know people that wouldn't have passed their degree, but then again maybe they shouldn't have done anyway.
-1 disagree is not a modifier for a reason. -1 troll, flamebait, redundant, overrated are NOT acceptable substitutes.
Scheme was the first language in my CS program. I hated it when I was taking it, but I ended up appreciating what I learned in the class, mainly in relation to my approach to problems, quite a bit. C (and a mix of scripting languages) followed. I don't think there is an undergraduate class that teaches Java. Graduates might have a harder time becoming Java monkeys after graduation, but everyone is capable of tackling a far greater set of tasks and approaches.
There is nothing that makes Java unsuitable for learning algorithms and data structures. The fact that Java comes with a set of prefabricated components does not mean that it can not be used for such a task. C++ and Java have exactly the same algorithmic issues, because Java, despite what others may have said, is essentially C++ with a garbage collector and all objects allocatable on the heap. Java also has pointers; it's not possible to say "I know Java but not pointers", because even the language itself admits it has pointers: it throws a null pointer exception when a pointer is null. There is also a little bit of memory management thrown in, in the sense that pointers must be nullified as soon as possible so as that the collector clears unused objects.
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.
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.
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.
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' 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.
I'm old enough to remember when discussions on Slashdot were well informed.
I don't need to even read the article. I've read enough of them, and I'm living this shitty fucking student life learning this dumbed down curriculum after getting all excited about learning C/C++ just in time for universities to switch away from it!
When I signed up to go to the Uni right out of High School I was programming to the side for fun, so I figured... hey! I'll keep computers as a hobby... no need to make drudgery work out of something I think is fun. I'll be a biochemist!
When I didn't want to be a biochemist anymore, I switched to computer science mid-way. Fuck, at least I was learning something as a biochemist. I have never had a lower opinion about higher education in general as I've had after I switched degree programs. I feel like I haven't learned a damn thing. This is a charade. It's obvious to me that any additional learning to what I knew before is going to come from outside of class. Everything I thought I'd learn about... I'm not. I think I used a pointer once in assembly class.
All of this while I watch classmates write shitty fucking programs, and fall asleep during classes, all the while I'm wide awake and attentive, waiting for little nuggets of something I might not already know. Both of us get the same grades.
Then I watch someone get hired at my fiancee's work to do some programming... he's fresh out of college with a fucking English degree. CS is a mistake and it's made me hate life! How's that then? Is that the vital feedback these CS programs wanted? I was right in the beginning... get a degree in something else if you grew up programming. Far as I'm concerned undergrad CS is worthless.
One of the issues I had with the previous article was that it appeared to be attacking Java as a language. In this clarification it's stating that it's not so much that Java is taught as what may later get left out.
However, he does his argument a disservice in his comparison with Maths. In Mathematics, we learn counting, then addition, then subtraction, and so on, only much later coming to differential equations and so on. Why should programming be different in starting with the easy stuff (Java), and only moving onto the hard stuff later (C++)?
After all, Java can fulfill the needs of various development requirements, just as Visual Basic is still the main language of a significant proportion of bespoke business applications, despite its limitations and the lack of understanding of underlying principles that many Visual Basic-only developer have, much as an understanding of basic Mathematics is useful in many areas without an understanding of the more complex calculations that are possible.
It is not a completely like-for-like comparison, because the simple maths is the core parts, while simple programming tends to be using large libraries, then introducing additional aspects to consider in looking at lower-level develpment. However, just as if you introduced maths ideas too early you'd scare off a lot of potentially good mathematicians, the evolution of introductory programming courses has been to allow students to gain some understanding and confidence in producing their own code before delving into the depths of the subject.
Yes, someone who has a full understanding of the underlying memory allocation, garbage collection, resource usage and other issues will likely be a better VB/Java/Whatever programmer. That doesn't preclude a Java or VB developer being able to produce a perfectly workable business application. Additionally, some of the libraries that are being denigrated in the article have been refined for substantial periods, and leveraging the libraries means that those functions should be suitably optimised, saves reinventing the wheel (and therefore reduces development and testing time), and reduces the complexity of the application-specific code. It also helps ensure that particular functions are properly encapsulated.
You can achieve a lot of that with good programming practice, but it's useful to support that practice by encouraging sensible code reuse, rather than attacking the process.
Yes, some of the courses will produce programmers who can produce basic dynamic websites but not complex business applications, but those domains can be very different - like aircraft engineering vs. automotive engineering - there's obvious crossover in engine theory and so on, but much of the supporting technologies being used are different. To attack a web developer for not being a good desktop programmer is just silly - they are different specialisations, requiring different issues to be considered.
PASCAL was/is taught as an initial language because it's the preference of some of the lecturers. Yes, you'll then learn about pointer arithmetic, but if you go into the commercial environment straight from learning just that you'll need to learn a few libraries to even be employable as a Delphi programmer, and you'll have much more limited opportunities at that point than someone who has basic Java or VB skills. Java therefore makes a sensible foundation as it allows a subset of concepts to be introduced while largely ignoring other issues. You can then expand on the concepts. Yes, to have a full knowledge of the subject you'll need to know about pointers and buffers and so on, and will really have to look at C++ at some point simply because it's the language used for most driver development and the language used for core libraries used in various other languages.
If you learn PASCAL then C++ you'll often never use PASCAL again. If you use Java then C++, or C++ then Java, you'll probably use C++ for driver development or other applications where performance or lower-level access is more importa
These guys are shills for the "Ada industry" and are not really crying about "damaging to students", but rather how difficult it is to find Ada programmers in support of their personal financial interests. And they do so hidden behind academic titles. Depressing. The world of programming for new grads is mostly about web development which is either Java, PHP or .NET. A CS program "rich in Ada" is not very beneficial to grads. OO Java Development is an excellent teaching language and is very pertinent for a bachelors of science in CS education.
Horns are really just a broken halo.
I started out in CS before there were libraries that did everything for you. If you wanted to sort a list you had to write the sort yourself and you had to know what it was you were sorting to know which sorting method was most efficient because by God every CPU cycle came with a cost. If you wanted to create a indexed file you had to know what random access meant and what type of tree structure you wanted to use because there wasn't any query language to do the work for you. That was the eductation I got. Now you can write code with a few mouse clicks and have no idea what's really going on in the background. That ain't workin', that's the way you do it. Money for nothin' and your chicks for free!
I agree with you on the algorithm issue. My school teaches through mainly through C/C++ then some classes of Java and then some mattering of other ones. Probably for the first 2 years we wrote stuff accessible through the STL like trees, linked lists etc. We did this even those things were accessible to us just to understand behind it. After that we're pretty much free to use the STL (notable exceptions being the classes geared towards unix programming and Compiler design which use straight C).
There are certain things that C/C++ has advantage of over java. For example, I'm currently working on a project that implements different mathematical algorithm. To keep it readable to peers and to keep it efficient C++ is the best option. Java (while it definitely has improved) would be no where as fast with the interpreter.
What's my point? Not really sure... I guess my point is that limiting the program to one language can be dangerous. For example, in AI we used prolog and Lisp for knowledge representation and list manipulation respectively. In a course about programming language theory we used ada (because it is very strongly typed compared to others).
Once a student has learned the basic programming ideas I think it is important to show multiple programming languages. Each programming language has its strengths and its weakness. I think it's important to realize that different tasks call for different languages. If I want something tight and efficient I'll likely use C++ however if I'm writing a GUI environment I'll use Java (or VB.NET). And yes, the microsoft languages do have their advantages if only for the fact that many end-users are on it.
So yes, I agree with you that one can learn algorithms in java as easily has C/C++ but that can't be the end-all to the CS program either.
Lack of planning on your part does not constitute an emergency on mine.
The problems with the arguments against CS as a discipline are that you have to replace it with something. Those who advocate other means of technical training besides university, such as self-study, have a point, but if your entire market is dominated by people who are self-trained, then how does one determine whether any single individual is qualified?
.net, and the proliferation of interpreted scripting languages ala ruby, python, etc. Rather than doing so much complaining about what java is bad at, it would be much more productive if we instead used java in those domains where it is and can be successful and made other language choices in areas where it is not the right choice.
We have universities in part to provide a base level of qualification into a chosen field. If may not be sufficient for one to be successful in that field, but it is a starting point.
Also, there is a wide range of CS education available -- some schools (even big name schools) are serving up complete crap, whereas others really are training "world-class" computer scientists. This is a problem with the universities, not with the discipline itself.
The arguments against java are misguided. First, any CS program should include work with many languages and classes of languages -- I believe the ACM curriculum requirements even state as much, and if you went to a certified school than this is certainly the case.
Java is the lingua franca of business computing today. Further, it has influenced the entire state of the industry -- look at
Personally, I think all this pissing and moaning about java -- be it in academics or business -- is just silly. In the past year I've written productive, working code in java, c++, objective-c, ruby, not to mention making use of things like javascript, sql, and so on. Just because I chose a particular language to apply to a problem does not invalidate other languages. Should I complain because somehow French is not as good as German, or that one is easier to learn than another?
If it is turing complete, go solve problems with it.
When I think about all the really talented programmers I know, not one of them likes Java or even uses it much. They tend to fall into two categories: Hard-core kernel hackers who sling around C or assembly, or higher-level hackers knee-deep in Perl, Python, Ruby, Tcl or more exotic things like Lua, Scheme and Lisp.
Quite a while ago, I bought "The Java Programming Language" and honestly couldn't see what all the fuss was about. An OO language with vaguely C-like syntax. The open-source scripting languages like Perl, Tcl, etc. are far more fun, funky and innovative.
That makes no logical sense. The slug CS graduate has the same sheepskin as the excellent CS graduate. Given the way HR policies work, your chances of getting a slug are higher under your model.
I would rather CS courses return to the model when I was in school: the entry level courses in system programming, computer architecture, logic design, and the mathematical requirements served to weed out the slugs. Case in point, my systems programming class started off with a packed auditorium -- 60 people. At the end of the course there were just 15 of us left - and quite a few of the dropouts changed their major to something less demanding. The professor even commented on it at the end of the course - that was its purpose, in addition to getting us a basic understanding of Unix system programming.
That being said - there were those who were smart enough to squeak by the coursework and graduate during the dot-com boom - the main motivation being money - and these are the primary slugs I've had to deal with in my career. I'm just starting to come into contact with the new variety - and they strike me as being fundamentally clueless when it comes to the implications of various actions. I am frankly quite sick of fixing, or worse having to live with these people's shoddy craftsmanship.
We need to add more salt - in the form of higher standards and more difficult coursework - to our CS degree programs. Every University should follow those minimum standards in order to meet criteria for accreditation of their CS program.
Software has become as critical to life, health, safety, and society as the trades plied by doctors and lawyers. It is about time we demand an equivalent level of professional responsibility, as well as just compensation for that responsibility.
I know Java fairly well, but I started with C++ in high school. Then when I got to college, Ohio State, sorry, THE Ohio State University, the introductory computer science curriculum taught using a modified version of C++ called Resolve C++. In Resolve they mostly added keywords to the language that help explain things better to beginners, and included extended versions of the primitive types, eg int became Integer, and double became Real. It was a pain in the ass for me since I already knew C++, but it helped a lot of students I think. They also encouraged in-depth planning before coding, I won't go into the details. So I think OSU isn't one of the schools TFA is talking about.
Or did all of you who did just reply to others posts? Let me clue you in. a MINOR point made in the updated article was Java. More seriously it was the exclusion of Data Structures, algorithms, and other math classes to dumb down CS to make it more attrative to a wider audience. Java was simply a part of this dumbing down process. Its an easier language to learn and work with, and it does all sorts of flashy things immediatly, so its more attractive to the "dumber" programmer. I have to say I agree with him. I started learning C++ on my own at 8 years old. Yes. 8. Thats no exaggeration. By 14, I was in a community college programming class. And you know what, I did pretty well. However, I didn't really get a firm grasp on pointers until, dare I mention it? I took assembly. Not only did assembly enlighten me to what my C code was doing, it gave me a firm grasp of the underlying architecture (and now many other types of architectures as well), and easy understanding of pointers, and a lot of good programming practices. No, I'm not saying to make assembly the first language taught, far from it. I do think it should be encouraged though, as well as digitial logic, Digital Electronics Design, and other low level classes. Sure, your career web developer will most likely NEVER use any of those skills, but then, they won't use 90% of what a CS degree is supposed to teach either, so why should they even bother. Like the article said, we don't need them getting CS degrees. I have had the opportunity to sit in on some CS interviews, and its quite frightening. How can someone come out of college with a CS degree and not understand how their could, should, and how it is being stored in memory?! You can't tell me what a deadlock is? You don't have a clue how to implmeent a Tree, queue, priority queue, etc? These were in response to job postings for a small hardware development reasearch company. Yes, hardware company. These skills are still in demand! Amazingly I came out of college with this sort of training, even though I graduated 2004. I went to 3 different colleges, and all of them worked similary then. Community College, UNT, and PennState Harrisburg. Its not that I was shopping for schools, I had wanted to make video games since I was a kid, thats why I started learning programming at a young age. I transferred out to UNT to follow that dream. Turns out, the only professer there I felt at the time was a good teacher was the one teaching the games classes. I left the school after a major disagreement with the Chairman of the CS department there who could care less about undergrads, and the Dean of the College of Arts And Sciences (Yes I know CS moved over to the college of engineering there, that was the semester I left). It was the best decision I ever made. PennState Harrisburg was almost everything I had wished UNT would have been. Even with as much as I disliked UNT, they still required digital logic classes, data structures, algorithms, and other theory classes. PennState did also, but that school actually cared about their undergrads, and didnt have us trying to do ridiculous things in college like work with students in Turkey, with an immense time difference, language barrier, it was tough, add them not caring much about our grades, and the fact that this was a LISP course, and you have a recipie for a major pain in the butt. I am glad though these colleges at least hadn't compromised their programs like the professor in the article describes going on, and that i have seen the results of. It was tough, it was work, but most of all, it was fun, and still is.
Q: What does an accountant do when he's constipated?
A: He works it out with a pencil.
"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."
Compared with implementing Java solutions, I think that was largely the point. "Platform independence" implies independence from the hardware AND the OS.
"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."
...which speaks to a different problem. Newcomers start off with Java, but don't spend enough time and effort on learning why things work as you were alluding to. ...problem-solving, data structures, algorithms, you get the drift. Ideally, Java allows a comparable level of performance (not every line of code gets compiled every time, nor needs to be) over more platforms within a level of security that C et al cannot match. Newbies who you may have worked with might not have known as much as they could about the Java API, which is rather substantial.
If turning out entry-level programmers expediently was the goal of computer science programs, I'd imagine they'd teach them Perl and set 'em loose. ...fast, cheap, real easy.
My real point about MyAbstractFooBarFactoryFactoryBean wasn't that it was a long name. I can deal with that. It's an example of one of these ghost classes. The kind that are there to make it 'extensible'.
The kind that are there 'just in case' you might need to use polymorphism, yet *much* more often than not lead to one single implementation class rather than a golfbag full of useful classes.
The point made in the article is 100% valid. Even if they never need to think about it in everyday life, programmers should know the basics of how data structures work or how pointers and at least be familiar with pointers and memory allocation. They should know that there is an alternative to Java's pass by value-reference. It's like learning long division or fraction arithmetic... does anyone write it out? No, if it's easy enough they do it in their head and if it's not they use a calculator. But when you learn it, you learn it without the calculator. Personally, I think that colleges shouldn't be in the business of teaching a language, they should be teaching the skills to learn languages. If you're in an OO class, you should be doing projects that explore concepts in the best language for demonstrating the concept. That's not always Java. In the real world, you will have to drop into situations where you need to learn a new language to solve a problem. In addition, there is always a time when the languages you learned in college are simply no longer in use. If you learned Fortran or Cobol in college, you either learned a new language or you aren't programming anymore... at least not professionally. The kids need to learn to fish, not simply be spoon-fed the hottest language at the time.
I think that all these schools that are teaching only Java to computer science students are going to end up cranking out a large number of application programmers. Not that it's a bad thing, but most won't have a thorough understanding underlying principles. I think it's good to teach Java it's an interesting language, but I thoroughly believe that needs to be sured up with a heavy understanding of how the underlying system works, and how lower level languages work. The most immediate thing that comes to mind is the memory management of C, while it's tough and a pain, it give you in depth knowledge about how the computers memory works. A very important principle in my opinion.
I've never quite understood this concept of why it's "cool" to pick on Java. It has pros and cons like any programming language, but for some reason because it's pros skew more towards the ease-of-coding side rather than performance, it becomes some kind of a pissing match between programmers about "skill" involved. It's the equivalent of a large tournament player debasing some "n00b" because he only casually plays Counter-Strike for a couple hours a day. It's absolutely ridiculous and unnecessary, and almost equates to a form of silly fanboyism.
As a 3rd year CSC student in one of the better engineering college's in the US, I must agree 100% with the remarks of Professor Dewar. I do not feel remotely close to prepared to enter into even many entry-level programming jobs with just what has been taught in my courses. HOWEVER, I'm not really understanding as to how this pertains specifically to the Java language. This is an issue with CS departments nationwide, not with what languages are being used in the classroom. If all that is taught is a couple steps beyond Hello World, it's hardly the coding language to blame for poor training.
that is a great article and a sound perspective on our business...But I still love Java.
I feel entitled to that. I'd written in Fortran, Pascal, BLISS, C and half a dozen assembly languages from IBM 360 to PDP and Intel 80** and I earned my appreciation for how much Java was doing for me and exactly what it could not do for me.
SLASHDOT: news for people who can't concentrate on work or have no life at all and got tired of yelling back at the TV.
IMHO, universities do not and never have truly prepared undergrad students to get a job in the job market at the time they're expected to graduate. I went to Boston University College of Engineering in the late 80s. What they taught was geared around Ada. What they job market wanted was C++. Defense contracting was taking a nose dive. So we all had a really tough time finding work. I ended up sticking around for a Masters and I still had a tough time although the advanced degree helped as did the fact that I played with computers on my own time. The weird thing was that I was eventually hired to program Macs and I had never written code for a Mac before. It seems clear that if it's being taught to undergrads, it must be passé. You gotta learn job skills on your own.
Not much. Therefore i assert that Java is relegated to a few niches, and doesn't have a lot of relevance in the FOSS world.
I know that I'd personally rather use programs which load quickly, run speedily, and don't need to have to have some huge proprietary runtime updated every few months.
Our "Intro to programming" course is COBOL. And I have to take 3 COBOL classes before I can graduate. :(
I totally agree with what your saying, but I am not sure who "they" are in the post. I graduated with a CS degree from the University of Iowa in 2001 and the CS degree required both a Discrete Structures and an Algorithm class. I would suspect that most colleges would have something similar, if not more. Calc 1, 2, and Linear Algebra were also required for the major (Calc2 was good at weeding students out of the CS major into business MIS!). I hope you were refering to specialized trade schools or technical colleges and not traditional colleges, as I believe they DO teach algorithms and data structures.
As a side note, there was single "core" CS course taught in C++, and the other courses were Java. I would guess it is all Java now. I'm glad I took one C++ class, but I feel Java was overall better for learning. There was a lower level programming class (also required for the major) that taught basic chip design and 68k assembly that taught me more about what was "under the hood."
>There is nothing that makes Java unsuitable for learning algorithms and data structures.
Can't completely agree there. Because one of your supporting points:
>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.
Seems narrowly focused. First off though, allow me to agree that Java is well suited to:
* Teaching Patterns (which greatly expedite inter-programmer communication),
* Using Exceptions (which unclutter everything),
* Strong Typing (the ignoring of which is an optimization which should be reserved for experts)
* Object Oriented methods (which are too popular to ignore even if you don't like them)
* Threading (made especially essential in these up and coming multi-core days)
So for these reasons I agree Java is great language, and not a bad language to start out with.
However, as a Systems Architect I am regularly bitten by code from people who lacked a fundamental understanding of system resource management because they are Java adept, and their desktop computers (lovingly overbuilt) always had ample resources to throw at the problem. These people have never considered the "weight of their threading model," it's cost to the JRE or their options for choosing another one. They have never calculated or considered their maximum instantaneous heap usage. And when their application that is much cooler and spiffier than anything I've ever created gets offered the Internet and posted on Slashdot, they have no idea what is causing the exotic kinds of breakage that occur as their application's garbage collector tries to clean up 10k short-life threads at a pass and starts getting behind.
There is a large and beautiful variety of desktop applications that will rarely get hit by such issues. Perhaps due to it's other merits it would be reasonable to start people with Java and simple desktop applications. But this is not the age to call people programmers and have them unequipped to write server-side code. We are doing these college students a significant disservice by giving them "A" grades at all the things they can easily learn in Java and sending them out into a world with deadlines and "we need this bug fixed TODAY" managers, and few/none of the tools it takes to "dig deep." The ugly-bits that C programming forces the programmer to be aware of are fundamental attributes of the machine and thus worth knowing.
I program because I love it and I am passionate about it. I enjoy what I do. I don't simply do it as a 9-to-5 job. But a lot of people get a CS(E) degree just to make money. I went to college at Arizona State. The CS and CSE program there was pretty good. I took a class called CSE 225 and CSE 421. 225 was introduction to assembly programming. We used the Motorola 6811. 421 was advanced assembly and we used the 6800. Both classes were extremely hard, especially the second one where we had quizzes and labs where you really had to think hard about your logic. You were graded on efficiency and timing. 421 was the definitive CSE course at ASU. Sometime in my junior year the university tried to "dumb down" the program. They wanted to use the 68000 and replace the professor. The started with removing the professor who taught 225. A new professor started teaching the class, using the 68k. It was a terrible idea. The 6811, though old, was simple and gradually introduced assembly programming concepts. The 68k had a lot of features which made it very difficult for a lot of the students. Some students who came into 421 after taking 225 didn't even know what condition codes were. The university then tried to "dumb down" 421 and change the professor, but there was a huge student outcry and basically the class stayed and the professor wasn't replaced. In my final semester, I took 521 with the same professor. This class was even more difficult than 421 and used the 521. We wrote a basic OS for the 68k as our final project. It was an amazing class and I learnt a lot. I talk to new students who are taking classes now. I honestly feel the curriculum has been dumbed down a whole lot. A lot of them don't even know how to use any sort of unix system. When I was going to university we had to do a lot of our labs on the unix servers. Now they only use windows.
Vivin Suresh Paliath
http://vivin.net
I like
...without any specific examples or support to point to of "dumbing down". It mentions a specific case where Java was selected instead of Pascal as the first language, and asserts that it was purely because of "student demand" and implies that pedagogical concerns weren't considered. But the very early arguments I heard when Java was young about it potentially displacing Pascal as a teaching language centered around the fact that it retained the features of Pascal that made it a strong teaching language, while at the same time being industrially useful. Dewar and the author point to no way in which Java is less pedagogically appropriate, only notes that popular texts spend a lot of time discussing libraries rather than the core language (something that was true, even decades ago, of popular books on Pascal—though popular books, of necessity, focussed on particular pascal implementations -- usually Turbo Pascal -- because there was little standardization beyond the core language.
And from the review of the catalogs from a few major universities (Caltech, MIT, Stanford, UC Davis) I did at the time of the thread on the first article, it doesn't seem like either Java (as complained about in the first article) or graphics libraries and other "fun" in place of fundamentals (as complained about in this article) are as universally the focus of CS education, even in the first few classes where one might suspect "making it fun" to retain underclassman that might be insecure in the major and attract those undeclared and wavering that might be trying it out would be factors, if they were considered at all. Without some kind of concrete problem to point to, I'm left suspecting that Dewar was on the losing side of an academic turf war while on the faculty at NYU, and is attempting to extend his perception of that turf war and the effects he expected the other side to have to the whole of modern US academia.
While I do agree that teaching the fundamentals are important for a CS education, I think people put too much emphasis on the actual language that is taught. Is it important to know about sorting algorithms, pointers, memory allocation? Of course it is. Is it important to actually write programs that use those principles? Again, of course. But is it important to spend all night dealing with memory allocation issues in an interface design class or artificial intelligence? No, probably not. Just like in industry, schools need to use the languages that make the most sense for the topic being taught. That might be java in some caes, C in others, perl, python, etc. To get my CS degree, I had classes that used Lisp, C, C++, Java, and even Perl. I think that makes me a much more flexible programmer than someone who only used one of the "hard core" languages.
What really needs to be taught in college is how to design and write maintainable code. When I got out of school I was so used to the "one week and then forget" projects that I really didn't know how to write programms that would need to change and be refactored over time. I didn't know how to get reqirements from customers and what questions to ask to make sure I was building the program correctly. IMHO, those are the skills that need to be taught in school over learning the particulars of a specific language since languages will morph and change over time. Foundations will remain the same.
"Oh dear, she's stuck in an infinite loop and he's an idiot" -Prof. Farnsworth (Futurama)
There are still universities that are not dumbing down their curriculums. Carnegie Mellon is one of those. As a former CS technical recruiter for a large organization, there are definitely differences in degree programs. We generally got excellent folks from the top CS programs (MIT, CMU, Stanford, U of Illinois, etc.) However, there were several where we needed to be careful and many others we wouldn't even consider hiring from. In general, a degree in IT/CIS is useless whereas a nice theory-based (and math-based) CS degree is very useful.
Regardless of where folks came from, I did notice a major shift in preparedness to enter the workforce across disciplines and schools. Kids were spoiled and are shocked to find that the real world "suffers" from some novel concepts:
1. You won't always win. This isn't T-Ball.
2. There are people who are smarter, having more impact, and who can apply their skills better. ALWAYS.
3. You will fail. Get over it. Learn and move on. It's not the time for a melt down.
And a really major issue is emotional stability. I can't imagine how some folks got through school. It's a tough world, and you need to be tough enough to take rejection, disappointment, failure and outright people being mean and selfish. I've seen people cry at design meetings where their designs were being critiqued. And this was in a group that was being particularly nice, IMHO. Think emotional intelligence. Oddly, I found folks with electrical and computer engineering to be more emotionally mature for some reason vs. pure CS. (And don't even get me started on IT/CIS degrees.)
To the point of the article, I think Java is an excellent language that has made me much more productive as a developer. However, I know how the data structures work and the low level implementations. I've had many classes in low-level database development. I spent my summers in high school in 6502 assembly. I can see how using a high level language first doesn't encourage you to really understand computer science. To that end, I think people should be taught in C and have to do assembly. In fact, I had to do both assembly, C, LISP & Scheme, Prolog, SML, C++ and other languages just to get a degree. This was very valuable. That and implement part of a CPU in Verilog. All very helpful. Theory comes first, then we abstract some of the lower level things away. Now that you know how a hash table works, welcome to Java or STL or whatever.
I do agree that dumbed down curriculums are producing a bunch of nearly irrelevant "graduates." But, look that most universities have to work with. High Schools are so dumbed down as it is, what are you going to do? My HS I had to take 4 years of science, 4 years of math, 4 years of English, 4 years of history, and 2 years of a language. How can you even think about pursuing a technical degree without trigonometry (to say nothing of pre-calculus) in high school?
So, while university curriculums are being dumbed down, the real problem is the primary education. I know many teachers and they constantly complain about meetings with parents who try to argue their kid's grade up. (My aunt quit because of it.) "This will prevent them from getting into XXX University." Well, you know when tests are coming, how about trying to study? Cut back on the 100 sports/music/art classes. Can't do the academic work? Well maybe MIT shouldn't be your first choice.
However, these trends are cyclic. We'll get some dumbed down and eventually people will be outraged (think 50 years ago with Sputnik and the mass panic over our science and math education.) But, we in the US can't plan ahead, so we'll just keep going until we are so wasted and far behind, we'll then spend tons of money getting caught up.
I don't know, but it works for me.
I suggest Universities focus on problem solving instead. For some tasks, I can complete them in Ruby or Perl. For some other tasks, I need C or assembly. What is most important is teaching the student to decide what tools to use to solve a problem.
Provide the student a problem and suggest tools to solve the problem. Let the students work cooperatively. And then review the results. This approach makes the most sense and is more applicable post graduation.
While getting in the discussion way too late I'd like to share my thoughts on this subject. When I was in university besides my job, part of the cource was Java programming. I've looked through the materials for the next years and while it did touch some topics that were more in dept, a lot was not. The main problem I noticed that it was tuned a lot towards 'fun' applications. Build a nice GUI, perhaps connect it to a database and make some code to make that work. Perhaps catch some common exceptions, but that's it. At the same time, I was making a Perl application at work to convert a flat file with records from system A with financial information into an other flat file for system B(not exactly rocket science). The main difference between the applications from my cources and my work? The application at my work has 75-80% of it's code dedicated to error handling while the applications for my cource would at best have 10% dedicated to that. And most would have been the 'required' try{} catch (Exception e){} ones. It did not matter what caused the error, as long as it was covered. For the business application, we tried to think about every possible situation that could go wrong. Each field in the record from system A (input) is checked if it matches the expected format when entering the program (some are human input) and each field in the record for system B (output) is checked if it matches the expeced format. In between, every translation or conversion is checked to be correct. Each error leads to a specific message where the error occured an what caused it. Each faulty record is fully processed and then rejected specifying all errors. This is something people probably never learn in Java classes. And many would not consider this fun. However, this is what programming in a business situation is or should be about. Making sure an application does only what it is supposed to do, nothing more, nothing less. And when something goes wrong, give a clear indication what went wrong. The best way to teach that? Probably make people curious on how things work. Stop teaching a specific programming language and let them solve a problem in natural language. Make several solutions part of a bigger problem. Solve that. And after that let the students translate the found solution to a programming language. Could be Java, C(++), Ada, Perl. Let them stuggle learning the language habits. Make learning the syntax part of the 'problem solving' proces.
If you make people think they're thinking, they'll love you; But if you really make them think, they'll hate you. -- Don Marquis
I find a strong correlation between music and programming. A good musician must know instrumental technique as well as music theory, must be able to execute that theory on an instrument, use an instrument to explore the theory.
Techne the episteme, and episteme the techne.
In this model, a programming language is like a style of music, and I cannot imagine being limited to just one style of music!
And of course some styles are more "basic," lower-level if you will. How to understand classical styles unless you know the chamber and folk styles from which they came?
For this reason I have figured out that using a real classic language like Pascal to begin with is probably the best thing you can do. And I mean classic Pascal, not Delphi or anything remotely object-oriented. This is very similar to programming in assembly on a processor without interrupt handling. You have to decide yourself where to branch off and what to do. Basic will do almost as well.
Next step is to increase the difficulty by introducing C. This will introduce a new set of problems where pointers has to be managed in a correct way. (OK, you can do pointers in Pascal too, but it's really awkward). If you do it on a machine without any memory protection at all you can end up almost anywhere in space and not knowing why, so doing it on a machine with memory protection is a lot better since the program usually dies where the error is (not always). Add some Assembly language programming into this segment and see how it integrates with C.
Some may argue that C++ is the next logical step - but it is NOT. Not only is the syntax different from C, it is a different kind of animal that can create a really tiresome situation. The language is not really consistent but varies somewhat from platform to platform and the runtime library packages are varying wildly. OK, you may use this language, but it's not really consistent enough and can be written very cryptic. (OK, you can write cryptic in C too). The next logical step is instead Java or Ada. For practical reasons Java is the better alternative.
So Java is a better alternative - but why? Well - it is more wide-spread than Ada, and is supported on a variety of platforms. And it is also possible to execute on different platforms without recompiling. It is relatively simple to create an usable application in Java, and it's relatively like C so anybody familiar with C will have a flying start. The big issue is to think object-oriented instead. An alternative to Java is C# (As I usually call it C-Hash) but I argue against it - it's bound to the Microsoft platforms and to the platforms where Mono is ported. Another issue to select Java is that there is a good support for it in development tools like Eclipse. Licensing costs is also a factor to consider - especially during education. And don't forget that many enterprise-sized projects actually use Java.
Of course - you have a different set of languages too that's worth learning. Lisp is mentioned, and it may have some uses, but I would also recommend that Erlang is used in education. The important issue here is that Erlang is used commercially which means that the probability of getting involved in a project where Erlang is used probably is higher than a project for Lisp or Prolog.
For those that wants to get their fingers really dirty there are still a few languages left like classic Basic and Cobol. Here Cobol may be useful to know, but Basic is actually used in several systems too, especially some embedded systems and control systems. The advantage here is that Basic is relatively "safe" when it comes to wild pointers and things, but it's still possible to do I/O in an easy manner.
And still - some may argue that why classic Basic and not Visual Basic? Well - VB is better replaced with C# if it comes to that. The reason is that in classic Basic you have a relatively limited set of data types and you can keep them all in your head and it's relatively easy to figure out what's happening, but in VB there is no requirement at all to declare variables unless you say that you want it required. This means that you can get strange effects of conflicting data types and all kinds of evil effects. So PLEASE do us all a favor and skip VB and it's sub-variant VBScript.
A language slightly better than VBScript is JavaScript, however it's not really a good language due to it's weak data typing. The good thing about it is that it's more widely supported than
If builders built buildings the way programmers wrote programs, then the first woodpecker would destroy civilization.
java is a bloat of 80MB of compressed brainfucked C++ code. And you cannot even compile it with open source tools and there are critical components which are *NOT* open source (mainly crypto stuff).
This is open source vendor collective lock-in since only the sun collective has the inertia with proper resources to maintain it.
To build a real community with proper inertia on java code (where people are more important than a company collective like the Linux one) is unreasonable on such bloat.
Better allocate resources on real important pieces of software like the build tool chain, the kernel and critical libs... than on a giga-bloat built *on top* of those already hard to maintain corner stone pieces of software.
Better learn python/perl/ruby/lua which combined with C/C++ are much much more powerful
I have came to the conclusion that the modern academia, including universities and non-open-access journals, but also the wider education community (including high school etc) is not what it ought to be. In many ways I see modern universities as echoes of the old guilds and monasteries. They evolved through them, but unfortunately the academic community has failed to get rid of many of the social outlooks and conventions of the dark age.
For me the only solution is to make it free, in the open-source way. Wikipedia opened the way for a better encyclopedia. Open access journals and some future free academic community will soon do the same for academic research and education. I am actually trying to bootstrap such a community, if you search a bit you can find it. Wikimedia also has a similar project.
To me, it doesn't look like he was saying that C++ should be taught instead of Java, it seems to me he was saying he opposed teaching Java as a first language. He also believed that no language should be taught as an ``only'' language, and points out that many schools do that nowadays with Java. And actually he seemed to favor teaching C as a first language, rather than C++.
He never says there's anything wrong with Java as language teaching Java, he just prefers programming to be taught first from a lower level language like C. In C style programming, memory addressing is generally handled quite differently than from within Java, for example, I don't I've ever heard the phrase ``pointer arithmetic'' associated with standard Java programming. If there's some way to do that, it's still not typical and would probably get students into unusual Java programming practices to get them to think that way in Java instead of just using C which is made for it.
As for low level programming being appropriate for only system level coding, I think that precludes what an understanding of what low level programming is good for. No less than Donald Knuth has discussed the importance of understanding things at a lower lever in order for a programmer to avoid writing what he calls ``weird code''. By that, I'm only guessing that he means a programmer could develop a disregard for what's happening with the machine and write needlessly inefficient code. He even developed his own pseudo assembler for presenting his algorithms. This doesn't mean he doesn't believe in thinking and programming at a higher level in a higher level programming language, it just means he believes that some understanding of what's going on with the machinery is beneficial to a programmer's coding.
Then there's the idea of Java and C++ being essentially the same language. I just can't see it that way. To me there's an important difference between the simpler single inheritance model of Java and the more complicated multiple inheritance model of C++. I know you can force your code between the two to look the same, but I think your code will be much more readable and maintainable if you try to find an approach more appropriate to the language. I learned that back when starting as programmer I tried make C code look like Pascal code, and C and Pascal are a lot closer to each other than C++ and Java.
This isn't a matter of which language, it's a matter or concepts, foundational knowledge, a bag of tricks. The simple truth of the matter is those who learned in C think it's the only way to really grasp the concepts. Those who learned in Java or any other language for that matter will think their language is an excellent vehicle to grasp the concepts. Anecdotally, all our tests were paper based so if you couldn't write a Linked List on paper there was no way you were going to write one in any language. And as the article mentioned, it was not explicitly Java's fault for this but rather the fact that universities are continually reducing the number of courses focused around core concepts.
Computer Science is a science degree. If you want to be a code monkey go to ITT.
Nihilism means nothing to the dancing peasants
The part of the article that mentioned JAVA is used to entice students to try CS. So the problem isn't really JAVA but it's JAVA-AS-THE-ENDPOINT.
I think colleges and even high schools should offer MORE teaser programs to expose students to as wide a variety of (for lack of a better term) career choices as possible. If said colleges want to make such programs as fun as possible they should also offer better guidance counseling so that someone will tell these kids what they're really in for if they adopt X as a career choice.
Oh, goodie, the creator of SPITBOL, the Realia COBOL compiler, and GNU Ada speaks about rigorous CS education!
In my school of Computer Sciences, which is part of the Natural Sciences Dept, along with Math, there was not a computer language course. We studied algorithms, Grammars, and set theory and and in the 2nd year were thrown to the lions ( EE School ) to learn Logic Design. The language used for our assignments was secondary. It was our job to learn the bells and whistles of whatever language it was used in the given class and concentrate in the ACTUAL assignment (a scheduler, device driver, a data base). At some point, we even made us program a virtual Motorola processor. We were doing VMWare! It was done in C. The point was for us to understand the complex human-logic and machine-logic dichotomy. In the last year we had a class that pitched programming languages against each other (compare/contrast) and we dove into functional programming(Haskell). Now, the question is whether or not Java has a place in the classroom to teach computer science, well, you don't teach English composition by learning how to use Microsoft Word, right? Java is just a tool and it won't teach how to implement an algorithm/interface/state machine. That being said, I know contractors that are so good with their tools and they have been building houses for so many years, they can actually design and build a house from scratch. They though would be the first to admit they can't build a suspension bridge. For that you have to go to school.
- these are not the droids you are looking for -
That's just stepping through with a few watches :). I think the original poster was pointing out that after a first programming course, most students don't know how to debug (find the problem and fix it). I don't think it is a problem with teaching, it is just that learning to program takes time.
My introductory courses were taught in Java... almost 10 years ago. Java has proven itself beyond a flash in the pan, despite many significant failures (AWT or EJB 1.0, anyone?). I would propose this would qualify Java as a language to be respected, if for no other reason than A LOT of useful work has been accomplished with this pointer-less, self-garbage-collecting, virtual-machine-using, heathen half-breed of a tool.
People can go to school and jump through the hoops while learning very little. Other people take there time and really work to understand the material instead of regurgitating it on tests or by writing a program. This is a problem with education because educators hope that everyone will walk out with the deep understanding of the material, when the reality is that few people really understand it to that level. However, the majority of the people do walk away with some type of understand or have learning to reproduce something that they could not do before making them believe they know more then they do. Or worse, they realize that they don't need to understand it, and believe that they are very smart by not wasting the time to learn it.
Example: Most home work is learning to do problem A using steps x, y, and z. You notice that problem B is similar to problem A hence you use steps x, y, and z to solve it.
You don't need an in-depth understand to do the steps, but this is what educations hope to provide. However, to change the system so that you get an in-depth knowledge might require you to figure out steps x, y, and z on your own. But this would be very time consuming and I don't see an easy way to do this. On top of this, businesses don't value that type of thinking, unless you're into research, so there is no real push to do thing differently. Hense the system that we have for education.
Any ways, this is my 2 cents.
My observation is that those who 'get it' are able to think in layers and can create a mental model regardless if the subject is SPARC assembly, Solaris administration (the CS departments use Sun servers that are segmented from the Windows servers network that the school database system is on), or Data Structures. I think that you have to be able to abstract layer from layer to understand anything in CS, regardless of your area of concentration.
I use Java - I don't hate it and I certainly don't love it. It's not as near and dear to me as C++, but it's probably a bit more warm and fuzzy than straight C. I could list as many things about Java that I don't like as things that I do like. But I think that Java gets a bad rap because it assumes that you understand how its layered. It assumes that you understand layered interfacing and layered OO (inheritance). It is designed with this implicit structure. However, it's also a very forgiving language in that it'll let you use the library as you'd like (unless you think it'll be forgiving of an implicit cast... but that's fixed w/ autoboxing), and it doesn't slap you for doing things that you should know not to do. Rather, the problem comes in for those who don't know what it's doing under the hood while they are expected to know.
Last semester I had a bug in my code when moving my framework to a GUI. It worked fine from a CLI, just the way I wanted, but moving to a GUI I didn't think about how my objects would now have a second reference and wouldn't be GC'ed. It took me all of 5 minutes to realize this, but took AP C++ in high school (I took the last exam before they moved it to Java). For a student just starting with Java, knowing nothing of pointers or GC, I suspect that they'd ultimately have to take their broken code to someone with more experience. Without a proper background, a student can very well create a Java program, albeit usually without any hint of OO design, so long as said program doesn't depart from their own layer(s).
But for those of us who understand the concepts, Java.util.concurrent is an awesome library. If you're into concurrency, I also generally really enjoying using recursion, so YMMV. Why in the world would we write our own spinlocks and IPC when we have the concurrency package and notify() built in to the master object?! But, then we find that Swing isn't thread safe (I've found it's fine as long as you don't do anything that's just generally stupid), and now we're watching our code on two layers. I fear for anyone multi-threading swing who doesn't understand layering, the abstraction that Java appears to have has just been yanked out from under them. If you further tell them that their success will vary at home on a single core machine as compared to a multi-socket Sun box, you've just added a hardware layer that they might not have considered, and perhaps a JIT layer on top of that hardware layer. Then if you go and tell them that on that Sun box, they may or may not have problems due to cache coherency, you've just added a memory issue which Java has hidden from them. However, the toolbox still has more than enough heavy lifting tools that they could very easily drop on their own toes.
Other languages don't give them option to fake their way through; if you don't understand memory management in C, you'll make it as far as stru
If I mod you up, it doesn't necessarily mean I agree with what you've said, sorry.
In conclusion, I think Java is a language designed to solve many problems that programmers have traditionally faced. However, the abstractions that it makes take away from the foundation that a beginning programmer should have to build upon. It should be easy for any programmer with good fundamentals to pick up Java on their own, if they so choose.
*I'm also rather amused at the numerous suggestions to teach scheme that have been posted on an article about the harm of teaching languages with heavy abstraction.*
Poor guy said that Ada matters. I've had the misfortune to have had to develop some large systems in Ada. It's like a nightmare in which a QA person with some software engineering background decided to impose a language on the rest of us. Structured-programming hell, with lots of rigid structure in all the wrong places. IDE, build system, runtime, language, all in one: bad idea.
Government agencies tried hard to push Ada in the 80's but fortunately, it choked on the sleeves of its own straitjacket. When I consider frameworks now, one thing I look for is real modularity, not a monolith. If I can't swap out a component, it's not a useful framework. Ada completely failed in that regard. It was Ada's way or the highway.
Not that Java is devoid of faults. I've run into plenty of Java programmers who, in the day, would have been happily coding in COBOL. Baaaaah. But that's part of what Java was for: an OO-ish language for the boneheads who couldn't be trusted with something more powerful. Hence the strong typing, lack of pointers, built-in garbage collection, and absence of multiple inheritance. Having said that, I'd rather get a crew to code up a corporate IT app in Java than, say, C++. In fact there are few large problem domains where C++ would be on my list at all. And there are none where Ada would be an option, unless I needed a strawman solution alternative to eliminate from a shortlist.
Get your teeth into a small slice: the cake of liberty
I think the problem is more on the material taught at colleges rather than the language itself. Java programmers should learn resource management, because the language demands it. But they shouldn't have to deal with the ugly bits of C, because those bits are not about resource management but specific C problems.
Being a hiring manager, I have been looking at the course work that many of the new grads have been doing during there time at university. I agree with the author that the course work in general is becoming dumbed down. I feel that there is a certain "abstraction" away from understanding how the under pinnings of software work. For example, the students in many universities are taught how to use software programs like mathlab to figure out problems rather than building software in order to learn. Also students I know use VHDL simulators rather than building actual simulators.
I have to completely agree with the author, but I take a more ground up approach to the entire problem.
From a very young age, I picked up, as my first language, basic by reading a book I found on a bookshelf at school. It had been untouched for years as nobody had an interest in it but me, and the title appealed to me. The book was a very basic introduction to the language and showed how it could be used to write simple textual input/output games. After completing it, I wanted more so I found my father's copy of visual basic 3 and proceeded to teach myself how to write applications in that.
After a few months of playing with it, it got to the point at which I felt I had no real control over the computer and often was left wondering how people wrote software I commonly used, as I perceived it to be an impossible task in such a language as VB. So in light, I picked up C and read a book called "C by dissection." Soon thereafter, I learned C++ and was given a copy of Microsoft Visual Studio 6 by my was-then uncle. But still, though I could do much more in C, I felt that I still did not really understand what was happening as a result of the code I was typing. At this point, I started reading about assembly and purchased an assembly book to learn it. After a while, it explained so much in the way of what was happening on the machine at the lowest level and why things such as pointers in C and C++ are so useful (and relevant). From there, research into how compilers generated assembly and how operating systems used special features of processors to carry out their necessary operations gave a completely new insight into computing.
From the approach, I found that I preferred starting with assembly and moving up to a language like C, then to C++ for object oriented programming. When in highschool I was first introduced to Java, I found its syntax to be very similar to C++ with which I was very experienced, and thus it was easy to pick up and use. I found the dizzying array of redundant packages that Java provided to perform such simple and mundane tasks for the programmer to be confusing. It made it almost "too easy" or "too stupid" to just google a problem with 'java' attached to it and out comes the name of a class which will perform the desired operation, turning what was to be originally called "computer science" or even what we were doing, "programming", into a game of fetch-and-copy style of piecing together a working program. I found it insulting to me and to everyone who has studied and written software with a strong understanding of what he/she was doing. I had to often times explain things that were not easily doable with an existing class to my classmates for the simple fact that this introductory "computer science" course did not cover underlying principles in computing, rather it delved right into using classes, types, flow control, conditional expressions, and functions, the implementation of which were completely lost on the student.
In no means am I trying to say that people who prefer Java as a normal programming language are inept, rather I simply dislike it due to how easy it makes to write software by giving, as the author stated, the programmer a big barn shed full of tools with which he/she can use to perform an operation with no real understanding of the theory of software development or programming. I do see Java as a useful tool when I need to write quickly a cross-platform utility, and some of its packages useful as writing them in C or C++ would be extremely time consuming, but without a fundamental understanding of how things work and are carried out on the host machine, the true beauty of what is being done is completely lost. It just appears to me that what is happening now is a huge army of mindless drones capable of writing software instead of a core set of people who excel in using and manipulating computers regardless of what language in which they're asked to do so and without concern for what machine the development is to be on.