Slashdot Mirror


Professors Slam Java As "Damaging" To Students

jfmiller call to our attention two professors emeritus of computer science at New York University who have penned an article titled Computer Science Education: Where Are the Software Engineers of Tomorrow? in which they berate their university, and others, for not teaching solid languages like C, C++, Lisp, and ADA. The submitter wonders whether any CS students or professors would care to respond. Quoting the article: "The resulting set of skills [from today's educational practices] is insufficient for today's software industry (in particular for safety and security purposes) and, unfortunately, matches well what the outsourcing industry can offer. We are training easily replaceable professionals... Java programming courses did not prepare our students for the first course in systems, much less for more advanced ones. Students found it hard to write programs that did not have a graphic interface, had no feeling for the relationship between the source program and what the hardware would actually do, and (most damaging) did not understand the semantics of pointers at all, which made the use of C in systems programming very challenging."

174 of 1,267 comments (clear)

  1. tasty by User+956 · · Score: 5, Funny

    Professors Slam Java As "Damaging" To Students

    I dunno about you, but java was nothing but helpful to me as a student. the drinkable kind, at least.

    --
    The theory of relativity doesn't work right in Arkansas.
    1. Re:tasty by Pvt_Ryan · · Score: 5, Interesting

      I have to agree with the article. At Uni I was taught java much to my detriment and annoyance (I had taught myself VB6 prior to going to uni so wasnt a newbie to programming).

      I find I am now having to teach myself C++, and am struggling in a lot of areas that had I been taught in Uni I would be a lot more confident in.

    2. Re:tasty by Daengbo · · Score: 2, Interesting

      I don't understand ... what happened to the weeder courses that the CS majors went through when I was in Uni in the 80s? Hell, they tested you with stuff much lower level than C (IIRC, C wasn't even standardized back then). I mean, try doing really complicated stuff in assembly, and you figure out really fast who can think like a programmer and who can't. I never would have passed the weeder courses, but I knew it and went for S.E. instead of C.S.

      I don't know a lot about programming as a profession, but teh article feels on target to me.

    3. Re:tasty by khellendros1984 · · Score: 2, Interesting

      As a newly graduated CS student, the most I've had to do in assembly was "Read in a list of numbers, terminated with boundary value x, then sort using bubble sort".

      In the upper division courses, we generally have our choice of languages. I've been alternating between C++ and Python (except for the rare professor that actually requires Java).

      --
      It is pitch black. You are likely to be eaten by a grue.
    4. Re:tasty by StarvingSE · · Score: 5, Informative

      I think there needs to be a distinction between learning concepts and the tools you use to learn them. I graduated from uni within the past 5 years, and they taught first year CS students in Java. They used these languages to teach data structure (ie stacks, dictionaries, etc) and some simple algorithms like sorting. At the same time, they taught us proper object oriented skills since that is what the industry is demanding.

      During the second year we took a class that taught C/C++ which basically taught pointers and memory management. In my upper level courses like operating systems and graphics, it was all C and C++ from then on. I think this gave me a pretty well rounded education.

      When I was done, I had used a number of tools (languages) to learn a variety of CS topics, and felt that I was well prepared for the industry.

      --
      I got nothin'
    5. Re:tasty by Anonymous Coward · · Score: 5, Insightful

      I've been alternating between C++ and Python

      Do more. Try doing your homework in haskell or lisp or hell, write in forth or postscript. It's a billion times easier to learn a language when you have someone else telling you what to do in it, and a billionth of the stress when your paycheck doesn't depend on it working.

      I've wanted to learn ruby and rails for a while now, but I've got nothing to do with it at home, and like hell I'm going to show up at work and replace a production app with ruby for the hell of it, even though we've got a number of internal web apps that are basically exactly the kind of CRUD RoR was designed for.

    6. Re:tasty by TurboTimmy · · Score: 3, Funny

      I don't know a lot about programming as a profession, but teh article feels on target to me. I don't know a lot about comedy, but this feels like a pointer joke to me.
    7. Re:tasty by computational+super · · Score: 4, Funny
      doing your homework in haskell or lisp or hell

      Hell? Maybe you meant Perl?

      --
      Proud neuron in the Slashdot hivemind since 2002.
    8. Re:tasty by SQLGuru · · Score: 4, Insightful

      My biggest gripe with my college experience (graduated 1994 - BS in CS) was that even though they were teaching the "solid" languages, they still didn't really teach me what I needed to know in order to do the job I do today (DB App development). Sure, things like Algorithms and Data Structures had some low level fundamental use, but they didn't teach me how to develop a SYSTEM.....most of my "projects" were simple "take some input - produce some output" programs.

      Most of my professors had no real world experience, either. So, teaching things like team dynamics and working within a project schedule were really beyond their expertise. Granted, I've been quite successful, but I attribute most of that to my abilities, not what I learned in college. College just got me a piece of paper that opened the door.

      I don't think the problem is with the languages being taught, but in the lack of true engineering being taught. This is true of any of the programming related fields (CS, MIS, SE). All of them need these skills.

      Layne

    9. Re:tasty by pyite · · Score: 4, Insightful

      So, teaching things like team dynamics and working within a project schedule were really beyond their expertise.

      And also beyond the scope of computer science. If that's what you wanted, you should have specialized in software engineering. People keep forgetting that computer science classes should feel more like math classes than engineering or management classes. One look at TAoCP would hint at that. For the record, I'm an engineer and I find the pseudo-engineering that most CS programs push out to be highly disturbing. Either do it right and call it software engineering, or remove the non-CS stuff and call it computer science. If you're not gonna do either aggressively, give it a fake major name like "Information Technology" or "Management of Information Systems" and teach a bunch of stuff really poorly.

      --

      "Nature doesn't care how smart you are. You can still be wrong." - Richard Feynman

    10. Re:tasty by mhall119 · · Score: 2, Interesting

      It sounds like for you, and the professors in the article, the problem is not that teaching Java is bad, it's that teaching _only_ Java is bad. This absolutely makes sense, and is in no way a "slam" on Java, as the /. headline suggests. Teaching _only_ assembly, or _only_ C, or _only_ Lisp would be equally bad. They make several cases about why Java is a bad choice for a first language, but that is mainly because it makes hard things easy, but you can still teach students most of those hard things in Java. I agree that they need to teach more languages, I wish I had been taught more languages while I was in school.

      I taught myself Perl first (talk about a bad first language), then learned a bit of VB and C/C++ (not enough) at a community college, was taught mostly Java at university, then taught myself PHP at work, am now working on C#, and have a Python project already set as my next language.

      --
      http://www.mhall119.com
    11. Re:tasty by Anonymous Coward · · Score: 3, Interesting

      I have to say, the idea that you can not only graduate from college but consider yourself to have received a "well rounded education" while having learned nothing but ALGOL-syntax C-derived languages is quite sad. During my CS degree, I learned C, C++, MATLAB, Java, Lisp, ML, Prolog, and a made-up language we wrote a compiler for, and I feel a bit deprived at not having done more. In my opinion, the idea that only languages which look like C are significant or worth learning is one of the more damaging things floating around CS today.

    12. Re:tasty by StarvingSE · · Score: 4, Interesting

      The way I see it, a university education is supposed to teach you theory and provide a "well rounded education." It irritates me when I hear the classic "why do I have to take social science/english/art, I came here to learn how to program."

      Computer science is theory and math. Computers and langauges are the tools used to explore these concepts. The specific languages you learn in the university doesn't really matter; anyone with a CS degree and half a brain can pick up new languages within a very short amount of time.

      I think it would be a very bad move for universities to cater to the corporate world. If you want to just learn programming, get some certs or buy a book. If you want an education, go to the university.

      --
      I got nothin'
    13. Re:tasty by Kadin2048 · · Score: 4, Insightful

      I'd offer only one correction:
      anyone with a CS degree and half a brain should be able to pick up new languages within a very short amount of time.

      There are unfortunately a great many universities turning out a great many low-quality "computer science" grads who don't know the first thing about programming, much less the intricacies of stacks and pointers in C. I've met some alleged CS grads who didn't know a compiler from a hole in the ground.

      I think the problem may be improving from how it was a few years back (the dot-com bust knocked CS off the lists of many students just looking for an easy $80k paycheck on graduation), but there are still a lot of dolts around, devaluing the degree.

      --
      "Ladies and gentlemen, my killbot features Lotus Notes and a machine gun. It is the finest available."
    14. Re:tasty by cayenne8 · · Score: 4, Insightful
      "I think it would be a very bad move for universities to cater to the corporate world. If you want to just learn programming, get some certs or buy a book. If you want an education, go to the university."

      But, the whole reason to GO to a University, is to get the skills/education to make more money when finished, than you would have if you had not gone.

      College is a means to an end....and while it is nice to learn other things to be a bit well rounded, that is extra fluff if you have the time and money for it while there, but, don't forget the real reason for going.

      If people could make good $$ without college, I doubt you'd see so many people trying to go....

      A degree gets you in the door for a job....regardless of what it is in often...you have to have one these days to get a good job.

      --
      Light travels faster than sound. This is why some people appear bright until you hear them speak.........
    15. Re:tasty by CaptainPinko · · Score: 5, Insightful

      Sorry, but universities are meant for education not job training. The fact that jobs are the reason main people go is sadly just another sign of the times. If you look at the long history of universities you'd realise that they have focused on research and the arts. Even the sciences were so abstract that they've didn't have a use for it at the time and for many years to come. Please, lets stop perverting universities for the industry. If universities don't produce well-rounded educated people where will they come frmo?

      --
      Your CPU is not doing anything else, at least do something.
    16. Re:tasty by Stamen · · Score: 4, Insightful

      Sad commentary; unfortunately you are correct, this is the view of many people.

      I think anyone who is spending 4 to 6 years getting an a degree in computer science only to get a high paying job when then get out, are a tad silly. They are really, really wasting their time. They can get an intern job right now, at a software consulting company, study their ass off (as we all have to do in this field). Within a year they will be making decent money, within 3 years making really good money. 4 years later when the person has their shiny degree, after studying Java (which probably wont' even be used then), they get the joy of getting a junior developers job.

      There is an old adage: "How do you become a writer?" "Write... a lot". This is the same with programming. You can't fake your skills, and a PHD in CS won't matter if you can't bill your clients because your application doesn't fulfill requirements or even work.

      Truthfully if all you care about is money, work in finance, or become a salesperson. The best developer in the world won't compete with a high end salesperson dollar for dollar; hell CEOs can't compete with top salespeople. Zero education required.

      I very much value a university education, but it has nothing to do with making more money. Learn, create, become a very educated person; the money will follow; the money part really isn't that hard.

    17. Re:tasty by b17bmbr · · Score: 2, Interesting

      Please, lets stop perverting universities for the industry
      I used to teach the AP comp sci class at my high school, but it's been dropped due to lack of interest. If you think industry has skewed what the universities are doing, you ought to see how the unis have skewed what we are doing. My school boasts that we have something like 80-90% of students graduating with A-G (A-G is the list of requirements to go to a UC or CSU, California public universities) complete. We send like 25% of our graduating seniors to a 4 year yet prepare almost all of them? This basically ensures that foreign language, which is technically an "elective" is a required course. And the list goes on...

      That the unis have become almost vassals to industry mirrors that high schools have become vassals to the unis.
      --
      My problem? I was perfectly gruntled, until some numbnuts came by and dissed me.
    18. Re:tasty by jjn1056 · · Score: 2, Informative

      Yeah, I think the basic OO support that was addd to Perl in version 5 leaves a lot to be desired, since it's extremely minimal and requires a lot of typing boilerplate to do even basic stuff. The thinking was to make the most minimal solution and see what people needed.

      If you are interested in doing real OO, I'd recommend using the Perl OO Framework called 'Moose', which you can install with 'cpan Moose' is you have a reasonably modern Perl (you might need to sudo that command, btw.)

      Moose is a full meta object system with introspection, Roles (sort of like Interfaces on steroids), and a neat syntax. check out the tutorial at:

      http://search.cpan.org/~stevan/Moose-0.33/lib/Moose.pm (which is the lastest version as of this posting)

      There's also a very active IRC channel at irc.perl.org#moose

      If you like Perl but feel envious of languages with more strongly defined OO systems, I really recommend looking at Moose. It's a big step forward for the community and give you one of the nicest and most productive OO systems around.

      --
      Peace, or Not?
    19. Re:tasty by Thomas+M+Hughes · · Score: 5, Insightful

      But, the whole reason to GO to a University, is to get the skills/education to make more money when finished, than you would have if you had not gone.

      College is a means to an end....and while it is nice to learn other things to be a bit well rounded, that is extra fluff if you have the time and money for it while there, but, don't forget the real reason for going.

      If people could make good $$ without college, I doubt you'd see so many people trying to go....

      A degree gets you in the door for a job....regardless of what it is in often...you have to have one these days to get a good job. I want to preface my comments by saying that a lot of people have a similar mindset as you do. It's highly prevalent in the United States at this point. So, it certainly isn't your own personal shortcoming for thinking like this, it's a larger societal problem.

      For a moment, put the reason why YOU go to a University to the side and consider what the purpose of the University is. It's an institution that's literally thousands of years old, dating back to the old Greek institutions of education. When Plato and Aristotle founded their schools, they didn't put up a big sign that said "When you're done, you get more money." That wasn't the promise. The promise was that by teaching you about the world, you would become a better person. That is to say, the founding concept of the University was that education lead to human excellence. And, for the Greeks especially, human excellence was not directly related to the possession of wealth.

      This understanding of education was dominant up until very recently. Everyone was required to learn Greek and Latin, so they could read Homer and Plato. Reading the Homer isn't going to get you a job, it's not going to get you a promotion, it's not going to get you an interview, and it's not going to get you laid this Friday. No one at the University used to make the claim that it would. They'd claim that reading Homer made you a better person, even if it doesn't get you a job.

      Now, as to why YOU should go to a University? If you're going for the purpose of getting a job, you're not going to understand the vast majority of your classes at the University. You're going to be wondering "Why do I have to take this anthropology class?" or "I have no interest in Operating Systems, why do I need this Operating Systems class?" and "Why do I need a foreign language, I'm going to be working with code all day." All these questions miss the larger point of what the University is trying to do to you. And if you're missing the point of the entire institution, it's exceptionally difficult to do well there.

      The whole thing is really just the result of multiple generations of corruption, I think. Employers realized that well-rounded, educated (dare I say, excellent) human beings are better for the health of a company. So they pay more for people who are excellent, and a University degree used to be a short-hand of some form of excellence. The masses of uneducated began to realize this, and started saying to their kids "If you want a good job, you need a degree." So their kids started going to the University, thinking the point was to make money. Professors, having tenure, just did what they were going to do anyway, but now we've gone two or three generations like this. We're reaching the point where current professors went to school thinking it was for money. We have boards of Universities with pressure from the state to focus less on the goal of education for excellence and more on the goal of education for job skills.
    20. Re:tasty by Creepy · · Score: 3, Interesting

      Forth and Postscript are useful for what, learning stack based languages? I learned Forth for one reason - to hack the PPC mac OpenBoot (open firmware), also used on some Solaris and IBM systems. Postscript I mucked with a bit also for hacking (I enjoyed trying to get root in college when I was a bored lab TA). I was much more successful with OpenBoot, as postscript is more geared to page layout and it's harder to do programming type operations.

      Lisp and Scheme I'll lump in "parenthesis hell." I've never seen the allure of list processing languages - they drive me nuts. In the real world, you'll probably never see them even for what it's known best for, AI (python or lua are much more useful these days).

      Haskell I've never used and seems to be stuck in the university wasteland. Ruby and Rails seem more practical, but no more than Python. To be honest, I dislike python because it uses indent significance, the one thing I despised most about Make. I've been meaning to look at Ruby, as well, because I like the Smalltalk object model, but I'm not sure how much I like linebreak significant line endings.

          As abusive as it sounds, languages like COBOL (banking/finance) or Ada (government/military) or even FORTRAN (mech-E) will get you a job faster than Haskell. Or learn RPG and dedicate your life to IBM and Unisys mainframes (*shudder*).

    21. Re:tasty by engwar · · Score: 3, Insightful

      Universities certainly do both educate and prepare people for jobs but I'd guess that the main reason people go to universities is to get a good job and make more money than they would otherwise.

      Let's imagine for a moment that going to a university would have ABSOLUTELY NO IMPACT on the kind of job you get or money you can make and that the ONLY thing anyone could get out of it was to be a more rounded and educated person.

      Do you really think that people would pay the kind of money that is required to go to a university if this were the case?

      The vast majority of people go to college to end up with a better job.

    22. Re:tasty by Radres · · Score: 4, Insightful

      I don't think the OP's point was that learning those languages would directly put the student in a better position to get a job after college. I think the point was that learning those languages would help the student to understand more about computer science.

    23. Re:tasty by nobodyman · · Score: 2, Interesting

      But, the whole reason to GO to a University, is to get the skills/education to make more money when finished, than you would have if you had not gone.

      No. The whole reason to go to a university is to learn . Not just learning the subject at hand, but also learning how to learn. That's what seperates a decent school from a training seminar.

      If all you want is more money, go get an IT certification
    24. Re:tasty by bidule · · Score: 2, Funny

      But, the whole reason to GO to a University, is to get the skills/education to make more money when finished, than you would have if you had not gone. What! Heresy! Perversion!

      University is there to teach you how to think, first and foremost. You'll get hired at a higher salary because you're expected to think and not just be a technician. Otherwise a degree is just a piece of paper, nothing more than a multi-year cert.

      It also means that you aim at being more than just a corporate drone. Well at least that's the theory.

      BTW, do you know the difference between theory and practice?
      In theory there's none, but in practice...

      --
      ID: the nose did not occur naturally, how would we wear glasses otherwise? (apologies to Voltaire)
    25. Re:tasty by Zeinfeld · · Score: 4, Interesting
      I used to teach the AP comp sci class at my high school, but it's been dropped due to lack of interest. If you think industry has skewed what the universities are doing, you ought to see how the unis have skewed what we are doing. My school boasts that we have something like 80-90% of students graduating with A-G (A-G is the list of requirements to go to a UC or CSU, California public universities) complete. We send like 25% of our graduating seniors to a 4 year yet prepare almost all of them? This basically ensures that foreign language, which is technically an "elective" is a required course. And the list goes on...

      I think you are missing the mark here, the profs who wrote the original architects are both principals at a company that sells Ada tools. What they are complaining of really is the lack of demand for their stuff. Treating the argument seriously is a mistake.

      I don't think that there was ever a time when Ada was a popular teaching language for any purpose other than coding in Ada. Same goes for COBOL, Fortran and such at this point.

      Nobody would claim that there was a desperate need to teach CPL or BCPL, Pascal, or the like these days. They had their moment, they were found wanting. There are much better teaching languages these days and much better production languages.

      These days I would probably teach either Java or C# as the intro language, depending on which is ahead at the time. I might teach C# to comp sci students simply to force the students to acknowledge the fact that they need to be able to adapt to new languages. Most other cases Java is most likely to be the most useful language.

      The big change that came with Java is that when Java appeared it was the first time that a mainstream language was an acceptable teaching language. Pascal was popular in universities but the architecture was bjorked (arrays of ten elements are not a different type to arrays with eleven). The functional languages had dreadful performance and pawky support libs.

      --
      Looking for an Information Security student project suggestion?
      Try http://dotcrimeManifesto.com/
    26. Re:tasty by StarvingSE · · Score: 3, Interesting

      If people could make good $$ without college, I doubt you'd see so many people trying to go....

      Art majors

      English majors

      Performing arts majors

      I could go on... I don't see how you have a valid point. I am not saying that the above fields are not worthy of pursuing, but people do not get into them for the money.

      --
      I got nothin'
    27. Re:tasty by peterpi · · Score: 2, Funny

      I graduated with a degree in the biological sciences and another in spanish, and now I'm a perl programmer. Go figure.

      So does perl make sense to a Spanish-speaking biologist? It sure as hell doesn't to the rest of us!

    28. Re:tasty by insertwackynamehere · · Score: 2, Interesting

      Tell me about it, everything about high school was about getting into college, since 9th grade. I think that's ridiculous, but as you can see in my other post in this thread I think it's also ridiculous that college is so expensive and then people can say "its for becoming a well rounded person." Yeah, I'm not going to make my parents happy if I graduate a couple hundred grand later and all I have to show for it is that I'm "well rounded." I'm at NYU to learn programming because I love programming and the fact is I want to get a job in programming and I want to increase my skill and have a degree so that I can actually get an interview. Sorry but I'm not going to beat around the bush and say that I never thought about my monetary future when I was decided on college at the end of high school. It's how it is, high school throws people into college which throws people into jobs. Now, dont get me wrong, I like college life and have a bunch of friends and dont sit around acting bitter the whole time, and I also don't mind taking courses outside of programming. It's just that there is the career aspect, like it or not. I just think its ridiculous that I've been under the stress of my future since I was a high school freshman and sometimes it seemed we were just being taught for the test whether it was a final or an SAT.

    29. Re:tasty by emilng · · Score: 2, Insightful

      You're lucky that you don't have to take out a student loan and that your parents are paying for your whole education to NYU no less. It's good that it seems like you have a passion in programming. I wonder if it's really necessary for you to be attending such an overpriced school as NYU though. For an undergrad education I think there are probably state schools or other private schools that can offer you a comparable schooling in learning how to program for a much lower price. I think the only advantage you gain going to NYU for undergrad is having the NYC experience, but working here and having grown up here, I'm getting pretty sick of it. Given the cost of your education you have to figure in the amount of time you will have to work to recoup the cost. You should also calculate the cost with compound interest and inflation. I think a better route would be to do some research and transfer to a cheaper school that offers a comparable education and then dish out the big bucks when you feel like you need to go back to grad school.

  2. University should be about people by Anonymous Coward · · Score: 2, Funny

    I'm concerned about the narrowm view of the world IT people and engineers
    have these days. I think the problem starts at college -
    There's a culture that somehow science is more rational and usefull
    then the humanitities. Lecturers encourage students to joke about arts
    students, and humilaite them whenever possible. This encourages
    eliteism, and I for one am sick of it.

    Let's tell it like it is. 'science' is just as much about opinion as
    the humanities. Research simply follows the fad of the day. Take
    dieticians for example. These men and woman believe that just because
    they have degree in medical science that they are all knowing. Why,
    what they recommend one day may kill you the next! (see the DDT story
    for more information.) Science is 95% opinion then facts, lets face
    it. What about astrology, the most rediculious of the sciences! But I
    degress...

    Another example is music. We know what sounds good. Everyone aggreed
    that Valves for instance sound great. But knowitall engineers use
    trensastors with inferious sound quality just to save a few bucks.
    They argue with numbers. Hey, I don't want to do maths just to listen
    to music. I know what I like. You cannot apply objective reasoning to
    a subject which is intristically subjective. But try telling those
    recent grads with their useless piece of paper that and they go all
    mightier--then-thou.

    The problem with you technical guys are that you are all so eliteist.
    Whilst you want to trun collage into a trade school with yore narrow
    minded views that collage should be a job training centre, humanities
    are focused on making you a well rounded person who is auctually
    interesting to be with, not a boring focuesed geek. Really, it makes
    me so mad when people say "oh, he's doing a humanities degree, that's
    easy". I have to read *3* *books* *a* *week* on average. Not picture
    books either I assue you. It is a lot of work, but the upshot is
    improved grammer and spelling skills that are lacking in the
    technical. As for those that say "you will be working at mcdonalds" ,
    I'm going on to so a PhD in socialolgy where I'll be line for tenure
    where I have a much more rewarding job then beeing a science freak or
    an engineer. Anyways, all I have to do to be a engineer wold be to get
    my MSCE and how hard couyld that be? techincal stuff is simply
    whatever fad the market thinks is hot at the moment, but all great
    things were done by humanities.

    You technical types are far to narrow minded and cynsical. You should
    learn to enjoy life.

    Peace be to god, he transcends all.

    1. Re:University should be about people by Exitar · · Score: 5, Funny

      "I have to read *3* *books* *a* *week* on average. Not picture books either I assue you. It is a lot of work, but the upshot is improved grammer and spelling skills that are lacking in the technical."

      It does not work for you. In your post mispelled:
      narrowm, lets, aggreed, trun collage, auctually, focuesed, assue, grammer, socialolgy, beeing, couyld, cynsical

      Read more...

    2. Re:University should be about people by Anonymous Coward · · Score: 2, Funny

      Did you mean: grammar

      FAIL

    3. Re:University should be about people by linguizic · · Score: 2, Funny

      I studied to become a sociologist, but all those circle jerks made my dick hurt!
      Seriously, sociology is full of shit. It's just an excuse for liberals (of which I am one) to make up reasons why everyone else should be liberal.

      --
      Does this sig remind you of Agatha Christie?
    4. Re:University should be about people by Exitar · · Score: 4, Funny

      Ehm...
      .
      1. English is not my first language.
      2. I'm a techie...
      3. I read only books full of pictures!

  3. software engineering != computer science by gangien · · Score: 5, Insightful

    "A Real Programmer Can Write in Any Language (C, Java, Lisp, Ada)"

    that's true, but again soft engineering/programming is a subset of computer science (maybe, i suppose you could argue they aren't)

    "Computer science is no more about computers than astronomy is about telescopes."
    - Edsger Dijkstra

    1. Re:software engineering != computer science by hedleyroos · · Score: 5, Insightful

      Dijkstra did say that, and if the software world consisted of only theory then we could all get 90% for our efforts and be happy with that.

      In practice systems have to work 100%, and when your graph search algorithm (by Dijkstra naturally) segfaults due to dereferencing a wrong pointer then computer science is very much about computers.

      I'm just worried that too few students these days know assembly and C, which leaves us in a predicament when the current generation of kernel devs retire.

    2. Re:software engineering != computer science by Jackmn · · Score: 3, Insightful

      and if the software world consisted of only theory then we could all get 90% for our efforts and be happy with that.
      University is not occupational training.

      In practice systems have to work 100%, and when your graph search algorithm (by Dijkstra naturally) segfaults due to dereferencing a wrong pointer then computer science is very much about computers.
      Computer science is not computer programming.
    3. Re:software engineering != computer science by bigstrat2003 · · Score: 4, Insightful
      True. Besides, the idea that Java is damaging to students is pure bullshit anyway. If the students are learning the Java way to do things, and nothing else, then they have horrible professors. I learned CS from good profs (well... one good and one bad), and surprise, even though I got my start in Java, I am perfectly capable of doing things in other ways.

      When I took data structures, and we used C++, I didn't have mental convulsions because Java had wrecked up my thinking so much (although I did have mental convulsions cause C++ is incredibly messy to read at a glance), I learned different ways of doing things. So, maybe these professors should look at whoever's teaching these kids so sloppily, not the language.

      --
      "16MB (fuck off, MiB fascists)" - The Mighty Buzzard
    4. Re:software engineering != computer science by timmarhy · · Score: 5, Insightful
      unfortunately he doesn't go far enough into the core of the problem, which is today's universities are mass producing what employers want, rather then the thinkers of tomorrow.

      employers want nothing more then easily replacable drones who come with an easily definable skill set which they can replace when a new buzzword comes along. this is NOT what universities should be pandering to.

      --
      If you mod me down, I will become more powerful than you can imagine....
    5. Re:software engineering != computer science by epine · · Score: 5, Insightful

      Anyone with a true gift to become a kernel dev has probably engaged in flame wars with his/her professors already, regardless of what she/he teaches.

      Pointers aren't rocket science. If you never perform an operation where you haven't first met the operation's preconditions, you never get a pointer error.

      If you aren't rigorously checking preconditions on *every* operation you perform, you're not going to cut it as a kernel dev anyway. Pointers are the least of your problems. Race conditions can become exceptionally hard to reason about. The prudent kernel dev architects the system such that this doesn't transpire. That requires a whole different galaxy of aptitude beyond not leaking pointers.

      When I first learned C in the K&R era, I thought those greybeards were pretty clever. Then I came across strcpy() and I wondered what they were smoking that I wasn't sharing. I thought to myself, their must be some higher level idiom that protects against buffer overflow, because no sane architect would implement such a dangerous function otherwise. Man, was I ever naive.

      More likely, too many of them had learned to program on paper teletypes, and just couldn't bring themselves to face having to type unsafe_strcpy() when they had reason to know it would work safely and efficiently.

      The C language deserves a great deal of shame in this matter of giving many beginning programmers the false impression that any function call should dispense with formal preconditions.

      Interestingly, if you sit down to implement an STL template algorithm manipulating iterators, it proves pretty much impossible to avoid careful consideration of range and validity.

      OTOH, C++ makes it charmingly easy for an object copy routine, such as operator=(self& dst, const self& src) to make a complete hash of managed resources if you fail to affirm dst != src.

      There are plenty of amateur mathematicians who can manipulate complex formulas in amazing ways. The difference with a professional mathematician is that the necessary conditions for each transformation is clearly spelled out.

      A = B ==> A/C = B/C iff C != 0
      A > B ==> C*A > C*B iff C > 0

      Infinite series must converge, etc.

      I'm not even getting into defining A,B,C as fields, groups, rings, monoids, etc. for maximum generality.

      Yet the average programmer feels sullied to exercise the same intellectual caution manipulating pointers. I've never understood that sentiment. My attitude is this: if that's how you feel, get your lazy coding ass out of my interrupt handler; go code a dialog box in some Visual Basic application that won't work right no matter what you do.

      Why did the software industry play out this way? Other professions have much harsher standards. Primarily because software was in an exponential expansion phase, any work was regarded as better than no work (perhaps falsely), and industry couldn't afford to reduce the talent pool by demanding actual talent.

      Now we've allowed many people to enter the profession without comprehending the rigors of preconditions. It's as if we had taught a generation of lawyers how to practice law, but omitted liability. Oops. What to do about it? Invent Java, and tell all these programmers it wasn't their fault in the first place.

      So yes, Java doesn't teach very darn much about the harsh realities of actually thinking. And since thinking is hard, it's an impediment to productivity anyway, so it hasn't much been missed. The only thing we lost in the shuffle is our professional self respect.

    6. Re:software engineering != computer science by cicatrix1 · · Score: 3, Insightful

      Isn't that kind of like saying science is not math? Of course it isn't technically, but computer programming sure is a great way to describe a lot of the theory and put it into practice, and in many ways make it easier to discuss.

      --

      I know more than you drink.
    7. Re:software engineering != computer science by erc · · Score: 5, Insightful

      I thought to myself, their must be some higher level idiom that protects against buffer overflow, because no sane architect would implement such a dangerous function otherwise. Man, was I ever naive.
      Naive about the purpose of C, anyway. C was never designed to prevent you from shooting yourself in the foot. Writing C requires you to think, which is sadly out of vogue these days, as you point out later. C was never designed to protect you from yourself, as explicitly pointed out by Dennis Ritchie many times. If you want a language that will protect you from yourself, program in VB.

      So yes, Java doesn't teach very darn much about the harsh realities of actually thinking.
      But C obviously does - like checking boundary conditions. I don't understand how you can slam C in one breath, then praise it in the next.

      --
      -- Ed Carp, N7EKG erc@pobox.com PGP KeyID: 0x0BD32C9B What I'm up to: http://intuitives.mine.nu
    8. Re:software engineering != computer science by daem0n1x · · Score: 4, Insightful

      It's just the usual senseless Java bashing. It has ZERO to do with Java. If the students are taught VB or C# and nothing else, like it happens in my country today, the problem is the same.

    9. Re:software engineering != computer science by aenikata · · Score: 2, Insightful

      Most teaching adopts the approach that you learn the easy stuff first, and then move onto harder and harder bits. In teaching Java first, and only teaching ones like C++ later, this is taking much the same approach. It seems that the argument is essentially about taking the view that you should learn languages like C++ first to get an understanding of all the lower-level concepts, and to look at libraries later. At uni I studied C++ and Prolog, and Java was reserved for the 3rd year. So I learned a bit about memory allocation and pointers, and now know that I prefer to stay well clear of that - and in fact have been influenced by other academics who suggest that such low-level access to memory is better avoided unless it is necessary. If you need all-out performance, then you may need to do this, but the cost can be obscure crashes, memory leaks, code insecurity, and so on. I also learned about recursion, learning to work with just a single method for iterating through a list. I still use it when it's appropriate (e.g. when parsing trees of data). However, it also taught me a greater appreciation of the value of having more options - for loops, for each especially (again avoiding invalid references). Yes, you can learn to use Java to design a GUI using an IDE, leveraging libraries to achieve most of the 'hard' stuff. And you know what, for most business requirements, this is probably the most productive way to code. Minimal reinventing of the wheel. Maximum leverage of tools to enhance productivity. No, that doesn't give a full appreciation of memory streams, stack vs heap memory issues, hardware I/O, etc. But you're talking about catering for the mainstream. I think the authors are WRONG in saying that a university should be focussed on the academic. The reason people go to university (apart from the social aspects and cheap drink, or dossing around for another few years) is to become more employable, and to earn more. They don't achieve this by learning skills which are in minimal demand in a real world workplace. As a result there should be a balance between the academic aspects and the more employment-friendly ones. Learning to use an IDE and use toolkits also allows the developer to focus on things like the User Interface, something which is often severely overlooked, and relatively incidental to the final design. Rather than criticising teaching a GUI-focussed course, this should be encouraged as part of a complete education, covering essential skills that are often missing from an academic course. I've known a brilliant mathematician and developer who has worked on a number of commercial games, but who took some time to get anywhere because they haven't got the skills in user interface design. Equally, I've know various developers with a shaky grasp of logic and maths, who created a nice GUI and couldn't get the code behind it working right. So yes, there is a place for mathematics and learning the details that require more thinking, because you have to sort the chaff from the wheat. It's a typically academic article - in that it presents the authors particular biases as fact, and one which doesn't necessarily mesh academic utopia with commercial realities sufficiently.

    10. Re:software engineering != computer science by rucs_hack · · Score: 4, Interesting

      Last year I was in the decidedly odd position of having to teach third year CS students (who had primarily used Java), what pointers were, how memory allocation worked, and how to use C.

      That they didn't know C wasn't too surprising. That they didn't have more than a basic grasp of memory management was shocking. They were also completely baffled when it came to not using an IDE to develop software. Makefiles had to be explained several times.

      I've grumbled many times about this concentration on Java, and the resultant lack of detailed understanding about programing, but each time I did so at my university I was disregarded, and someone always trotted out that age old nonsense "not re-inventing the wheel".

      I mean, sure, I see the point, but surely you should have a basic idea of how wheels are made?

    11. Re:software engineering != computer science by James+Youngman · · Score: 5, Insightful

      Anyone with a true gift to become a kernel dev has probably engaged in flame wars with his/her professors already, regardless of what she/he teaches.
      Piffle. You are equating software engineering talent with a propensity to participate in shouting (or its equivalent) matches. Those things are, to say the least, incommensurate.

      If you aren't rigorously checking preconditions on *every* operation you perform, you're not going to cut it as a kernel dev anyway.
      I disagree. Once a precondition has been checked once (on entry to whatever subsystem we're talking about) there is no need to re-check it all the time. Especially if it's an invariant of the algorithm. Sometimes such precondition re-checking gives rise to bugs anyway, since the negative arm of the conditional may contain code with a bug in it (though obviously using an assert macro will prevent that) - error cases get poor test coverage so such bugs may persist for a long time, too.
    12. Re:software engineering != computer science by DerWulf · · Score: 4, Insightful

      They aren't as valid once you've realized that abstraction is the key to tackeling complexity, that how hard somethings is does not equal it worthiness, that a language where even K&R wrote unsafe code is probably not for everyone and that not every architect needs to be a Michelangelo.

      --

      ___
      No power in the 'verse can stop me
    13. Re:software engineering != computer science by jacquesm · · Score: 4, Insightful

      Different languages have different purposes, C has gravitated to a 'niche', system level stuff, situations where performance is more important than security (not everything is connected to the internet, impressions to the contrary). And - surprise - 30 years ago we were living in a different world security wise. The biggest problem with strcpy is not that it is 'inherently unsafe', it is that if you do not do proper input sanitation you can not rely on it.

      This goes for most of the so called 'insecure' functions in C, they only become insecure if you have already messed up in an earlier stage of your code. If you are aware of the limitations of the standard library routines (even the unsafe ones) and you are operating in a 'hostile' environment (and todays internet certainly qualifies as such) then you'll need to take great care to accept only input that matches your assumptions in the code further down, if not you are in trouble. But good programmers will work like that anyway.

      It's perfectly possible to write crappy code in *any* language, not just in C (though, in the words of one old timer programmer 'C is like a racecar, you can cut corners but if you do that too often you'll end on your side).

      To come back to a fairly well thought out piece with an answer like what was written several levels above here is not in any way helping the discussion, it is simply insulting.

    14. Re:software engineering != computer science by cheater512 · · Score: 4, Interesting

      In Australia, universities are spewing out people who can pass a test but cant think in programming terms to save their life.

      I was rolling on the ground laughing when I saw the problems people were having making a simple Sudoku program in C#.
      Once they were done drag/dropping all the UI elements, they all got stuck.

      Mind you your right about they are teaching what they think employers want.
      We didnt get to see a *nix system let alone use one.
      Although that may be because of that rather large donation Microsoft gave.......

    15. Re:software engineering != computer science by jacquesm · · Score: 5, Interesting

      Exactly. C is best thought of as a very powerful assembly preprocessor. I know that sounds harsh but when I look at a chunk of C code I have a pretty good idea of the assembly language the compiler is going to emit. Even with C++ that works to a certain extent.

      With Java and most other 'friendly' languages you have literally no way of knowing what is going on under the hood unless you are prepared to invest a lot more time and effort than is available to the average comp-sci student.

      With C that's as close as a single flag on your compile line and you can study the generated code until you're tired of it.

    16. Re:software engineering != computer science by teh+kurisu · · Score: 2, Insightful

      They were also completely baffled when it came to not using an IDE to develop software. Makefiles had to be explained several times.

      That's a teaching problem, not a Java problem (you can teach badly in any language). If they can't function without an IDE then they've obviously not been taught how to use Ant, or even java and javac come to think of it.

    17. Re:software engineering != computer science by epine · · Score: 4, Insightful
      I don't advocate protecting the programmer from him/herself.

      I do advocate designing primitives as essential to the language as the C string functions to powerfully remind the programmer using those functions of the programmer's logical obligations and support the programmer to reason correctly about those obligations, without having to digest 15 lines of preceding context to see that calloc() provided the implied terminating NUL.

      strlcpy and strlcat - consistent, safe, string copy and concatenation by Todd C. Miller and Theo de Raadt, OpenBSD project

      There are several problems encountered when strncpy() and strncat() are used as safe versions of strcpy() and strcat(). Both functions deal with NUL-termination and the length parameter in different and non-intuitive ways that confuse even experienced programmers. They also provide no easy way to detect when truncation occurs. Finally, strncpy() zero-fills the remainder of the destination string, incurring a performance penalty. Of all these issues, the confusion caused by the length parameters and the related issue of NUL-termination are most important. When we audited the OpenBSD source tree for potential security holes we found rampant misuse of strncpy() and strncat(). While not all of these resulted in exploitable security holes, they made it clear that the rules for using strncpy() and strncat() in safe string operations are widely misunderstood. An Interview with OpenBSD's Marc Espie

      We have had a lot of success explaining the issues and getting a lot of people to switch from strcpy/strcat to strlcpy/strlcat.

      Weirdly enough, the Linux people are about the only major group of people that has constantly stayed deaf to these arguments. The chief opponent to strlcpy in glibc is most certainly Ulrich Drepper, who argues that good programmers don't need strlcpy, since they don't make mistakes while copying strings. This is a very mystifying point of view, since bugtraq daily proves that a lot of Linux and free software programmers are not that bright, and need all the help they can get. The original C strcpy() could just as easily have had the semantics of strlcpy(), with insane_strcpy() provided to copy strings/trash core without a cycle wasted.

      One must recognize that in a solid code base, thinking occurs more often while reading code than writing code. Correctness is not a write-only proposition in any living code base.

      We came to the conclusion that a foolproof alternative to strncpy() and strncat() was needed, primarily to simplify the job of the programmer, but also to make code auditing easier.

      The original C string functions were (and remain) a pedagodic disaster. Most beginning programmers failed to realized how much thinking had been folded into the surrounding context. If they were reading K&R, that thinking existed. If they were reading any code they had at hand, it likely hadn't, by any survey of average C code quality ten years later. With the original string functions, whether this careful thinking existed is not obvious without doing a lot of mental work, and that work has to be repeated *every time* the code is seriously reviewed.

      Worst of all, the strcpy() function seemed to imply "buffer overflow is no great concern, we're not even going to give you a single argument on this very dangerous function to help you avert it". It was a false parsimony to save that extra argument in the default case.

      This isn't at the level of whether the handgun has a safety or not. It's at the level of whether it is possible to chamber a round too large for the barrel. I can point the gun successfully, but I'd greatly prefer it not to detonate in any other direction.

      A more thoughtful C string API would have averted mistakes on the magnitude of chambering bad ammunition, without encumbering the pointy end in the slightest, or failing to endanger the programmer's foot.
    18. Re:software engineering != computer science by trifish · · Score: 2, Informative

      Out of curiosity: how can you check that the size of a memory block pointed to by a pointer in C ?

      The modern secure variants of strcpy() solve it by requiring additional parameters where you pass e.g. sizeof(dest) and sizeof(src).

    19. Re:software engineering != computer science by makomk · · Score: 2, Informative

      Except that's not true anymore with modern optimising compilers, and assuming it is is a good way to shoot yourself in the foot. (Apparently, gcc does some really interesting things sometimes - for example, see this thread and the related lkml thread.)

    20. Re:software engineering != computer science by JavaRob · · Score: 3, Insightful

      unfortunately he doesn't go far enough into the core of the problem, which is today's universities are mass producing what employers want, rather then the thinkers of tomorrow. Is that even true, though? The "drones" are the reason why so many projects fail (because they have no clue about larger risks, and no way to solve difficult problems), which costs those same employers vast amounts of money.

      I code mostly in Java in my professional life, but when I was in school we were forced to diversify, and it was a definite plus.

      The intro course used mostly JavaScript for some reasons (!), but other (even relatively low-level courses) required projects written in C, Schema, and Java. I took an operating systems course where we had to write a project in some kind of mini-assembly language... it's all a bit fuzzy now (I graduated 10 years ago), but I remember it being tough to wrap my head around for a while. And that's a good thing, right?

      I also did a couple of summer-long solo projects that probably taught me more than anything -- just fighting through the problems on my own, learning the hard way about the value of clean code, OO, version control, debugging skills, etc. etc..

      Perhaps obviously, I'm much better a *Java* developer than I would have been without the other stuff. So I agree wholeheartedly that students must learn more than one language in their schooling -- either for professional reasons OR for academic reasons; you simply have to flex your thinking in more than one way if you're going to learn.

      It also strikes me as a tough way to learn... how do you learn what X language is, and the reasons behind its design, totally in isolation? How do you learn what OO is if "functional" is a meaningless concept to you?
    21. Re:software engineering != computer science by Ed+Avis · · Score: 2, Interesting

      Java is much, much closer to Java bytecode than C is to assembler. You can take a .jar file and decompile it to get readable source that almost exactly matches the original (modulo private variable names). That's not true of C.

      --
      -- Ed Avis ed@membled.com
    22. Re:software engineering != computer science by AndersOSU · · Score: 4, Insightful
      Ok, I'm not a programmer, but a mechanical engineer, and I know precious little about programing, but I find articles like this very interesting. I was reading your post, and I stopped dead in my tracks here:

      I think the authors are WRONG in saying that a university should be focussed on the academic
      People don't go to the university to get real world skills, people go to the university to understand the foundations of their field, so that they can adapt their fundamental understanding to solving the problem at hand. People get certificates to learn routine use of employment friendly tools.

      As I said, I'm not a programmer. I could (if I had to) model the frequency response of a simple mechanical system to a range of perturbations by hand. The chance that I'd have to do that in the course of my professional employment is so slim as to be laughable. Yet, the fact that I could do this (if I really had to) tells me that I don't want to put an eccentric load on a rotating shaft with out a lot of careful consideration. Now if I sort of knew this was a bad thing, but didn't really understand why I might to something silly like put only a single U-joint in a shaft. After all, it provides flexibility, and as long as the shaft is straight there is no eccentricity. The problem occurs when there is a deflection, then your single U-joint translates a nasty sinusoid down-stream. If you do that things tend to break.

      Now, I agree that the university should have some courses focused things that practicing professionals in the field use. I could draw a part by hand (if I really had to), but if I've never seen CAD before, I'd be at a serious disadvantage if I ever wanted to be a machine designer. However, fundamentally, a university is an academic institution. The suggestion that it should be an employment mill would severely compromise our education system.
    23. Re:software engineering != computer science by halber_mensch · · Score: 2, Interesting

      But should they teach simple stuff such as using javac and Ant in University ? Sorry to sound like an elitist asshole, but it is pretty reasonable to expect a CS undergraduate student to be able to figure these details by himself. I mean, surely the lecture time could be used for something more fundamental.

      I would agree with you, if the students were encouraged to learn on their own and given direction in which to point their curiosity. But they aren't. They're encouraged (from early in childhood, really) to do the bare minimum work to get through the course, to stick to the examples and lectures given by the instructor explicitly, and not deviate from what everyone else is doing, or you'll stick your neck out too far.

      Case in point, in my data structures class we were given an assignment in which a requirement was that we used a hash table which had an underlying structure of a pointer-based linked-list. The assignment could be completed in any language, but since Java was the curriculum language, the course was taught using only Java examples. I preferred C, but knowing STL list was available I wrote my implementation with C++. I got half credit for the reason "Not use pointer based linked list". Now, aside from the obvious flaw that Java does not have pointers per se, and the Java kiddies all got full credit, STL list is in fact implemented with pointers. I argued this with the instructor, who relegated me to the TA that graded the assignment. When I explained to her that STL list is pointer based, she told me I was wrong. So I directed her to the SGI documentation that says "STL list is implemented by a doubly-linked pointer-based linked list..." Reluctantly, she gave me full credit. However, she wouldn't correct the scores of the other handful of people that also used C++ and STL list unless they came in and showed her the same web page. It wasn't enough that she had been proven undeniably wrong. Lesson learned: don't deviate from the strict curriculum and curriculum tools, or you get screwed. That is, at least, how the others took it. I was too angry to let the man get get the better of me, and I was determined to fight it. So many other people just rolled over and took it, though, and they abandoned all other languages for Java for the rest of their undergraduate classes.

      --
      perl -e "eval pack(q{H*},join q{},qw{70 72696e74207061636b28717b482a7d2c717b343 637323635363534323533343430617d293b})"
    24. Re:software engineering != computer science by autophile · · Score: 3, Insightful

      Naive about the purpose of C, anyway. C was never designed to prevent you from shooting yourself in the foot. Writing C requires you to think, which is sadly out of vogue these days, as you point out later.

      I know, it's insane nowadays! Why, just the other day I was just remarking to my barefoot wife, who was cleaning our clothes by beating them against the rocks in the river, and then rolling them through a wringer, that all these fancyboys with their pushbutton machines and laundry powder just don't value godly, manual labor anymore! Then I went to my factory job where the machines have no safety features, so they really require you to think, which is sadly out of vogue these days with OSHA and safety goggles and whatnots.

      The shame!

      --Rob

      --
      Towards the Singularity.
    25. Re:software engineering != computer science by stryder100 · · Score: 2, Insightful

      Good point - C was invented primarily not to make assembly language safe but to make it portable. That being said, to use it as an application development tool is not a good idea, even if the developers are "real" programmers. Things like checking for buffer overwrites, null pointers, etc. should definitely be automated, like it is in C++. Otherwise you're reinventing the wheel at every turn.

  4. You have to start somewhere... by KillerCow · · Score: 4, Interesting

    Java programming courses did not prepare our students for the first course in systems, much less for more advanced ones. Students found it hard to write programs that did not have a graphic interface, had no feeling for the relationship between the source program and what the hardware would actually do, and (most damaging) did not understand the semantics of pointers at all, which made the use of C in systems programming very challenging.


    Yeah, I just read a press release from the FAA blasting driver training courses. Apparently, flight students who just got their drivers licenses were not able to navigate in the air, execute banks, take-off, or land properly.

    Students have to start somewhere. It's easier to start with simple stuff than to try to cram their heads full of everything all at once.
    1. Re:You have to start somewhere... by vux984 · · Score: 4, Interesting

      C is a lousy beginners language.

      I started programming in Pascal, and then moved to C/C++. Structured programming, language syntax, variable typing, functions, parameters, recursion, etc I could ALL learn in Pascal.

      When I came through Java was still pretty new, but I did take a java course, and found it reminded me a more of Pascal than C/C++; I'd say its a good starter language.

      Also you can easily write command line apps in java, so i don't know why they blamed gui dependancy on java.

      And as for 'systems programming' well DUH. Your first language is where you learn the basics of programming, before you start taking systems programming you should also have a lower level course ideally in something like assembly language (even if its just on emulated hardware) or C.

    2. Re:You have to start somewhere... by jandersen · · Score: 4, Insightful

      Don't be silly. Flying an aircraft requires a whole new set of skills, that are outside the normal experience of most people. Driving is not just flying with a number of 'security enhancements', whereas programming in Java is like programming in C, but without the need to learn about pointers or good programming discipline. So if C is like a manual car, Java is an automatic.

      It is reasonable to expect that a CS student has both the ability and the interest it takes to learn all the details of programming well in C.

    3. Re:You have to start somewhere... by doktor-hladnjak · · Score: 2, Insightful

      It really depends what you're trying to teach when. A few years ago I taught a data structures course (second out of a three course lower division sequence) in Java and thought it worked fairly well. About a year before that, I was a teaching assistant for a data structures class taught in C++.

      Language choice affected the content of both courses quite a bit. In the Java course, students spent more time understanding how specific data structures worked and working on more interesting programming assignments. Students got to a working knowledge of Java fairly quickly after having only a semester of Scheme under their belt. In the C++ course (which followed a semester taught in ML), the students as a whole spent a lot more time learning about memory management along with the ins and outs of C++. Instruction on data structures was much more limited. Both sets of skills are valuable for practicing engineers, but I think it's fair to say that both the staff (myself and the teaching assistants) and the students enjoyed the class taught in Java more than the class taught in C++, probably because the interesting parts of such a class have to do with efficient data structures more than fighting with pointers and copy constructors.

      Following the Java course, those students normally took an introductory hardware class. That course was taught in both assembly language, C and Verilog where learning pointers fit in better with the other material. Following the C++ course, I don't think those students saw much more C or C++ programming for a while (possibly not until upper division topic-specific course work) and instead went off to complete 4 more semesters of more theoretical Computer Science.

    4. Re:You have to start somewhere... by Osty · · Score: 4, Interesting

      When I came through Java was still pretty new, but I did take a java course, and found it reminded me a more of Pascal than C/C++; I'd say its a good starter language.

      Java is also a lousy "beginners" language, because its reliance on standard libraries leads beginners to look for pre-packaged solutions rather than writing their own. That was one of the main arguments against Java in the paper, and it was a problem even a decade ago when my school was transitioning beginners classes to Java (I was ahead of the change by a semester or two in each class, so I got to start from Scheme, learn data structures in C++, learn AI in Lisp, etc). Yes, in the "real world" you don't want everybody reimplimenting their own linked list or hashtable. However a beginner must learn the concepts behind those data structures in order to advance, and Java just makes it too easy to use the standard set of classes.

      That's not to say that Java is all bad. With a good teacher and a good curriculum, it's absolutely possible to teach core concepts in Java (or any language, really). You have to be merciless about banning standard library usage such as collections, and teach your students the theory behind those data structures. People understand theory best when they can actually see it in practice, so you have to have your students implement their own linked lists, doubly linked lists, trees, etc. With Java it's an uphill battle getting people to ignore the standard libraries for "academic" purposes, but it's possible to do.

      Personally, I'm thankful that my first real programming language (not counting BASIC in its various forms) was Scheme, and that I was exposed to a number of languages through my college career (the afore-mentioned Scheme, C/C++, and Lisp, as well as ML, Java, and MIPS assembly) even though my current day job consists of C# and SQL. Because of my background, I can easily pick up pretty much any language (and have done so several times), which gives me an advantage over those "programmers" churned out of today's Java-mill universities.

    5. Re:You have to start somewhere... by goose-incarnated · · Score: 2, Informative

      C is a lousy beginners language.

      That depends on what you are trying to teach.

      I started programming in Pascal, and then moved to C/C++. Structured programming, language syntax, variable typing, functions, parameters, recursion, etc I could ALL learn in Pascal.

      Once again, depends on what you are trying to teach/learn. Pascal (which I like, btw) teaches different things than one would learn in C. In pascal you are learning a programming language; very often in C you are using it for a specific platform/architecture, and hence get to use and understand things like signals, volatile variables, memory-mapped IO, etc ...

      When I came through Java was still pretty new, but I did take a java course, and found it reminded me a more of Pascal than C/C++; I'd say its a good starter language.

      For what, exactly? Java (and C#, etc) bring nothing new to the party; everything they offer has already been offered (sometimes decades ago) by different programming languages. The only reason to use them is peer-pressure, in which case the only place to teach them is in vocational colleges, not universities.

      Also you can easily write command line apps in java, so i don't know why they blamed gui dependancy on java. And as for 'systems programming' well DUH. Your first language is where you learn the basics of programming, before you start taking systems programming you should also have a lower level course ideally in something like assembly language (even if its just on emulated hardware) or C. Like I said above, it all depends on what you are trying to teach; for example, it is possible to teach OO using plain old C, but it is rather painful! In much the same way, the only time you would want to use Java is when your problem maps nicely to an OO architecture (and most problems do not!).

      --
      I'm a minority race. Save your vitriol for white people.
    6. Re:You have to start somewhere... by AuMatar · · Score: 4, Interesting

      C->C++->assembly (any ISA)->some functional language->some other language (Java, python, ruby, etc).

      Assembly is necessary, to understand how a computer really works. Functional languages are good, just to know a completely different style. Some other language for breadth. Then the student can realise that everythin after asm was a waste of time, and return to C.

      --
      I still have more fans than freaks. WTF is wrong with you people?
    7. Re:You have to start somewhere... by goose-incarnated · · Score: 2, Interesting

      Students have to start somewhere. It's easier to start with simple stuff than to try to cram their heads full of everything all at once.

      Trouble is, Java is not "the simple stuff", Pascal is "the simple stuff". Java has inconsistent syntax, has only one model for all programs (OO), etc. It all depends on what you are trying to teach, and if you are trying to teach:
      1. Computer architecture, OS designs, Hardware, etc
      then use C (or a subset of C++).

      2. Computer Science, theory of automata, TM's, state-machines, etc
      then use Scheme.

      3. Programming, data-structures, algorithms, etc
      then use Pascal.

      4. Java, C++, $LANGUAGE_OF_CHOICE
      then use Java, C++, $LANGUAGE_OF_CHOICE

      There is no place for Java in tuition unless it is taught as a vocational skill. Universities never were about teaching vocational skills.
      --
      I'm a minority race. Save your vitriol for white people.
    8. Re:You have to start somewhere... by shtarker · · Score: 2, Interesting

      And as for 'systems programming' well DUH. Your first language is where you learn the basics of programming, before you start taking systems programming you should also have a lower level course ideally in something like assembly language (even if its just on emulated hardware) or C. You'd think that wouldn't you? But then I took a course in "Operating Systems Internals" which turned out to be entirely in Java. To this very day I'm still asking my self why...
    9. Re:You have to start somewhere... by KDR_11k · · Score: 2, Interesting

      I was at a university that teaches Haskell as the first language. Why? Because someone who has never programmed before doesn't know concepts like variables as they are used in imperative languages but they sure as hell have seen them the way they are used in math. We've used Haskell to learn the basics like recursion, data structures, verification, etc. Only after that did Java get introduced.

      --
      Justice is the sheep getting arrested while an impartial judge declares the vote void.
    10. Re:You have to start somewhere... by Simon+Brooke · · Score: 5, Insightful

      C->C++->assembly (any ISA)->some functional language->some other language (Java, python, ruby, etc).

      Assembly is necessary, to understand how a computer really works. Functional languages are good, just to know a completely different style. Some other language for breadth. Then the student can realise that everythin after asm was a waste of time, and return to C.

      This is kind-of bollocks.

      When I was a young programmer - which is about twenty-five years ago - the team I was on got a new ink-jet printer. It printed its own character set, we needed it to print bitmaps. The processor it used was one none of us had ever worked with before. One of the older members of the team - a guy called Chris Burton - took the spec sheet for the processor and the spec sheet for the printer home with him on the train, and came back the next day with the code for the new printer driver written in long hand, not in assembler mnemonics but in actual op-codes, in pencil on a pad of paper. It was burned on an EEPROM that day and drove the printers until that model became obsolete five years later - there were no bugs, it never needed fixing.

      It should be said in passing that Chris had worked in his youth on the Manchester Mark One, and after he retired was part of the team that rebuilt Baby and got it running again.

      I've always thought that was epic programming, a standard I'll never reach. But it's one particular layer on the stack. My job on that team was writing inference engines, and Chris was always really impressed by that. It's nearly thirty years since I touched any assembler and fifteen since I wrote anything serious in C. A modern computer system is way too complex for any single person to really understand, in depth, all the layers. I take what the silicon designers do as given, and likewise the microcode programmers. Right back in the early days of Linux I did fix issues in kernel code a couple of times but I wouldn't even try these days - the guys who do that are much more expert at it than I am. Likewise, I don't expect them to understand the compiler compilers that I write. It's a different layer on the stack.

      I agree that you need to have a rough idea about how the whole stack works. But we no longer expect all computer science students to be able to wire up NAND gates from discrete valves or transistors. And although a computer scientist needs to know that there are primitive logic operations carried out on the metal, and that on top of that there are a stack of different software layers with real machine code on the bottom and a whole slew of intermediate code representations above that, I don't believe that it is any longer necessary for all students to be able to write a serious program in assembler.

      --
      I'm old enough to remember when discussions on Slashdot were well informed.
    11. Re:You have to start somewhere... by mwvdlee · · Score: 2, Insightful

      I agree with much of what you write but think assembler should still be covered atleast to the point of students being able to create tutorial programs.

      My day job is as a mainframe (z/OS) programmer in a number of languages and whenever a program has a non-obvious bug, it still comes in damn handy when you can read what is actually happening underneath.

      I'm not talking about training them upto the level of building systems in assembler, but they should be able to take hex values, processor specs and an assembler guide and translate what's going on.

      Assembler teaching you what a processor does, just like students should know how it's possible for a processor to be costructed out of NAND gates. They needn't be able to create their own processors, just understand why it actually works.

      --
      Slashdot social media options: AIM, ICQ, Yahoo, Jabber and Mobile Text. Why no MySpace?
    12. Re:You have to start somewhere... by david_thornley · · Score: 3, Insightful

      Java is also a lousy "beginners" language, because its reliance on standard libraries leads beginners to look for pre-packaged solutions rather than writing their own.

      Which is exactly what we want people to do when they're off doing real work. One problem with teaching languages without such libraries is that people get used to writing their own rather than looking for pre-packaged.

      There's no problem with basic data structures and algorithms in Java. You declare that certain libraries are off-limits for an assignment, and give a zero score to anybody who violates that. The ones that actually belong in the field will catch on real quick.

      --
      "When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
    13. Re:You have to start somewhere... by jandersen · · Score: 2, Insightful

      Give me a break Sure - where do you want it? But of course, when I boldly claim that you don't need to learn discipline in Java, I am oversimplifying in the hope that the reader is able to fill in the obvious gap. After all, discipline is required for anything you do, to some extent; but in C you need so much more of.

      I am not saying that Java is bad or that Java programmers are bad, but there is still some serious value in understanding how a computer works right down there at the metal, and C is a lot closer to the bare metal; and that is why it is important for CS students to learn to use C well, even if they will forever more use Java, C# or whatever. When you study computer science, you study to become a Computer Scientist, which requires a lot more than the ability to program - hence the word 'Scientist'. Computer Scientists are, as far as I know, required to be able to write things like operating systems from scratch and that kind of things, and you won't choose Java for that if you want it to go fast (not quite true, I know - Nixdorff made a series of servers once, whose OS was written almost entirely in interpreted BASIC).

      Now, as for the 80% errors caused by pointers - it is perfectly possible to learn a coding discipline that avoids them. This should happen automatically with experience; after a while you learn to always initialize buffers - whether they are pointers, strings, int or other - when you define them.
  5. 1 language is damaging. by toolslive · · Score: 5, Interesting

    If they teach you only one programming language, yes, they damage you.

    In the course of my CS education (early 90s), they started with Pascal when they explained algorithmical basics.
    Later courses were in C for OS and networking, while other courses used about everything from PROLOG to ADA.

    You learn that some paradigms map to certain types of problems better (or worse) than others. So don't open sockets in
    Prolog (I have seen'em do it man) , and don't do AI in C.

    a quote: "if the only tool you have is a hammer, every problem looks like a nail".

    1. Re:1 language is damaging. by synx · · Score: 2, Insightful

      Yes, early 90s - but have you checked out universities lately? We're talking cradle to grave Java. Intro to dev in Java, mid level courses in Java, Sr courses in Java. We're graduating people who don't know what pointers are!

      COME ON!

      And don't tell me Java doesn't have pointers - what do you think references are? Glorified pointers with auto-null checks.

      One problem I've seen is Java Developer Syndrome (JDS) - think devs who don't know the difference between Java API names and datastructures that are used to implement them.

      Think of someone who when you ask them what a hashtable is, they say 'oh, that's the synchronized version of HashMap'. Tell me that is a quality developer you want to work with. Go ahead, TELL ME.

    2. Re:1 language is damaging. by goose-incarnated · · Score: 2, Funny

      a quote: "if the only tool you have is a hammer, every problem looks like a nail".

      right back at ya: "if the only tool you have is a chainsaw, every problem looks like hours of fun

      --
      I'm a minority race. Save your vitriol for white people.
    3. Re:1 language is damaging. by something_wicked_thi · · Score: 2, Funny

      And don't tell me Java doesn't have pointers - what do you think references are? Glorified pointers with auto-null checks.

      And what's a SIGSEGV if it's not an auto-null check? ;-)

    4. Re:1 language is damaging. by Abcd1234 · · Score: 2, Insightful

      Gah, you're completely and utterly missing the point. This isn't about friggin' languages, and it never was. It's about programming paradigms. My training in computing science took us through the usual host of languages: C/C++/Java, Assembler, Prolog, and of course Lisp. Plus SQL and, if you were so interested, Smalltalk. Was the point, here, to teach languages? Of course not! The purpose was to teach traditional imperative, functional and declarative programming, in procedural, functional, and object-oriented styles, all the while exposing us to both high-level software concepts while giving us a grounding in the underlying details so we can grasp how things work down at the hardware level. And *that* experience is vital for producing well-rounded software developers who understand a variety of techniques and can apply the appropriate tools for the job.

      So, sure, if you could find a language that supports all those programming paradigms, and allows one to expose students to both low- and high-level programming concepts, then my all means, teach it from start to finish. Because you're absolutely right, it isn't really about the language. But, that said, the language is there to best express one's ideas. And I'd be *very* surprised if you could find a language that encapsulated the full breadth and depth of programming approaches while not being a pathetic, lowest-common-denominator expression of those concepts.

      Incidentally, the real irony in all this is that languages like Java and C# are taking on more and more functional and declarative features (though, again, only a poor man's version of them). Just look at C#: suddenly, they have lambdas, and soon it'll have a built in query language. Bang, suddenly we have declarative, functional, and procedural programming models all jammed into the same syntax. And the brutal, bitter truth is that most programmers using C# probably have *no idea* how to best use these tools to solve problems.

  6. About the Authors by etymxris · · Score: 5, Informative
    Gee, wonder why they're praising Ada so much.

    Robert B.K. Dewar, Ph.D., is president of AdaCore and a professor emeritus of computer science at New York University. He has been involved in the design and implementation of Ada since 1980 as a distinguished reviewer, a member of the Ada Rapporteur group, and the chief architect of Gnu Ada Translator.

    Edmond Schonberg, Ph.D., is vice-president of AdaCore and a professor emeritus of computer science at New York University. He has been involved in the implementation of Ada since 1981. With Robert Dewar and other collaborators, he created the first validated implementation of Ada83, the first prototype compiler for Ada9X, and the first full implementation of Ada2005. Maybe Ada is helpful for learning concurrent programming and safe typing, but I'll wait for the opinion of a slightly less partial party.
    1. Re:About the Authors by superash · · Score: 3, Insightful

      TFA says:

      A Real Programmer Can Write in Any Language (C, Java, Lisp, Ada)

      Why C matters...
      Why C++ matters...
      Why lisp matters...
      Why Java matters...
      Why Ada matters...

      So, I don't think the article is biased.

    2. Re:About the Authors by Col+Bat+Guano · · Score: 5, Informative

      I'm a slightly less partial party. I've taught Ada to first year students, and our school replaced Ada with Java. Some observations are...

            Students found Ada a relatively simple language to start with (if you choose an appropriate subset)
            Java can have more overhead for a beginning student
            Lecturers are often tempted to push a lot of "stuff" in intro subjects
            Java GUI motivates some students to get more involved
            Many of my students regretted that Ada would no longer be taught in first year (having quite enjoyed it)

      No matter what you start with, teaching students to be better programmers takes more than just a language. Each language allows you to teach a specific set of skills, and Ada is not bad for teaching some important SE skills (IMHO).

      I think pointers are overrated as a first year concept, and can wait for later years.

  7. Programming languages are tools, not religions. by delt0r · · Score: 4, Interesting

    There going to plenty of flames on this topic.

    As someone who programs mainly in java, I have to say they have a point. Surely a degree in CS should get someone familiar with all forms of higher order programing (both OO and functional). They should also have a reasonably solid understanding of basic hardware architecture and how that affects programs.

    Unfortunately this does not seem to be the case at least in NZ. Some don't even know about basic complexity ideas and often have little to zero mathematics under there belt.

    I did not do CS but physics. I was required to do Assembly,basic,C,matlab,R,Lisp,Java,C++,Haskell and a bunch of others I don't care to mention (Like PLC's and FPGA stuff).

    --
    If information wants to be free, why does my internet connection cost so much?
    1. Re:Programming languages are tools, not religions. by delt0r · · Score: 2, Interesting

      When employing people in the past, I have not considered them from lack of mathematics. Calculus is in fact used a lot, and is very necessary in many areas that involve programming. This is why I often favor Math and Physics Majors for programing work. The understand the problem, not just the programming. Hell even game programing often needs basic calculus (Thats above High School level).

      --
      If information wants to be free, why does my internet connection cost so much?
  8. I've noticed that... by Facegarden · · Score: 2, Insightful

    I've noticed that... I'm not a CS or a CE, i'm an ME, and i build robots. I'm great at the mechanical side but i always talk to Computer Engineers or CS majors, trying to see what they can do for me, and all i've surmised is that they just aren't taught anything useful! Sure, there's probably all kinds of great theory and whatnot, and that's all very important, but at the end they should have a class that teaches them the useful stuff! I say that because the guys i've spoken to were never taught how to make ANY kind of GUI, and have no idea how to send data out a serial port (something often neglected but very useful in robotics). In fact, even the head of the Computer Engineering dept at my school (Santa Clara University, supposedly 14th in the country for engineering) didn't know how to talk to a serial port. And not teaching how to make a GUI? I mean, i know you can figure it out, but then, what is the point of school? I know not all software goes to consumers, but if it does it had better have a GUI, so why not teach at least the basics!? And hardware output - either from the serial port or programming USB peripherals - is incredibly useful, yet seems to be completely left out of today's undergrad programs, and that seems insane! What has been your experience with this stuff? -Taylor

    --
    Worldwide Military budgets: $2100 billion. Worldwide Space Exploration budgets: $38 billion. Really, world? Really?
    1. Re:I've noticed that... by Anonymous Coward · · Score: 5, Insightful

      I'll answer as a computer scientist.

      I view school as bootstrapping a person to learn how to learn, and for teaching them the things that are timeless. The only reason that a popular programming language like Java is used in the first place is because something has to be used, so it may as well be that. However, many schools offer Scheme, ML, or Common Lisp as the programming language of choice when the job market is comparatively low. This is because it's seen to help the learning process. The goal isn't a marketable skill, but a vehicle to teach the timeless things like algorithms, data structures, and all those courses that have he word "theory" tacked on to the end of the titles.

      If you want someone to be a lackey and build you a GUI, you'd be better off looking for someone who has an ITT certificate. If you're looking for something more on the math side of computing (again, algorithms, analysis), then you talk to a computer scientist.

    2. Re:I've noticed that... by phugoid · · Score: 4, Insightful

      Are you suggesting that the CS curriculum should be designed around solving your little practical problems?

      I'm a Mechanical Engineer as well. Are you suggesting that _we_ should have spent our degrees studying look-up charts for HVAC ducts, or how to make nice Excel graphs? (calculus, mechanics, thermodynamics, heat transfer, ring any bells?)

    3. Re:I've noticed that... by AuMatar · · Score: 2, Interesting

      Because how to talk to a serial port is OS dependent, and can be found out by less than 5 minutes with google for your OS of choice. Same with USB. GUIs- the vast majority of programs don't have one. Even those that do, the GUI is a small part of it. Almost every college has optional classes in it, but its a specialty field that isn't that interesting to people. If it interests you take it, but it isn't really important.

      As for the theory you callously disregaurd- that theory is what allows us to dream up ideas like GUIs, OSes, etc and implement them. Without the theory, all a CS major would be qualified for is to make a new webpage that does 90% the same thing as another webpage. Thats why theory is stressed, and they can learn individual tasks like IO reading on the job as needed.

      --
      I still have more fans than freaks. WTF is wrong with you people?
  9. They don't say "Java is bad" by koinu · · Score: 2, Informative

    The title is bad. Read the text and you will notice that they claim that "Teaching Java, as the only language, is damaging." and that might be true. I have the opinion for years now and I teach Java to students during this semester. There is far more than only Java and you can only get better the more languages you know.

    By the way, C (yes, the one without "++") is still my favorite language.

  10. Biased? by silverhalide · · Score: 5, Informative

    This might be obvious, but take a close look at the authors of the article:

    Dr. Robert B.K. Dewar, AdaCore Inc. (President)
    Dr. Edmond Schonberg, AdaCore Inc. (Vice President).

    The article by some weird coincidence slams Java and praises Ada.

    Salt, please...

    PS, Ada is mainly alive in the Military/Aerospace industries where projects can last 20+ years.

  11. Different goals by Secret+Rabbit · · Score: 3, Insightful

    In a College for a 2-yr Programming Diploma, this would be fine because the goal of such a program is just writing some business application or some such. Nothing that requires any real competence.

    On the other hand, Universities have a much different end goal. They want to teach such that completing there program means that the student can go onto a Masters program, etc. Obviously, Java won't get students there without a massive amount of pain if they go on to further study.

    Well, at least that how it was, and how it should be. Currently, Universities are edging toward the College level. What this has produced is a massive gap in knowledge/skill of where the student is expected to be and where they actually are upon entering a Graduate program.

    Unfortunately, this isn't just in CS. More and more I see Mathematics and Physics programs degrading as well. From what I've seen, this is due to Administration applying... pressure for high grades, etc. No grades, no funding. The cycle continues.

    Though, I must point out that there are some Departments that are making an attempt at fighting back. Small in number they may be, there is still hope for a return to actual academics. Though, we'll see how that plays out. You never know, I wouldn't put it beyond a spiteful Administration to turn a Department into offering just service courses.

  12. Java brings out the best and Worst in you by freedom_india · · Score: 2, Interesting

    For the record, the same professors said the same thing when C++ was in vogue. They also said the same thing when C was popular.
    To take apart their argument by logic:
    1. Java is an abstraction a VM over the hardware. People who study comp sci, today are of three kinds:
    a) Those who want to be a programmer and then a Project Mgr.
    b) Those who want to maintain hardware and/or design new ones. iPod maybe.
    c) Those want to manage systems (20% hardware: 80% software).

    For the first kind, Java is a better choice because: It does not force you to dig down to machine-code which is unnecessary today. Much like car driving in 1920s and 1990s. It teaches you the best of programming by forcing you to think in terms of objects and how to act upon them in real-world. If you mess up, you don't overwrite the root disk thus causing innumerous references to the time-worn joke about shooting in one's foot.
    It also teaches you GUI writing is tougher by way of its MVC programming. At this time, programmers can be split into real men or MSFT weenies: real men would go to Java in Server-world. Weenies would love GUI and goto VB.

    It also teaches you the worst in programming: Forcing you to think only in OO way.

    The second kinds is better off learning C or even Assembly.

    The third kind is tricky: There are lots of management tools nowadays. Some of them written in Java. if they want to write their plugins easily, then Java is the way to go.

    2) Java is one more step in evolution which normally the professors hate because it moves them away from the machine. But mankind has more important things to do (watching LOST and Sopranos) than twiddling with RPG.

    3) Blaming Java alone for problems is like blaming the Sea for causing Katrinas.

    Lastly if anyone should be blamed for warping the minds of youngsters permanently, it should MSFT with its Visual Basic system.

    --
    "Doing what i can, with what i have." ~ Burt Gummer
    1. Re:Java brings out the best and Worst in you by ardor · · Score: 3, Interesting

      Java is one more step in evolution which normally the professors hate because it moves them away from the machine. But mankind has more important things to do (watching LOST and Sopranos) than twiddling with RPG.

      Wrong. Java is a step *back*. Not because of the abstraction, mind you, but simply because Java is such a severely limited language. 30-40 years ago amazing new things were developed in CS, none of these are included in Java. Lambda? Map-Reduce? Purely functional code? Caml-style pattern matching? Conditions? People say Java made C++ obsolete, which is completely wrong, since C++ is far more powerful than Java (thanks to generic programming and metaprogramming). Just have a look at Boost, or C++0x, and try to replicate the features in Java - WITHOUT runtime overhead (this is one key feature of generic/meta programming - a lot of computation can be done at *compile*-time).

      Actually, the next step in evolution should be Lisp, since it is one of the the most powerful and flexible languages in existence. There is nothing in the language that intrinsically prohibits Lisp performing as well as C++, its mostly the tools that lack development (for comparison, g++ has had a hell of a lot of improvements; the 2.x series was awful). If you avoid certain things like eval, Lisp code can be optimized well enough. There is a Scheme compiler called Stalin which does just that, and it can even outperform comparable C code.

      So, if you want to abstract away from the machine, why use Java instead of Lisp?
      IMO there are other reasons for Java:
      1) its a braindead easy language.
      2) you only need mediocre programmers, since Java is easy enough for them, and there are much more mediocre programmers than good ones.
      3) as a consequence, programmers are expendable, jobs can be outsourced etc. One C++/Lisp/Haskell expert could replace an entire Java team. Not good for the company, since this guy becomes indispensable, and can demand more salary etc.
      4) Universities can claim to have more success in teaching, since the number of guys with a CS degree is higher.
      5) Companies need less teaching courses, because of (1).
      6) Java has been overhyped for a while now, and many CTOs are so clueless, they just buy into it.

      Well, you can disagree at my opinion about Java, but it is a fact that CS students *should* learn about the functional paradigm, what lambdas are, closures, and so on as well as what pointers are, how the memory works, what the garbage collector actually does etc. However, this is not the case - and THIS is a serious problem.

      --
      This sig does not contain any SCO code.
  13. Variety by andy753421 · · Score: 4, Interesting

    Where I go to school, just this year we switched from teaching the introductory classes in Java to a combination of Python, then C, then Java. I think that this is much better than using any particular one of those languages the whole time. It gives the student experience with more different concepts and from that I think they can begin to see how everything works together. Also, starting with something simpler than Java/Eclipse seems to make it a lot easier the first few weeks of the course.

    One thing I have noticed though, is a complete lack of security related training. Something about calling eval() on every input just to parse integers makes me cringe. I guess the idea is that worrying to much standard practices keeps people from thinking creatively or something. Unfortunately, it also seems like a good way to get into a lot of bad habits.

  14. Why not D? by Twinbee · · Score: 3, Interesting

    I would suggest being taught a programming language such as D, at least in addition. Although the transition from C/C++ to D can be painful, D contains many similarities with C/C++ such as speed, except it's much tidier and has many of the advantages of Java syntax whilst maintaining the power of C/C++ if necessary (optional pointers, optional manual garbage collection etc.).

    Sooner or later, languages are going to evolve, and surely it's only a matter of time before something D-like is going to be used anyway. Might as well make the switch sooner rather than later.

    --
    Why OpalCalc is the best Windows calc
  15. Re:Damaging to students maybe, but not workers by doktor-hladnjak · · Score: 2, Insightful

    ... and I've been writing almost entirely in C/C++ without any SQL since finishing undergrad over 5 years ago (grad school followed by a desktop application development job). The bottom line is that students should be learning a broad range of skills because it's hard to say where any of them are going to end up right out of school or especially within a few years of finishing school.

  16. Re:Right on! by putaro · · Score: 4, Insightful

    .fuck you collage idiots Well, the problem is that you want to a collage. That's a bunch of stuff pasted together by art majors. If you had gone to a college, or perhaps a university, you would have learned stuff beyond programming such as data structures, compiler theory, etc. Programming, especially in any particular language, is a skill, like plumbing or electrical wiring. Knowing the theory behind it is education. I was a decent programmer when I started college. All the theory and stuff that I learned in college didn't seem that useful at the time but as I've gone along in my career it's definitely the difference between being a code monkey and being someone who can design systems.
  17. Why is "Computer Science" Staffing S/W companies? by wrook · · Score: 5, Interesting

    OK, this hit one of my hot buttons. Before I continue, though, let me preface my statement by saying that I don't disagree with the article (which is right on the button). But I disagree with the way the summary characterizes the situation.

    I totally agree that universities shouldn't be teaching Java exclusively. They need to teach the basics of modular, functional, declarative and oo languages. Why? Certainly *not* to fill "software engineering" positions!!! A university's role is to do research, not to act as some technical college. OK, I can see having a programming course aimed at creating programmers for industry if it's going to pay the bills at the uni. But *don't* make that your "Computer Science" course!!

    Computer Science should be science (well, math anyway). Universities should be getting the 5 or 10 graduates they need that will move on to academia (or industry research) later in their careers. Because right now, *nobody* is getting taught Computer Science! Lately I've been reading papers posted on http://lambda-the-ultimate.org/ Regularly I have to go back to the basics and learn extremely fundamental theory because nobody *ever* taught them to me in the first place. Half the time I think, "OMG, I never even knew this existed -- and it was done in 1969!!????"

    More and more lately, I've been wanting to phone my University up and ask for my tuition back.

    If you want to learn how to program in a professional setting, there's nothing better to do than just start writing code. Get your chops up. Then find some big free software projects and start fixing bugs. Learn how to use the tools (configuration management, etc). Learn how to interact with the other programmers. That's all you really need (well, that and a quick automata and grammar course so that I don't have to look at yet another context free grammar being "parsed" by regular expressions).

    But right now, where do you go if you want to actually learn theory? I guess the library... And getting back to the point, this is essentially what the paper is suggesting. Students need to learn all these things because they are relevant to the field. A university supports industry by doing basic research. If you don't understand the concepts that they point out, you just can't do that. Paraphrasing from the article, having a university course that's meant to pad out a student's resume is shoddy indeed.

  18. commercial app dev != internal business app dev by remitaylor · · Score: 2, Insightful

    software engineering != computer science

    [...] soft engineering/programming is a subset of computer science

    true! i would take that even a step further ... it depends on the target consumer of your applications, as well.

    mr. awesome computer science man, who can program in everything, might not be what a business wants for someone who's good at whipping up quick, user-friendly (potentially resource-hungry and not secure enough to face the public internet or for commercial distribution) applications to help streamline business processes.

    and, obviously, mr. business programmer, who's good at getting the employees what they need, probably isn't the guy you want to program some super computer ... math ... stuff. or even a decent performing application that could be sold and distributed, commercially.

    i'm sure Java's *perfect* for some people to learn. C or even Assembly are *perfect* for other people. C# / Python / Ruby might be perfect for someone else. [some other languages here].

    it depends on the person and their career / interests / environment.
  19. Java for Dummies by DCFC · · Score: 5, Interesting

    I am a headhunter for high end roles at investment banks, and we are close to classifying CompSci as a "non degree", along with media studies, languages, etc.

    Java is fine for teaching design patterns, and classical algorithms like Quicksort, or binary search.
    But you can't do operating systems, and the success of Java in isolating you from any notion of the hardware is actually the problem.
    We have already blacklisted courses like the one at Kings College, because they teach operating systems in Java.
    Yes, really.
    Their reason apparently is that it is "easier".
    I have zero interest in kids who have studied "easy" subjects.

    The world is a bigger, more competitive place, how many jobs do you think there are for people who have an easy time at college ?

    Java is part of the dumbing down of CS.
    A computer "expert" is not someone who knows template metaprogramming in C++, or compiler archaeology in BCPL, or the vagaries of the Windows scheduler.
    It is someone who understands computers at multiple levels, allowing them to choose which one illuminates the problem at hand.
    To be wise in computers you choose whether to think of something as a block of bytes, quadwords, a bitmap, a picture, or a buffer overflow pretending to be porn. If also have the option of understanding flash vs static RAM, virtual memory, or networked storage, all the better. I doubt if even 1% of CS grads could write code to turn this BMP into a JPG, or even explain the ideas behind this. In my experience, 50% could not work out how to develop a data structure for a bitmap that used palettes.
    I have interviewed CS grads with apparently good grades who could not explain any data structure beyond arrays.

    Any CS grad who sends us their CV with bullshit like "computers and society" or "web design" has their CV consigned to trash with no further reading.
    A CS should be able to write a web server, not be an arts graduate who didn't get laid.

    C++ makes you think at multiple levels, unlike Java, you simply cannot avoid thinking about your system from patterns to bytes. This may be good or bad for productivity, and I'm sure we risk a flame war here.
    But I am entirely convinced you need to hack your way through a "real" system.

    How can someone understand the Linux kernel without C & C++ ?
    Is someone really fit to be called a computer scientist if like >50% of the Computer "Scientists" we interview for very highly paid jobs, show actual fear of working at that level.
    They have the same "way above my head" attitude that a mediocre biologist might have to applying quantum theory to skin disease.

    Partly, as in the Kings College debacle it is lazy mediocre lecturers, but also CompSci grads frankly are not that smart, so they need their hands held.
    Although the seats get filled, they quality is in monotonic decline.

    --
    Dominic Connor,Quant Headhunter
    1. Re:Java for Dummies by Endymion · · Score: 4, Insightful

      Java is part of the dumbing down of CS.

      Java is the new COBOL. And we will regret it in 20 years for much the same reasons.

      It actually gives me hope that you have recognized this in hiring practices. That a CV with a list of Sun's Java buzzwords is not an indication of a useful programmer.

      I was disturbed in college (1997-2001) that things were changing towards Java and other idiocy. Too many people didn't get pointers and other basic concepts, and Java was hiding them even more. I believe it was the one class we had in assembly programming that really pointed it out - when confronted with having to deal with real hardware, most of the students didn't know what to do. Concepts like "two's complement" vs "one's complement" caused a strange brain-lock for them, as they were so sheltered from the actual binary math and hardware of the computer.

      It was only a handful of us that had been programming for years already (yay for the Atari 800XL) that had any idea of what was going on. The college (UC Davis) skipped entirely over very basic concepts like Von Newmann Architecture. I ended up having to spend most of my time trying to help my fellow students, there was so many fundamentals missing.

      I think the most frightening part was having to yell at one of the professors one day, because the basic data structures he was teaching were being done incorrectly. He was teaching people to leak memory. ("Let's allocate a huge linked list, and then just set the head pointer to NULL and consider it freed!")

      Sigh. It was frightening then, and apparently all my fears were justified, as now the entire discipline is getting a bad reputation. Unfortunately, I can't exactly disagree with that reputation from some of the CVs I've seen recently. My degree is destined fscked, apparently.

      You hiring? ^_^

      --
      Ce n'est pas une signature automatique.
    2. Re:Java for Dummies by tieTYT · · Score: 2, Insightful

      I am a headhunter[...] I have zero interest in kids who have studied "easy" subjects.
      You have zero interest in hiring kids that are in the most demand? Does your boss know you're turning them away? I think he'd be upset.

      To be wise in computers...
      Not to be an elitist, but you're a fucking headhunter. If you actually knew anything about what makes someone wise in computers, you'd be the first I've met. Every headhunter I've met thought SQL was a database and didn't know there was a difference between "C-pound" and C++.

      You can't know unless you've been developing 8 hours every day after work. Wanna know why? Because every day I work I am 8 hours more knowledgeable in my field than the day before. I doubt you're keeping up with me.

    3. Re:Java for Dummies by philipgar · · Score: 2, Insightful

      I doubt if even 1% of CS grads could write code to turn this BMP into a JPG, or even explain the ideas behind this.

      Just to harp on one statement in your comment. This is either an absurdly basic demand to ask of programmers, or an absurdly complex one. On one side, this is as simple as making a function call bmp2jpg(...) or whatever it is with the libraries they are using. The process of doing this is simplistic, and taught to the java mentality of "find the right tool in the shed to do your entire program".

      On the other hand the question you are asking could be one so absurdly difficult that it is unlikely you'll find more than a handful of people who just got a BS in CS will know (having a BS in Computer Engineering it is possible they might understand it, and having advanced degrees makes it even more likely). Expecting a CS student to be an expert in signal processing is rather silly. Even if someone was a computer engineer and was actually changing the JPEG code (a process I have done recently), it isn't expected that they understand the entire algorithm. They need to know the basic steps, and how the data flows through the process. They may even need to know the basics of what a DCT does (knowing the math behind it could be useful, but experts have optimized it so using a naive algorithm is idiotic). They should also know how Huffman encoding works, and any student who's taken an algorithms course should be familiar with such ideas. However at a low enough level, they really don't need to understand it. People spend entire careers optimizing something like a DCT, so to most programmers it should be seen as another tool.

      The point is that different levels of abstractions exist in different problems, and a good programmer (not necessarily a good CS student) should know what level of abstraction is necessary for the task at hand. Having someone who reinvents the wheel for everything is about as useful as a programmer who only uses canned solutions. It's finding the right mix that is important.

      However, one key points of this article is about the fact that CS curriculums spend TOO much time on programming, and too little on theory. A university is not a trade school, and students should learn the important theories and not the tools. However teaching a student when using the wrong tool is highly detrimental. And one thing that was observed is that while Java may make the introductory course easier, it causes problems later on when a student must know some other tool (such as pointers). Not having a good enough foundation can mean that the professor must waste a significant portion of a class teaching student the new tool.

      Phil

    4. Re:Java for Dummies by forgotten_my_nick · · Score: 2, Insightful

      Nearly every head hunter I have met has no clue what they are talking about when it comes to technology. They have a few fancy buzzwords, believe what they read in the local computer mag. They also try to inflate your CV to the customer they are selling you to.

      A bit like your post. I mean comments like "How can someone understand the Linux kernel without C & C++ ?". Why would anyone need to understand the linux kernel or C++ unless they were linux kernel programmers. Even so we have things called an "API" which allows developers to write to a kernel without having to know how the Kernel works or if it is even in C++.

      Also your comments on Java are laughable. Java is in use in day to day objects in real life. Phones, Set top boxes, Cars. It is not just web servers. There are even operating systems and emulators in Java which run fine. Go read up on JIT and stop living in the 90's.

      "In my experience, 50% could not work out how to develop a data structure for a bitmap that used palettes."

      And why would they? Unless they were looking for a job that does that. Seriously, if I was in an interview and they came out with the stuff you posted I would laugh at them.

  20. "Sure I know C!" by Durandal64 · · Score: 5, Insightful

    I'm kind of a proponent of having a student's evolution mirror the industry's, to an extent. Start them with C and then gradually introduce problems that were more and more difficult to solve in C. That way, when you show them C++ or Java, they can appreciate why these languages were needed and what classes of problems they're appropriate for and more importantly, what they're not appropriate for. But to really appreciate these things, you have to have students implement their own little OO runtime in C or whatever other procedural language. You can bet that after that, by the time you show them a true OO language, they'll know plenty about OOP, and things will just come more naturally.

    These students are being trained as engineers. They shouldn't be afraid of a little grease.

  21. 2 professors, 1 cup. by forgotten_my_nick · · Score: 2, Interesting

    I disagree with them. The flaw isn't with Java but with how it is most likely being taught to the students. They also undersell Java as a language. dot.com? seriously. And about using Java only for threading and reflection? Are they serious?

    I've taught grinds to first year students in Ireland in Java (I'm SCJP 14/5) and their professors do not even allow the use of an IDE when coding. They also grade them over Java patterns and OO rather then knowledge of the language.

    C/C++ have their place, but any good CS student normally learns a number of languages.

    I can code in a number of languages, certified in quite a few as well and I've never used Ada. Considering both professors work for a company that sells ADA stuff it seems a little biased and uninformed on Java.

  22. That's true by cgomezr · · Score: 4, Insightful

    I love Java, and I find it much more pleasant to use than C/C++, but I generally agree with TFA. I have seen many people doing things like this

    //build a string with 10K a's
    String as = "";
    for ( int i = 0 ; i < 10000 ; i++ ) as += "a";

    which creates 10K temporary objects to construct a single string*. This is because they started learning programming with a high abstraction level so they have no idea of what is going on behind the scenes. It's something similar to starting programming with one of these new "intelligent" IDE's such as Eclipse, which do lots of things for you so you don't have to figure them out for yourself. I think all these abstractions are great for people who already know how to program, not for beginners. You wouldn't give a calculator to 6 year old kids learning math, would you?

    I personally would being with C and then jump to Java. C is not so complicated as a first language if you don't introduce all its features from day one. It was my first language and I think it was a good choice, it shows you enough low-level concepts to be able to make efficient optimised code in higher-level languages. Besides, when you later jump to a more high-level OO language you appreciate the difference and learn it with interest.

    * I know modern compilers are able to optimise that automatically using a StringBuffer or StringBuilder. I just chose that (somewhat unrealistic) example for the sake of simplicity, but the same happens in other cases that aren't so easily handled by the compiler.

  23. Start with by www.sorehands.com · · Score: 2, Interesting

    They should start with assembly language and circuits. One should have understanding of the low level.

    Though you may not use assembly language much, it helps to better understand what is going on under the hood.

  24. Re:CS Newbie here. by forgotten_my_nick · · Score: 4, Funny

    Sure don't you know that C++ was just a cruel joke by the creators. ;)

    http://www.phy.duke.edu/~rgb/Beowulf/c++_interview/c++_interview.html

  25. Re:Pointers, References and Performance by Mr2001 · · Score: 4, Informative

    And because it's like that, you have heap allocations for every non-atomic data type, which is really the opposite of performance. Need a simple int[2] for the pipe(2) syscall? (let's just assume it, even if Java does not have)?

    try {
                    int fds[2] = new int[2];
                    pipe(fd); /* still check return value */
    } catch (memoryAllocationErrorOrSo) { ...
    }

    Why does this need to be so complicated [...] It doesn't. You've made it more complicated than it needs to be, by putting in an exception handler. What are you going to do in the unlikely event that there is an exception, anyway - fix it somehow? Free up another 8 bytes of memory to make room? Just remove that try statement, and let the exception be caught by your top level handler.

    And then there is this garbage collector that professors swarm about. Does it handle circles? Yes, it does. It's not a reference counter, it's a garbage collector. It collects garbage, i.e. any heap object that can't be reached by following a chain of references from a root reference (like a local variable, a static field, or an instance field of any non-garbage object). A modern GC won't be fooled by two garbage objects holding references to each other.
    --
    Visual IRC: Fast. Powerful. Free.
  26. Misleading concept ... by garphik · · Score: 2, Informative

    Software engineering is not just about writing a class / implementing a functionality. Its about a process and is lesser to do with what programming language you have been taught. Mostly it is to do with the Object oriented paradigm (C++, Java for example). OO has a lot of proven advantages.

    C, Lisp, and ADA are all different types of languages.
    I think the best way to learn programming is not just by mastering one particular language, but going by the programming principles; Just like if you learn to play a guitar, you can learn other the strumming instruments easily.

    Languages like assembly and machine code don't require learning one just needs a manual while programming.

  27. Re:Oh noes! Java is not C! by wbren · · Score: 3, Insightful

    And here's a radical concept: what about learning both types of languages? You know, the purpose of education being to provide a wide-ranging vision and not just with what your teacher happens to like.
    That's exactly what the article is saying, and clearly you are missing the point. They aren't really complaining about students that learning enough languages, but rather that students aren't being shown the bigger picture. A student can be taught how to use a linked list class in Java (or C++ for that matter), but that's not all you should know. You should also know the advantages of a linked list over, say, a dynamically-expanding array, as well as in which situation they should be used (or avoided). You should implement a linked list yourself at least once so you understand how it's done. That's just a really small example, but everything from speed optimizations (optimal buffer sizes with respect to processor caches, etc.) to enterprise-level application scalability relies on a deep knowledge of system architecture as well as language syntax.

    Many universities are simply training highly replaceable professionals, which is a big reason why outsourcing is such a problem. When two people--one in the USA, one in India, for example--have the same skills, the cheaper will be chosen (and rightly so, sorry). The point of the article is that many universities are simply training programming rather than teaching computer scientists. It's an important distinction, which some people just don't understand.
    --
    -William Brendel
  28. Low level languages by hubert.lepicki · · Score: 2, Interesting

    I come from Poland and at my university we started learning programming from Pascal, then C, assembly and C++/Java after that. I think Java is not damaging, you just have to know what is really going on under the hood. I think there is no plan to change this route at my university, which in fact I consider great. Even Pascal - outdated, boring and not widely used is important as it's syntax is frequently used in pseudo-codes in books or on lectures. Learning Java, not knowing low level languages or the way hardware works can lead to poor programming skills and prevents people from solving many problems related to performance etc, e.g: "why does my array behaves so slow when I swap 'i' and 'j' variables?". You have to understand how hardware and OS works, not in details but still!

  29. Java easy to lean is the problem by papaver1 · · Score: 2, Insightful

    I've seen this in couple of students I went to school with. During my CS degree at UT of Austin the CS department started migrating to Java as their primary language. Java is definitely a easier language to learn on, especially with its GUI environments and libraries. That is the main problem however. A couple of friends I kept up with after college had a really hard time picking up lower level languages.

    It's much easier to pick up higher level languages when you know the building blocks from the bottom. I wrote all my code in C/C++ in vim. Not using a GUI gave me a good understanding of how code works. Like managing files and linking object files and libraries; using certain flags to enable compiler options. I think once one is familiar with these concepts a GUI is great to become more efficient and not have to deal with such rudimentary task sometimes. But if you never learn these concepts you are losing out.

    C/C++ helped me hang myself in college. It was grueling but worth it. I've picked up most languages I've tried pretty easily. I've coded/scripted in C/C++, C#, Pascal, Haskell, Perl, PHP, ASP, HTML, SQL, VB, Bash, MEL, LUA, UnrealScript. It's better to stick the pain out in college than try to figure out pointers and such when you have a job and there are deadlines to meet and the possibility of getting fired if you keep slipping.

  30. Better CS programs don't teach languages anyway by Bryan+Ischo · · Score: 4, Insightful

    The better CS undergrad programs don't really teach languages per se. The main focus of the curriculum should be the theoretical underpinnings of computer science, combined with the practical aspects of software development. Since languages themselves are part of the practical aspect of software development, in addition to also being the focus of some computer science theory, it is unavoidable that languages should themselves be studied to some degree, and also used to a large degree to practice the theory that is being taught. Most theoretical CS only really needs 'pseudocode' to illustrate the concepts being discussed. But since students are often asked to write programs to demonstrate their understanding of the subject matter, a real language is unavoidable. But the language itself is secondary to the real meat of the subject, which should all be mathematical and theoretical in nature.

    At CMU the very first CS class (that losers like me who didn't AP out of the first CS course, mostly because my high school didn't even have computer classes let alone AP computer classes!) really did focus on teaching a language - Pascal - and a significant part of the class was the learning of the language. It was the least useful CS class I took in the long run (not surprising, as an introductory course in any subject is likely to be the same). Subsequent courses would spend 1 - 2 weeks going over the fundamentals of the language to be used in coursework for the remainder of the class (which in some classes was C, in some was C++, some used ML, others Scheme, etc), to get everyone started, and after that, you had to figure it out on your own in conjunction with actually learning the theory that was being taught. It really isn't that hard to pick up a new language once you know a couple, although I did have a hard time with ML, mostly because I was completely unmotivated to learn it, feeling that it was absolutely useless to know (I was right).

    No really good CS program has any classes with names like "Java 101" or "Advanced C++". To use a carpentry analogy, I would expect a really good carpentry school to teach the fundamental rules and "theory" of carpentry, so that the student upon graduation really understood what carpentry was all about and could apply their knowledge to aspects of the subject that they hadn't even encountered in school. I wouldn't expect a good carpentry school to have classes like "Advanced Hammering" and "Bandsaw 101". The courses would instead be "Introduction to House Frames" and "How to Construct Joints". You'd be expected to learn the use of the tools in the natural course of studying these subjects.

    It's the same for CS. Good programs don't teach the tools, they teach the *subject*; learning the tools is intrinsic in the study of the theory.

  31. Start simple and use different types of languages by anandsr · · Score: 2, Insightful

    I would think the best language to start with is quite possibly C. Pascal used to be better, but its no longer used. I personally would prefer a scripting language like Python or Perl. I think scripting languages are better because there is no complexity of the compiler involved.

    I would think it better to have functional language next. Students are much more receptive in the earlier years, and Functional programming does take some getting used to. I don't know much to recommend these languages ;-).

    After that I would take an Object Oriented Language, Preferably Java. It is a nice Object Oriented Language.

    The important thing is that these languages must not be taught as languages, but as a tool to understand some Computer Science subject. For example we had something like this in my science courses

    1) Data-Structures : Pascal
    2) Linear Programming: FORTRAN
    3) Programming Languages : Lisp
    4) Graphics: C (Now it would be better to use something like C++)
    5) Systems Programming: Assembly
    6) Filing Systems / Database: Cobol (I would think java would be good here)
    7) Artificial Intelligence: Prologue

    I think now the layout now could be
    1) Data-Structures: C
    2) Mathematics (Set-theory, Combinatronics, Boolean Algebra, Linear Programming): Scheme, (C for Linear Programming)
    3) Graphics: C++
    4) Systems Programming and Operating Systems: C, Assembly, and shell
    5) Databases: Java
    6) Windowing Systems: Java
    7) Compilers: Perl and Yacc
    8) Artificial Intelligence: Scheme

    I am not sure Ada is required as such, because it is not used as much as other languages. I think having different types of languages will put enough base in people to learn Ada later on if required. I would have liked to fit Python somewhere, but I don't know where ;-). It does everything well but nothing specifically better.

    -anandsr

  32. I think they have some credibility by jesterzog · · Score: 2, Interesting

    Maybe Ada is helpful for learning concurrent programming and safe typing, but I'll wait for the opinion of a slightly less partial party.

    You might be right, but just because they're involved in Ada doesn't necessarily make them biased towards it -- it does mean that they probably know a lot about it. What actually matters are their teaching qualifications and their understanding of what's important.

    They might just as easily have come to be involved in Ada because it met all their requirements as a good language with flying colours. If they have experience teaching and working with other teachers and teaching in other languages, then I think it's perfectly reasonable for them to comment on this and be given some credibility. (As it is, I can't personally tell for sure just how much experience they've had.)

    If you ignore everything someone says simply because it looks like they have a reason for saying it, there would be almost nothing to listen to. After all, who else is going to stand up and say that a language like Ada is better for something besides the people who actually design and use it? They are the people who would understand it best, after all... and there would have to be a lot of them before anyone even tries to run a visibly independent review.

  33. Java is like "The Incredibles", or a circus by IBitOBear · · Score: 4, Interesting

    I you make everyone special, nobody is really special.

    Every time someone tells me that there are no pointers in Java I laugh a little. EVERYTHING in java that isn't a scalar is actually referenced through pointers. That is, you declare the pointer variable and then "new" the object into place.

    They are just incredibly _boring_ pointers. You cannot math on them. There is no sense of location to those pointers. But the absence of interesting pointer operations, and the absence of the _semantic_ _copy_ operation is what all this alleged pointerlessness is all about.

    I have only two _Real_ problems with java... (okay three if you count the complete requirement that you constantly have to deal with exceptions even when you know they cannot really happen, and if they did, you would want the thing to abort all over the place... but I digress)

    (1) Java has no useful destructors because no object has predictable scope. If you think finalize methods are the same as destructors then don't bother responding, you don't know what destructors are...

    (2) Since everything is a pointer in Java, you have to bend over backwards to pass-by-value. The fact that the language doesn't even begin to provide copy-construction semantics. What a miserable PITA.

    Now the _dumbest_ thing about java is that they were so set against multiple inheritance that they never bothered to ask themselves why _every_ OO language starts out life without multiple inheritance only to have to add it later. By making everything a proper linear subclass of Object, they left themselves with having to graft on "interfaces" which is just multiple inheritance with the "bonus" of completely preventing default implementations. (Which lead to delegation etc.)

    The way the language keeps sprouting things it claims to never have and never need, well it's very like watching a clown car endlessly explode with ridiculous archetypes. After a while it just isn't funny any more.

    So yea, teaching people Java as an introductory language is something of a disservice if you ever want to make them truly think about programming and what makes some things machine smart, while others are machine stupid.

    --- BUT ---

    I worked in education for years. The fundamental problem with computer science education is that it is being taught by computer scientists instead of educators. We are stuck learning from the people who learned from the people who made it up. None of these people ever learned to EFFECTIVELY IMPART INFORMATION.

    Consequently, the students are largely unemployable on the day of graduation.

    The classic computer curricula seems to consist of throwing three or four languages at a kid in the hopes that they will "just kind of figure out this programming stuff."

    The field of computer science has not yet come up with a "basic theory"... a starting place... The list of things a student simply must know before you start filling their head with syntax.

    And so we are a bunch of prelates training our acolytes in our special, individualized deeper mysteries.

    And that's what everybody is doing worldwide, so our graduates are just as lame as everyone else's...

    Cue "Enter the Gladiators"...

    --
    Innocent people shouldn't be forced to pay for inferior software development.
    --"Code Complete" Microsoft Press
    1. Re:Java is like "The Incredibles", or a circus by imgod2u · · Score: 2, Interesting

      Every time someone tells me that there are no pointers in Java I laugh a little. They would be correct. Java contains references, not pointers. The distinction is obvious to anyone who understands C++ as it has both (& for references, * for pointers). Pointers are mutable, references are not. This makes references (somewhat) safer to use and also allows a garbage collector. It also means it has a lot less functionality (particularly as an iterator).

      Java has no useful destructors because no object has predictable scope. If you think finalize methods are the same as destructors then don't bother responding, you don't know what destructors are And here I thought Java had no destructors because you had a garbage collector. There's an easy way to "destruct" an object in Java:

      myThingy = null;

      Granted the actual memory won't be deallocated until the next garbage collection cycle but the object is lost as far as the programmer is concerned and the memory is usable if needed.

      Since everything is a pointer in Java, you have to bend over backwards to pass-by-value. The fact that the language doesn't even begin to provide copy-construction semantics. What a miserable PITA. new ObjectType(myOtherObject) works fine and almost all classes in the standard library has a copy constructor. There's philosophical arguments about how many features you want to be part of the language syntax as opposed to part of the library. Just because you favor the former does not make it superior.

      As to passing by value. Why would you be doing that for anything other than scalars (which Java does pass-by-value) anyway?

      So yea, teaching people Java as an introductory language is something of a disservice if you ever want to make them truly think about programming and what makes some things machine smart, while others are machine stupid. With compilers the way they are today, such knowledge is not necessarily useful and/or even related to the desired field of study/work. Someone concerned with algorithm scaling really isn't interested in saving a few scalar bytes of memory here and there.

      I am glad my introductory algorithm classes were taught in Java. The same algorithms were used in a C++ class later on. The Java class was to actually teach you the algorithms. The C++ class was to teach you memory management. The algorithms just so happen to be a very good exercise in memory management.
  34. Beginner language? by Jartan · · Score: 4, Interesting

    People learn a lot through failure and pain. C is clearly the perfect choice when you look at it this way.

    1. Re:Beginner language? by Shohat · · Score: 2, Insightful

      That's bullshit
      C is a perfect beginner's language. When something is wrong, you know that YOU did it, not the compiler, not some class or wrapper or interface you have never seen, not the VM, or some bug or leak or god knows what.
      I write for real-time control systems (thermal/air/chemical, etc...) in C , for PIC and NEC microcontrollers, and I've written Java servlets and PHP (5, OO) for myself.
      When I write something like
      shortPointer=&(BYTE *)&Short_Transmission+2
      I know exactly where I point, what kind of data is there, how I handle it and what can change it. If something is messed up, I KNOW I did it, and I shouldn't google around for workaround, a bug fix or some undocumented feature.
      Learning programming should start from the point where you have full control over your code and data, and build up to the level of Java, where very often you handle little more than instances of objects that you just happen to understand enough to use.

  35. What is the purpose being served? by jdickey · · Score: 2, Insightful

    If what is desired is the training of hordes of marginally useful, low level hacks who can be easily replaced by the Bots from Bangalore, we're on the right track. Someone obviously noticed that their "bachelor's" degrees are 2-3 years and "master's" is a year on top of that. It's not politically or economically acceptable (to the schools) to do the same thing, yet they're under pressure to produce drones who can be easily replaced. Hence the insectlike specialization inherent in a lot of "IT" "education" for the past decade or so.

    Back in the day, "computer science" apparently had a strong liberal-arts component, with topics such as logic that are traditionally taught by philosophy departments. By gaining a solid grounding in theory, compiler design, and different languages, a CS graduate could reasonably be expected to fit into a wide variety of roles. By the late '70s and early '80s, that had been folded into the engineering schools in many universities; CS was seen as a subset of EE, and CS underclassmen generally had the same requirements as any "other" engineering underclassmen, getting precious little specialization until their junior year. We all know how well that turned out; it's what led to the "industry-focused" "curricula" of the late '80s and '90s. Education became a byword for vocational training, with an ever-shrinking set of currently topical skills being taught; shrinking largely because the American (and, to a lesser degree, Canadian and British) lower public educational systems were being systematically raped and dismantled by the political trends of the day. Johnny can't program? Well, that's to be expected; he can't read or write past what for half a century was deemed a third-grade level by the time he hit university.

    Rather than solve that problem by re-broadening (all levels of) education, industry "solved" it post-1990 by offshoring everything that didn't involve a well-paid management position, and bringing indentured labor (via H1B visas in the US, for instance) for positions that were deemed "too difficult" to offshore. Everybody dranks the purple Kool-Aid for a decade and more, paying little attention to the fact that failed projects where becoming more and more common, and more and more costly. Instead, approaches like XP were introduced and sold, not on their very real merits, but on the idea that "this will help failing projects fail faster, earlier and cheaper".

    What ever happened to the idea that the project shouldn't fail at all? Or, more heretical still, that software shouldn't fail at all? We put our lives at the mercy of software whenever we get onto a modern elevator, a recent-model airliner, or an automobile with electronic fuel injection. We put our wealth and comfort in the hands of software much more regularly. I recall one day back in early 2002 when I walked into the local branch of my bank, to be greeted by the sight of every "terminal", including at the teller windows, displaying the Windows "blue screen of death". I walked out, came back the next day, closed my account and took my money to a different bank. I was, according to the local newspaper, far from the only one to do so.

    Our society is and will remain completely dependent on the correct functioning of computer software for its continued health and growth, if not survival. We, as a society, are being extremely shortsighted and apathetic by tolerating the status quo without examination or serious discussion. Which of these "sensible" "reforms" of the last 20 years will be the equivalent of the Romans' engineering decision to use lead as the lining of their water pipes?

  36. Re:Pointers, References and Performance by MythMoth · · Score: 2, Insightful

    Fail gracefully? I mean, at least attempt to close the open files, sockets and whatnot They weren't opened in the shown try block, so closing them in its catch block wouldn't be appropriate; there should be a higher level try/catch to handle this. At the point of failure shown there's nothing much that can be done, and I agree that the AC was adding complexity to bolster a completely bogus argument.
    --
    --- These are not words: wierd, genious, rediculous
  37. This guy is about as unbiased as Stroustrup! by MCTFB · · Score: 5, Interesting

    99% of what you learn as a programmer you don't learn at college anyways (at least the people who don't totally suck at programming). Furthermore, unless you have one-on-one mentoring from a senior programmer or professor who has at least 10 years of solid professional coding experience under their belt, not much else is going to help you other than you and yourself in maturing as a programmer.

    Most CompSci college graduates are totally unproductive on their first job. They can be put to work on trivial things, but no matter what school they came from, they are just going to need a lot of hand-holding to make it through the first year. That is just how it is. Doing coursework at school is no substitute for coding on a meaningful project, whether it be work related, something open-source related, or just something for fun. That is the honest to god's truth as a software developer for over 12 years now and I don't even consider myself even that wisened in the field (maybe after 20 years I will feel differently).

    Now, with respect to Java as an introductory programming language, it is not bad but not great either, however the purpose of any introductory course to anything should be to capture the interest of the people who are curious enough to take the course in the first place. Back in college, we started with C (most of my peers had already been programming since they were teething but this was CMU) and if not for my persistent no quit attitude in life, I probably would of given up programming right then and there because spending your entire night trying to debug a trivial program not because you didn't understand the material but because of one stupid uninitialized pointer turns a lot of people off right then and there who may have had the potential to be great programmers, but because their first impression of programming was so bad, they gave it up before they got to learn more about how great programming really is.

    Oh yeah, and the not relevant at all math courses didn't really help much either. Whenever in your career you need to use some advanced calculus or discrete math, you will have likely forgotten about 99% of it and need to look it all up in a book anyways. Besides, 99% of programming projects in the real world basically involve high school level algebra and not much else. What separates the productive programmers from the unproductive ones is not who got a better grade on their math course back in college, but those who innately understand systems and are willing to make the extra effort to learn all about the gazillion design patterns available to programmers so that when they are faced with a difficult project, they will not waste inordinate amounts of time reinventing the wheel.

    As for understanding computing at a rather low-level, as is the case with a class in operating systems, then yah Java might not be such a great choice, but then again learning C is easy because C is made up of very simple constructs (C++ is another story). However, using C productively just requires a crapload of practice/experience to be good with, not necessarily a whole lot of computing expertise. In addition, the mastery of whatever API's you happen to be basing your career on is paramount as well. In the real world, employers don't want to hear "but I can learn anything quickly" because mastering some API's can take 6 months or more so if you come out of university with no specific skill sets, it is going to be really hard to get that first job because unless you can be productive soon (or even on day one), you are useless as far as employers are concerned. Also, though I don't program in Win32 professionally myself, from my understanding it takes at least 3 years of non-stop work with those API's just to be semi-proficient in them. Professionally, most of my work over the years has been in Java, and Java is probably scary to a lot of neophyte programmers these days because since 1.5, it has unfortunately turned into the bastard child of complexity like its twisted sister C++.

    Last but not

  38. Java == Jobs by pinkfloydhomer · · Score: 3, Interesting

    I am not especially fond of Java myself. In fact, my focus has been precisely with lower level languages like the ones mentioned in the summary. I would love to work with these languages, preferably with tasks that where algorithmically and mathematically challenging etc.

    But I have not been able to find any such jobs. Job databases show 90% .NET or Java jobs. The summary makes it sound like there is a great demand for my skills, but where are the jobs? /David

    1. Re:Java == Jobs by asc99c · · Score: 5, Insightful

      I think a lot of employers advertise Java / .NET as a lot of employees believe that is the new thing and the way forward. i.e. C programming is on the decline, and (young to middle aged) employees don't want to get too far behind the times. Older employees might instead make a selling point of their skills.

      I'm mainly a C programmer these days, but I took the job basically understanding that I would be working significantly with Java. That was the only language I had experience with on leaving Uni, and I was promptly put to work on a Pascal / OpenVMS system! Friends from Uni have had similar experiences.

      I have been a bit worried about an outdated skillset as lots of employers ask for lots of object oriented programming experience and I only occasionally use this. I think this would be my primary problem if I started looking for a new job. I also think it's a bit unfair as the skills are pretty transferrable - there's only a little new theory to learn and after that, good programming practices aren't hugely dependant on language used.

      In dealings with many (perhaps even most) other companies whose software I write interfaces with, it's pretty clear that they are also using C or C++, and often even older systems (in one interface we have to convert our messages from ASCII to EBCDIC). You can frequently tell what language the other system is from the sort of errors that crop up, and sometimes from the design of the interface. I'm forced to believe that my area of the industry is still primarily C based.

    2. Re:Java == Jobs by timster · · Score: 2, Informative

      I had to explain to him how the computer handles twos complement works in binary and how a binary 1 converted to integer would be -1 and 0 would be 0.

      Maybe I'm not reading this right, but a binary 1 (as in 00000001) interpreted as a two's-complement integer is positive 1, not negative 1. -1 would be 11111111. Maybe this doesn't have much to do with your point, though.

      --
      I have seen the future, and it is inconvenient.
    3. Re:Java == Jobs by aldousd666 · · Score: 4, Insightful

      There are many jobs in .net and java yes. I hated Ada in school, and particularly difficult was FP. But once we got to assembler it all made sense. It was the guts of the system, and I finally saw how it all fit together. Once I saw data structures, and then had a look at how stack based code was generated from all of the other languages, I felt like I could learn any of the languages and not feel like I was using a black box. In my opinion, it's ok to learn java and C# in school after one has had a look at the internals, perhaps a primer in virtual machines. That would cover the bases of actually knowing how computing works, in addition to allowing for the preparation for job markets. One thing that's absolutely crucial to a computer science grad in the real world is being able to adapt to any language when needed, so all of this argument over which language to learn is a little off the mark. You should learn programming in general in school, and optionally focus on any language of the day for the market after you've become versed in the art in general. I realize that 'becoming versed' while in school is a little bit unrealistic as well, but if you've at least been exposed to the concepts at a lower level, it doesn't leave you scratching your head as much in practice when you can't figure out, for example, why your C# code makes a distinction between stack and heap allocated structures, and what impacts it has on performance and all that. It also means that when security holes are pointed out, or patched, you at least know what the hell is going on, and why it was a big deal to begin with.

      --
      Speak for yourself.
    4. Re:Java == Jobs by Phleg · · Score: 5, Insightful

      I have been a bit worried about an outdated skillset as lots of employers ask for lots of object oriented programming experience and I only occasionally use this.
      What's stopping you from learning a language on your own, for fun? If you think employers won't care about non-professional experience, you're either simply wrong, or working for employers who hire crappy programmers. Where I work, we'll likely throw your resume in the trash if it doesn't have Haskell, Lisp, Ruby, Python, OCaml, Scheme, Scala, or some other obscure, clearly self-taught language on it.

      I think this would be my primary problem if I started looking for a new job. I also think it's a bit unfair as the skills are pretty transferrable - there's only a little new theory to learn and after that, good programming practices aren't hugely dependant on language used.
      You're far off here. This seems to be a prevailing thought, but it just doesn't bear out in practice.

      As code gets more complex, the best way to keep it understandable to others is to follow common language idioms, indentation / code formatting practices, and use built-ins in the standard libraries. These alone often take months to become familiar with, but that's only half of it. The other half I can only describe as trying to approach problems from the unique perspective of the language. Any asshole can jump from Java to Ruby, or from C++ to Lisp, or from VB.NET to Scala. But learning how to solve problems using those languages' strengths, rather than writing code as you would in the language you're coming from, is crucial.

      From my own experience, Java programmers coming fresh into Ruby don't use blocks. When you finally convince them to use blocks for enumerators, they miss the point entirely and simply use each_with_index for everything, rather than more powerful methods from functional programming like map. They also don't like to reopen classes. In Ruby, classes can be added to at will, so if you want a method to calculate the average value of an Array, you can simply define it as a new method on the class. But Java programmers will create a Util module, throw a method in there that takes an Array, and think nothing more. It's not wrong, per se, but it's ignoring Ruby's strengths, and simply writing Java code inside the Ruby interpreter. And the people who do this are bloody useless.

      My rant is getting long, but the main point is this: learning syntax for a new language is easy. Learning to use that language properly (much as a screw is used differently than a nail) is crucial to being able to work with other people, and getting anything meaningful done.

      --
      No comment.
    5. Re:Java == Jobs by Pengo · · Score: 3, Interesting

      I agree, Java does equal Jobs.

      But C and a C++ background will help you keep that job.

      It's very hard to be taken serious as a computer programmer, even a Java one, if you aren't able to understand memory allocation, points, etc. Often times it's critical to understand that so you can understand what the garbage collector is doing.

      I'm the director of technology for a small/medium company (about 5 programmers), and when I'm interviewing a new job candidate for a Java position, during the interview I ask them to explain to me how they would achieve writing a linked-list in Java without using the collection class.

      Interesting some of the responses I get. :)

    6. Re:Java == Jobs by SatanicPuppy · · Score: 3, Insightful

      They taught mostly Java where I went to school, though "taught" isn't really right. They didn't "teach" by languages at all, it's just that the programming projects mostly tended to be in Java, unless the class concepts were better suited to something else.

      Mostly the classes were theory, concepts; stuff that applied equally to all languages. It was weird in some ways; I had a networking class that assigned the eternal "create a server/client chat program" project, where part of the project was a Java GUI. At this point, I'd never programmed a GUI, and neither had anyone else I talked to. The response of the TA (who was the only one who'd ever give programming advice, because the professor only dealt in theory), was that GUI design was beyond the scope of the class and we'd just have to figure it out.

      My method for figuring it out involved downloading a Java editor, and using the GUI design tools. It was the first time I'd used a graphical editor for Java; it was encouraged to do the work in VI or Emacs, and generally, that's all we did.

      Now I hated that crap at the time, but nothing has prepared me better for my day to day life than having projects dumped on me where I had to goddamn well use my initiative and figure it out. Over and over again, I was forced to go out and read and work out for myself how to translate the theory into code. These days, I program in Java about 20% of the time. I'd hardly say it stunted my abilities, and it certainly didn't make me into a cookie cutter corporate programmer.

      I'd have to say that specifically teaching any language is a problem. They all come in and out of fashion. I work with a guy whose mind is stuck in Visual Basic...And I don't mean .Net. The idea that you should focus on intellectually sexy teaching languages (like goddamn SCHEME) because it builds character or some crap...I just don't buy it. Language is a tool, and should be treated as such.

      --
      ad logicam Claiming a proposition is false because it was presented as the conclusion of a fallacious argument.
    7. Re:Java == Jobs by raz0 · · Score: 2, Insightful

      Reopening a class certainly has it's drawbacks too, which is why I mainly try to avoid it. There's a good reason why almost? all the core Java classes are final.

    8. Re:Java == Jobs by smallfries · · Score: 2, Informative

      Ouch three replies and nobody got what he was saying.

      A single binary 1, would be -1 in 2s complement. You are talking about bytes, as in 8 bits. He is talking about a single bit, for which the two values are -1 and 0. The key word in the description is single.

      --
      Slashdot: where don knuth is an idiot because he cant grasp the awesome power of php
    9. Re:Java == Jobs by raddan · · Score: 4, Insightful

      Sorry, that's just not the case. OO is just a formalization of what was already happening with good procedural programmers. OO is not fundamentally different that procedural programming-- it is a superset. OO languages force the programmer to do certain things: code modularity, polymorphism, typedefs/classes, etc, and does so in a way that encourage a programmer NOT to come up with their own system to do the same thing.

      If you look at developers who spend a lot of time doing things in C (e.g., the OpenBSD developers-- have a look at their repository), you'll see that they are keenly aware of "object-oriented" design principles. They also tend to know exactly when things like byte alignment is an issue, and when you really should just use a void pointer, because they are forced to think about their machines. Most OO programmers I know have no idea why they would need OO language features-- they just use them because that's what they've been taught-- and they know next to nothing about the machines themselves. I would argue that a good programmer is a good programmer; and if they have standard procedural programming experience, that will nicely complement their future OO work.

      GP is right-- OO is simply a design philosophy. The actual mechanics of building an application are no different.

    10. Re:Java == Jobs by HiddenBek · · Score: 2, Funny

      There's an even greater danger. A while ago, I was trying to make toString return a length, just like you suggested. Great minds think alike hey? Anyway, I was reading the API docs and eating my donut, and, wouldn't you know it, I dripped some jelly from my donut into my computer. Now, I know what you're thinking, just lick it out right? Well, that's exactly what I tried, and let me tell you, that's a bad idea. I even had to go to the hospital. But Java didn't say ANYTHING ABOUT THIS! Not even a compiler warning. What the hell? The doctor said I could have been killed.

      Also, did you know that you can override the paint method on a JFrame? The paint method. The method that does the painting. Why, someone could override that method with some code to show a naked picture of themselves, then forget they did it, then accidentally install the application on every computer at a catholic school. I bet they'd have to register as a sex offender and the girl scouts would stop coming and then where would they get their thin mints? I really miss think mints. I filed a bug report, so here's hoping this dangerous behavior gets fixed in the next release.

  39. Re:Why is "Computer Science" Staffing S/W companie by wrook · · Score: 2, Insightful

    I think you're missing my point. If you want to learn theoretical computer science, where would *you* go to learn it? Because they don't teach it at universities in general (with some notable exceptions). They churn out professional programmers, who would actually be *much* better off (in terms of being good programmers) to just spend those 4 years writing code.

    The comment about my degree was flippant, I admit. And it's been 25 years since I took that degree. So it's only in retrospect that I realize it's worth (or lack thereof). It got me a job. Without that piece of paper, it would have been difficult for me to break into the field. But it did *not* teach me anything about CS. Nor did it get me to a point where I could realistically do meaningful graduate work in the way, say, a physics graduate would have. But I had lots of trivial information about systems that were in use at the time (if you know what IEFBR14 does, then you understand what kind of systems those were. If you don't, be *very* thankful!)

    I take your point about researching the degree, and if I had known what I know now, then I would have known to go to those few schools that actually teach CS. But here's the thing: when you don't know something, you don't know what you don't know. Now that I've spent the last 2 and a half decades writing and reading, I'm beginning to understand what you need to know in theoretical CS. I at least have an idea of what I don't know. It is not reasonable to expect someone who has not done that work to know what is out there. But most professors who do research in CS know this. So I don't excuse them.

    And the point of my rant remains. The purpose of the university is basic research. Most universities are not training graduates (even grad students) to a level where they can do basic research in computer science. They may very well be providing a function for industry by churning out people by the tens of thousands with an introduction into the hot programming languages of the day. But that's the function of a technical college.

    What we risk by not investing in basic research is a stagnation in computer theory. Marvin Minsky proved that perceptrons can't compute everything. Then in a off hand comment said that he didn't know if multi-level neural nets had the same problem. It took something like 10 years before anyone even checked. In other areas, programs are getting more and more complex all the time. If we can't find ways of representing that knowledge in more expressive forms, then we will just hit a glass ceiling. By choosing to train programmers and neglect theorists, our whole profession loses. *That's* what I'm complaining about.

  40. It is a coursework issue, not a language issue by what+about · · Score: 2, Interesting

    Why is the professor whining about Java (or C# for that matter) instead of teaching what he think is "useful" ?

    I suppose he will say that there is no time.... well then either make the course longer or more focused !

    Java/c# have solved a number of bugging issues in programming, do we want to program using tools that helps our job or tools that hinder us ? NOTE: I do not think that java is good for Device drivers or OS, but if you do GUI or any other higher level stuff.... why not, just to have fun with pointers ?

    If you really want you can reach the "guts" of the OS even from Java, but unless you really need to why bother ? for fun ?

    Another thing, only Java is mentioned, why not c# ?

  41. Lisp by wikinerd · · Score: 3, Insightful

    Professors who care about students's education teach Lisp and Scheme. I had a professor who taught us Scheme in his free unpaid time after the main lecture. The university did not include it into the curriculum, but he explained to us why Scheme is important, and those of us who understood its importance choose to stay and listen to his unpaid unofficial lectures on Scheme. The reason these languages are important is in the mathematical thought that lies behind their structure. Every language has a way of thinking behind it. Some languages are procedural, others are functional. It is these paradigms that are important in a curriculum, because most mediocre programmers who get to program using one paradigm usually stay with it for a lifetime and never get to learn another. So a university should ideally offer courses on all available paradigms to make sure future programmers can choose the one which is the most productive for every specific project.

  42. And ignorance is key to bad habits by Moraelin · · Score: 4, Insightful

    Yes, abstraction is key to tackling complexity. But equally, having no clue what happens behind that pretty Java code is the key to writing bad code and spending time debugging what you shouldn't even worry about.

    Guess what? Even in Java, pointers still come to bite you in the arse when you least expect them. I see people every day who have trouble understanding the difference between "==" and "equals()" in Java, because they never learned the pointers behind them. They're essentially one abstraction level too far from understanding what their own code is doing.

    Or even in Java learning why you can't modify an "int" parameter, but you can modify the contents of an "int[]" parameter, guess what? Requires pointers. People end up doing all sorts of unnatural metal contortions to remember when passing by value isn't really passing by value, when "it's a pointer" would sum it up perfectly.

    And it shows. I've had people come to me half a dozen times with basically the same idiotic "auugh! Java's Hashtable is broken! I added a new value, and when I look into its array with a debugger it replaced my old one!" When in fact, it was only added a node to the front of the linked list. But they don't know what a linked list is, nor what a hash table really is, nor how a Node can contain another Node, without a concept of pointers. Worse yet, not only I see them spending a week debugging Hashtable, I see piss-poor workarounds done to prevent it from doing its job.

    Or I see burger-flippers-turned-programmers occasionally get the real programmers fired for doing the right thing. Like using a "==" where it's correct to use it. But the burger flipper doesn't understand that. He learned some "for String use equals()" mantra, and he'll apply it and preach it, cargo-cult style, without even understanding what he's _doing_.

    Or I see people think that optimization means replacing two lines with a one line call, because they have no fucking clue what the machine does with that code. They think that speed is measured in lines of code, because noone explained to them otherwise. So they wonder why their replacing two ifs with a catch is actually slower. (And I'm not getting into the many ways such a catch can make the code less secure, for example, by assuming that a real exception is just their loop reaching the end of the array.) Exactly what throwing an exception does, is a mystery to them.

    Etc.

    No, noone said you must keep programming in "a language where even K&R wrote unsafe code, nor that difficulty equals worthiness. But it helps to be at least exposed to those concepts once, even if thereafter you go on to program in Java or VB for the rest of your days. The fact that you worked with pointers once in C and managed to get them right, _will_ show in your Java code too.

    Probably the best thing that helped my coding was doing assembly on my parents' old home computer, back in high school. In fact, in hex, because that ZX-81 with 1k RAM didn't even have enough RAM for an assembler. Wrap your mind around _that_, if you think C is too hard.

    Would I advise anyone to write a production program in assembly nowadays? Nope, God forbid. I wouldn't have advised writing a whole program in assembly even back then. But understanding the machine behind that high level stuff will show even in your Java code.

    And, yes, not every architect needs to be a Michelangelo. But it helps if they're not a clueless moron who can't even build a doghouse right. You can see plenty of architects nowadays who can't even get a basic house right. They know how to draw an artsy sketch of a house, but they have no clue how to calculate it to actually stand upright or what materials to use so it doesn't get damaged by rain within a year or two. And/or need a civil engineer to fix their elementary mistakes. Maybe it wouldn't hurt that much if they knew a bit more, ya know?

    --
    A polar bear is a cartesian bear after a coordinate transform.
    1. Re:And ignorance is key to bad habits by DerWulf · · Score: 2, Insightful

      Yes, a programmer should be able to grasp the concept of pointers, no argument there. But as you said yourself this concept is also necessary in Java. So, what was your point? That badly trained programmers are bad?

      --

      ___
      No power in the 'verse can stop me
  43. Just as an extra anecdote by Moraelin · · Score: 4, Funny

    Just as an extra anecdote and illustration of what happens when such people finally get told about pointers (but still don't quite "get it"): one team's architect actually told everyone to use "Integer" instead of "int" in method definitions everywhere, because it's faster! See, it copies only a pointer instead of the whole int!

    Yeah, that guy was quite a bit less than a Michelangelo.

    --
    A polar bear is a cartesian bear after a coordinate transform.
  44. Why We Teach Java by fartrader · · Score: 5, Insightful

    As a CS Professor, here are some of my thoughts on this article:

    (1) Java is what the market wants. Yes, we can teach any other language under the sun. But the reality is, that the software industry values individuals who are Java-literate. By this I mean an individual who has a basic understanding of the OO principles that the language is founded upon, can write Java code using common tools, and has at least some insight into some of the more common Java APIs. Any learning institution that doesn't take this into account when designing their curriculum is doing a serious disservice to their student body. While some do go to University for the sheer joy of learning a subject - most are there to ultimately get a job.

    (2) In my opinion there is something seriously wrong with a Java course that emphasizes Swing or Web development, rather than the fundamentals. Yes, its important to get things in and out of a program, but, at least initially these should be incidental to the main event. Learning the language, and applying it effectively. Thinking in an object-oriented way, which many of you know is not necessarily an intuitive way to look at the world - especially if you already have a procedural background. GUI and web application development should be separate, advanced courses.

    (3) I sometimes lament the lack of insight into pointers, but any professor worth their salary will spend some time discussing the Java object reference architecture, and relate that to pointer-based languages. Regardless of how abstract your language is "opening up the hood" and demonstrating how things work, and why things have been designed the way they are, is often worth knowing.

    (4) I laughed when I read the article about Praxis, especially the part about formal methods. Are they serious? Yes I was taught formal methods in school, and could understand *why* I'd want to use them... If I had all the time in the world... a huge budget to burn and customers not screaming for something that the business needed yesterday. Praxis offers software development based on formal methods and as a consequence occupies an important (and probably expensive) specialized niche of the software ecosystem. To suggest that this approach should be the norm and lament its absence really betrays that the authors have spent too much time in academia and not enough in the real world.

    (5) Ada is a great language - in fact I learned Ada 83 as a first language along with C. It just isn't relevant to most software development companies or IT departments - if indeed it ever was. I worked on a research project that was part of the Ada 9X Real-Time initiative - the main users were aerospace and military vendors - particularly embedded systems. There you do need to know about concurrency and distribution - along with hard performance deadlines and often a slew of safety and mission-critical issues you need to consider to do a good job. However, I fail to see the general relevance of Ada to a commercial market that is primarily interested in "simple" information systems, getting information out of a database and/or putting it in - with some processing on route. Why should I use Ada when the market in general doesn't use it?

    (6) We teach concurrency - its useful stuff to know. I think that using formalisms to describe concurrent programs is going a wee bit too far (see (4)) above.

  45. You get what you pay for... by bcharr2 · · Score: 2, Insightful

    The colleges would teach computer science if businesses were willing to pay for it. Unfortunately the industry wants to pay for the minimum, so that is what is being produced. Add in inept businesses managers, who see no difference between CS and CIS majors (except the CIS majors are willing to work for less money), and you have the industry today.

    It's why so many "project managers" think taking a little extra time to properly engineer a system is a waste of time, but have no problem rewriting entire systems every few years since they are unmaintainable.

  46. How much extra pay for knowing the theory? by Shirotae · · Score: 2, Insightful

    There is no shortage of highly skilled computer scientists who know the theory and can program in any language, including ones they invent for themselves because the existing ones are not good enough. If there were a shortage then there would be head hunters out looking for people like that and offering big salaries and golden handshakes. The same is true for various other science and engineering disciplines.

    When businessmen or politicians talk about that sort of shortage what they really mean is that these days there is a shortage of naive people who will spend many years racking up debts pursuing an advanced education and then work for a pittance afterwards.

  47. Ada 2005 by krischik · · Score: 2, Insightful

    If someone has actually stopped caring about the evolution of Computer Science then it's you - otherwise you would have known that the newest Ada is Ada 2005 and not Ada 83. Have a look for yourself:

    http://www.adaic.com/standards/05rm/html/RM-TTL.html

    There is nothing Java (as a language) has what Ada 2005 hasn't got as well - but a lot what Java hasn't got but Ada does.

    Martin

  48. Re:Why is "Computer Science" Staffing S/W companie by syousef · · Score: 2, Insightful

    I think you're missing my point. If you want to learn theoretical computer science, where would *you* go to learn it?

    I'd research my courses very carefully and go somewhere where theoretical subjects were taught. That may mean a masters or even a PhD.

    When I did my B.Sc. in Computing Science, we had a mix of theoretical subjects (automata and discrete math were actually core, compilers was an elective I took, I took a couple of artificial intelligence subjects as well)

    Because they don't teach it at universities in general (with some notable exceptions).

    Ahhh so there are "some notable exceptions". Could it be that you should seek one of these out if that's what you want to do?

    They churn out professional programmers, who would actually be *much* better off (in terms of being good programmers) to just spend those 4 years writing code.

    Complete garbage. Programmers who don't understand how the machine works under the hood, don't understand that you can express problems that can't be solved, or can't be solved practically etc. are rubbish. They don't understand the very tools they use. I've worked with people who understand the classics like the travelling salesman problem, or the halting problem. I've also worked with people who don't. Let me tell you I'd much prefer to work with those that aren't going to propose something impossible and set a deadline for my team to meet in creating it. (I once had a manager propose we write a full blown compiler in a month, and it was clear she had zero understanding. My current boss on the other hand - and I work elsewhere thankfully - use to write software and she's brilliant). It doesn't matter if you never become a computer scientist proper. These things are VERY important.

    And the point of my rant remains. The purpose of the university is basic research.

    The point of a university is higher learning. One avenue is basic research.

    What we risk by not investing in basic research is a stagnation in computer theory. Marvin Minsky proved that perceptrons can't compute everything. Then in a off hand comment said that he didn't know if multi-level neural nets had the same problem. It took something like 10 years before anyone even checked.

    If it were an easy problem Minksy would have set one of his grad students to work on it.

    Look the rest of this refutation is pointless. If you want to move into a career of research now, you clearly have the intelligence and articulation required. Your education has put you in better stead than you give it credit for. What I don't know is whether you have the drive and circumstances to persue another degree or a change of career. If you want it desperately enough, you're willing to make the sacrifices and you're lucky enough to do it, I wish you the best of luck.

    I'm not saying this flippantly either. I dropped out of a science degree because I found it didnt suit me. I worked then went back and didmy comp sci and found my career in IT. Science was a dream of mine right through highschool. When I found I couldn't persue it I didn't give up on it. I went and did a Masters of Astronomy part time and on the Internet. I certainly didn't have my hand held to learn what I did, and though I never intended it as a change of career (ie. I l did the degree "for fun") and though it cost me big time health wise and socially (not to mention financially) I don't regret doing it. It is part of who I am, and I loved the challenge and cherish the knowledge I gained. I finally know how we know what we know about the universe. I've computed the distances to stars and understood their life cycles. I understand what the universe looks like on the grand scale. In short I have a better understanding than the average person of the universe I live in. While I'd love to go and do research I know I won't sacrifice what I have to for that. It's still okay. My degrees have been anything but a waste of time.

    --
    These posts express my own personal views, not those of my employer
  49. I never understood uni CS programs by jollyreaper · · Score: 2, Interesting

    I never went through one but a good friend of mine did. I was astounded when he described what the curriculum was like. At no point did they ever take on a large programming project such as they would encounter in the real world, shepherding it from start to finish. They were given a lot of abstract theoretical knowledge, the kind that posters on Slashdot describe as the foundations to learn whatever specific language you need to know and use it intelligently. But based on what he described, that just wasn't the case.

    Now I could understand this approach if the world still operated the way it did when my dad learned the ropes, the way he kept insisting it operated even though things have changed in the decades since. In the old days, you went through college for whatever program you were on and when you got out, all the shiny diploma meant is "the boy can be trained." You got hired on at the firm you'd work at for the next 40 years and they would then teach you the business from the ground up.

    That's the way it used to be. These days, nobody wants to mentor. Everyone expects you to have experience coming directly out of school, nobody wants to hire entry-level. And the way the jobs go, you may be technically a full-time employee but your work history will end up looking like a contractor. Work here for a few years, laid off, work another place for a few more years, laid off, maybe another place only lasts six months and you're laid off or fired because your boss doesn't like your tie, wash rinse repeat.

    I'm a huge fan of education but I've been very disappointed with the educational institutions I've done time at. Public education was a joke, a waste of time. Because I lacked the big bucks and the desire to take on a crushing student loan, I went to JC after high school. It was a laughable experience. I did my undergrad at a local uni and again, it was just a bunch of hoop-jumping and wasted effort. True, there's the point that you get out of something what you put into it, I've seen people turn a bad situation into a positive experience and I've seen others make the same situation worse. But overall, I just think the education system is highly wasteful and inefficient. It'd be expensive to change. There's a reason why tailored suits cost more than the ones off the rack and a tailored education to best suit the student would cost a hell of a lot more than our current one-size-fits-all model.

    --
    Kwisatz Haderach
    Sell the spice to CHOAM
    This Mahdi took Shaddam's Throne
  50. Followup about Ada by Antique+Geekmeister · · Score: 2, Funny

    Given the authors, perhaps they could share their insight on how studying Ada is damaging to your employment prospects and your career?

  51. Re:Pointers, References and Performance by egomaniac · · Score: 3, Informative

    Well, the whole point is that this exception should not be necessary at all. Just have 2 ints on the stack...

    Of course, because while it's possible to run out of of heap space (implying a possible OutOfMemoryError), computers have had infinite stacks since the 1960s. Simply by moving the memory over to the stack, you can't possibly run out anymore! It's brilliant!

    Hint: it's all the same memory. Your desperate desire to have the bytes come out of the "stack" bucket instead of the "heap" bucket is simply irrational.

    --
    ZFS: because love is never having to say fsck
  52. Oversimplification is sooooo easy ... by joel.neely · · Score: 2, Insightful
    ... and so self-defeating.

    There are many dynamics in (American) programming; some are real problems, and some are changes that the "old guard" finds uncomfortable. Nobody here (including me) wants to read a 30-minute rant, so let me just mention a few high spots.

    1. There are forces in almost every industry that seek to dumb down the role of the worker so that jobs can be commoditized or outsourced.
    2. Any institution that caters to the forces of #1 is acting like a trade school offering training, rather than a university offering education.
    3. There are many fine companies and schools that do not cave in to the forces of #1.
    4. No curriculum that teaches just one language will produce well-rounded programmers, regardless of what that language is. Any well-rounded programmer knows multiple languages, and is capable of learning more.
    5. The decline in mathematical competence of American college students has been widely discussed. Nobody with his head on straight believes that Java (or any other programming language) caused it. (The same can be said of grammatical competence.)
    6. Overemphasis on GUI toys is a fault of the curriculum and/or the teacher, not of the language. On the planet where I live, Java is more likely to be found on the server than in the browser.
    7. It is possible to have a long, productive career as a programmer without ever writing an operating system, or picking up a soldering iron.
    8. It is possible to learn a great deal about the foundations of programming by writing an operating system, or picking up a soldering iron.
    9. Conclusion from #7 and #8: there's more than one way to do IT.
    10. Anybody who thinks that application servers, messaging middleware, and compilers are not "systems programming" is still living in the 1960's. Nobody who knows the current industrial software world can be ignorant of the fact that Java is one of the languages in which these are being written. It is also not the only one (see #4 and #9).


    There are also the traditional inter-generational conflicts:
    • Every generation laments the fact that the following generations don't have to do/learn things "the hard way, like we did". Cars no longer require hand-cranking, manual choke, manual spark advance, or manual transmissions. Today's automotive technology makes it possible to be a good driver without knowing how to use any one of those bits of historical infrastructure. (It also means that we are more dependent on professional mechanics when our cars break down! ;-) Modern type-safe languages allow very sophisticated programs to be written without ever directly manipulating a memory address masquerading as a "pointer".
    • Every generation runs the risk of losing important lessons learned the hard way by preceding generations. Merely playing video games doesn't prepare one for a career in a high-tech world (as if anybody thought it would! ;-). How many Viet Nam wars or Great Depressions do we need before we learn to do better? ("How many roads must a man walk down before you can call him a man?") OO is about 45 years old (going back to Simula in the early 1960s). Functional programming is about 30 years old (going back to the mid 1970s). Our industry hasn't yet fully learned how to do either one correctly.


    Progress is made by human beings, not by tools.

    Or, as Shakespeare might have put it: "The fault, dear Brutus, is not in our programming languages, but in ourselves..." Julius Caesar (I, ii, 140-141), 2008 edition
  53. Right Tools for the Job by WED+Fan · · Score: 4, Insightful

    I think there needs to be a distinction between learning concepts and the tools you use to learn them.

    University is not where you go to learn a specific set of skills. If you want that, you go to a technical trade school.

    University is where you go to get an in-depth set of concepts, critical thinking skills, research skills, and theory foundations. This is true for any major you wish to approach. In the CS department, there is a reason you take different languages, some are for system development, some are for app development, some are for theory exploration with little to no value outside of the educational environment. Java falls into one of those categories. Assembly, C, C++ fall into others. Ada falls into yet another.

    Think of it in the terms of the English major, you know, those dime-a-dozen students who will end up working at Burger King and Mr. Chows Empire Chinese Buffet, or they go to Hollywood to work as waitresses while they wait for their big break. The English major takes a load of literature, English, American, Russian, Manga, and poetry from Bacon/Shakespeare to Ginsberg to Hughes to Tupac, and writing from haiku to freestyle with a goofy footed pentameter (trademark and patent pending). None of this is particularly helpful to someone who wants to come out of school with business writing skills.

    Remember, in University, some of the most mistaken ideas come from the professors.

    --
    Politics is the art of looking for trouble, finding it everywhere, diagnosing it incorrectly and applying the wrong fix.
  54. Pointers... by steelclash84 · · Score: 2, Interesting

    I graduated a couple of years ago with a CE degree. We were initially started on Java. One of the best courses that really taught me the concepts was a course in which we basically rewrote all of the data-structures that Java provides. Manually creating linked-lists (pointers), arrays, stacks, queues, etc. I think the real problem isn't the language, but the lack of conceptual teaching. However, I do agree that exposure to different languages is a good foundation.

  55. Sounds like a person problem, not a language probl by FatSean · · Score: 2, Insightful

    If you can't figure out concurrency from theory and pseudo code, you're a hack. You must first understand the theory, then worry about how to implement it. Besides, Java has so many tools and support systems for concurrency that you'd have to be a lunatic to try to develop that in C++. Hardware is cheap, talent is not.

    --
    Blar.
  56. Couldn't agree more... by TemporalBeing · · Score: 3, Informative

    First, some of the best comments in this thread: Comment 1 Comment 2 Comment 3 Comment 4 Comment 5 Comment 6

    I list them because they hold a lot of wisdom, and wanted to draw special attention to them for such as well.

    When I was in college I got really ticked at the level of theory - there was too much of it. It wasn't balanced well enough with implementation; and as I looked around, I noticed that was pretty common place among academic institutions (colleges AND universities - and I'm not talking about trade schools either). That was before they moved their curriculum to using Java for the first couple classes; and after they did, I had already heard some stories about the upper classes getting some of these "new" students and not being able to focus on the class materials because they had to teach these students C/C++ first and the students had a harder time getting it. (Not so the other way around.)

    That said, I've started thinking about how I would put together a curriculum for teaching computer programming/science/engineering. (I'm not talking about computer _hardware_ engineering, btw.) I even did some tutoring after college. So what would I do?

    I'd start students with a language that can be used to teach the real basic skills and concepts (variables, functions, etc.) - even vbscript could be used at this level; but I'd also quickly move them on to more advanced concepts (in the case of vbscript, it would only be used for a couple weeks at most), moving from language to language to bring not only a depth of concepts and understanding, but also a breadth of computer languages and kinds of tasks. I'd also ensure that somewhere in the curriculum students would be exposed to Assembly, and have found that even a small exposure makes a big difference in programming styles and philosophies for programmers.

    Furthermore, I'd break the curriculum into two parts. One part would start from the ground up; and the other would start from the top down. Both would be required of students. The idea being one part would be more focused on the theoretical, while the other would be more focused on the substantial - implementation. Both would work together to produce a well-rounded student. Additionally, it would be designed such that students that wanted to work on operating systems would simply follow the one from start to end; while other students would be able to leave for more focused courses at the layer of their choice. (Students wanting OS would still have other courses for focus work too, btw.) The primary idea being that even a web-app developer needs to know the underlying systems, and even the OS developer needs to understand the abstractions of the web-app developer.

    I'd also have the overall curriculum be far more software engineering focused. Yes, if people want to really be computer "scientists", then they could do that; but industry really needs software engineers, not computer scientists. Real programs require engineers, and sadly, this is strongly lacking from most all academic computer programs. (Some have changed it, but not many.)

    I'd also think that this approach would be very favorable to the authors of TFA and the comments I've linked. The ideas probably need a bit more refinement, but the general approach would be sound - and it's not what academia is doing today by any stretch of the imagination.

    FWIW - While I am relatively young (college grad of 2003), my main strength is C prog

    --
    Truth is like the sun. You can shut it out for a time, but it ain't goin' away. - Elvis Presley (source: imdb.com)
  57. What's new? by roggg · · Score: 2, Interesting

    When I took my undergrad degree, the intro course, data structures course, algorithms and analysis course, and a few others were all taught in Modula 2 (circa 1989). These did very little to prepare me for systems courses. C was introduced as part of the systems course, and there were concepts in C that were new to me after my Modula education, but so what? Later on I did TA work on intro courses in Pascal. Not exactly the stuff of systems programming either. Were these students doomed? Java is a good language to start with. It's not the be all and end all of programming languages. Why should we expect the first language a student learns to prepare him or her for every possible programming task?

  58. Basics by xmvince · · Score: 2, Interesting

    Everyone should start with the basics, and learning about the lower level things going on is key. I'm glad I learned C/C++ in highschool, and I'm glad that I will continue learning it in college. Java is definitely a power language, but I do not think one should start out with it. I plan on learning it in my junior year of college.

  59. Re:Pointers, References and Performance by Mr2001 · · Score: 2, Informative

    Well, the whole point is that this exception should not be necessary at all. Just have 2 ints on the stack... As another response pointed out, you can run out of stack space just as easily as you'd run out of heap space, and running out of stack is even less graceful.

    With a modern GC, allocating on the heap is basically the same operation as allocating on the stack anyway: just advance the top-of-heap pointer. Not really a performance issue, unless you're running it inside a tight loop where you want to avoid triggering a collection.
    --
    Visual IRC: Fast. Powerful. Free.
  60. two profs working for adacore love ada by jilles · · Score: 4, Interesting

    1. Mathematics requirements in CS programs are shrinking.

    The reason is because Computer Science has developed into a discipline that is no longer pure mathematics. There's only so many courses you can squeeze into four years.

          2. The development of programming skills in several languages is giving way to cookbook approaches using large libraries and special-purpose packages.

    Guess what, that's what building real software is like today. We don't need people that can write quicksort in obscure unused languages but people that can grasp systems of millions of lines of code. Ada doesn't prepare you for that because it is a toy language that never really was adopted outside of the academic world. It has no good, widely used frameworks & libraries like you find in the real world. People don't use it for a whole range of software systems that you find in the real world and to prepare you for this real world there are simply much better languages around these days.

          3. The resulting set of skills is insufficient for today's software industry (in particular for safety and security purposes) and, unfortunately, matches well what the outsourcing industry can offer. We are training easily replaceable professionals.

    I agree that skills are important. A good prof can teach those using pretty much any turing complete language if it needs to be done. Java isn't half bad for teaching a whole lot of important CS concepts and theory. And unlike Ada, people actually use it. As for C and C++ they are useful languages to learn of course. Many colleges still do.

    But of course two ex profs working for adacore are hardly objective. Ada is as dead as latin. It has some nice features but nothing you won't find somewhere else. Keeping professional skills up to date is as important for professors as it is for students. Having done a Ph. D. in software engineering & architecture and having practiced my skills in several companies, my view is that one of the largest problems in computer science education is teachers who have never worked on real, industrial sized software systems and continue to send students into industry with a lot of misguided & naive ideas about how to build software. Most SE teachers out there simply have no clue what they are talking about. Software engineering is a skill learned in practice because the teachers in university mostly lack the skills required to properly prepare students. That's the sad reality.

    --

    Jilles
  61. Matters entirely on the industry. by RingDev · · Score: 2, Interesting

    If you are going into Web development, office productivity desk top development, or information management applications, knowledge of pointers, memory management, stacks, linked lists, etc... is worth exceptionally little.

    The vast majority of development is being done using pre-compiled libraries. Because let's face it, there is no need for your employer to pay you to recreate the string class, or a hash table, or any other primitive functionality that already exists in any number of languages. Sure, this knowledge is good to have as it can come in handy. But in reality, other then a cursory understanding to ground your knowledge to, the in depth knowledge of them will not effect the vast majority of developers.

    Sure, if you are working in OS development, or in embedded software, or in other arena's where you may not be able to use a managed code solution, yeah, knowing C/C++ and all of the underlying mechanics is critical. But when was the last time you listened to a web developer talk about span width, compression algorithms, and rendering engines?

    I think Java is an excellent tool for teaching OO design. Especially for people who had VB6 experience (because going from VB6 to VB.Net with out learning OO design was both possible and painful). C/C++ are also great tool for teaching the stuff that has already been written (as you mentioned, stacks, pointers, memory management). So both should be taught for the purpose of educating students. As for ADA, having taken a crap ton of ADA courses while in the military, I can only say that I saw nothing in it that really impressed me over Pascal. I could see bringing Lisp back into the educational realm, but it's real world usage is again, very limited.

    I picked up my assoc CS degree from a tech college. We had 2 courses of C++, 3 courses of Java, 3 courses of VB.Net, 3 courses of Web related stuff (ASP.Net, HTML, Javascript, IIS/Apache, etc...), and the like. We never touched Assembler, no one coded an OS, we never touched a lot of stuff that my friends up at the University were working with.

    But after 2 years, 9 of the original 60 students graduated the program. And of them, 5 were spot on to become entry level consultants with the flexibility to pick up a variety of languages and technologies. The other 4 were dedicated students that had worked very hard, but just didn't have the mindset to really make it in the development arena, but would still make solid tech support, technical writers, and technical managers.

    -Rick

    --
    "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
    1. Re:Matters entirely on the industry. by RingDev · · Score: 2, Interesting

      I think this goes directly to the article's point. A BSc in CS from a 4 year university should mean more than just the ability to program in a particular environment. Stop right there. A 4-year BS at a university does not mean MORE than a 4-year BS from a tech school. It means something DIFFERENT.

      I have a buddy who works in the laser microscopy industry. He has a 4-year EE BS from a tech school, almost all of his coworkers have 4-year EE BSs from Universities. They are all extremely smart guys. The University guys have an edge on him in some of the theoretical areas, which is to be expected. But he has an edge over them in engineering a product that will optimize a lot of the theory and limitations of their production abilities. For instance, he stepped in on a project that another engineer was working on. The project was functional, but just barely, all of the theory was spot on, but it wasn't anything that they could sell. So my friend took over, refining the layout and functionality of the electronics, removing almost 500 feet of wiring, completely restructuring the layout, designing new enclosures, mounting systems, etc... Could he have figured out the theory behind the original engineering all by himself? Probably, given enough time. But the University grad has more knowledge on it, and so he could come up with that design faster. Could the University grad have turned the proof of concept into a sell-able box? Probably, given enough time. But the tech school grad has more knowledge on real world environments, functional design, fabrication, and economic and production constraints, so he could come up with that design faster.

      Me personally, I have a tech school AS in comp sci with a BS in Computer Information Systems (CS focus) and a BS in Computer Information Management. I've been doing software development since '97 in the military and as a civilian as a contractor and full time employee. I've worked with uneducated prodigies, grad school masters, and tech school graduates. And I have to say, if I need an entry level application developer for a business environment application, I head straight to the local tech schools and look for a student who is ace-ing the courses and getting along with his/her classmates.

      It's not because I think tech degrees are better than university degrees. It's because I think tech degree course catalogs have more pertinent classes to the industry I work in than university programs do. If I were working at MS or Google, trying to find more people to work on a new search algorithm, or the next version of Windows, I would move my recruitment efforts to the universities.

      I've seen (and suffered with) some horrible web and "office application" code that was written by people who obviously had no intuitive sense of algorithmic complexity and what the impact of an O(n^2) algorithm was as n got beyond their little test case. I've also seen (and suffered with) similar "multi threaded" code written by people who seemed to have only the barest of notions about concurrency control. I have also seen university grads look at a O(n^2) problem and find amazing ways of optimizing the compiler, creating custom memory management functionality, and working on making it the most efficient O(n^2) function they could. Just to have a tech school grad look at it and say 'you know if you reorganize your code's structure, you wouldn't need any of this'.

      Once again, I'm not saying either degree is better than the other, just that they are different, and the graduates of both programs will likely have different things they can bring to the table.

      -Rick
      --
      "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
  62. Not why I went by SuperKendall · · Score: 3, Interesting

    But, the whole reason to GO to a University, is to get the skills/education to make more money when finished, than you would have if you had not gone.

    That's not why I went to college. That's why you go to a trade school.

    I went to college as a CS major because I loved programming. I went to college because I enjoyed learning, and wanted to round out my education in a lot of ways.

    That I happened to be able to get a job after was because I was able to take all of the very abstract concepts I had learned and apply them to practical matters. But I had always been doing that on my own all through school anyway - why would I need school for that? Anyone can do that on their own, schools are there to teach you things that are hard to grasp or learn on your own.

    --
    "There is more worth loving than we have strength to love." - Brian Jay Stanley
  63. Re:Pointers, References and Performance by julesh · · Score: 3, Informative

    Java is all about pointers actually. Everything that is not an atomic type (int/long) is actually a pointer. They even call that a reference! Hah, people go use C++ for a while.

    And because it's like that, you have heap allocations for every non-atomic data type, which is really the opposite of performance.


    Not really, no. The just-in-time compiler performs pointer escape analysis for the allocated objects and only uses the heap for the ones where heap allocation is actually necessary; the rest use the stack regardless of how the programmer wrote the declaration.

    Admittedly, it's taken a while for this optimisation to be included, but it is there in the latest versions of Java.

  64. third incarnation. by krischik · · Score: 2, Informative

    Earlier this year Ada even went into it's third incarnation now called Ada 2005 (ok, it took a bit longer to ion out all the ruff edges from the new standart):

    http://www.adaic.com/standards/05rm/html/RM-TTL.html

    Martin

  65. But knowing those langs helps a lot ! by curri · · Score: 4, Insightful

    You may not find some languages (Scheme, Haskell) practical, or useful for getting a job; however, they help you understand certain concepts a lot better. If you really learn Scheme, you'll understand recursion, and will also get an appreciation for syntax (since scheme has none :); Haskell will teach you typing (templates etc) and lazy evaluation. Of course, you *could* learn those things in C++ or Java, but the concepts will be every unnatural, so chances are you won't really grok them. After you've learned the concepts, then it is relatively easy to apply them in a different language.

    1. Re:But knowing those langs helps a lot ! by Anonymous Coward · · Score: 2, Interesting

      Incidentally, they really didn't teach recursion in my Scheme classes, those focused almost entirely on list processing, especially linked lists


      Maybe one of us missed something... how do you traverse a list in Scheme?

      (define (walk l)
        (if (null? l) '()
                      (walk (cdr l))))
      That's recursion.

      (let loop () ... (loop))
      That's recursion.

      In fact, in RnRS there is no *iteration* mechanism in the language other than recursion, unlike in CommonLisp for example. All apparent iteration is just syntactic sugar around recursion.

      As a result, RnRS Scheme implementations are required to be safe for space when doing tail recursion. It's a fundamental point of the language, and directly ties in to how it handles large data structures, including lists.

      If your course touched on Scheme without making this obvious, you got ripped off. Or you had an instructore who very ingeniously avoided using recursion to operate on lists! Who was it?

  66. You're barking mad. by rjh · · Score: 4, Insightful
    I hold a Master's degree in Computer Science with a focus in information security. I have also worked in the private sector in a variety of IT jobs, so don't think I'm some propellerheaded academic. I have also taught programming courses at the university level. I call shenanigans on your entire argument.

    I am a headhunter for high end roles at investment banks, and we are close to classifying CompSci as a "non degree", along with media studies, languages, etc

    So, what, you're going to hire math geeks only? People with degrees in mathematics or operations research, or perhaps some of the hard sciences? In my own experience, while there are some non-CS degrees that are excellent preparation for a CS career, only a CS degree is a CS degree. It is lamentable that some schools have embraced the trade-school mentality, but many more have not. When I was teaching courses as a graduate student (just a couple of years ago), the curriculum began with Java and quickly shifted to Haskell. A neighboring institution still uses Ada as an undergraduate language. There's also a legion of Knights of the Lambda Calculus who are trying to get Scheme reintroduced to the undergraduate curricula in several institutions in the area. Intellectual diversity about languages is alive and well in the academy, based on the institutions I've seen up close and personal.

    Also, who is this "we"? You and someone else who shares your prejudices? Or is this you and the senior engineering staff? If you're about to decree CS as a non degree, maybe you should get the input of the people who will be most brutally affected by your shortsightedness.

    Java is fine for teaching design patterns, and classical algorithms like Quicksort, or binary search.
    But you can't do operating systems

    So glad to know that you think design patterns and classic algorithms are worth studying.

    Look, pick up a copy of Cormen, Leiserson, Rivest and Stein's Algorithms textbook sometime. That's the definitive work on algorithms--if you need an algorithm, it's probably sitting in CLRS somewhere, along with some beautiful mathematical exposition about it. Every algorithm listed in the book can be trivially converted into Java. So why the hate for teaching CS with Java? It's a perfectly sensible language for many very important parts of CS.

    Further, I've taught operating system design in Python. Yes, Python. When talking about how a translation lookaside buffer works, I don't write C code on the board. I write pseudocode in Python and say "so, this is how it looks from twenty thousand feet." On those rare occasions when we have to get down and dirty with the bare metal, then it's time to break out C--and we leave C behind as soon as possible. I want students to be focused on the ideas of translation lookaside buffers, not the arcane minutiae of implementations.

    After all. Implementing it is their homework, and it involves hacking up the Minix code. In C.

    Their reason apparently is that it is "easier".
    I have zero interest in kids who have studied "easy" subjects.

    If it was an easy subject, would changes need to be made to make it easier?

    If it was a spectacularly hard subject with a 50% washout rate, would changes need to be made to make it easier?

    I've been in courses where 50% of the class washed. They were horrible, horrible classes. The pedagogy needed to change. The learning curve needed to be smoothed out and made gentler. This is in no way equivalent to saying it was made easy. The fact you think otherwise brands you as an intellectual elitist who can't be bothered to think logically about his own prejudices.

    A computer "expert" is not someone who knows template metaprogramming in C++, or compiler archaeology in BCPL, or the vagaries of the Windows scheduler.
    It is someone who understands computers at multiple leve

  67. Don't forget about English by borat4president · · Score: 3, Funny

    And do you people know how damaging English can be to those studying linguistics? No cases, no genders, just two articles, only 26 letters, decimal numerals, vowels not ommitted from spelling, etc. etc.

  68. A humble suggestion by doom · · Score: 2, Interesting
    Rather than indulge in this academic excercise of arguing which languages will stretch your brain in just the right way for you to claim you're the top dog, why not pick a project in the world that needs to be done, and go to work on it, and learn whatever you need to learn to work on the project.

    With some luck, your work on the project might even bring some money in, and you won't need to impress employeers with a long list of languages. Even if the project doesn't bring any money in, you're resume will show that you're someone who can work on an actual project.

    ...oh forget it. Waste of breath, right? Let's just go back to "My syntax can beat your syntax, so there!".

  69. Not a problem here by RzUpAnmsCwrds · · Score: 2

    I'm in CS at the University of Colorado, and while our program as a whole is more like software engineering than CS (which is why it's in the engineering department), that happens to be exactly what I want.

    For "higher-level" courses (data structures, algorithms), I've programmed in C, C++, Java, Python, and C#. But I've also taken a digital-logic course where I "programmed" in Verilog. I've taken a (required) course where I programmed in M68000 assembly. I wrote a compiler in another required course that had to emit x86 assembly. I've coded for various RISC architectures, too.

    Is learning about the entire hardware-software stack CS? No, probably not. But it's valuable in and of itself, and it's something that I'm interested in.

    Now, if you're teaching pure "CS", the language is really irrelevant. CS is about the theory, which is something that you can implement in practically any language. But that's not the kind of program I'm looking for. It's not the kind of program that most students are looking for.

  70. Re:WRONG! by Synic · · Score: 2

    LISP takes about two days to learn, so BFD.

    My coursework started with Java in 1998, moved to Assembly in sophmore year, then C/C++ in junior year, then did some Perl, J2EE, Lisp, and much more ANSI C on POSIX systems, and a bit of C++ at the end.

    Every language has it's place, but discounting Java completely is stupid. It's a great way to introduce students to programming concepts. Although, you could equally switch it for Python for the 101 type course and then switch to Java or C# (a pretty good language in its own right), then go deeper with C, assembly, then back up to OO land with C++, side-track for some functional languages with Scheme and Haskell, then to SoA languages like J2EE and C#.

  71. Re:Why is "Computer Science" Staffing S/W companie by Wolvey · · Score: 2, Insightful

    I spent those 4 years programming and not in a university. I've worked alongside people who did spend those 4 years in a university, and some came out with hardly a drop of practical knowledge. While they were reading from a book I was solving real-world problems. The halting problem is a fun exercise in logic, but to say that one must have knowledge of it to realize that writing a compiler in 1 month is unrealistic is... unrealistic.

    Considering the years and (tens of) thousands of dollars you've invested in formal education, I can see why you would want to justify that decision. Personally, the years I spent earning money and gaining experience in the field lead me to believe that a degree would have been a less-than-optimal use of my time and money.

  72. But... PostScript is practical! by PaulBu · · Score: 2, Interesting

    Learning some of PostScript could be extremely helpful, and you would never know when it can save you 1000 keystroke or 10,000 mouse clicks!

    Some examples:

    * Make lines on someone's chart (available as eps) thicker/different color/etc. Translate it to another language.

    * Add basic visualization capabilities to any program (good luck linking some old dusty Fortran code with graph plotting library of the day, but it is entirely possible to FORMAT some E16 E16 lineto there)

    * Generate some recursive graph(ics).
    Like this...

    * Yeah, good luck writing anything that produces print-outs without PostScript knowledge! :)

    etc.

    Paul B.

  73. Take the initiative. by jcr · · Score: 2, Insightful

    If you want to fully understand your profession, you'll have to go beyond what you get in the coursework. Look at the assembly code that GCC generates. Optimize some code manually. Write Bresenham's line and circle. Write a knight's tour. Write a threaded interpreter.

    Your degree is the starting line.

    -jcr

    --
    The only title of honor that a tyrant can grant is "Enemy of the State."