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."
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.
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.
"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
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.
After passing CS101 (which was just a Java course at my school) with a decent mark, I took an embedded systems course that required FPGA programs written in C++. Great, because Java syntax is just slightly different from C++, except.. WTF is a pointer? I got "pwned."
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".
EAST. Way to the East ! (or to the west, over the edge of the map)
just kidding. Anyway, overhyped, But Yes they need to start with C.
... is perhaps because they are spending too much time on software engineering concepts and programming in specific languages such as Java instead of doing actual computer science?
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.
I've spent the past five years in the workplace programming primarily in Java, along with some PHP and the always ubiquitous SQL. In close to a decade now of workplace programming, I have yet to actually have a need for any systems level programming of any kind. I used to be extremely fluent in C and even dabbled with assembly language for fun, but those are skills I just don't need at work generally speaking. I'm much more likely to need to remember esoteric Linux system administration details.
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?
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?
"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" Good, not bad, imho.
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.
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.
Well, of course learning Java will not help you with languages intended to be "high level assembler" like C, just like learning C will not help you with languages intended to be compiled to bytecode and executed under a VM like Java or C#. How that makes C the "solid language" and Java the usurper, I don't know. 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.
I haven't read TFA (this being Slashdot and all), but if those professors actually mention Ada as a better language for teaching than Java, I wouldn't trust anything else they say, because they obviously stopped caring about the evolution of Computer Science at some point in the 80s.
Java programmers know one thing: Type code in a box and press the play button.
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.
As an English major who now works in CS (laff it up, chuckles), I completely agree. My college experience, with just a CS *minor*, started me in C, moved to C++, branched into different assembly types, went to MATLAB, on to some theoretical garbage that's not an actual, usable language (can't remember the name), and then, finally, java.
Java is useful, but.... God. If I were a Java-bred programmer when I was asked to learn Perl, Coldfusion, and ASP at my first coding job... I would have been screwed.
http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html
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
"he resulting set of skills [from today's educational practices] is insufficient for today's software industry (in particular for safety and security purposes)
Seconded. Speaking professionally, the number of programmers I trust to write a secure/stable application is vastly smaller than the number I would trust to whip up a typical business app, and a profound lack of appreciation for the relevant system details is usually the reason why. But it's a big leap to blame that on Java - the more general academic trend of dumbing down curricula (at least in the US) is more suspect.
#!
I went to UCSD back in the mid 80's. Our intro CS class back then was Pascal (UCSD P-System on IBM PC's baby!). As I recall, Pascal pointers are about midway between Java object references and C pointers. You can't just slam values into them but you can do pointer arithmetic and wind up accessing weird places. I remember lots of students having problems with pointers. I had a lot of experience writing BASIC code and also assembler (6502 & PDP-11). Thanks to my assembler experience pointers were not a problem for me but recursion looked like voodoo and I was not comfortable with it. The next programming class, though, was PDP-11 assembler. If you survived that you were good to go.
Those were the last classes the CS department offered that focused on learning a programming language. The Math department offered a C course that I took which helped a lot. As part of our Data Structures class we were supposed to pick up C++ and object-oriented programming. I still hate C++ thanks to Stroustrup's buggy cfront C++->C compiler.
I don't think there's anything wrong with Java as a first language. You can come up with pros and cons for just about any language as a first language. It sounds like the real problem is a lack of breadth. Java plus some assembler and then maybe some LISP or Prolog and you should be ready for just about anything.
These guys seem to think that ADA is the answer though you'll note that they also own an ADA related company. At UCSD back then we had a comparative languages class that covered a bunch of different languages including ADA. The prof was a big ADA fan and had in fact developed an ADA compiler. Unfortunately no one was allowed to use it since it had a habit of crashing the VAX (why I don't know - it was a rumor floating around). So, for us to do ADA we were supposed to write ADA and then follow a set of rules for transforming it, by hand, into Pascal. Most of us just wound up writing some Pascal that worked and then back translating it into ADA.
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.
OK....really, anyone with a real intrest will figure this stuff out in one month collage/university right? I mean teachers, professors and the like are no diffrent than the ppl working at McDonalds, its just a job - the less work the better. I knew C, python, php and that stuff before going to "collage"..I quit after 1 year of watching half of the class strugling with even the simplest hello-world shit out there. I just couldnt belive it was going to be so beginner friendly. Fuck I dont care if I'm working in burger king when I'm 60, but I'm not going to sit there and do extra hello-world shit just cause I'm 50 assignments ahead of the rest....fuck you collage idiots!
That, that really grinds my gears!
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.
/* still check return value */ ...
/* still check return value */
/* what about the memory now - was the GC smart enough? */
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);
} catch (memoryAllocationErrorOrSo) {
}
Why does this need to be so complicated, where all C needs is:
int fds[2];
pipe(fds);
And what about if you wanted to create an object on the stack? Too bad Java can't do that.
And then there is this garbage collector that professors swarm about. Does it handle circles?
public class Foo {
Foo other;
public void f(void) {
other = new Foo();
other.other = this;
}
public static void main(String args[]) {
{
Foo bar = new Foo();
}
}
}
Start with a scripting language, show the students that hello world can be as easy as print "Hello world!". From there, teach them syntax, functions, and OOP. Once these concepts are understood, moving to another high level language is just adjusting the syntax a little and working around the environment. Or their curriculum could start from the bottom as my university does. We started with transistors and logic, then moved to a simple type of assembly, then C, and finally Java in the 3rd or 4th course in the series.
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
I've known two people who took 100-level "Introduction to Programming" type classes using Java. Both of them ended up terribly confused and I had to tutor them. But the problem wasn't Java; it was the fact that their professors approached "an introduction to programming using Java" as "an introduction to Java programming." I believe Java can be a great first programming language, but only in the capable hands of somebody without a doctorate.
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.
true! i would take that even a step further
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
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.
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
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.
Java? I would've killed to have Java as the first language I was taught in university; we started with SML/NJ (Standard ML of New Jersey, a functional programming language - and not even a good one. Languages like Haskell and Curry are OK, but ML is the Pascal of the functional programming language world.)
Fortunately for me, I already knew how to program; for others who didn't, it was a total waste.
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.
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
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.
Java became the next big thing when corporations pushed it as a solution to sell more functionalities in less time but its inherent value as a programming platform, from a purely technical point of view, approaches zero. Every skilled programmer knows that native code is smaller, faster and stabler and easier to debug, and there are workplaces out there where one can lose the job in ten minutes if he/she suggests Java as a solution instead of a native one. Just tell some PMP or GPS manufacturers they have to double the memory or processor speed of their gadget because you can't write code in C.
Nowadays the web appears to be king because it's widespread and used in nearly every PC worldwide, and it speaks PHP, Python, Ruby, Java and ASP, but low footprint devices, device drivers, applications where speed matters, including financial applications that need lower latencies than a fps game, all of them still require more performing languages and implementations.
So, yes. The Java-for-everything culture is really dangerous both for the programmer culture and the code he/she writes.
Well, then again it makes a huge difference writing with an IDE and writing in an editor.
With an IDE if you're a beginner you usually think.. "ok I press this button and I run the program".
Plus you usually design your gui there.
It's a whole different ball game when you write code using an editor and compile either through the command line or preferably through ant.
Don't use in Java in your curriculum if you don't like it. Duh. But please at least use a language that has practical application to students outside your classroom.
I agree and disagree with you. There's nothing wrong with CS being the path to becoming a "software engineer". Dumbing it down so that graduates didn't learn any CS is wrong though. If you take Mechanical Engineering or Electrical Engineering in college you don't expect to learn how to use AutoCAD or Verilog. You expect to learn the theory so that you can design and build safe, efficient, economical widgets.
It might make sense to have a CS and a Software Engineering major that are akin to each other the same way the Physics and Mechanical Engineering relate. Taking the theory out of Software Engineering is just wrong, though (I think we agree there). I don't see anything wrong with having a Software Engineering major offered at the university level, as universities should be educating people as well as doing research.
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.
Fight Spammers!
I had both those professors at NYU. PL/1 with Schonberg and Dewar for compilers. The curriculum back then for a CS major was an inrto language, at the time PL/1, an assembly class (BAL on a 370). Discrete math was a must. Data structures using PL/1, a graph class. OS design and comp arch (others that I forgot I am sure). This was a good challenging major and I am glad they are making the case that the current trend is bad. I agree, its difficult to find good programmers. Bad habits seem to get into folks very early with these hands off the hw languages. That is at least from where I need people (embedded fw). For a web gui perhaps C# and Java are all thats needed these days. To me, I need to understand the hw on up to, if used, the vtable and the objects on top, complete understanding of all the layers. If you dont know your system, how can you grasp the ramnifications of change of any of the pieces (new processor, different compiler, runtime, etc). If you understand all the pieces, your life is ultimately better and easier I feel. I dont think the new CS majors get that training any longer.
The fact is C and C++ whilst to many of us self-taught programmers was our first language it's not necessarily the best first language and had I known differently I'd probably not have chosen C as my first language.
I went to uni already knowing C but then being taught Java it seemed a nice starting language and I somewhat wish I'd learn it earlier. I'd question why his students are unable to transfer from the idea of reference variables to pointers as the concepts really aren't massively different, when you get your head round the whole references thing the pointer concept isn't that far a leap. I'd argue that if his students understood Java and are unable to make the jump to C that it may be the teacher that's at fault.
As I see it the best route would be to teach the likes of Java and so forth in the 1st year and then make the jump to C/C++ in the 2nd and 3rd years, probably even assembly of some forth in the 3rd year also. I'm not convinced there is one big problem here, the lack of teaching of C/C++ isn't necessarily Java's fault and the two languages certainly aren't mutually exclusive in their ability to be learnt.
What I do think would be a bad idea however is throwing students into C/C++ straight away when they may have no knowledge of other languages, I'll be a brave man and admit I think it did me some damage that took a fair while to repair jumping straight into C as it's easy to overlook important things such as avoidance of buffer overflows when you're not even totally sure about pointers and are still initially trying to get your head round the concept of multi-dimensional arrays as well as trying to remember even the syntax of the language.
Regarding students not being able to understand how to write console programs, again I don't see this as a fault of Java and I doubt if students can write GUI apps that they're incapable of writing console apps, it's just down to a lack of teaching about different programming patterns such as FSMs and so on.
My biggest problem with uni teaching in this area is not the use of specific existing languages but the fact some Unis and courses make up their own languages which don't always quite work right having never had testing in a wider environment and that really offer nothing over certain existing languages. At least students get another language under their belt that's actually usable outside that specific course should they be taught an existing language than some home grown one for the course.
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.
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!
The title might be misleading, the authors says Java is important in learning to code!
;-) and I would say that it is indeed necessary to understand pointers to write complex (especially multi-threaded) Java programs. Somebody not understanding pointers will have no idea that every Java Object (even arrays) are accessed through references which is indeed a fancy name for a pointer. So all Java variables except primitive types behave just like a pointer would. I can't see how one could be an expert in Java without understanding this!
;-) I have been knowing this for a long time and my guess is that I am not alone ! ;-)
I am myself a Java developer and I started when the language was born.
Nevertheless, I can understand where the professors are coming from when they state:
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.
I started to write Java programs with vi (now using eclipse
I see the point for teaching C and at minimum a few other languages (I did lisp, prolog, ml, assembly for Intel and Motorola and a few others). I am just surprised they don't suggest also at least one assembly language as mandatory.
A student would also need to learn at least a minimum on how the hardware works, (hardrive, processor, cache, bus, memory, etc.)
Why ? Because knowing all the components (hardware and software), knowing the machine and all the layers is the only way to be able to write efficient programs !
We are supposed to have nice abstractions to work more easily knowing only a few layers but in my experience this is a myth and this is how we end up with trashy programs, when the person who wrote it didn't have a clue on how the other layers worked and the nasty impact his code would have on those other layers.
Here is a 2002 article that explains the phenomenon a little more, it is called the Leaky Abstractions
If we are not aware of this, we end up forming "fast-food" programmers instead of the software engineers of tomorrow. I guess that's what the professors were saying.
Then again, in a sense, nothing new here
Everything I write is lies, read between the lines.
I started with the c64 Basic ( beiginner algo.s for seemingly infinite confusion)
Moved on to Hex, then ML
Finally on a 286 I switched between pascal and C/C++ ( Borland you know )
As a math Professor qualified to teach programming it is disappointing that java is the [economical] choice of the university.
C is a for the sake of programming. Most others are made from C !
--
To turn your computer into a gameboy type "win."
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.
Yes Java and its siblings are quite dangerous. It's a bit late to realize that... it's going to be hell expensive to clean damages done by java and its siblings.
Moreover, plenty of you thinks it's really free software... my a**! Indeed, to compile the 80MB (Yes... you read well... only Sun is able to maintain such giga-bloat) of compressed C++ source code, you need closed proprietary modules AND the previous closed and proprietary SDK!
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.
Where I go to school, we learn a buttload of different languages. We start off with Java, just because (I think) it's a well structured language that's fairly easy to learn and get concepts of programming from. We also have a Database course and a web course that covers everything from XML to PHP and AJAX. These are all in the first term (we have 8 courses a term). The second term there's C, more Java, focusing on the object oriented part, as well as an architecture class and a Systems analysis and Design course. Third term we do C++, Algorithms which is based mostly in Java, and depending on what option you chose, you could go into different things such as deeper web development, win32 systems, signal processing, database systems, along with others.
Personally I think what we learn here is really good, we learn a broad spectrum of languages (although we don't do many scripting languages, we do a bit in terms 3 and 4) and we get the concepts that go with them as well (discrete maths, architecture, analysis and design, etc). The only other bad thing other than the scripting languages is that we get worked to death, 8 classes, which is between 27 and 35 hours a week of classes, and then at least that again in homework, is probably not good for our heath.
I wasn't aware that anything useful had ever been written in LISP. I know many programmers who speak with a lisp, but none who write anything useful with it.
As a programmer trained, at least initially, in java.. I kinda agree with this article.. while it's certainly not true that there are no good programmers who code solely in java, the education I got was sorely lacking in some critical fields.. most notably (and obviously) memory management and pointers, and moving from a memory managed language to one with absolutely no automated object destruction or garbage collection was a bit of a stretch..
;)
I've since picked this stuff up, but i'm still not as confident with C++ or C as i am with java. Ok.. maybe that's not their faults..
http://www.xkcd.com/354/
That said: Of course it is important to learn more than one language. At my University we startet the first semester with MMIX (Assembly) and Java, later c/c++ and so on.
But you can't blaim Java for weak education. 90% of my Java Apps are without GUI.
I never did C/C++ properly, we did Pascal (yeh laugh), but we were specifically taught about passing by reference or value. Pointers per-se are not a good thing, but references (which is what Java has) are, as they still have type and heap protection. Yeh you can't do OS level coding in it, but my first name isn't Linus either.
Actually nowadays I do PHP, and I actually often use Java to describe my approach to coding (which does tend to highlight me as a better-than-average PHP'er). In todays world I think it's propably more important to get set theory, SQL,some patterns and have a great approach.
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.
;-).
;-). It does everything well but nothing specifically better.
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
-anandsr
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.
You're forgetting about all of the knowledge about how computers work and the concepts about how different programming languages and styles work that you picked up when you learnt C and asm. Although you haven't used C for a long time, you are still using the knowledge about how the whole software/hardware stack fits together when you run your Java or PHP programs. This stuff is valuable to know and makes you more capable of using the tools and hardware you have.
Programming concepts tend to reappear. Consider the C qsort() function. It takes another comparator function as an argument. Programmers that only know Java won't learn this concept of passing function, and they won't be prepared for it when it resurfaces in Javascript code for example. It's about broadening people's understanding of computation and how it can be done.
--
Simon
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
For example, it's commonly thought that garbage collected languages like Java don't suffer from memory leaks. Nothing could be further from the truth, as was evidenced by the Java eCommerce app one company I knew had - it would run out of swap space every couple days, so they had to keep rebooting their server every day.
Consider the Document Object Model (DOM). Each node in a DOM tree holds a reference to its parent and all its children. So if a client object holds a reference to any object anywhere in the tree, none of it is available for collection. That's a memory leak.
While really appropriate applications of assembly code are uncommon in today's computer industry, one place it is completely appropriate is in the teaching of computer science and software engineering.
One reason is that those who later use higher-level languages like Java will be able to visualize what effect the actual implementation of their code has on the machine.
For all you kids who want to make fun of me for being an old-fashioned old coot, I learned my first programming language, FORTRAN, at the tender age of 12 in 1976. The IBM 360 I ran my first program on, I understand, had magnetic core memory.
Request your free CD of my piano music.
People learn a lot through failure and pain. C is clearly the perfect choice when you look at it this way.
Notice too that the article is in the Journal Of 'Defence' Software Engineering. Ada was designed by committee as a language for use within the military. I was taught Ada in the UK's Lancaster University in the late 80s/early 90s, and at the time that university had decent links with military recruiters.
I really don't see why they're so much against Java as compared to Ada - to my mind there's a lot of similarity with a lot of dependency placed on the langauge's runtime checks. I liked Ada. I like Java now (started with it whilst the language was still in beta). I like C too. Years ago I also worked with Prolog and Lisp, though not so much now. I wasn't terribly keen on C++ after my first year of it and still am not, though I admit I'm not up to date with latest developments in it. I mention all that though because whilst being taught Ada, the professors of the time described C as "an abortion of a language" unsuitable for software engineering. Interesting to now see people describing it as essential to know for good computer science...
Cheers,
Ian
I'm a CS student in the UK. From my experience the degree is getting easier and easier each year. Though it's not just a Java problem, it's the quality of students attending. The CS degree is being dumbed down to allow for these students that, by the end of the degree, have trouble program simple tasks (and they get a good degree classification). Personally I think too many people are going to university in the UK nowadays which are having to dumb down subjects or introduce pointless degrees to cater for everyone.
Java is the only language taught. And many students do not like it - but many have not programmed at all before! When it comes to optional courses a lot of students, when they find out that a course unit has Java in it, do not take it. Then there are teachers telling students for example, to ignore things like class definitions and the purpose of the main method and just that they have to put the code inside the main method.
There is hardly and theory or mathematics taught.
Well, I agree with most of your points, and I think CS degree should not teach any programming language, but only in the context of theory and concepts on programming language design. I went to McGill University in Montreal, we had one class in assembly language, and it was the only class in which the prof explained the assembly syntax, and the only reason was so that we could work on the term project to build an assembler in C.
There was no other class where we were taught specifically to program in a specific language, we just went to the computer lab, set up a user account, and started to learn by ourself (when we had to do our programming assignments). We had homeworks in C, C++, assembly, Lisp, Scheme, Prolog, Modula, Objective-C, Tcl/Tk, Pascal. We learned about other languages in the context of programming language design.
I have been working in the field for over a decade, working on telecom switches, embedded systesm, financial and trading systems, large scale web systems, etc, and I still think this was the best way to teach CS.
If the universities teaching C# .NET ... a lot of people would shout, but... although Java is the same shit ...
Some fool will think this is trolling, but it's not.
You go right ahead and phone your university and ask for your tuition back. Clearly you learnt nothing about professional behaviour or life long learning.
You don't just stop learning at University. You'll never cover everything you want to know at University. It's a starting point. If you're really aching for that knowledge, yes you can learn it on your own, or yes you can do a higher degree BUT for fark sake research what's in it first!!! If you want to work on something mathematical, talk to the people doing it and ask for their advice on what to do.
It sounds to me like you wanted to do a pure research degree, took a comp sci course because the word science was tacked on the end, and are now feeling sorry you didn't do anything more advanced. What's worse you show a complete lack of regard for what you have learnt and I'll bet it's how you're making your living. You want to do higher learning? Well the first thing you should learn is that the onus is on YOU to find out what a course covers. Stop asking for your goddamn hand to be held. You can't have it both ways. Advanced means you do most of the learning yourself.
These posts express my own personal views, not those of my employer
The real problem with Java is not that Design Patterns are popular, but that they are so necessary. How often do you see a Factory or Observer in Java? How often do you see them in Python? Or even C# for that matter?
Quite frankly, I think the problem stems from the lack of closures. Since you can't pass functions around, you have to keep making objects that have the functions you want. But you can't just call an arbitrary function, you have to call a method on an object that implements a defined interface. Instead of being able to sort a list of strings case-insentively by just calling list.sort(x,y -> string.compare(x.toLower(), y.toLower())), you have to create a class that implements Comparator, put your sort function in there, and then call list.sort() with an instance of that function. All those contortions result in bloat and complexity which makes the language suck.
dom
At Berkeley, the intro CS courses go Scheme, Java, C/assembly. I complained about these courses when I took them, but now I know: choose the language to go with the concepts taught in the course.
Sorry, folks, but I have yet to find something about pointers that can not be explained to my mother in 5 minutes. (Ok, my mother is a technical translator with a military background, but you get the picture) More or less the same goes for the supposedly difficult matter of object orientation. It may, however, be a tad tedious because n00bs usually need a few nudges and some pratice inbetween before they can wrap their head around these concepts permanently.
The ledgend that basic (or whatever) spoils programming n00bs beyond repair is total rubbish. Mind you Basic and Pascal are IMHO way to old to get people started effectively, but so is this bizar thing called Lisp (take that from an Emacs user). Professors need to get into teaching again. I just dropped out of CS (for reasons unrelated) and the programming Prof. we had explained pointers in such a way that even the guys and girls that appeared like burger flipping quake players 'I like computers' type CS people were up to speed in no time.
Maybe the problem is with adademia?
We suffer more in our imagination than in reality. - Seneca
Big corporations are paying schools MILLIONS to gut their curricula. The fewer competent engineers the US graduates, the more justified huge companies can be in offshoring jobs and on-shoring foreign H1B and L1 visas and 1/4 the cost.
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?
I'm a student at the University of Sheffield, in my second year on a three year CS degree, and so far we have covered: Java (used for "Introduction to OO Programming" and "Further OO Programming"), Haskell (used for "Introduction to Functional Programming"), matlab (used for discrete and continuous set theory, matrix algebra, all that maths stuff you need to do CS well), PROLOG (for the logic based modules), Java bytecode and RISC assembly (on an ARM9 iirc, for embedded systems), SQL (used to teach database calculus), and touched on C++, LISP and COLISP and Python. In the Systems Analysis and Design modules there is a huge focus on choosing the right language for the task and how to combine programs written in different languages. From this thread, am I to understand that other Universities dont cover as much as this? It seems to me that without teaching a spread of everything, you won't really learn that much.
Some unis here in Holland teach programming, by using languages that don't exist. This way you're forced to aquire the programming skill, not a programming language.
Thing is, if you start em on Assembly or C then they are going to have a tougher time getting to grips with OO languages like Java, C++ or C#. I know a few old school programmers from an Assembly or Electronics background and they just didn't get it. Classes were just things they grouped their functons in.
I have excellent Karma and I am not afraid to Troll it.
He started by discussing how electrons move about in silicon crystals, for example how "holes", or places where electrons were missing, effectively acted as positive charge carriers.
He went on to explain transistors, then how to make logic gates from transistor circuitry, and then the basic architecture of microprocessors and memory, machine code and assembly code.
With this grounding, he want on to teach the basics of Pascal - including pointers - and basic data structures like linked lists and binary trees, as well as recursion.
To cement our understanding, we used these concepts throughout the quarter to write simple vector graphic editors on 68000-based workstations made by HP.
That one quarter was the only computer science course I ever had - my degree is in Physics, not CS - but it was enough grounding in the fundaments to allow me to succeed as a software engineer for more than twenty years now, with a resume that looks like this.
Request your free CD of my piano music.
I started with FORTRAN 77, learned C, Perl (purists just move along), C++, x86 Assembler, a smattering of high level languages in a survey course, THEN Java.
Without my background in the earlier languages the understanding of what Java does for the software developer is completely meaningless. In C/C++ you MUST have a working knowledge of memory management. Its crucial in whatever environment your in regardless of how much is available resource wise.
Anyone who needs to understand programming close to the hardware or memory management must learn C. Agreed. One might then differ about the merits of C++, ADA, and the need for learning LISP.
However that's not what struck me most about the discussion.
First of all I remember that JAVA was seen as something that "Industry wants" when it was introduced at Universities. It was seen as being "in touch with the needs of Industry" to advocate it. Funnily enough Industry now discovers that there are skills that aren't conveyed when you teach the fad of the week. Could it be that "Industry" really is not competent to determine what should be taught? Sure ... they can usually be relied to know what skills they need "right now". But what else? Industry typically isn't able to forecast its demand for skilled workers more than say 2 years ahead, let alone determine what skill-set they need unless there is an acute shortage of it.
Secondly, I find the following criticism levelled by the authors of the original article amusing: "Java, instead of exposing this beauty, encourages the programmer to approach problem-solving like a plumber in a hardware store: by rummaging through a multitude of drawers (i.e. packages) we will end up finding some gadget (i.e. class) that does roughly what we want."
Well ... isn't that what Engineering is about? What Engineer building a bridge starts out by redesigning I-beams and/or reformulating the concrete mix? We'd consider that idiotic ... even dangerous. But software engineers should be doing that? Sure ... sure ... any Engineer (unlike a plumber) should understand the properties of the components used, and be able to spot less suitable components. But that understanding doesn't mean he's got to redo the components every time he builds a bridge.
In third place ... the criticism formulated as: "Students found it hard to write programs that did not have a graphic interface [...]". Well ... I know that all Java IDEs tend to push you towards writing graphical interfaces, but as a teacher you can set assignments that *require* command-line activated programs, just by specifying that such programs must be callable from a command prompt. Might it be that said professors haven't sufficiently thought of teaching command-line programming?
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
We hire grad school interns occasionally for the research work we do, which is high performance computing. Many of our interviewees have experience in Java and/or .NET on Windows. Ug.
Very few have experience in real systems (*NIX) or fast computing languages, such as C.
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.
.NET or Java jobs. The summary makes it sound like there is a great demand for my skills, but where are the jobs? /David
But I have not been able to find any such jobs. Job databases show 90%
First you hire Java programmers to produce C code. Next you found out (surprise!) that they are struggling to get the work done. Then you blame Java.
I think it's still being used, there was something like high and low level programming languages. This was the level of abstraction between a programming language and machine code. Java is at a higher level than C. The AdaCore professionals are bitching that they can't hire good C programmers. What they should know is that programming is not a method. You can not expect a good programmer to be taught in 10 days, it's more like 10 years.
Also, Free Software displaced things a bit. Good C programmers are born in good C environments. In a proprietary world, there is no environment to teach a good C programmer. You must let them watch your code, since when they were sloppy, lousy programmers. Worse, you have to let them mess with your code. Big companies like (from the article) "AT&T, IBM, Intel, Bloomberg, NI, Microsoft, Lockheed-Martin, and more" just want to *hire* these programmers, those companies don't have the patience to teach them, because there's no guarantee that they would turn into good C programmers. But how can you learn good programming when you can't look at good code?
Free Software is not guarantee of good code, but is guarantee of a good learning environment. Lots of code to look at, lots of bugs to be fixed, sometimes people to help you make a good fix or guide you how to make yours better coded. All this thanks to a philosophy that allows you to to that.
On the other hand, companies want to produce proprietary software, but don't want to help these people being good programmers, how can programmers be grateful to those companies?
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.
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# ?
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.
what are they blithering about? The ONLY people who need to know pointers are the people who will be writing the next generation of programming languages - it's their job to protect the programmer from minefields like that. Faffing about with triple pointers to make a 3-d array work, like in C, should be completely unnecessary - the sooner that C and its pointer friends are dead & buried the better. It doesn't even have the excuse of being antiquated, Fortran is older and handles arrays without forcing the programmer to play about under-the-hood to make it all work.
I'm a computation physicist, I'm sorry if my desire to get answers easily and quickly without being hardcore for the sake of it treads on your toes.
Interestingly enough at my University Computer Science and Software Engineering were seperate degrees - and your degree was awarded by a different faculty (even if you were taught in the same department.) I did the Software Engineering degree. I have to say that the first languages we were taught were Java, and some weird functional one that I can't remember the name of. I programmed my final year dissertation in a mixture of C++ and C, just to see whether I could or not, and I remember the learning curve of managing my own pointers, looking for memory leaks and having to actual compile stuff against libraries and get header files right, instead of just dumping a load of .jar files into a directory a painful painful experience.
But when I started to working it was a painful experience again - I got a job programming large scale web applications. I discovered that suddenly when you need to start scaling Java up to large numbers of people you still get, not memory leaks, but object references held onto too long. I had to learn about weak references in Java, and how to make the automatic garbage collection run more efficiently. I had to learn how to integrate lots of libraries, some of questionable quality quickly into my application. In short, I needed another skill set, which my software engineering degree, with all of its formal methods and programming of small applications had in general not prepared me for. I found it useful to know about SQL, when I used frameworks like hibernate, but I never wrote an SQL statement. I found it useful to know how to formally construct tests for functions - but to be honest I didn't have time to formally prove stuff and so just wrote tests quickly and using common sense.
At the end of the day, what do you want your degree to prepare you for? I had quite a learning gap when I want to work in the real world(TM), but equally friends have complained that when going on to research they also had one. For them, they needed more modules about theory, and beautiful programming, for me I needed more about how to manage the process of building and integrating software. But we were both given generic educations.
It's all a moot point now. I quit my software engineering a few years ago, and went back to Uni. Now I program small things in Python from time to time, because life is too short for either Java or C.
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.
Now, I wouldn't give a calculator to a 6 year old kid while they were practicing mental arithmetic but that's only one facet of mathematics. There's all sorts of calculator games and explorations they can do which will help their understanding of mathematics.
Unfortunately, the human race is incapable of doing things in moderation, so what you get is a holy war between conservatives who think that the measure of a man is being able to work out 271 x 137 in your head while being beaten with a stick , versus the touchy-feely brigade who think that learning to add up before the onset of puberty will make you grow up an emotional cripple. Both have a point - neither is 100% right. I suspect similar reasoning has led to the Java monoculture in college (a few years ago, Java was the cat's whiskers and C made you go blind).
In a survey of 100 programmers, 111111 thought that duck-typing was a good idea.
I think that's a more fitting title, really.
Why does someone who almost PROUDLY admits not to even have read the article gets a FIVE modding??? There seem to be too many moderators on crack! I think moderator privileges should be tight to IQ.
I'm mad at the moderators, not nearly as much at the guy they moderated. Although (no surprise!) he COMPLETELY misses the point of the article.
Besides, he has no idea about computer science as the last sentence of his post shows. With the same argument one could argue no mechanics should be taught in physics lessons any more - Newton is sooooo hundreds of years ago after all, today we only deal with relativity (ooop,s even that is a hundred years old), quantum physics (not too new too) and string theory (a lot of completely unproven stuff).
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.
So, Java is bad because it is such a safe language to write in?
If we want our young to experience pain, maybe we should teach them Perl.
Also, without a shell script you can't really have a single-word command like "ls" or "cp", but that can be overlooked.
I'm pretty happy with Java overall, but this one drives me nuts.
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.
Maybe the problem isn't what the professors are teaching so much as the mass of students who aren't suited for the kind of concepts that are in programming. It's the wave of the future and a lot of people are drawn to that just for the sake of it. Besides, how many played video games and said "wow, wouldn't it be cool to make these?"
... see the lower part on mindset changes in education
I studied C in school while working full time and made deans list twice while doing so. Pointer were a little tough to get but once gotten, no problem.
However, it you read the whole wiki page linked above, what they seem to be complaining about in light of reality is that their way of doing things is becoming obsolete.
Using pointers and other text based programming methods or concepts or procedures or whatever you want to call them is important to know as a software engineer understanding the full scope of software programming history and being able to deal with its old code, but that doesn't mean everyone wants to be a software engineer but just wants to write a program.
Personally I know the whole software engineering shebang is working off the wrong assumptions and premises and that there has been this ongoing lack of needed talent because of it.
Just as using the roman numeral system for mathematics today would be found impossible in its ability to even do what is today considered common accounting, so is becoming the ways of software development.
I'm not defending Java or any other programming language because ultimately its not what language you write in, which includes what GUI use use in the process of programming but a matter of translation of what code you write or click.... its translation down to machine level. And that is where genuine "Software Engineering" should be focusing.
There are just to damn many people needing to program everything from a full out large scale programs, to making a simple macro to automate some repetitive set of actions they perform.
To many people for the illusion of elitism of programming to continue as it has. Programming can and has so been becoming more and more automated.
Software engineering main focus today should be of "Abstraction Physics" and the development of "knowledge navigational mapping" as a standardize mapping for software programming support.
The navigational mapping of programming concepts, data type, common functionality, etc..
In simpler words, software engineering should be the field that focuses on building the support base for programmers. Just as structural engineers do the plans for building a bridge but its the skilled and often unskilled laborers that actually build the bridge, not the engineer.
I don't think that the first language you learn is the source of the problem with understanding in programming. Unless you consider maths a language. The basis for understanding programming begins with primary school maths. Logic, ordering, functions, exactness... maths... Not to mention that half the applications of computers are to do more complex maths. As a student doing units of programming, I can tell you theres a lot of people who can't think of a way to solve the underlying mathematical problem - that has nothing to do with their first language. Comprehension and reasoning skills needed for coding should be built earlier than the first (real) language you learn.
I have grown weary of coding, though, so I'm studying piano with the aim of enrolling in music school to study musical composition. Someday I'm going to write symphonies!
But twenty years of playing as a self-taught pianist wasn't going to enable me to pass the music school entrance audition. So I started formal lessons, having now had three and a half years of them.
At my rate of progress, I expect to have to study, and diligently practice, for another five years or so before I can pass the audition for a school like Dalhousie in Halifax, or the U of British Columbia in Vancouver.
I don't think there's any hope that I could ever get accepted to Julliard. And all that study is required just to get accepted to a University-level program. Far more study is required to graduate.
Given all that, consider what a failure in my understanding of music theory might cost someone: my audience might not enjoy my show as much, or my CDs might not sell.
Now consider what a failure in my current job writing hardware RAID device drivers might cost someone: wiping out a business' data, or the failure of my employer to compete in the marketplace.
Yeah, I'd say other professions do indeed have much harsher standards.
Request your free CD of my piano music.
. . . they teach Java in the introductory courses, and then tell students to buy Kerrigan-Ritchie and give network and systems programming assignments in C.
Bastards.
What?
Java might be important for some people to learn. But it will forever limit your abilities. The same applies to any other single language you could possibly learn. As they say: If your only tool is a hammer, everything looks like a nail. While you could go and write a simulator for a particle accelerator, an accounting package or a text editor in almost any language, you will find that certain languages are more suited to certain tasks. Remember that, in theory, the same applies to Excel. Would you consider yourself computer literate on a software developer level just because you understood every single Excel feature? With Excel being capable of (in theory) being used to create almost any imaginable application? You need to know what's under the hood at some time. You also need to know that good tools save time and lead to better quality. (Few customers in the 80s and 90s understood that 4GLs and report generators would beat COBOL hands down in these areas, with few exceptions - and there's still COBOL code out there.) Java is like short order cooking in a diner. You might be able to earn a living, you mignt even end up managing a chain of diners, but the fine art of e.g. french cuisine will forever escape you. (My first programming language was FORTRAN IV. Since then, I learned a new programming language every two years. About. Until I stopped working in development. Don't expect Java to last you more than a couple of years. Unless you want to do something similar to maintaining 30 years old COBOL code. Learn. Or stay in accounting, where you belong.)
As always, to put it bluntly, the software industry in the US as depicted in parent-post does not reflect the state of the software industry of the entire universe.
The main itch most people of my academic years scratched after graduating is that we virtually learned nothing directly useful there, except how to think, how to handle any sort of IT problem, regardless of paradigm or computer language: how to collect and iterate over data(bases), how to communicate over networks, protocols, interface design, etc.. In fact we learned bash, Perl, Python, AND Java on ourselves without any official course or textbook, but we wrote compilers, text editors, etc.. we had to because the assignments were either asking for it or we had to find "the best tool for the job".
Java is not meant to teach you anything. It is a tool. A good allows you to think on a higher technical level, which is great for productivity. A hard-to-use tool will force you to be very accurate on lower technical levels. Academic institutions can teach a range topics that is FAR greater than would be possible using C/C++ using Java as an implementation platform, because of the speed with which points can be made.
So it is a wrong thing to blame Java. Learn how to think. It is even more wrong to "blame the way universities teach", because no 2 universities teach the same thing in the same way.
I remember being forced to learn how to use logarithm tables (printed booklets with rows and columns of logs, sine, cosine values etc) long after electronic scientific calculators were commonplace and cheap. It was a total waste of time. I'd never dream of introducing people to programming using C or C++. I'd leave those for much later, or even for an optional, specialised unit. The use of libraries is actually important - in today's world one of the best talents a programmer can demonstrate is the ability to find what he needs, whether it's a library, some documentation or a solution to a problem. It certainly beats the old practice of just copying and pasting code from one place to another.
I study Computer Science at the University of Aarhus, Denmark. The first year you have two programming courses, Introduction to programming and Programming 2, both of which teach java exclusively. These two courses are rather easy (for someone with programming experience, really easy), and they teach the basics of OO programming. We have, alongside Programming 2, a course called Computers and Networks, which teaches the basics of assembly (ijvm and IA32), and the basics of TCP/IP. I find this approach much better than just to teach programming in one course. You constantly have to think different, because you have these really different programming courses, and the courses do their job: they teach you computer science. To compensate for the bad choice of programming languages the first year, there is a mandatory course third year (5-6th semester), after which one should be able to write a compiler. Personally I find java really easy to program in, especially the non-gui part. I have had some experience with pascal (Delphi too) before, but they weren't quite as easy to understand as java. The truth is that java is a really good beginners language (and it has its uses in many business environments), and the only thing that can damage students is choice. They can choose only to learn java, or if they have a passion for computer science, learn some other language on the side. To quote Paul Graham: "if you can do things that make you stupid, you can also do things that make you smart".
So how does a person find you? Or how does a person get found by you?
I did a degree in NZ that gave you the flexibility to learn about serious CS, or learn how to write SQL and Java. I've coded VHDL, C Kernel code, I understand the bottom layers of the OSI networking model in depth, I've designed and simulated a CPU, I've written a (trivial assembly) multi-tasking kernel, tackled IEE754 floating point concerns at the CPU multiplier level. I have the grounding in CS theory, and I've applied it to little. Sure, I understand how encryption and associated security principles work, that doesn't stop projects I'm involved in designing and implementing their security incorrectly. I hit most of the things you require and many more, but right now I'm effectively writing business solutions in Java web layers.
I'd be happier with heavy backend Java based servers, happier still with embedded C, happier the more technical the task. But the market is for Java. In the UK technical job offers seem concerned at the door with whether you attended a UK red brick university, or perhaps Stanford. When I put a technical CV in the market, the typical response is that the advanced subjects I understand demonstrate "too basic a knowledge" or "a sign that I don't understand enough Java". Which is kind of fair, as most recruiters don't know squat about CS, let alone software - and the market is for Java (which I also understand, right through to the virtual machine).
So help us out, where does a person with the right training and skills find these jobs that demand them?
Once in my programming class a student was expelled from the room and suspended from school (for 14 days) precisely for criticising the programming language being taught (java), by making it clear he thought it, in is own words "gay". The guy made valid remarks apart from that, saying it gave aspiring programmers a "too simplistic view of software" and "made people almost have to learn from scratch how to code when they where faced with a real programming language". This guy was fluent in C and Delphi so I can kinda understand his view but it's pretty curious how people react when you challenge their teaching strategies.
If I had to define a program for somebody to learn how to write code, it would probably be:
1) Pascal and/or Java. NO UI! Learn the basics of how programming works.
2) C and assembler. Learn how code maps to the hardware. Be able to manual translate simple C programs into assembly.
3) Scripting languages. JavaScript, perl, and bash (or the equivalent).
4) Prolog, forth, and/or Lisp. Think Differently.
5) C++, Advanced Java (with UI).
After all of this, specialty languages like VB, SQL, C#, AppleScript, and Ada should be fairly easy to pick up.
-X
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.
I agree with those who have mantioned that languages are not what should be being taught but the principles. Java in it's current form is certainly great for learning general language features and when i saw Haskell in my first year it helped bring a different perspective from the Java side of things not that i hadn't seen a number of languages before.
On the other hand the chosen language to start with is of real importance, Java is a student friendly language in that it forces you to define types - this may be counter-intuitive in some programming uses but its a well defined language and the typing system 'teaches' you to get into the right habbits.
Certainly on my course in the first year a lot of varied topics were covered such as testing techniques, cohesive code, file system handling methods and exceptions and client server models with objects (client objects calling on server objects). I would also point out that memory handling and pointers from my point of view are mostly handled within Java with its garbage collection features. I can understand teaching C in the second year, after getting the roots of good programming practise and theory of computer science down in the first year but not in the first.
I would also point out that on my course - University of Kent, Canterbury, England, UK (i cannot speak for others) input and output and non graphical programming were taught before going near writing GUIs. Admittedly command line usage was not introduced until the second year directly to students via specific modules but you can ask questions thats what university is about in one way, and also reading about these topics is a major part of learning about computer science. If you don't read the section of the "Objects First With BlueJ" book on running java from the command line and writing stand alone programs then its your loss.
If students are coming out without the knowledge they need then its not because universities chose to teach Java. Maybe student mentalities are changing because of wikipedia and the way life is now, i know one student who steers clear of the library at all costs... where does that lead us?
An interesting discussion of where Java is going is on Michael Kolling's blog linked from www.bluej.org.
For hardwired data structures and batch processing in commercial environments, COBOL used to be quite useful. (But PL/I would do a better job.)
COBOL could (and can) be made to perform. Talking about millions of records and file operations, not the cute little amount of data a GUI displays.
Java in itself is not the problem.
... what should be a single machine language instruction for CMP becomes tens of dozens or more. I wouldn't be surprised if the 1000 was being stored as a string within the beast's guts too.
The problem is that without the grounding in the lower levels the programmers (I use the word loosely here) don't understand about simple concepts, or at least don't understand the ramifications of poor design choices.
As a result you get systems that (for example) use Strings everywhere, for numeric values, dates, etc. They understood what a String was! They probably didn't get StringBuffers sadly, and why they are a solution to the limitation of Strings (in Java) for certain issues. They didn't get that you should use Strings for, well I know it's a toughy to grasp this, textual material. Then you ask them to add a method to sort by the date, and they say it can't be done easily. You check, it's a String! In the format "dd/MM/yy". FFS. They didn't even use "yyyy-MM-dd". Then you find utility classes elsewhere that do things to get values out of these datestrings.
It's odd, but most people that programmed in their teenage years seem to be good programmers all round. Of course I'm coming at this at an age where my contemporaries learnt BASIC and then assembly. I did BASIC and then Z80 assembly for example (and Pascal at school, and a tiny amount of C) before I went to university. Of course to flatten the students out for better assessment the first course was a functional language, ML, and that's why a functional language is good as the first programming language course! Also when you start programming on a 4MHz Z80 with 64KB of RAM, you get to understand the limits very quickly. A good university course should teach you all you need to know about functional and O.O. programming so that you can learn any language easily. A bad university course will train you to do a single language without understanding the actual concepts of computer science.
In my company there's this huge rules engine in use. It appears that said rules engine gave up on the idea of having a decent data structure in favour of passing a HashMap of Strings through it. Never mind the random key names. There's a GUI front end for the rule definitions. You get things like "if foo_bar_amount > 1000" and you know that behind the scenes it's converting amount into an integer before the comparison, with all the try-catch that entails
Yes, the Java Collections API is great, and should be used instead of reimplementing the wheel. But you need to understand when to use them.
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.
Of *course* there's no need to re-check a pre-condition if you're still somewhere within the code where its impossible for it to have changed ... and good compiler optimizers know that and will code the check for you when its needed and omit it when it is semantically guaranteed not to have potentially changed.
Or do you code in one of those languages that leaves it up to you to code the pre-condition check so that you can choose to omit it when, in your infinite wisdom, your design for use of the code says it *shouldn't* have changed and you want to trade safety for a little performance advantage by trusting your memory (along with that of every other coder on the project) of whether it really was changed?
All the summary suggests is that we are creating, borrowing from the medical institutions around the country, general practitioners instead of neurosurgeons in our basic courses. Personally, I like knowing that I can increment the value in a pointer from "a" to "A" or add to the value of a[0] 4 and end up with a[4].
But, many in the industry have realized: unrestrained direct manipulation can be as damaging as an untrained man walking down the street doing brain surgery. You might get lucky, but you might kill your patient -- in this case, a program which may or may not be running critical operations like an embedded control routine in a medical laser. Flip the switch maverick!
I graduated with a BS in computer science before there was a JVM and function oriented C was taught as a prerequisite to C++ with classes being treated like a passing fad. However, I know of at least one school district that within the past 5 years was teaching C++, CISCO, A+, Network+, and a dazzling array of the classes I had to pay thousands of dollars to take at college. If I wanted to play a 3D game, short of creating it myself, I was left with things that make amateur flash games look like an MMORPG. Regardless of the state of US colleges, the science and the industry have made light-years worth of improvement.
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
When I grew up into programming, I started with a BASIC command line on various machines... Apple ][, Commodore PET, TRS-80 CoCo and the like. But that was just entertainment. By the time I was ready to make things really happen on microprocessors, I got a book on assembler and started learning how to make powerful code in small places. By the time C became a topic of interest, I was already doubting how efficient C could be when compared to straight assembler. My suspicions were confirmed in my analysis of C compiled code, but it wasn't all "that bad." But then C++ and other object oriented languages arrived on my horizon and my doubts were cast upon them for efficiency reasons. Unfortunately, the people learning those languages didn't have the background and focus on writing small and efficient code... the world of bloat was upon us.
But having written assembler, I have retained my appreciation for small and efficient code. Knowing exactly what the code does further allows an inherently more secure program to be written. "Stack/Buffer overflows?!" The first time I had heard of those, I was shocked... "you mean to tell me they didn't write code to prevent a stack or buffer from overflowing?!" No...apparently they didn't... and they still don't. What was always an inherent and instinctive practice under assembler for me is now something taught to "security-minded programming professionals" which were classes taught well after bad programming habits were created.
This isn't about "JAVA" specifically, but about onbject oriented coding in general. The rules for writing good, stable and secure code, even in those languages, are fairly well known. It can be done. It can be taught. It isn't.
Teachers need to blame the other teachers, though... not the language.
Well, the primary Java textbook (I taught from it) is by the Deitels. The Deitels always start by having the students build a GUI. Well, duh, the reason you students have a hard time doing anything that does not have a gui is because their textbook taught them that way! And if these teachers were such asses that they could not stray from the textbook--whose fault is that?
I know this won't get read, due to not getting this off in the first 5 seconds after an article posted, but I just have to say this. Rant followed by red-mist comments.
Fuck off already, you goddamed idiot taggers. This article is not flamebait. It is not a troll. It does not have a poor summary. And why the hell are you even bothering to make semi-obscure A.S.R references in the tags, anyway? Too cowardly to comment? Not enough time? Can't actually construct a sentence to fit around a one-word tag-quip?
I'm sick and tired of anything someone doesn't agree with getting marked as a flame, or something that might be slightly controversial marked as a troll. Really, it just shows how stupid we all have become, if these words can't be used correctly.
Ranting aside, the article has a good point. CS students are idiots. The article doesn't mention, however, that CS teachers are idiots, too. It was CS teachers who decided that students weren't smart enough to begin programming learning C/C++ in the first place. This is not a chick&egg dilemma, here. Sometime in the 1990s, many institutions got together and decided to switch to teaching CS via Java en masse.
Personally, i think this is a great idea. Let them all 'learn' enough to pass a fuzzy curriculum, then fail in the real world. Then maybe all of em, idiot students and teachers alike, will get the hell out of the software engineering field, and and stop competing with real programmers for jobs.
Remember, kids. Computer Science != Computer Programming.
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
You just need to use Java 6
java.io.Console
At some point, somewhere, the entire internet will be found to be illegal.
The article should read "Java considered harmful to students"
I can remember being in a couple of interviews for potential new-hires where the guy who was obviously taught with Java completely fell apart with the whiteboard coding test. (candidate writes two selected programs, one on files and the other on linked lists, on whiteboard while many of us talk among ourselves, thus simulating a "normal work environment")
#naabhaprzrag, #sverubfr-000, #agi-fcbafberq, negvpyr[pynff*=' negvpyr-ary-'] { qvfcynl: abar !vzcbegnag; }
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
I attended two Major North Carolina Universities: ECU and UNCW
:)
During my education I have always considered my time at ECU the most valuable in that
I was forced to learn assembler and electronics. Upon attending UNCW I saw many students suffer
from a failure to know anything about the underlying components that a computer operates on.
Simply put, I know how the transisters and Nand gates fold together to create the illusion of magic.
Generally speaking, if you want a solid education then you need to know some basics.
Calculas, Discrete Math, etc.
Physics, Electronics and especially the Computer Science equivalent Switching Theory.
Learn how the car works then learn how to drive it.
I've heard this bullshit for years that you don't need to know how the car works in order to drive it.
But I say you must know how the car works in order to perfect it.
See universities are putting out half assed developers so much that none of them can get a job and the ones that do
just destroys the credability of the students that deserve a job.
Java! Complete utter bullshit. It's the worst language to force somebody to learn on. C++ will teach you more and how to appreciate
it's intricacies. The only people that like java are the ones that are over caffinated into submission! Keep on dranking your pepsi's and cokes
all you are doing is drugging yourselves into accepting whatever these assholes come up with next in order to get another paycheck.
I agree with the article in that, C, Lisp, C++ are great languages. Start with assembler and learn how the compilers are created.
I don't however agree that ADA is a good language. Actually Asm, C, and Lisp are all you need.
I have even taken a compiler class. I own the DRAGON BOOK. I've written my own parser etc.
Some of these languages are just beyond concepts I can describe. C# has to be the worst lanugage ever. Delegates, Properites.
How freaking lame, and they are just copying Java. Much in the same respect that DirectX started copying OpenGL after 8.0. My oh my how
some of the 3D state techniques started looking the same.
I grow weary of this tech savy world, I long for the time when the Kudzuu vines will hang from the Sears tower. How we'll dehydrate meat on the Interstates.
And the elk will run rampant through the city streets.
Tyler, free us from this self centered, nesting, materialistic world.
Fight Club is our Bible, our church.
It makes learning C++ easier. The students that cannot understand VB or Java will be weeded out and perhaps change majors. They will not understand C++ if they cannot understand VB or Java. The first programming language I learned was BASIC Basic and that made it easy to move on to Pascal. Then I was out of programming for awhile and when I went back to school, I started with C++ and could understand it because of previous programming experience. I saw a lot of fellow students asking me for help and/or dropping out or failing. I think they would have done better if they had started with VB or Java; preferably VB. The title of this thread is misleading as it makes you think that professors think the language of Java is bad. I think all colleges/universities/etc. should recommend starting with VB and then Java, then C++, then x86 Assembly. All those languages should be taught and that order would be recommended by me. They all have their uses and they are all necessary to develop a good computer scientist. Yes assembly too. Assembly is not as difficult as many think. It's just a little tedious and it teaches students more about how computers work at a low level and translates into better programming practices and more skills. Math is for another debate, but it important too for advanced programming applications and to think logically and analytically.
http://www.fuckedupcountry.com
Given the authors, perhaps they could share their insight on how studying Ada is damaging to your employment prospects and your career?
Most real computer scientists don't want to perform the work in the domains the unwashed productive masses operate using languages like Java and VB. Why is it so hard to understand that those people do not consider themselves to be computer scientists, nor do their jobs require them to be?
The problem is computer scientists having so much self respect that they're insulted by the jobs they do get, leading to a lack of respect for anyone else performing the same work without precisely the same background, but not enough self respect to go out and get the "real" jobs they think they deserve. It isn't that non-computer scientists are sullying the field, it's that there are legions of unambitious, barely qualified "real" computer scientists trying to make the low-hanging fruit jobs writing silly WYSIWYG GUIs and web applications equate to writing bare metal encryption algorithms for NSA...and then they wonder why there are so many jokes about the alienated, arrogant IT staff that are just this side of batshiat crazy.
I am a 4th year CS major at a small liberal arts college in New England, and am a Teaching Assistant for the intro to computer science course, as well as the Data Structures course. This year, the faculty made a key decision to switch from teaching Java in the intro course, to teaching python. Those who believe C should be taught probably consider this even more blasphemous that teaching Java, because at least with java you have to compile, etc.
I disagree however. Computer science is not simply being able to program in different languages, it's being able to understand logic and how computers operate. These concepts need to comprise a foundation long before a student ever needs to worry about pointers and whatnot. The fact of the matter is, a computer is whatever we make of it, and if we can build a system that does not need pointers, that system is no less a computer than a PDP-11 or Eclipse or DeepBlue.
First year students in particular should not have to fight the language to achieve end results. Python provides this functionality, enabling the professors and TA's to introduce even recursion in the first semester course, which would have been unheard of with our previous Java course.
But, like all good liberal arts students, learning is not about the specifics it's about the process and the patterns that we uncover and can be applied to other languages in the field. Once concepts of programming are understood, learning different languages becomes mostly a chore of learning different syntax notation. How quickly did you learn your second language compared to your first? Your first program in your second (or third) language was probably not "Hello World," (unless you are like me and you just wrote it for kicks), but instead was probably a program designed to accomplish a task for which that language was geared. "No, I am not going to write this log parser in C, that would be silly. Hmmmm, I hear Perl is good for that stuff..."
However, the result of computers becoming more powerful, enabling higher levels of abstraction from the hardware, does present different issues in the industry. Computers are becoming utilities, and abstraction allows schools to produce utility programmers, in comfortable utility languages like Java or even python. The industry is creating more and more single points of failure in terms of capability and know-how. Students might become less and less interested in writing interpreters and virtual machines because they no longer appreciate what those programs accomplish (in allowing for abstraction in the first place). Thus the knowledge to do so, to talk intimately with the hardware with languages such as C, will disappear, much like how assembly programmers make up smaller and smaller portions of the market.
But what is the true impact of such a progression. Is there an expanding role for people who can write in C, or are there a finite number of jobs, that as long as they get filled by at lease one competent programmer the industry is safe? Will there always be that university student who is striving to control more and more of his machine, or will all university student's curiosity stop once they can program a bouncing ball in Java? Is my college wrong in attempting to teach "how to think," before we teach "this is where you place the curly bracket,?" These are the questions of our times, and like most things CS, will probably boil down to yet-another-reiligious-war (YARW). But as long as both sides have supporters, I have hope for the industry. It takes all sorts of people to make the world go round.
The first language I learnt was HTML, if you can consider it one. I progressed to JavaScript after that, then moved on to *managed* C++. A year later I moved to C#, and I've been using it since. Looking at this, you'd think it was a really crappy intro to programming. HTML is a mess (compared to XHTML), JavaScript isn't even strongly typed, and then I just jumped in the deep end. Yet I'm one of the best students in my class (yes I'm a student - studying software development). It could just be that I'm naturally gifted, but perhaps there is somthing to be said for the self-taught after all... Maybe its better to learn from experience and research, rather then let some professor who studied assembly in uni pass down his possibly outdated thinking.
Most human behaviour can be explained in terms of identity.
Keep in mind - I'm coming from a school who doesn't even teach Java, they teach their own made-up C++ variant that no one aside from their research group uses or generally has even heard of (Resolve, bleh).
:)
It is my opinion that there are few things that will benefit a growing programmer more than being forced to use and think in different programming languages and to learn to program in the appropriate paradigm for that language.
I love C as a language as part of understanding the core of the relationship between your code and the machine. A combination of C and assembly should be a requirement for all CS or EE degrees because it makes you think about every single minor thing you try to make the system do. I honestly think that this instruction should be combined with some sort of compiler course - so you can see what your C code is generating and why. It's also a good time to look at performance analysis. However, you should tell, even recommend to your students, that if they're doing something other than kernel or driver work they probably don't want to be touching this stuff again.
I love something like Smalltalk or Java or Object-C or something, anything but C++ for teaching real object-oriented programming. The thing is, you need to force students to learn how to both implement even the lowest level classes, but get them to really comprehend the idea of programming by contract and encapsulation so that you really have no idea what *class* you're even working with, let alone how it is implemented. There is so much more to OO programming than the "grab a class that does what I want and hack it to work" mentality that often seems to be taught in introductory classes, and in my opinion C++ does as much as it can to muddle up that thinking. Most C++ instruction I've seen quickly resembles "C with some conveniences" than it really does OO programming.
I think that everyone needs to be taught or know some scripting language. And please, can it actually be taught instead of self-learned (the VBscript code samples I have found online are often horrifyingly bad). There are a million problems that have nothing to do with the "art" or "science" of CS that still need to be solved every day, and often the best and easiest solution to those problems involve a scripting language.
And of course, you have to throw in Lisp or Scheme, just because the mental model required is so very different from any other programming language. Make people think, and it should help them understand recursion in whatever else they're programming in.
I guess I've always felt that it was a real shame how easily new programmers fall into traps of language wars, and preferring whatever they're familiar with. I hated Resolve, but the best thing it did was force me to learn at least two languages in college, because I knew that I would never be able to get a job with that one
I see no need for the struggle that seems to go on in CS academia about Science versus programming versus software engineering. A good school should be aiming to produce people who understand the theory behind what they are doing, are masters of enough programming languages that they can think of how to solve any problem in at least one of them (and can pick the right one for it) as well as being able to pick up a new language in a week, understand the most important practices of software engineering, and are engineers enough to really understand what the hardware is doing.
Looking back at my classes, I see places where they could have fit all and any of that into the curriculum without even leaving out what they did cover. I think the better students tend to figure most of this out themselves - but any self-teaching like that has gaps and holes that can come back to bite you in the ass, and in any case contribute to the lower level of professionalism in our field.
College is supposed to prepare you to be an expert in your field. Focusing too much on any one aspect of programming (pure theory, a single
K&R were trying not to smoke 8-bit CPUs and exhausting kilobytes of RAM with your inefficient programming. Strings can come from a lot of places other than user input, and most programs out there were tools for the end-users to do their jobs, not websites or even telecom apps.
Sure, you could do a buffer overflow on your handy-dandy EBCDIC converter, or crash your line editor by inserting null characters. But why would you want to? You could also stuff pencils into the power supply and fold floppies. What's your point?
If you want protection for modern programming, try C++.
If I recall correctly, introductory programming classes are geared toward the mass of the student body and not really relevant to systems programming. And NONE of the languages traditionally taught in introductory programming (FORTRAN, BASIC, Pascal, Java) use pointers the way they are used in C, C++ and Assembler. So the argument at that level is really moot.
The real question is: what is the first programming language that a computer science or engineering major should learn AFTER intro programming? While C could be considered "obsolete", I would still prefer it to C++ in this case, because C++ would give Java programmers a false sense of familiarity due to its object orientation. But even C introduces several permutations and uses of pointers that can be confusing. Pointers to arrays of function pointers, anyone?
Frankly, I'd prefer to see the CS and CSwEng majors get into a course on boolean logic and logical microprocessor architecture, with a simple assembly language like 6502 8-bit assembler used as the programming tool. It's easier to learn about pointers as indirect memory references when you only have to worry about the memory management involved in adding two arbitrary integers, and not have to worry about refactoring your objects and other complexities introduced by the higher level languages. Learning some simple assembler and architectural concepts would also help the comprehension of what is going on in C and C++ behind the scenes. For example, the short-hand notations for incrementing and decrementing numbers in C/C++ make more sense after seeing the corresponding assembler operations.
We are the 198 proof..
Sadly, others have noted similar concerns in the way we teach programmers.
One classic piece is this series of articles on Salon about "The dumbing-down of programming".
This is pedantic but I don't consider references to be pointers because they can be garbage collected. Someone summed it up to me like this: The difference between pointers and references is that you can do arithmetic on pointers.
It's a real shame what the burger flippers are doing that to you folks though...
Perl can be used as a functional language. It can also be used as an object-oriented language, especially if you use a modern OO library instead of the low-level core support for object-oriented development. Perl is also a great structured programing language too, of course.
Other than Systems Programming and Operating Systems, you could use Perl and CPAN to address all of the computer science subjects you mention, and you could use the Inline module and the other modules in its namespace to teach other languages, within the context of a Perl development framework.
I'm not suggesting that universities should switch from all-Java to all-Perl (though doing so would probably improve productivity for most programmers, so long as they're taught to use Best Practices and not create the write-only code that bad/non programmers often create with Perl.) Instead, I'm thinking that an introductory course could teach Perl syntax and best practices, and use that as a basis to provide introductory training in all of the different development styles and subjects you've touched upon. By using one language that is flexible enough to cover this wide variety of material, the topics could be covered without confusing beginning students with a variety of languages.
Making a 6 figure income without pointers is possible. I haven't used pointers since the days of NEAT/3 in the early 80s, and good riddance. For the majority of work out there, they aren't needed and for those that need them, the smart ones will pick them up quickly. I know I did.
Learning how to code without a GUI is the fault of the teacher. I write most of my Java without a GUI, some of it running 24x7x52 and surviving through database resets. Others were very sophisticated monitoring scripts, web page scrapers, data manipulation programs (both database and flat file), and even reports. I write them because developers coming out of school have not been taught skills surrounding the operationalization of programs, such as adequate error checking and messages and code that is able to recognize external failures (such as database shutdowns) an react with anything but an abort.
It's not the language, it's the course material that is at fault. And the teacher who hasn't had any experience in the business world and understands that learning syntax, classes, and algorithms is only step one through three of a many step program.
I rarely read replies, it's my opinion and if you thought about your opinion a little more, I'm OK with that.
I like Java. I develop extensive systems in it. I also have developed extensive systems in C, C++, Perl, Python, Progres 4GL, Clipper, VB, Delphi, Basic (Tandy Co-Co no less), Assembler (Co-Co,C64,AppleIIe), Lisp/REP/Scheme/Guile (My personal favorites), Javascript (really just Lisp with syntactic sugar), etc, etc, etc.
All of them are "nice" and productive languages. But, let's make one thing clear, a language like Java was not invented to solve a technical problem. It was invented to solve a commercial problem. That problem, "How does Sun sell their hardware and O/S when all the developers are developing for Microsoft/Win32?"
So, trying to introduce new developers to Java under the false assumption that Java is needed to solve some class of problems that predecessor languages were inadequate to solve it complete and utter "BuuuuuuulShiiiiiit"!
I'd rather try to keep things honest.
Over-the-top Response Guy! Giving "Over-the-Top Responses" since 1970.
"Damaging"? How about "more damaging than learning to use GOTO"?
Seems more like they are not complaining about people learning Java as they are about people learning Java first. I suppose I can understand this as Java is what I learned first. It is what I took about 3 years learning in Advanced Placement Computer Science in my High School. I have to tell you, I have an excellent knowledge of loops, recursions, iterations, and many other basic computer science methods and terms. But seriously, what is a Pointer? If there is one thing I know this article is right about, it's that I can learn plenty of Java and never be properly taught everything there is to know, but isn't that the point of learning something, knowing that there will always be more you don't know. Sort of, just because you have a lot of knowledge with Basic, C, C++, Java, and Pascel, that doesn't mean you know Python and Python is on the rise. So a Programmer has to start somewhere and just keep learning till he knows it all..
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?
Amen.
When I was younger, my father wouldn't let me have an electronic calculator until I proved to him that I could do long division and I knew my times tables. He wouldn't let me have a scientific calculator until I could explain square roots, the basic trig functions, and the idea of logarithms.
Would I do these things by hand today, in a non-trivial context? Of course not, I have tools for that. But there was never any danger of using a tool I didn't really understand, or picking the wrong tool for the job as a result, and I am forever grateful to my father for making me invent the wheel the first time.
A bit older and hopefully a bit wiser myself, I see a lot of the same things in programming today. Junior developers come straight out of education and don't care about understanding pointers. They reckon they don't need to understand sorting algorithms, because they'll just use a sort function from a library. They don't need to understand data structures either, because again they have a whole toolbox full of them. In fact, they don't really want to understand what's going on under the hood of their program at all, because apparently (so they tell me) one day we'll have a sufficiently smart compiler and it will optimise away any unnecessary overheads they introduce. Presumably some uber-l337 hax0r is going to write that for them. ;-)
<sigh> And we wonder how a modern PC literally thousands of times faster than those of a decade ago can possibly take the same length of real time to do simple, everyday things, and how in an Internet-connected world where spyware and malware cost society billions every year we still have basic security flaws that let the script kiddies in the door. Won't it be ironic if the educational gaps left in a whole generation by modern universities catering to a cookie-cutter programming industry wind up being addressed by the veteran programmers in industry who needed to get stuff done properly? :-)
If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
...but don't seem to realize this.
What we observed at New York University is that the 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
There are two ways in which I can perceive this.. Either they find it hard to write software which doesn't have a GUI (which strikes me as odd because setting up a GUI in Java can be relatively difficult, esp. for a beginner). OR he means that it was hard on the students to write interactive software which should work on the commandline. Then he would have a valid point there because although it is very possible to write such programs it can be tricky. A lot has improved in SE6 but still...
HOWEVER... In another part of the article they describe their main gripes with the Java language, namely: Java, instead of exposing this beauty, encourages the programmer to approach problem-solving like a plumber in a hardware store: by rummaging through a multitude of drawers (i.e. packages) we will end up finding some gadget (i.e. class) that does roughly what we want. How it does it is not interesting! The result is a student who knows how to put a simple program together, but does not know how to program.
And there are some things which I find wrong with this comment. The first is that the main gripe here doesn't seem to lie with Java but OOP itself. The whole idea and filosophy behind OOP is to have several individual objects which, when brought together, can perform a bigger task. You don't need to know the inner workings, only the results (basicly input/output) matter. This sure looks to me as if this cluebie is now blaiming the language for being OO!
While I do agree that I also wonder if OO based programming is the best way to start I also can't help wondering why the heck students only start working on a single language? That makes no sense to me what so ever. When I was still studying we were taught both Pascal and Assembler. One was the more "abstract" language which made things easier, and the other was a lot harder but also gained you a lot more control. The whole advantage you gain here is that when learning what the first language does you'll immediatly implement those ideas with the other language. Especially if you realize that in the end Pascal basicly generates assembly code.
So why can't they manage to do the same for a combination of Java and C ? IMO this would teach students the easy and direct ways of OO while also making them aware that while OO is a very nice programming model it cannot solve all the problems out there.
The other thing which I consider wrong, but this is a little nitpicking, is that while he claims Java is simply "collecting pieces and making it work" but still says students are having problems to write an interactive program for the commandline. What strikes me as funny is that doing so is really a classic example or reading the API docs and picking what you need (as well as some knowledge about stdin).
This whole article tells me more about the quality of that particular school than Java.
Java has its own special niche, kind of a middle-road for when you need reliable systems more or less quickly, but perhaps not by tomorrow, such as in financial institutions and what not.
C and C++ are meant for systems development, and excel at that, leveraging the power of writing in assembly without the hassles of assembly. You can make great and wondrous use of pointers if you know what you are doing. You can write fast real-time code that runs in a small footprint. You can also hang yourself easily if you have no clue. :-)
I have been around for a while, and still choose to do many things with the command-line and with emacs on Linux. I do work with those who would probably croak if I took away their Eclispe IDE. Though, for database architecture, I have chosen to use an IDE for that, simply because it makes it easy to make changes in the schema, and it creates all these pretty ER diagrams that I can share with others.
As far as exporting software development, good luck. From what I understand it's a crapshoot. In many cases you get crummy code, but you may not care about that if it works and you got it on the cheap. Of course, if you had to maintain it....!!!!
So, I think the author of that article is a bit overblown though he does make a number of salient points. And of course, I question his motives of brain-draining even more rare talent for the productions of weapons and other systems of mass destruction.
Ruby Neural Evolution of Augmenting Topologies
Java is bricking students' brains!!!
This is a fantastically insightful comment, and IMHO it is very true. I came from the generation of developers that was caught somewhat in the middle - C++ was the platform for study in high school, and when I got to University Java had just become the de facto platform. As I approached graduation, I was exposed more and more to younger students that had not seen anything other than Java, and they were completely lost without a textbook to copy and paste from. It was depressing. Now I'm running into them in industry, and they don't have the skills to adapt to the real world of software development.
perl -e "eval pack(q{H*},join q{},qw{70 72696e74207061636b28717b482a7d2c717b343 637323635363534323533343430617d293b})"
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.
There are also the traditional inter-generational conflicts:
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
There are US students still enrolled in programming courses?
As a lowly grad student, my CS department decided that it would move its undergrad intro courses from Pascal to C. I thought this was a huge mistake, as C is not a beginner's language, unlike Pascal.
In the end, market forces dictated the final decision. A lot of the undergrads wanted to become C programmers, not because they were interested in programming, or the language; they wanted the resume bullet of knowing C. (This was long before Java existed, you see.)
It was like that old joke where a rude patron shows up at a diner, and yells at the nearest waitress, "hey lady, make me a cheeseburger!".. only to have the waitress look at him and say "okay, poof, you're now a cheeseburger" before walking away. Instead, you had students yelling "hey, prof, make me a C programmer". (Were the students were as skilled at C at the end of the course? Yeah, sure, and the rude customer was suddenly tasty with ketchup too.)
It seems not much has changed since then. A lot of people who really shouldn't be programming (let alone for a living) are learning Java. They have no regard to the care and craft required of solid software construction. (I see this a LOT in offshore development teams as well as in new grads.)
Oh well. Thanks for keeping me employed, folks.
--- The American Way of Life is not a birthright. Hell, it's not even sustainable.
What is it that the lecturers here are expecting?
If I wanted to teach people to be ready-to-roll programmers in insert-language-for-today, I'd do industrial / commercial training. Short, intensive courses that deal in the how and not much in the why.
If I wanted to teach people to really think about the fundamentals of how computers work, and how languages work, using a range of examples, with a veiw to designing better computers/languages/systems, I'd teach in a degree program. Extended, theoretical courses dealing in the why, which may involve soem of the how, but accepts that whichever language you learn is quickly obsolete, so gives you the tools to look at ideas instead.
(for the record, I've done some of both. Both are equally but differently challenging)
Look up the extensive educational debate on academic learning vs vocational training if you're further interested in this. Since that is the underlying issue here : what's a degree good for?
Like most ed professionals, more questions than answers, I'm afraid.
I'd be willing to bet that 90% of the students in my CS program have never heard of pre/post conditions and how to chain them together to think about how a program works. Or loop invariants. They're clearly using them (because they can get their programs to run) but don't understand them - and understanding how pre and post conditions chain together is probably the most essential tool in your brains for writing good code.
One of the biggest disappointments to me about Java was that it did not support Eiffel (Sather...) style pre/post conditions and class invariants. Then Microsoft could have won me over big time to C# by including nice (and nicely syntactic) language support for them, but they didn't do that either. Asserts are ok, but not as easy/elegant.
While I once liked Java as a first language, I now see that what is taught in Java books and classes is stuff like what a class is, how inheritance works, how exceptions work - often before they cover arrays. Too often, what is being taught is not how to program (whatever that is and however you teach it) but how to use java - a different beast entirely.
This article has described exactly what is happening in Australia. At the university I graduated from they taught formal methods, computer architecture, assembly, C, C++, Haskell, math, concurrent programming and all sorts of other good stuff. Java was still used as an introductory language but at the same time they taught us that all objects are just pointers to heap memory in Java. The course also covered the softer side of software engineering such as requirements and documentation which is also important. The article makes no mention of this kind of stuff being important. Maybe there has not been a decrease in the quality of teaching in this area.
The university has now dropped all this "hard" stuff to try and attract more people to their degree. The teaching staff has also halved in size. I have spoken to many recent graduates from around Australia and it seems this is happening everywhere. It is a real shame.
Why outsourcing? Because the offshore coders are the worst sinners of all. I have been in this industry for a long time and have worked with lots and lots of offshore teams. You find the very sloppiest coders are found in offshore projects--on the Indian side. I wish it were not true but it is.
I see lots of posts decrying both Java and C, for different reasons. Perhaps the answer lies somewhere in the middle. Teaching only Java yields students who do not understand pointers, or assembly, or optimizations, or any low-level thinking. Teaching C is abhorently difficult because there are too many stumbling blocks and subtle things that can go wrong.
It seems to me that the ideal solution would be to teach a C-like language that didn't have certain stupidities. For example: printf("%s", 5) results in a memory dump of whatever is at address 5, up until the next 0 byte. (Notice "d" is next to "s" on the keyboard). It's a great learning experinence, it's important that they see and understand that the computer is doing exactly what it was told to do. And there's nothing wrong with an efficient language that skips bounds-checking and allows pointer arithmetic. But that is too subtle of an error for a programmer to understand on day 1. So it would be nice to have a beginner version of C that instead displays "5 is not a string" or something like that. It would help students and teachers get over the hump and into the real business of what they are doing, then switch to the more powerful language after they get their feet wet.
As a perosn that just recently completed a very educational internship on Java, programming and computer science, I can say that these professors are partially correct.
While I think that it is necessary for students to learn about the more traditional aspects of software development (i.e. pointers, memory allocation and optimization, etc.), this doesn't necessary have to translate to booting Java as an educational framework. I believe that Java's prowess in object-oriented programming makes it extremely important to use as an academic platform, as well as a vocationally-preparing tool for the "real world" that is often preached about today in universities.
For example: Mainframes were of vital importance in yesterday's computing world. Some larger companies still use them for archival purposes. However, are we still taught any of the rudimentary languages that they operate under? No; our shift has focused to more important issues of today's computing paradigms; application performance, program security and information presentation.
However, I think that using Java as the sole example of programming in computer science and software engineering programs is a very damaging idea, since it's much easier to forget about the core aspects that make a program good with a language that does significantly more "hand-holding" than older languages did. It is possible to create a mean and fast app with Java, but it's much easier to create a hog with it as well (just like it's easier to create a memory leak with C++ when forgetting about pointers, etc., but easier to make a very fast application with it).
Java is not an Object Oriented Language. It is an OOP-like language with some support for objects. Smalltalk is a nice Object Oriented Language.
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.
I agree a little more with the parent of your post because, I find that it's really important to be able to reason about what your code is *doing*. To reason code, one must understand what high-level language X is doing with it. A lot of mistakes that I see are made because people don't understand how their code is executing.
It doesn't take too much to learn. A bit of assembler, write some basic stuff, so that one can get the idea of it. Write a bit of C for a microcontroller, throw in a few pointers, so that one has a working understanding of stack/heap memory, function pointers and such. Only then will you be able to understand how the CLR works, how it tries to save you from resource leaks, and how you can still screw it all up.
Ignorance is not bliss when it comes to working in higher level abstractions. One needs to have some basic idea of what the abstraction is doing.
Like all pain, suffering is a signal that something isn't right
There is nothing wrong with learning java. There is something wrong with learning java to avoid learning the low-level details of a computer.
Klingon Software is not released, it escapes, inflicting terrible damage onto the enemy as it does
Computer scientist spend 90% of their time surfing for porn. I have yet to see a class that teaches how to do this efficiently.
Learn C -> C++ -> Java -> How to surf for porn. Here is your bachelor's, thank you for attending our University. May you live long and prosper.
I'm a senior CE student who's about to graduate this spring from a well known university. First, to bash C a bit- one reason java is superior to C/C++ is that there is a consistency in compilers. Not all work the same and that causes issues. That isn't to say that C is absolutely superior, it's just one of the strong points. But that's the real point I'm making. All languages have strengths/weaknesses. If you had to do some logic work, you could do it in C or Java or Pascal, but the logical choice would be a logical language like Prolog. Or if you needed a completely versatile language, you'd go with something that had a versatile typing system, like ML. I could go on and on, but I hope my point has been made. Anyone can learning how to program, it's not that difficult. But the ability to choose the most appropriate language for the job and do it most efficiently is what makes a software eng.
With that said, what it boils down to is what makes the best educational languages, as they should be used in school for most of the time. Like starting with Pascal (say what you will, but it is one of the best learning languages out there) to teach iterative programming. I haven't used OO Pascal, but I know of it's existance so that might be a good call for teaching OO techniques. However, for shell programming, C is a great language for it. But OO is the next gen of programming type, so it is critical to start teaching OO early on, because the more iterative work done makes it more difficult to grasp TRULY OO programming techniques.
Once the language type has been learned though, then you introduce other languages so they can choose best language for whatever situation.
And that's what I have to say about that
Live life to the fullest. It's not that life is short, but that you are dead for so long.
Even in the late early years of Computer Science (early 1980s), when PCs where not ubiquitous and MS was just getting started, basically the same situation existed.
Some people could not get passed the same issues you mention. Except back then the GUI was the text menu.
Some people just do not have the necessary skills to solve problems; but this is not just limited to programming.
Of course some professors had the same/similar concerns back then - I will never forget the senior level class that a visiting professor was teaching and was amazed that we had never been exposed to ( in her estimation) the greatest language ever - LISP. And originally she insisted that all problems where to be solved in LISP. Once she realized that the we really did not know LISP - this was never a requirement in the program or for the course, she relented and allowd us the language of choice. ( She also realized that we could not get proficient in LISP and do the normal course work in time; afte all this was not a course to teach a language, but to apply concepts to solve problems - it was some type of algorithm course).
That's because OO languages like C++ and Jave relay on there standard libraries for high abstraction - even in C you would use a library function (memset).
.. 10000) := (other => 'a');
The Ada the solution the the above problem is:
As : String (1
A programmer which has learned Ada as first language will look for an more elegant solution the a for loop when forced to use a lesser language and might in fact find "StringBuilder" on there quest.
Martin
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.
I graduated from UCF a couple of years ago a course in programming languages was required.
We had assignments in LISP as well as Prolog.
My Software Systems class had just switched from ADA to C++.
Java is a great language to do assignments in because you can get stuff working pretty rapidly.
My Systems Software class (not to be confused with sofware systems which I took the same semester) we had to write a two pass assembler in Java. Doing it in Java made it real easy because we could use vectors and hashtables and actually concentrate on the ideas of assemblers they were trying to teach. If it was in another language it would have taken longer to do but wouldn't have taught us anything more than we learned using Java.
Any good CS program will teach you theory and not a particular language. It was kind of frustrating as a student for them to not teach us Visual Studio, or Sun Developer Studio, or Eclipse, or Access, or MySQL, or any particular version of something. They just taught us theory which I am glad about now.
Ideally, the programming language used to teach a course should support only the core concepts of the subject. It should avoid all else. That's why Pascal and Scheme are probably still the best means to introduce the basics of procedural and functional programming. Sure each language has weaknesses, but the goal in CS is to learn *principles*, not *languages*, and these two perform that role economically and effectively.
Should CS students learn Java or C++? Yes to the former since its today's lingua franca among professional software engineers (and probably no to C++, because it's requires the programmer to overcome far too many interfering semantics when implementing even simple tasks). But Java should still be introduced only when teaching principles of software engineering, not computer science.
Randy
Just to point it out to you: Ada is an OO language and has Pascal like Syntax. See:
http://en.wikibooks.org/wiki/Ada_Programming/Object_Orientation
Martin
Don't you know that Ruby is manna from Heaven and everyone and I mean everyone should be using it. They could do an occasional foray in to C# if need be. If you must use Visual Basic never ever admit to it. Don't even get me started on FORTRAN users.
.NET world and must use VB or C#. I never got my head around Java but since I'm a web developer and part-time sysadmin I'm very comfortable with Perl, PHP, and Python (my preferred language). In my CS classes I had to learn Pascal, Assembly, FORTRAN, C then C++. And I even had to roll my own mini-language using Lex and Yacc. On the job I learned Visual Basic, Objective-C, Java, Perl, PHP, Python, and Powerbuilder.
.NET. 'Everyone' uses Microsoft so they want MS based programming systems. You just have to find your niche. My preferred language is Python because it can run in Jython so it has an in into the Java world. It can be IronPython so it has an in into the MS world. It is object oriented and much easier for me to debug than Perl. It's also easy to learn and there is a lot of crap I just don't have to worry about.`
Snarkery aside (is that a word?). Use the language that you are most productive in. Use the right tool for the job. If you are simulating nuclear explosions or climate modeling then FORTRAN may be your tool. Some programmers are stuck in the
I think a programmer should be exposed to multiple programming paradigms. You don't know what you may actually end up programming in. The big sell about Java is that it is an 'Enterprise Level Language' and is a big sell to companies. Same goes for
"You'll get nothing, and you'll like it!"
I think the thing that makes Java "damaging" is that most people that learn it don't learn any other language. Why? Because for most employment Java is all that exists outside of "niche" markets. If you don't learn Java as your first language, you end up learning it anyway so you can get a paying job (since most jobs are java and the ones that aren't java are probably COBOL). You just don't need anything else.
Java is the new COBOL. It isn't going anywhere so like guys in the 80s, you can learn one language and retire using it for 20 some years...
Of course, people with those mindsets are missing out on a lot of fun. I learned Java first and use it 92% of my time (the other time is wither SQL or bash) at work. But at home, I love playing with C and C++ but its only a passing fancy. I'm sure my following lament is shared by many Java first-timers: if I had a pratical reason to use C/C++ or , I'd have a reason to learn it better. Since I don't have a pratical reason to learn it or use it, I can't justify the time at home to spend on it.
I started working in IT a few credits short of a BA. I learned databases, networking, and servers on the street. Every few years management would bring in a "Golden Child" with a B.Comp.Sci. Aside from the ones from Waterloo and Rensselaer, all the other computer science grads were incompetent. Most of them had soft hands and were incapable of rescuing a dead server or creating a practical app for a client in a practical period of time. Most of them washed out, some of them gravitated to management which is probably a good match for their skill set: none.
I've seen some terrible IT projects started by companies on the advice of their Java-loving computer scientists. The only people who like Java are its priests. Most of these projects ended up with tens of thousands of dollars in server farm expenses to support Java bloatware and were replaced by PHP scripts that ran fast on old PIII servers.
People need to be programmers before they study computer science.
That means they need to know programming before they get to university.
The way it is now, university is just remedial and hopelessly behind-the-times.
AFAIC, nobody ever learned to program in school.
When I studied computer science, which admittedly was a very short time, we had a very interesting course layout which really made sense in the end.
What we did was that we started with high level languages (Pascal mainly, this was back in the stone age) and at the same time we had courses in digital electronics, that tought logic and basic circuitry.
And then, while the digital electronics got more and more complex, the programming got more and more low-level. And in the end of the year, we made our own microcomputer and programmed it in assembler.
Something like this should in my opinion be the layout of every single first year in computer sciences. Admittedly I didn't learn anything the first half-year, having dome some computing before, but in hindsight, when everything came together at the end of the year, I realized this was a fantastic overview over computing. I had after this insight in both procedureal programming as well as SQL-databases while still being able to program in assembler and actually soldering together my own little 8-bit computer.
Big Kudos to whoever at Utvecklingscentrum Gotland and The Royal Institute of Technology in Stockholm that thought this course up in the end of the 80s. I don't think you can get a better one-year introduction to computing.
I think that universities should create separate degree programs. I'm sure that Computer Science would nearly empty out. Perhaps it would move to the Math department. I'd still be in it, though.
Programming is a neat tool, but the fun stuff is discrete mathematics, set theory, process/security calculus, and most importantly computability. Design patterns and computer architecture are interesting to some, but often they're the types that groan at discrete math and 'classical computer science,' (of which there is a decent amount of development these days).
Reid
The Right Reverend K. Reid Wightman,
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.
I think that students should be taught C and C++. To go back to the basics and learn how to do memory management, use pointers and all that good stuff that builds a good foundation. I found after you have a good foundation in C you can just go and pick up new languages with little problem. I think its fine to teach Java, C# .Net, etc after they have a solid foundation with C and C++.
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.
If MS did not get a swirly they might be teaching Visual J++ to CS students! Wouldn't that be F*^$'d up? I was in school in the J++ era. Yes I was naive about schools (Brown Institute) and the school was naive about the Java language (as in it was suppose to be cross platform...It's reason for existence) and they actually taught it. What other schools taught J++?
From Wikipedia-
"On January 24, 2001, this suit was settled and Microsoft agreed to pay $1.95 billion and to cease MSJVM distribution"
Still Java took it's place as the cross platform language just as ODF will take it's place.
Well, for a start, I probably should apologize if anyone understood the "burger flipper" quip as singling out McDonalds' employees. As it happens the particular burger flipper I was referring to in that paragraph (and yes, he did get a real programmer fired for writing correct code he couldn't understand) is an ex-marketer.
It's more generally the complaint about anyone turned programmer with no more than a minimal course in some language, just because programming pays better, not because they actually have any inclination or aptitude. It's more that they're (still) burger flippers in the language of their choice, than whether they literally flipped burgers before. They're trained at most as unskilled manual workers.
As for the rest of your comment... well, I'll try to say it more diplomatically and constructively, but it's basically a more verbose version of what the AC already replied. Sorry.
See, thing is, programming isn't unskilled manual labour at any level. Whether you're designing the grand architecture of a whole enterprise system, or just the innards of a helper function, it's design and engineering work. So saying that someone should just teach you the language, but not the engineering principles, is a recipe for disaster that's been repeated too many times.
It's like saying that you should just teach someone how to use a wrench and a hammer, and then ask them to build you a custom car from scratch. Regardless of how hard management wishes that it were just a matter of mechanical work with those tools, it isn't. That guy may be able to hammer sheet metal like the best of them, but if he doesn't understand combustion engines, he'll still produce crap. Both performance-wise and safety-wise.
And that's just the mistake repeated in programming again and again and again. There's a ton of _horrible_ code out there, and a lot of security holes repeated verbatim again and again. (E.g., not only I see the same cross-site-scripting and SQL injection vulnerabilities repeated ten thousand times verbatim, but occasionally I even run into idiots arguing that they're overrated and inevitable anyway.) Because yet another guy didn't even understand the principles behind it, and didn't even know such basic stuff as how to quote a string for use on a site or in the database.
Please don't take that (necessarily) as an insult, but as an explanation of _why_ you need that engineering stuff. Because you _are_ doing engineering work. I'm not saying "go back to McDonalds", I'm saying, "do learn more and you'll be better at your job." Your choice whether you want to follow that advice, though.
A polar bear is a cartesian bear after a coordinate transform.
Good Article. Used to chaperone CS labs during post grad to make ends meet. Java is not a good first language for computer SCIENCE. It makes the whole process seem confusing and somehow 'magic' simply learning programatic incantations and learning the CS prof's prefered idioms. No concept of the cross platform, virtual machine, bytecode, interpreted, hotspotting, garbage-collection, client-side, etc, etc. The so called 'CS' course just churned out RAD Cookie Cutter GUI programmers who could connect (just) to databases. Imho must pass C class first, preferably with a bit of assembler thrown in, then and only then Java but teach from the bottom up not GUI top down.
we are all cosmic nuclear waste
I work for a small company. Our software is all written in C++ except for the parts that have to be some other language(java) to interface with customer systems. Finding fresh BS grads in CS to hire can be a real challenge because we need C++ skills far more than we need java. I'm currently getting my MS in CS, and I'm amazed by the number of people in my classes who are very bright people and are very knowledgeable about all things client/server/web oriented, but who have no clue how to write even the most rudimentary applications for straight computation.
The MIT CS and EE degrees required a programming course (6.001) based on a descendent of LISP called SCHEME. They started this around 1970 and just dropped it for 2008. SCHEME had a very wide set of computer language elements. It was only commercially practical in the early 1980s when A.I. Lisp machines were the first graphics workstations, quickly subplanted by UNIX/C. [6.001 "Structure and Interpretation of Computer Porgrams" is replaced by 6.005 "Principles of Software Development" and 6.006 "Computer Algorithms". Since these are new courses, I havent seen details yet.]
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)
We are in Toronto and I can personally attest to the difficulty of finding good C++ applicants, particularly fresh from University. Unfortunately it seems that university or college graduates are now trained in java and .net, neglecting C++. Pity, as our website shows THREE open positions for C++ applicants.
.Net - how wrong they are. Even current C++ programmers seem to be looking for Java and .Net.
Even if I were to hire good programmers and hope they would pick up C++ (a training curve we are reluctant to pay for), these fresh graduates seem to be brainwashed into thinking C++ is dying in favour or Java and
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?
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.
From TFA:
SPARK is a subset of Ada augmented with assertions that allow the designer to prove important properties of a program: termination, absence of run-time exceptions, finite memory usage, etc.
Really? They finally solved the Halting Problem?
I often don't like the choices people make, but I like the fact that people make choices. That's why I'm a conservative.
I think this article brings up a general issue that is facing CS departments at the moment.
Computer Science courses have two main audiences:
These categories overlap to a degree dependent on the University.
The two audiences have been diverging more and more in the last decade or so, and it appears that many departments are now in a position where they have to choose to stop catering to one, or split their courses into programming/software development and more mathematical/theoretical alternatives.
I also think that this separation of mindsets is the fundamental cause of many debates between students and their professors, kernel hackers and academics. There is a misunderstanding caused by the different focus each party has, where your approach really depends on what you are trying to achieve (do you want to write software that does the job? or is elegant? something immediately useful, or that demonstrates a different way of doing things?).
It's quite sensible that students should learn several languages in a CS degree, although Ada is becoming very much a niche language (my University still teaches it, mainly for real-time programming). It's also useful to have an understanding of lower level subjects such as electronics and logic circuitry.
Exactly where universities draw the line is a very difficult decision, but with CS applications falling rapidly in the UK at least, I think that a major change to course structure or separation of courses is required to modernise the system.
A Java-only miseducation provides no tools for grasping how and why the templated nature of the C++ Standard Library enables good compilers to produce efficient code from abstract source representations.
Most of my O() thinking these days seems to come down to using the appropriate Standard Library containers and methods.
The rest comes down to using lots of hashes in perl...
--
phunctor
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
On the other hand modern Java students are really good at object oriented design and software engineering which is a real plus.
I've recently read H.H.Bauer's "Students who don't study". A bad student myself, I recommend all Prof. Bauer's writing. Not a paradox, really. link
Gee, I took 3 courses in Java and never touched the graphics in it until my final year in college when I went back to take a course they had mandated after I'd passed it up. I had no problem understanding the hardware/software boundary and how it interacted, and all my core programming concepts were learned on Java. I never felt at a disadvantage. Granted, I went on to also take classes in C and C++, but there really wasn't anything new there. Now what confuses the hell out of me is Visual "Anything", especially VB. Maybe it's the courses and the teaching, not the language...
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
Coming from an Ada man:
"From our experience and that of our customers, we can say that a real programmer writes Ada in any language. "
Um, no. Different languages have different strengths and weaknesses, different emphasis, and find best application in different domains. It's natural that differences in programming style fall out of that.
I'm a LISP man, so I initially bought into the idea he expresses (replace Ada with LISP), but a few years in the business world have been enough to change my mind. Formal analysis has potential, but is still more often an academic pursuit than an industrial one, so I suspect that insularity is clouding his judgment.
I went to Rose from 1986 to 1990 for CS. Back then we learned these kinds of things:
Languages: FORTRAN (as the first language), C, Pascal, Ada, Lisp/Scheme.
Assembly: DEC VAX, also had to do machine language BY HAND in hexadecimal (lower than assembly).
Hardware: computer architecture; had to design simple CPUs from the gate level up (yes, including instruction decoding, number multipication, etc.). And if you took EE courses too (which myself and many other CS students did), you even learned how the gates work from the individual transistor level up.
Theory: lots of algorithms, complexity, Knuth "stuff", automata. Even dabbled a bit in denotational semantics, lambda calculus, etc. Not to mention lots of math including descrete math and numerical computation.
Other: compilers (but at least once we could not use Lex/Yacc generators, we had to work through parser generation BY HAND. Then we actually had to produce real machine code output, do wimple optimizers, etc.)
That's what I consider learning comp sci. Exposure to so many different aspects, including very low-level hardware, that you really knew what the computer was doing.
Java programmers are nothing more than glorified typists, stringing together the latest 'cookbook' code, and modifying it to do something half-way useful.
Java programmers are not taught 'the basics' since the attitude of java itself is 'Let java take care of the hard stuff for you'.
-Don't worry about memory management, let java do it for you
-Don't worry about pointers, let java do it for you
-Don't worry about concurrency / OS level functions, let java do it for you.
It's taking the 'programming' out of programming, and replacing it with a typist.
"Use the latest java 'cookbook' code for everything."
Don't worry, programmers and engineers will always be needed.
Java proffessionals will always have jobs too, data entry is a need that will always exist
Quoth TFA,
And here I thought we'd driven a stake through the heart of Ada back in the 90s. It lives!
Tom Swiss | the infamous tms | my blog
You cannot wash away blood with blood
Took a web dev class at the uni. Writing CGI in C++ is so much more painful than doing it in Perl!
I only look human.
My mother is a halfling and my dad is an ogre, so that makes me an Ogreling
I thought OSX was written in Objective-C.
That's not a memory leak. It's only a memory leak when the program loses its reference to the memory and it can not be recovered at all in the program. In your example since every node has a reference to it's parent and children the memory can still be recovered. All you do is walk to the root node from that node, then recursivly free the children. It would only truly be a memory leak if you tossed out the reference to your first node, there are no other references to anything in the tree, and yet the nodes in the DOM stay in memory with no way to free them.
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
Sure, mastering C and ADA skills might help me become a good college professor who has no clue ow to be productive in the real world; but I'll take my 10 years of Java skills, home ownership and a high 6 figure salary over the drudgery of college professorship any day. Idiots with PHD's.
Horns are really just a broken halo.
Mathematics requirements in CS programs are shrinking.
Most for-pay programming does NOT involve higher math. That's the reality. Yes, every bit of knowledge is nice, but there is only so much that can be spent on every topic.
The development of programming skills in several languages is giving way to cookbook approaches using large libraries and special-purpose packages.
Using existing tools to avoid reinventing the wheel is an economic necessity. Those who master the tools will leave from-scratch bit-twiddlers in the dust and unemployed. To be productive and competitive with cheap foreign labor, we have to plug Lego's together, not make Lego's.
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.
Anything, no matter how brainy, can be offshored. Those who personally know the customer seem better protected, not those who using magnifying glasses to twiddle individual bits. It is schmoozing that saves the remaining programmers, not extra doses of trivia.
A further pitfall of the early use of Java libraries and frameworks is that it is impossible for the student to develop a sense of the run-time cost of what is written because it is extremely hard to know what any method call will eventually execute.
Our tools are reaching ever higher levels of abstraction away from the hardware. Their statement is like complaining that cars are not Model-T's where one can replace and repair their own engine with a screwdriver, hammer, and duct-tape.
The authors are from "AdaCorp" and are bashing Java to sell more Ada contracts. (I don't like Java either, but for different reasons.)
Table-ized A.I.
Hey, this is fun.
It's called computer *science.* It's supposed to be theoretical first, practical later. You don't see chemistry classes dumbed down for the sake of the industry, except when you're taking a class specific to working in the industry. Yet chemists have no problem finding employment.
It seems what all y'all want is to provide another educational track. Rather like the distinction between mechanical engineering and sniv... civil engineering, it seems there's a demand for computer *science* (those who wish to understand the discipline as completely as an individual can), and computer *programming* (in which an individual learns C# + Visual Studio 2010).
Those in the first category won't have problems finding employment, at least assuming they have any kind of skill, and can figure out for themselves how to apply it to a particular problem. The second group will find themselves losing out to overseas programmers who have exactly the same skillset, but will work for 1/5th the wage.
I've worked in the industry for 18 years, and worked with computers for 27. In all that time, the *best* people have had a firm, fundamental, abstract understanding of computers. They were trained as computer scientists, rather than as Java programmers. In general, those who have been trained as programmers first and computer scientists second have a harder time adapting to unique situations, and have difficulty thinking of solutions that are both creative and sound.
Programming is a tool in the service of an engineering goal. Focusing on programming as an end to itself is like training carpenters by teaching them only how to use the hammer and saw.
Microsoft is to software what Budweiser is to beer.
They are just using "offshoring/outsourcing" to scare developers to use their products/services. They don't even bother to discuss what skills are being offshored and why.
Table-ized A.I.
Any companies that have not really done outsourcing will use it as a scare tactic. However, AFTER a company has actually bet the farm on outsourcing, then the fear comes from Managment. I worked for a large insurance company that outsourced a ton. Well, after those disasters came in terrible and all the code had to be thrown away because it was sloppy and hacked, it is my MANAGERs who fear outsourcing. They know they will still be required to meet their deadlines but they know that outsourcing is only useful for repetitive, idiot-proof assignments, with heavy oversight from a US developer. I no longer fear outsourcing as a competitor--just as an enemy of quality.
If their introductory courses aren't preparing students for later courses, it seems a bit silly to be blaming any particular language. Introductory courses are all about concepts, and Java is perfectly suitable for that.
CS students should learn low-level concepts: registers (assembly language, the parts of a CPU) as well has higher-level more abstract software engineering practices. Java is a great language for the abstract stuff (at least a stepping-stone to Ruby :) but give me C and assembler for the low-level stuff. CS students should be well exposed to both. Mere programmers can learn one or the other.
"If you're not passionate about your operating system, you're married to the wrong one."
Functional programming is about 30 years old (going back to the mid 1970s).
Functional programming dates from about 1958.
Which makes it 50 years old in 2008.
To a Lisp hacker, XML is S-expressions in drag.
I can't understand how you can possibly argue that it's better to use a language that makes it easy to make a certain class of common mistakes (buffer overflows, using uninitialized memory) than to use one that makes those mistakes impossible?
I programmed in C++ for about 7 years before I moved to Java. I think I was fairly hot stuff in C++ - I was very adept with the STL (I started using it when the only freely available implementation was the HP one, and I wrote several sophisticated frameworks that have now been duplicated in boost). Even so, everyone occasionally fails to initialize memory, or fails to bounds check, and so ends up with a bug that just causes phantom behavior. Until you can duplicate it in an emulation type environment like Purify, finding the source of the error is nigh on impossible.
Now I write code in Java. Occasionally I need to resort to a JNI call to some C or C++ code, but mostly it does everything I want done, and when I fail to initialize memory, or overwrite bounds, I get a stack trace that tells me what I did wrong & exactly what calls were going on when it happened.
Java is far from perfect - I personally prefer Python for most things. But using C/C++ to write application code, unless you have very strict memory requirements on the target platform, is just crazy.
Now that's news!
It is very important for students to start learning a low-level language. This way, they teach themselves to pay attention to smaller details and thus write better code. It is much harder for a java coder to sit down and start coding in assembly then it is for an assembly coder to sit down and start java. Low-level languages prepare students for other languages and reinforce important base concepts which are vital to a balanced education. Just remember, web-based and scripting languages wouldn't have a platform to run on if it wasn't for c/asm.
Klingon Software is not released, it escapes, inflicting terrible damage onto the enemy as it does
That's what the business needs, isn't it?
For a project manager, it's better to have a team of replaceable Java professionals, than a bunch of non-replaceable "proper language" programmers.
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
The 'Folding @ Home' link you provided in your sig is the *PERFECT* example of a peice of software with a well intentioned design, who's implememtation falls completely flat. COMPLETELY. Lack of check pointing (after about 1 weeks of worth, it crashed on its own, corrputing its datafiles, which it retrives from the internet anyway leaving a WEEK OF LOST PROCESSING)(FYI did you know that IBM mainframes in the 50s did checkpointing? That you could run for hours, and step forward to the EXACT instruction that caused the failure? ), poor graphics port rendering,( Dont get me started on the UI, which "blows Chunks" ) as well its handling of priortitization? I am not short of experence in the use of either distributed computation, like OGR and primenet, or rendering with network rendering packages.
If Folding @ Home is the best example of acedemic developed software, contrast it to the history of Multics. It is a theoretical TOY, and in its current implementation a shining example of bad implementation. How much more productive it could be with just a few minor changes, but, you may rationalize, all that lost work is insignificant.
Folding @ Home BLOWS. ( The idea of getting others to contribute to your efforts at rational drug design is a good one, especially if you can get others to do the work to come up with something like the gene amplification patent, but why not just fool the SETI @ home people into thinking they are actually doing something worthwhile? )
This RANT will come up again, to those who INSIST on promoting something that is in such stark contrast to the discussion.
"If universities don't produce well-rounded educated people where will they come frmo?"
They will come frmo liberal arts colleges, lead artistic lives, and create corporate sclupture.
Try netbeans 6 ... tasty, Java is good, Java is good ....
... "The theory of relativity doesn't work right in Arkansas."
... there is the endless levity field.
... Could Arkansas (like Washington, D.C.) be in the endless field of levity?
Also, as relates to
As you approach a "black-hole" event horizon "relativity" breaks down, physics ceases to exist as an "EinsteinBohr-domain" universe, and beyond the Universe-brane (UBrane) or through a black-hole dissipating "EinsteinBohr-domain" gravity
The question now becomes
Unaccountable leaders are masters, and unrepresented people are slaves. How do US and EU fare?
I see a lot of posts talking about how useless math and C are in "the real world." Well, it depends on the "real world" in which you live. Most of us will find ourselves writing code to help a company do stuff on the interwebs. That's where most of the jobs are and little of it really requires anything more advanced than the basics of programming and a little bit about databases. Thanks to frameworks like Rails, you really don't have to know much about databases, either. You also don't need a computer science degree to do this. In fact, after CS 101 just get a degree in business or get an MIS degree. Getting a CS degree because you want to work at Accenture doing in Java what many have done before you in COBOL is a perfectly fine thing to do. Getting a CS degree to do it is like getting a biology degree to sell fish at the local pet store.
;) but it is good training for just about anything else you want to do with computers. So, I think their hack at Java is a very valid criticism of relying on Java and not having students learn something about what a computer is/does at a low level that only languages like C can provide.
If your "real world" involves interfacing computers with physical devices, then you need more math and more low-level stuff. For example, even if you're working in Java, you may need to talk to devices over serial lines (which Java stinks at) or you may even need to write your own devices to read/write to device memory. Not many CS grads actually wind up doing this. A lot of people who got degrees "CS" and work in "IT" feel like this is useless knowledge, but someone had to write the software for their car's GPS, or braking system, or that reads the various sensors all throughout their car and posts warning information. Things like braking systems are sometimes written in "dead languages" like Ada because they need to be real time and safety critical. There is a real time Java, but programming in it is quite different that regular Java.
The point is, don't think about your narrow slice of the "real world" and then think that's all there is. By training nothing but Java programmers, with only a vague understanding of what actually happens inside the physical computer, we loose our ability to generate the people that will write software for braking systems, avionics suites, robotics and plant control. Also, the people who do that kind of work can often step into a web application environment and pick up whatever language they need. I've seen that transition occur often, but I've never seen people who are just Java hacks make their way into "real" programming. Maybe we don't need as many of those guys as we need ColdFusion experts
Leave the gun, take the cannoli -- Clemenza, The Godfather
C and C++ I certainly understand, but Lisp? ADA?? Why? Neither of these are remotely relevant anymore. Fortran is more relevant than those.
+++ATH0
But you have been missing that those proffessors are also the managing directors of AdaCore [1]. 6 figure salary - sure if not 7.
Before you call "cheating" remember the intended audience for the original article.
Martin
[1] http://www.adacore.com/
Data structures, and to introduce object oriented programming.
Python works well for data structures because, as you say, it can do everything but it's a very readable language and makes it easy to focus on the concept rather than the programming.
It's great for OOP because a lot of the mechanics are visible. You don't have this pointers popping up automatically for example. The self reference is the first parameter to the method, it's quite obvious where it comes from.
Only the boiler plate stuff in C++ is pain for CGI. I maintain and write some Perl scripts at work; I sometimes think they'd do well in an obfuscation competition.
The minute I saw "professors emeritus" I knew the article would only have an incidental connection with the real world.
'The tyrant will always find pretext for his tyranny.' - Aesop's Fables
We where discussing this article at work for a bit and came to the same conclusion.
Here as the two of us as IT generalists we create programs at varying levels of abstraction depending on the need.
Having gone the old fashioned route in the 80s of Fortran, Assembler, Pascal, Cobol and C, and later C++ and now adding in Python. In 99.99% of the cases I don't care about what happens at the assembler level. I need to rely on the guys who write the CLRs and IDEs - that is their problem domain. I solve computational business problems, automation control problems and data collection, access/storage problems not assembler problems.
I actually agree with what you said, "A degree gets you in the door for a job", but disagree with the general thrust of your post.
A degree gets you in the door for a job. A solid foundation in the basics of your industry ensures that you won't become obsolete.
Imagine, in a few years, a whole new paradigm of parallel computing comes out that requires most programmers to learn to write parallel threads and greatly optimize for parallelism (this is just an example, as I can't think of another right now).
Now, students who don't know dick about how their programs work, but just learned java or ASP or some other crap from memorization and high-level basics won't have a clue and will be screwed...
meh
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.
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.
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.
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.
You know, I went to University and most of the people I work with didn't. Sometimes I'm referred to as the "educated ***hole", that's fine. I took C++, and .NET and JAVA and any other initials you want to throw in there. If you're learning fundamentals, it just depends on how far you want to be abstracted away from it. To me, learning Swing was a waste of time, it felt like it was something a guy threw together while nursing a head cold and bong. Java's RMI was great to learn, but C++ interested me. Some students in my class did whatever the teacher told them to do so they could graduate and some others memorized the textbook. There were very few that understood what was actually going on. Things like pointers, vectors, and linked lists eluded them. If you want to teach someone the underpinnings, sure, use a language that can blow you whole leg off, but when it comes time to the real world, most of us sit on enormous frameworks and spend much of our time gluing pieces of those frameworks together rather than worrying about how to touch the metal without being burned. University is a business and like any other, is in it to make money, so you teach "the hot language" to get students to enroll. Most programmers are afraid of C++ because of the punctuation and complexity, so fine, use that framework, sit in the comfortable corner, and let us earn top dollar, and you can use a language that abstracts that away from you, but when there's a deep bug and you can't figure it out, because you didn't want to spend the three hours to read about pointers and memory tables, oh well, you can pay me to fix it.
If you did the shortest research [1] before posting you would know that Ada - like Pascal from which it decents - is named after a historic person [2] and as such is written Ada. This in turn means that you oppinion is rather uninformed.
/. - what do I expect.
But hey, this is
Martin
[1] http://en.wikipedia.org/wiki/Ada_(programming_language)
[2] http://en.wikipedia.org/wiki/Ada_Lovelace
I'll agree that you need to understand concurrency before you leave uni and try to claim you're competent, rather in the program contexts or the OS contexts.
I disagree that pthreads require lunacy, however. They're pretty simple to use.
So what about not getting above a C (grade, not language) in a course. When I took my Operating Systems I course, the professor said that 35% would be considered A material and 40% would be considered Nobel prize material.
What would I know? I sat in on a friend who was teaching OS concepts at Harvard for fun.
Fight Spammers!
As an individual who majored in CS in NYU during the transition from Pascal to Java, I agree a lot with what they wrote.
I went from C++ in my high school AP class to Pascal in my 102 course in NYU to Assembly as 201. The year after I did 100-level they switched the beginning classes to Java, I have no idea how those poor suckers handled Assembly or any of the other concepts in CS.
The best way is to teach the lower-level languages first because (1) weeds out the non-serious students; and (2) teaches you close to the source, you get a better understanding of how the computer works and how the programs are run. Once students have a solid grasp of that, then Java is a great tool to learn.
I don't work in CS, but I still find myself using the algorithms and the math in the curriculae for other tasks, but not Java. Dropping the math and the way the algorithms are generated is the height of folly.
I think the crux of the problem is that computer science as a field has grown a lot since most CS departments were founded, and is less like its roots (usually math or engineering) than it used to be. This isn't because math and engineering aren't important to CS, but because there's a lot more substance in computer science as distinct from other subjects than there was decades ago.
As a result, a lot of "Computer Science" departments have an identity crisis, mainly between mathematics and (software) engineering. Some of them even realize it.
The problem is that there are lots of facets to this whole computers and software thing, and IMNSHO, you can't teach it all in one degree program---there's just too much.
The problem is that few departments/schools/universities (pick the level of the hierarchy you think is most blameworthy) have wanted to admit that they really need to give students a choice between specializing in computer science OR software engineering and not pretending that you can be an expert in both (at least with one 4-year BS). There's a lot of overlap, clearly, but there are also differences in what each specialty needs to know.
Then there's related areas farther afield from traditional CS roots, like MIS and HCI (human-computer interaction). Most traditional CS departments (or, to be fair, most any other single traditional university department) couldn't grant degrees in these even if they wanted to, because they require knowledge from areas that have historically been in different departments.
As someone who taught themselves to develop software (first with scripting languages, then Java, C, and C#) I'm routinely surprised at how little "trained" developers understand. Basic concepts like word alignment, unrolling loops, and efficiency are lost on most people. Hell, I've seen more than my fair share of apps coded in C that never release memory until the very last second; wholly expecting the OS to clean up after them.
In all honesty first and second year courses should be taught in languages like Java and C#. They a lot easier to grasp and allow entry level developers the ability to build some confidence. C and it's children can be taught later in the collage career.
What'd I'd like to see is more algorithm logic being taught. Puzzles that require thinking outside the box. Like finding the best worst case scenario for a given problem instead of alway just thinking about the best best case.
Also, why can't any undergraduate seem to understand event driven models? I think this worries me the most.
- I voted for Nintendo and against Bush
Ignoring the language issue, the authors raise the question of how much math and theory should programmers have. That's worth exploring.
I'm a programmer with a strong theoretical background. I have an MSCS from Stanford, I've built a automated proof of correctness system, and I've done a physically based animation system which required building solvers for stiff systems of non-linear differential equations. I've done hard real time programming for mobile robots, network protocol design, assembly language programming, and logic board design. So I've actually used most of that theory.
Most programmers don't. If you're just doing web site back ends, you don't need all that stuff. I'm not even using much theory any more.
There's also the question of what theory to teach. I got too much discrite math and not enough number-crunching. Automata theory isn't very useful, but Bayesian statistics is. Academics can guess wrong on this. In the mid-80s, Stanford had a program to train "knowledge engineers", who were trained to write rules for expert systems. Where are they now?
There are only about 20,000 real computer science jobs in the US outside of academia. That's not the mainstream part of the field. The other 500,000 programmers don't need that much theory. Teach them Java and Python and how to work on a big project, not number theory.
I had to learn big-project work by spending years as a maintenance programmer for mainframe operating systems. Didn't get any training in school on that at all. That was a lack. Once I got that, I was able to use the theory on hard problems. I needed both kinds of training.
"There are just two kinds of [programming] languages: the ones everybody complains about and the ones nobody uses." - Bjarne Stroustrup
Nah, what we need when programming is more like the content from 'Concrete Mathematics' book by Knuth. With some linear algebra.
Calculus is way overrated in relation to programming.
However, mathematical knowledge is fundamental to make a good programmer. More if it's related to writing proofs instead of just solving exercises. Writing a proof really feels like programming to me.
Calculus != Mathematics.
We are Turing O-Machines. The Oracle is out there.
The real issue in programming languages is "what do you have to worry about?" They all have, in theory, equivalent power. But some languages fully handle some parts of the problem for you, and some don't. The trouble spots in different languages vary considerably.
When programming C, one has to obsess on pointer management. Storage allocation is completely manual and arrays are not only unchecked, but ambiguous in size. Most C errors are related to pointers. The language also offers almost no help in dealing with concurrency.
Java does a good job of dealing with pointers. Arrays are checked and memory is garbage-collected. So Java generally doesn't have pointer problems. The language knows a little about concurrency, but not quite enough. Java programmers can stop worrying about pointer management, but still have to worry about race conditions. Most of the problems in Jave programming relate to interfaces with large, troublesome libraries.
Ada deals well with array size issues, but storage allocation is still manual. Concurrency is addressed in a rigorous way. Ada programmers have to worry about how to structure their problem within Ada's constraints. More of the problems in Ada are at the front end in design; once the basic structure of the program is right, the pieces tend to go together well. This does not map well to "extreme programming" or "agile programming".
C++ is in the unique position of providing hiding (or "abstraction") without memory safety. No language before C++ had that combination, and no language since has had it. C++ has the same problems as C, but there's a layer of wallpaper over them. Memory errors in C++ tend to be fewer than in C, but more obscure when they occur. C++ tends to be a ritual/taboo programming language; there are many things which one must not do, and those things are not obvious.
That's a more useful way to think about the problem. Ask the question "in what ways do programs in this language break?"
They have contests for obscure C/C++ code. Nobody bothers for Perl.
I only look human.
My mother is a halfling and my dad is an ogre, so that makes me an Ogreling
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.
Computer Science is one of my two majors (got two minors as well, NYU is a great school to go to if you want to study many related disciplines). I graduated in May 2001 and have a picture of me during my graduation ceremony in front of the fountain at Washington Square Park with the Twin Towers of the World Trade Center in the background, less than 4 months before we were attacked. I have heard of Professor Dewar, but had not heard of the other guy and never learned from either of them. At the time that I went to NYU, they were teaching the two terms of froshman introduction to programming in Pascal. Luckily, I had formally studied introduction to programming in C/C++ somewhere else and obtained an A in both classes, so I placed out of the courses during my advisement as I entered the university.
My biggest mistake as I entered NYU was signing up for Computer Systems Organization I (in x86 assembly language), Discrete Math, Calculus I/II (that's an accelerated Calculus course with a ridiculous amount of advanced material), and if I recall correctly Introduction to Psychology (which I had already taken in High School and got an easy A). To this day, x86 assembly language is my least favorite way to code, even though I think I got a B+ or A- in Computer Systems Organization I. I considered dropping CS as a major after that term and started to pursue Psychology as a second major. Computer Systems Organization II was a cinch as it dealt with operating systems and programming in C (I love C, because it's so straight-forward and I can't picture any young nerd that would not enjoy an OS course) -- I got an A in the class. I also took C++ and UNIX, which played to my existing strength in C++ and got another A; that professor also threw in a little bit of Perl, CGI, and multi-threading in Java at the end of the course. I also took Computer Architecture the following term and really enjoyed designing a MIPS processor from low-level logic gates (AND, OR, and NOT). We implemented a MIPS processor simulator in C, including the ALU, a number of required operations, and I even implemented an assembler for MIPS instructions for my simulated processor as part of my final project for that course; I got another A in that class as well and that was the point where I decided to finish my major in CS at NYU -- MIPS assembly language was the antithesis to x86 assembly language and showed me that assembly languages can be intuitive and don't necessarily have to suck ass. I also studied Distributed Operating Systems, Programming Languages (where we implemented a database system in LISP, writing only 4 or 5 functions, each less than 5 lines of code; two of them were only 1-liners and all used recursion) along with all the other required stuff like Basic Algorithms and Calculus; even tried my hand at Computer Graphics, but I got a tendinitis injury in my writing arm because I was working full-time at startups while taking notes in class and had to drop the course. One of my minors is Mathematics, so I also studied Linear Algebra, Statistics, and Logic (great course; we formally proved all of arithmetic and algebra).
I was studying CS at NYU right around the time that CS department first switched the introduction to programming courses from Pascal to Java. At that point in my life, I had a real distaste for Java, but it is my primary language at work these days. At that time, Java was taught as a senior-level elective and you could graduate from NYU without ever having written a single line of Java code.
What I saw from the students in my CS classes at NYU was that there were a handful of us who almost knew the material without having been taught it...it came so naturally to us and we knew the answers to the questions before the professor even asked the question. I also saw tons of students get weeded out in the first few introduction classes. I expect that this weeding out process happens at all universities, regardless of the language that the introduction courses are taught in.
When learning C/
Java was essentially my first language. I did BASIC as a kid and Pascal in High School, but Java was the first language that I used to actually earn money when I worked during undergrad. Most of my undergrad was Java based as well.
A testament to Java is the fact that there's a small company out in Cleveland whose entire operation runs on software I wrote for them during one summer in my undergrad days. It does all their books/invoices/shipping/recieving/inventory/reports, and there hasn't been a bug in it since it was delivered in 2000 or 2001. The APIs and garbage collection as well as platform independence (for straight-forward things, anyway) of Java allowed me to focus on business logic and actually deliver what the client wanted. I am actually very proud of that project, and there are other projects I wrote during those years that are still being used by real businesses. I am not sure that C/C++ would give me the leverage to pull that off so quickly in a one-man show.
So the upside is that Java allowed me to be a fairly experienced writer of real-world software by the time I got my bachelor's degree. The downside is that I graduated w/o having a good sense of compilers, memory management, algorithms - but that's sort of language-independant. I am sure that if my undergrad was C/C++ based, I'd have at least a better sense of memory management but at the time I was really just interested in writing software and Java let me do that.
During my senior year I was recruited by a C shop, so I had to learn C. They bought me K&R (and a few other great books like Code Complete). I read K&R in one shot over a weekend, and I was a good C programmer from that day. I actually was much better at C than a lot of more experienced programmers exactly because C is a simple language and it kinda needs to be learned from K&R rather than by trial and error. So being a good programmer + reading K&R as gospel was a good combo.
After working in this C shop, I started to get a sense of all this stuff I've never had to deal with before - intricacies of compilers and linkers, insight into programming languages and memory management, etc. So certainly WORKING with C (and C++) having come from a different background was thought-provoking. It made me realize that all the stuff I didn't care about in undergrad (and didn't HAVE to care about because I had Java) had relevance. So when I went for my Masters' degree, I focused a lot more on basics like Programming Languages, Compiler Construction, OS, and Algorithms. In fact, I was very lucky to have Ed Schonberg (one of the authors of the article we're talking about here) as instructor for the first two and other great instructors for the other two (I made an effort to take courses w. instructors who were well recomended as people I am going to learn a lot from)
Perhaps I am biased towards myself and my learning patterns, but in general I think most people go into Computer Science because they want to be programmers (and hopefully because they love programming) - and I think that the job of an undergrad education is to make sure you know enough to be a working programmer. Frankly, I didn't learn anything about compilers in undergrad because I couldn't care less about something I didn't have to use in a non-trivial way. So it would be in one ear and out the other, and I suspect many people are like that. In undergrad, you're supposed to learn and think as a programmer and maybe get some exposure to the big paradigms that are out there.
When people go for Mater's, I expect that to mean they have a real interest in the actual science and that's where the hardcore basics should be taught. There's no point to teach someone all about compilers if they aren't good enough at programming to actually have to compile anything in their daily work! This is part of the reason I strongly advocate for people to go into the industry between undergrad and masters' - real-world experience should be a good motivator for why a lot of this stuff matters.
At
http://ed.markovich.googlepages.com
Parent is a copypasta.
It's better to vote for what you want and not get it than to vote for what you don't want and get it.
- E. Debs
Aaaargh, stop the madness. What the Java programmers are doing is perfectly sensible. (Mind you, the ideal Ruby solution would probably be to use a mix-in for your average method, then dynamically including that mix-in into Enumerable from the code that requires it.)
The idea that we ought to put every operation under the sun inside a class is a bad idea. When you write a bunch of code that looks like it's using plain old Array methods, but is in fact using your own add-on methods to the Array class, this leads to spaghetti pretty quick.
While I don't think Java a bad language I am amazed that so many CS departments switched to using it almost exclusively. I have also noticed that some CS departments no longer teach computer organization...what's up with that? Why not teach the basics of how a computers work? Is it that difficult to teach them about logic, memory, CPUs, ALUs, buffers, I/O, and how it all fits together? Is assembly and C that tough?
One excuse I have read in the past was that departments were trying to make their programs more "female friendly" by trying to bring more art, multi-media, and philosophy into CS. OK, well it is great if they want to make it more welcoming to everyone, but how does taking computers out of computer science do that? It just means when a girl graduates she is less prepared than she should be.
20 years ago, Carnegie Mellon's introduction to programming course was taught in Pascal, so upper level courses (all taught in languages like C and Lisp) had to start out by teaching real languages first.
What this really comes down to is people griping that they have to teach things that they wish somebody else had already taught students. Nothing to see here, move along.
"It is our blasphemy which has made us great, and will sustain us, and which the gods secretly admire in us." - Zelazny
Having done multithreaded programming in too many languages I must say that Java does make it much much easier. Although I'd hope/expect that other modern languages provide similar support (not tried concurrent programming in Ruby,
Still need to know the theory and what you're doing of course. But it's not difficult, just needs you to think things through properly. I'm continually confused by the media reports that programmers struggle with concurrent code; I think most of them just never really tried it.
While it is not right for a university to teach only one language, I see a lot of mixing up in the discussion.
...etc. fall in that category. Java is not the right tool for this, but something closer to the operating system and/or the hardware (e.g. C, and even C++). People working on these type of problems require the features and capabilities of these languages.
...etc. In this case, lower level languages are not the right tool. Having pointers and having to deal with memory leaks stands in the way of delivering business logic. COBOL used to be the language for this, and now Java fills that niche. The businesses hiring these people do not pay them to invent a new process scheduling algorithm, nor make sound come out of a new sound chipset.
There are two big domain areas for people who program computers (call them CompSci, Engineers, or whatever, the terminology is irrelevant).
a) Systems Programming
These are people who write stuff that is gluish in nature, be it kernel algorithms, device drivers or similar things. Even things like Web browsers, text editors, word processors, compilers,
b) Business Application Programming
These are the people who build higher level applications for end users. These are things such as an accounting application, air line reservation systems, banking systems,
If one tries to use a language that is more suited to (a) for (b), or vice versa, then it is the wrong tool for the job, and will stand in the way.
A university graduate of engineering or computer science should be exposed to both types of languages and both types of problems, not just one. When the graduate they can make the decision which one to pursue as a career.
2bits.com, Inc: Drupal, WordPress, and LAMP performance tuning.
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.
'Computer Science Education: Where Are the Software Engineers of Tomorrow?'
Not in a Computer Science course!
Computer Science != Software Engineering
Real computer science doesn't care whether you use Java or C or Haskell or a single tape Turing Machine, as they all recognise the same class of language anyway!
People who go to uni to do Software Engineering with the goal of working for some large corporation automating 'business processes' hunched over in a cube with all the other troglodytes deserve what they get.
I remember Computer Science professors said the exact same thing about BASIC. But I learned BASIC first, along with LOGO, Scheme, C, C++ -- and now I use java. I think java is a great language, it's easy to learn and you don't get bogged down with memory management/pointer crap. I think learning the basics without diving down into the nitty gritty nasty stuff is a good way of learning things, I'm surprised a professor would disagree!
When I started out programming, I learned assembly language for the Radio Shack Color Computer (Motorola 6809 cpu if I remember right). That took quite some time, but once that was done, I was able to *think* in algorithms at a moment's notice so that I didn't need to flowchart anything at all. This skill is very valuable to me as I am able to write 'bespoke code' at a moment's notice with a minimum of BS. In my case I have to 'code or crash' as writing software is my livelyhood.
People think Computer Science = Learning How to Program. Actually Programming is akin to learning how to frame a house. It's a trade that you learn, a craft that developed with practice. You learn what works and what doesn't (sometimes it's what works and what doesn't work for you, individually). You can even follow strict standards on how you should program from various methodologies or certification programs. However, this is not Computer Science any more than building a house to code is Civil Engineering.
.NET the same way companies teach plumbing. We don't require the electrician wiring your house to have a degree in Engineering, but they still manage to get it wired. Same thing with whipping together some JSP pages for an online store. We have lots of tools to take the programming burden off the programmer, just like the electrician has tools and training without having to resort to 4 years of classwork in physics, chemistry and math. We can teach them the basic language, the IDE, and how to take requirements and translate them to code according to (pick your methodology). They then take a certification exam and they're good to go.
So, what is Computer Science? For the most part Computer Science is applied math. Even Computer Science majors don't think of it this way, especially the ones that dread math. However, let's break it down. At the lowest level you have a CPU, memory and devices, which you are controlling with a stored program as opposed to physical wiring. The nature of the CPU and the instructions, their flow, and how the execute can be described by abstract machines (turing style) and boolean equations. At this level you could talk about computers on pen and paper without actually having to worry about silicon and wires. In fact, those who really love computer science love taking the architectures class where they basically build a CPU.
As we move up from the lowest levels into the operating system, we see issues like dead-locking handled through mathematical proofs of why a deadlock can or can't happen. We prove why certain communications patterns can or can't result in certain states (i.e. why 2-phased commit works). Implementation is performed to actually test the theory in real life. However, you could spend all your time working on the theory. This is also true of graphics, communications, artificial intelligence and databases. You can pick up journals in all these areas and find articles that are nothing more than a proof of why a given algorithm will work. Implementation is a way to check to see if the theory works in the real world, and in a sense tests the assumptions more than theory. The area of software engineering is an odd bird in that it straddles code and people issues. Really, it can fall between a management problem and an engineering problem. However, even some software engineering approaches are grounded in math.
Now, with that said, why do we require programmers to have a Computer Science degree? My thinking is that we shouldn't. In the late 70's and early 80's a number of schools opened up that taught people COBOL programming as a trade. I think we should do that for Java, and it may be high time. Microsoft could open Microsoft education centers teaching Windows and
What would happen to the computer scientists? First off, if we had a ready source of skilled programming labor, we would come to the conclusion we graduate too many computer scientists. If you had a company of 100 programmers you might have 5 or 10 computer scientists on staff the same way you might have an engineers on staff at a construction firm. Of course that depends what you're doing. If you build bridges you might have more engineers than if you just frame single family homes. Some companies would have no computer scientists and would just body shop out programmers. Others might have 1 computer scientist for every 5 programmers.
Second we would see fewer people going to get a degree just to work in IT. In fact, it might become more of a training after a BS in Ma
Leave the gun, take the cannoli -- Clemenza, The Godfather
I would like to propose the addition of the following tags to this article:
...thank you.
javasucks, noduh, oldnews
In Russia computers program you.
You may be using the terms college and university in a different way that I (and maybe others?) do. Are you getting a 4-year degree or a 2-year one ?
If you want to learn theoretical computer science, where would *you* go to learn it? A school that has many classes on theoretical computer science. If necessary, enroll in graduate-level courses. In this respect, CS isn't different from any other discipline at most universities. The bulk of the theory-focused classes will be past the BA/BS level. It's only once you have your undergrad degree and come back for more that they begin to teach you how to be a computer scientist, political scientist, or whatever the term for your field is.
Blame the coursework, not the language. You can write Java from the command-line, you don't have to be taught to "rely" on GUI just because you're using Java. I write Java every day and never use a GUI framework (it's the network, stupid). You can (and we do) write Java components as services, libraries, CLI tools - if you're not teaching that but only teaching how to write Swing apps, it's your fault not the language. That said, C/C++ and assembly should certainly still be taught, and I believe they are in most normal compsci departments. But a -far- greater problem I've encountered are colleagues who *still* really don't understand OOD, reuse, and software architecture: thank you to those universities who are using Java to stress that, it's what the industry needs more of. Fie to the fuddy-duds.
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.
Having studied Software Engineering years ago at CIT, I was not impressed by the concentration on embedded software, it was mainly of use to the few people who saw a future in writing software for traffic lights, etc.
It would have been nice if they had some allowance for Java, but they didn't.
I've only used the hardware design stuff I learnt twice, for a wireless network coder project and a neural net process.
Needless to say, I would prefer that Java be used on low level hardware, as it can easily be controlled and has excellent networking tools.
- Kaos games and encryption systems developer
Sorry, but those professors are idiots. No, Java is not a language to use with systems programming. Likewise, C similar language are equally shitty for the types of things that Java is good at. Where these professors are idiots is that software engineering is *not* about the language being used anymore than engineering is about the screwdriver being used. All courses should be taught with a focus on the engineering concepts, not the language. Using only C/C++ is just a bad a using only Java.
.com bubble).
At my University we were taught primarily in Java to get our feet wet. All the introductory classes were in Java (programming 101, data structures, etc.). All the other more specific sources, like systems, AI, etc. were in whatever language made the most sense for that area (C/C++, Lisp, Prolog, whatever). The catch? None of these courses taught how to use those languages (i.e. the AI class didn't start by spending a month teaching Lisp and Prolog). Students were expected to learn on their own -- those that didn't failed. It was a nice way to weed out the posers looking for a paycheck not a discipline (and there were a lot b/c this was the height of the
"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."
Does that describe bad language choice or bad teaching?
My money's on number 2.
Java doesn't need a GUI. Why are you having students use one?
Java VMs are teachable. Why aren't you exploring the VM?
This is looking for a scapegoat. Examine your curriculum, and in particular what you want to get out of the intro to programming class.
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.
Ooooh! I got this from one of my friends -
Imperial College year 1996-2000: Turing maze solve algorithm with text-based graphical output move by move, recursive -> C conurrent with 68000 assembler -> C++ concurrent with SQL and Operating Systems -> Miranda various programs -> Build a compiler with Miranda -> Parallel programming -> Microsoft Developer Studio C++ -> Java.
With certain course modules you also get AI and NAND gates + FPGA, MOSFETs, ASIC, machine code instruction-by-instruction, BGP, spanning tree algorithm, routing tables
I wish I could go on his course! Lots lots more that I don't remember, I've remembered about 30%
A caveman dreams of being us, the incalculable power and riches. We dream of being Q, then what?
The ADA 'ring' security model which microsoft implemented poorly in NT (by bringing GUI and other userland functions into ring 0)
still makes ADA one of the best platforms for secure realtime systems (think military coms and EW and CCC)
http://www.cotsjournalonline.com/home/article.php?id=100687
-I'm just sayin'
I even _warned_ you not respond on the subject of destructors...
YOU: 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:
YOU: myThingy = null;
The above is so wrong on so many levels it threatens to induce apoplexy... 8-)
At the end of the instruction above, nothing has been destructed at all. The object has lost visibility in this scope. Once the compiler notices that the object has no visibility anywhere it will schedule finalization, which may or may not ever take place. Finalization does not necessarily occur if the program exits before the garbage collector sees and finalizes the object.
So yes, you don't understand destructors. Having never really _needed_ one, you have never really understood what it is to _know_ and be able to _rely_ on the timely entry into a method/callback at the end-of-lifetime of an object. Oddly enough, if you have ever done any Java programming of a GUI etc, and so been exposed to "window destruction notifications" you _OUGHT_ to know why destructors are important. But clearly you have not learned to generalize your knowledge.
And amusingly enough, you _AGAIN_ demonstrate that Java only has pointers by having the "alleged reference" mutate from pointing to an object to pointing to "no object" which is something that a proper reference, being immutable over the course of its lifetime, would not be able to do...
That word. "Mutability". I don't think it means what you think it means. -- (with apologies to The Princess Bride 8-)
Innocent people shouldn't be forced to pay for inferior software development.
--"Code Complete" Microsoft Press
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.
While I've never been a good fan of Java, I audited a course in it to pick up the basis, and it seems to me that all the students in the class were given decent ground to build upon, particularly for C. Java isn't inately a bad language for understanding hardware; it's got the potential, and I suppose some teachers abuse it.
Obviously this construct would not compile:
// make some thing // make some other thing // still have two separate things, but the original value of "some other thing" is obliterated by the value of "some thing"
Thing & thing1 = new Thing;
Thing & thing2 = new Thing;
thing2 = thing1;
It was provided for congruency of example not correctness of text. A more useful construct would have been something like
void assign(Thing & thing1, Thing & thing2) {
thing1 = thing2;
}
and then some convoluted combinations of either automatic values or overtly contrived pointerisms...
Thing auto_thing;
Thing * pointer_thing = new Thing();
Thing & reference_thing = *pointer_thing;
assign(auto_thing,*pointer_thing);
Or possibly...
Thing & thing1 = &some_object;
Thing & thing2 = &some_other_object;
thing1 = thing2;
Or some such, but for teaching purposes the original (illegal) code is more illustrative.
I went for the cheap but obvious example, and I just know the sophomore in question will go all hoppy all over it.
It was a deliberate act, so I won't be indulging in defending it elsewhere in the thread. 8-)
But I apologize to those seeking compilable code examples... 8-)
Innocent people shouldn't be forced to pay for inferior software development.
--"Code Complete" Microsoft Press
Essentially these guys have a problem because they chose to use Ada - a language that was created for and mandated (briefly) by the government and rejected by the market. If you use a niche language, you're going to have trouble finding people who are experienced in it.
The idea of "proving" programs are correct is a naive one and the impracticality of doing so is one of the reasons why Ada failed.
These guys should also realize that support for OO programming was grafted on to Ada after C++ proved popular. So it would be more accurate to say that if you're writing OO code in Ada, you're really writing Simula, Smaltalk, or C++.
Kidz what only knows one computer language are teh suxxors. If tey don't know pointers tey suxxors more.
P.S. If you don't teach Ada, teh terrosirsts is win.
That is all.
Great zot, it's so rarely that I actually hear this spoken aloud that I'd almost forgotten how true it is.
Breakfast served all day!
The subject matter that should be taught for a partiular major changes over time. I went to university before Unix and C were dominant and spent a considerable time doing assembly language coding. The value of that experience diminishes every day.
It's natual for those who spent a lot of time and effort learning (or teaching) now semi-obsolete material to overstate its importance today.
It always comes from people who care more about choosing tools than about the job.
Please, for the good of Humanity, vote Obama.
back then it was used for AI and her expertise was pattern recognition in some kind of geological graphical data of some sort. The idea was to identify patterns that would lead to oil fields.
Apparently she was doing it all in LISP at the time...
I suggested as much to someone in 2007, when issue of Vista security vs. XP.
The clearance system sounds logical. It is not. It is completely arbitrary. -- John Bolton
Even if the concentration of 'greenhouse gases' double, man would not perceive the temperature impact.
Probably not; however, we would notice the impacts of temperature change, such as regionally increased albedo on air and water circulation.
Ph.D. in Chemistry, and some atmospheric chemistry exposure.
The clearance system sounds logical. It is not. It is completely arbitrary. -- John Bolton
"[Java-schooled students] had no feeling for the relationship between the source program and what the hardware would actually do,"
And compared to that, Lisp is a solid language???!?
Stating on Slashdot that I like cheese since 1997.
I teach at a University and am responsible for the CS curriculum there.
..) that is a crash course in different programming languages. There we teach principles of functional, declarative, and other languages so students can see the contrast. We also teach recursion w/a vengance. Amazingly students also do some Assembler here and seem to pick it up w/o trouble!
The article mentions Java as the source of all evil and recommends Ada. I see an Ada slant in the article. Also it mentions C and C++ as beginner's languages, but there are tons of PhDs out there that have called C/C++ a poor beginner's language.
Though I do not dispute the need for heavy math, and many programming languages in the curriculum. The purpose of CS1 is programming in the small and learning if/for/while and other such constructs. Also, in an objects first curriculum you teach people the art of reuse and the value of encapsulation. CS2 courses build on this to teach full fledged OO and an intro in data structures.
The level of CS1 and CS2 students can be fairly low. And so the language used needs to create the least amount of unnecessary barriers. C is terrible for this. Ada may be a bit complex. Pascal was favored for years and did its job fairly well until people started looking for an OO language. Java is now used as the Pascal of CS programs. Good to teach basic concepts because it has relatively few barriers of entry (not as few as Python or Ruby though!).
So we chose Java because:
1. It is statically typed
2. It is OO
3. It has many features modern languages have
4. It is popular in the industry (no need to convince students to make the effort)
However, beyond CS1 and CS2, we have a computer languages course (Prolog, Lisp, Smalltalk, Assembler, Pascal,
For data structures we use ansi C! We do NOT use Java for the following reasons:
1. Java already has data structures.. why reprogram them?
2. This is our opportunity to deal w/pointers, memory addresses, memory leaks and other such issues
3. C is still an important language and the lessons learned here are very important for programmers in general
Later in our program students are exposed to VB.Net and PHP and other such languages but w/o dwelling too much on them (they just use them for their database projects, etc). We also use C++ in our graphics class. We also have a Microprocessor and Assembly language class.
So our students end up fairly well rounded. I guess the principle to apply here is:
1. Use a reasonable language for the beginner's course
2. Don't ONLY use that language, expose them to several languages throughout the curriculum
I don't believe in Java only.. but Java is just fine as a beginner's class. Though for some students it certainly would be easier if we started out w/Ruby or Python.
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. ...and your point is? I know the type but I also know people who've been programmers doing practical work for years and are STILL useless.
...but go ahead, continue to display bad manners with childish personal attacks and keep telling yourself that a degree is a waste of your time next time you're turned down for a nice job that pays well (or are paid less than you're worth).
University isn't a place where your hand is held or you magically learn things. You may wish to argue that they shouldn't have been able to earn a degree and still come out clueless, but it's amazing what people will do to pass a test without actually doing the learning. In other words in University, you can learn as much as you want or as little as is needed to pass a test.
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.
Well you're definitely right. You don't need to understand the halting problem to understand a good estimate for writing a compiler isn't 1 month. However someone who understands computability and who understands how compilers work is much less likely to make such rediculous demands.
Your dismissal of the halting problem as "a fun exercise in logic" shows that you don't understand its significance at all. There are entire classes of problems that you can run across and that aren't obviously impractical to implement in code. If you don't understand these things and you come across a slightly more complex problem than your typical business problem (fetch and edit data with some calculation) you can bring a whole project unstuck.
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.
See, now that's both illogical and just plain nasty. You know nothing about me and why I may or may not want to "justify that decision". I could just as easily argue that since you've decided not to spend that time and money I can see how you'd want to justify working instead.
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.
Well I'm 32 and I have about 10 years in the industry. If I hadn't done my degree I might have 13 or 14. Not a huge difference even this early in my working life. I've easily made back any money I've spent on my undergrad degree. My current job, and my previous one both required that I have a University degree and paid much better than my first programming job which did not (I would have done better working at MacDonalds than working at that first job.). I understand what I'm doing much better than I would have and at a deeper level than if I'd just coded.
These posts express my own personal views, not those of my employer
Those "professors" would be looking for jobs.
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?
Universities used to be mental masturbation for rich kids. Thus, they explored lots of theory. However, now that the middle class is involved and because universities charge an arm and a leg, people hope (expect?) that their education pays off in the work place so that they can pay off their education debt. The problem is that the rich-kid mental-masturbation model hasn't changed to fit the different demographics.
Table-ized A.I.
I completely agree with you, and can in fact relate as well.
You see, I am finishing up my undergraduate studies and am preparing to go to graduate school. One of the things I need to do is take the CS GRE subject exam. While studying for this I have, many times, had to completely stop what I am doing and go back and "retake" a class. In particular my algorithm and programming languages classes. It has become clear to me that I did not learn what I should have, instead of a CS degree what I got was a "CS Experience". A brief exposure to actual CS.
At present, I feel completely ripped off and disgruntled. At times it makes me wonder how I will compare with other students. The question of "can I teach myself as well as professors have taught other students?" is constant (hats off to the *1* prof of 9 who actually takes the time to teach me what his colleagues failed to).
Looking back at the past 4 years (almost) I can clearly see that the CS curriculum was fashioned after exactly what run of the mill employers were looking for (code monkeys). What CS is and entails has been almost completely displaced by what employers want. To be a code monkey, one does not need a deep knowledge of CS.
IMO, over the years Software Engineering has become its own field, separate in many ways from CS. As such, CS and Software Engineering should be separate degrees. Trying to combine one with the other only harms the quality of a program.
I fairly recently graduated from a Computer Science program -- it was, frankly, a total disaster, and rather then getting lots of interesting and detailed technical tidbits, I wound up re-hashing things I'd taught myself years before.
But to speak more to the point of this story: my college had just switched to Java (from C++) as it's primary teaching language, but the language was definitely not the issue, it was the approach. The first semester programming course progresses more or less as follows:
- A brief lecture on a topic is presented and a demo program is shown
- Students move into the lab
- Step by step, students *COPY AND PASTE* code to re-create the demo program
- (On the "good" days:) students are asked to make small modifications to the code to effect minimal changes
- Occasionally, these minor changes are slightly more complex, in which case they constitute a "project"
- Later: everyone passes with a B or better
Most of the students have no idea whatsoever how to actually write a program from scratch by the end of this semester (small wonder, since they never had to do much more than hit ^C ^V). To compound this mess (and officially to avoid boring the students) the college provides a (rather poorly constructed) library of graphical components which the students get to use so they can "jump right in" to "doing graphics". Unfortunately the library obscures virtually all of the details of how any of the graphical components work, and once the students become used to it, it's very difficult (or impossible) to get them to shift to using something more direct (drawing via Graphics objects or using AWT, for example).
A further consequence of this approach is that, since time is spent learning the graphical library upfront, key concepts of "real" programming are deferred, sometimes until very late in the semester. This means they're being taught under serious time pressure to fatigued students who have already learned an "easy way" to "program".
For some reason, Java seems to somehow be connected with this idea of "instant gratification" programming, but it's certainly not Java's fault that this is how material is presented to students. You certainly could teach this way in C or C++ for example (although it might take a bit more work upfront to build the "instant gratification graphics library"). It's unclear to me if the problem is lazy or confused instructors, a haphazard and indifferent educational system, or if it's some need to ensure that no student is ever the least bit bored or challenged by any material, ever.
Python instead of Java for databases -- with SQLAlchemy you can churn out something interesting pretty quick, with minimal boilerplate.
I [may] disapprove of what you say, but I will defend to the death your right to say it.
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."
... at AdaCore [1] a very successful compiler vendor. Sure that makes them biased - but it also means they know what they are talking about. Note that the intended audience of the article (which is not /. btw) knows about there double role. Also some of there former students praised them here on /.
Of course, you would have know that if you read the article or some of other postings.
Martin
[1] http://www.adacore.com/home/
Actually the only essential OO paradigm which got grafted on later was dispatch - the rest (templates, inheritance) was available on Ada 83. And Ada is still the only language where you have inheritance for primitive types:
.. 31);
type Day_Of_Month is new Integer range (1
Sure you can get the same effect using a (template-ised) record type - but it will take you more then a line as the needed template is not part of the STL.
And speaking of templates - C++ copied the idea from Ada. Ada and C++ influenced each other at various stages of there evolution - just a much as programmers have moved from one to the other (Grady Booch was an Ada programmer at one stage of his live) - I myself have 10+ years of C++ experience (which made me a strong C++ critic).
Martin
Your comment "Employers realized that well-rounded, educated (dare I say, excellent) human beings are better for the health of a company." certainly applies - to the people that the MBAs and Human Resource types don't call "techies".
A "techie" is anybody with a computer science or engineering degree of any sort. Rephrased, a "techie" is anybody someone from "Service & Finances" is unable to quickly pass a "quality and value" judgement on because the bean counter can't understand what the "techie" is doing or how well the "techie" is doing it when they stand behind them peering over their shoulder.
Business in fact loves the idea of Java and anything else that makes people - and their skill sets - "plug'n'play".
Hence the name change from "Personnel" to "Human Resources"; the more often the corporation can treat people as interchangeable commodities or resources to be sourced at least cost, the better.
And it is Business with a capital "B" that funds all of those new University buildings and lovely grants, which is the sum total of Business' commitment to "long term thinking" - let somebody else do the latter for them because that is not one of their "core proficiencies" or "profit centers".
Orwell: "In a Time of Universal Deceit, telling the Truth is a Revolutionary Act"
I haven't completed reading the article, just yet, but based on the blurb I'd agree Java should not be taught as a first language, it could be taught as a second or third language. My biggest gripe with my college experience in Software development was we started in an engineering class where we built basic C programs in a Borland C++ compiler, but after that class suddenly we had to take another C/Unix Class and compile on a 'nix framework. Then Immediately after that we had at least two classes on Ada (The second being on OOP Concepts). Now ADA is not a bad language, but I feel that what is needed is more discussion and following a main language through in the early years and then adding other language familiarity on top of the experience gained in another language. How can students truly appreciate LISP, ALOGOL, Fortran, or any other language unless they have some broad experience with at least one language. I also think that Java itself (And I'd add C# to this) can make programmers lazy, and that's my main reason why those should not be taught as first languages. (On a side note, does anyone still program in industry based on ADA?)
I took a comp sci course years ago, and have been doing fairly well... steady employment, but low salary because I refuse to move to a major urban center. My thoughts through the courses and still to date is that comp sci should be focused on teaching students one language, it should be teach the students how to perform the proper analysis quickly or on the fly (forget that system lifecycle shit, the only time it might be used in industry is if you are in the management team of a company specialized in software development). Teach the students the logic of how to program both sequential and event-based systems, and expose the students to several languages so they don't so much learn the language as learn how to learn the language. if 2 students attend 2 different schools, one that focuses only on one language (who cares if it's java, C++, VB, etc) and one that teaches a the programming concepts as abstracts, and has courses in several different languages. the 2 students finish their courses at the same time, with the same marks, and apply for the same job which turns out deals with a language neither have been exposed to. WHo is more likely to meet the challange? My courses had covered C, C++, VB, VC++ and sql programming on the PC, and REXX, COBOL, JCL and KIX on a mainframe running VM/CMS. Lets just say those of us who survived the workload are all doing fairly well compared to the quick and dirty progams offered at other colleges where a extensive course in one language creates a comp-sci grad.
"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." Finalization does not necessarily occur if the program exits before the garbage collector sees and finalizes the object. Custom end-life routines (particularly if you want to close IO resources) don't automatically occur in C++ or any language that I know of either. In C++, you use the deconstructor. In Java, you can either call your own finalize function at your will or trust the garbage collector if there isn't a timing critical resource you have to give up. I fail to see a lack of functionality here that you're griping about.
The authors didn't 'slam java', but simply pointed out that CS students are not prepared as they should be for the real world. I tend to agree with the authors, in that schools are pumping out the least common denominator that fills the classrooms, not putting out solid engineers with good foundations. Foundations in CS are not about languages or vendors or the latest tools in the marketplace but more about concepts such as encapsulation, abstraction, concurrency, efficiency, security, performance, etc, etc. These concepts should be taught in the context of many languages and different perspectives (embedded, web, compilers/OSs, desktop apps, medical/military, etc) with the strengths and weaknesses of many languages and environments. Languages and tools and vendors change over time, but these concepts have not changed since I first wrote Fortran in 1977.
I took an AI course in college that included Lisp and found it to be mostly worthless. All of the concepts you'd want to illustrate can be done with fairly well-studied constructs in C.
+++ATH0
..and your point is? My point is that a degree (or lack of) is not a good indicator of a person's skills.
However someone who understands computability and who understands how compilers work is much less likely to make such rediculous demands. If you're going to write a compiler then hopefully you'll be doing some on-the-job research beforehand. At this point you will likely discover the HP and its relevance to the task at hand. Otherwise it is more or less useless academic trivia.
If you don't understand these things and you come across a slightly more complex problem than your typical business problem (fetch and edit data with some calculation) you can bring a whole project unstuck. I don't quite understand what you're saying. I interpreted it as: "If you don't understand these things and you come across a complex problem then you can bring a project unstuck." Maybe you meant to say "If you understand these things..." Anyway, the halting problem in and of itself is not significant unless you are writing a compiler (correct me if I'm mistaken). Like you said, it is part of a whole class of unsolvable problems, but you don't need college to realize that such problems exist.
See, now that's both illogical and just plain nasty. I apologize, my comment may have been inappropriate. However it was not illogical. Too often we justify our life decisions to ourselves and others because it is painful to consider what could have been if we had made different choices. I'm as guilty as you, thanks for pointing that out.
I doubt that anybody read my comment anyway, but if it helps deter somebody from going thousands of dollars into debt while missing out on investment opportunities (aside from the time-value of money), then it was worth it. Had I gone to college I would have been paying 10k per year plus instead of earning 50k per year in my junior position. I would have graduated right after the dot com bubble burst, instead of getting my foot in the door with a stable job that had opportunity for advancement and which supported me well through the years of downturn. There is plenty that I missed out on, no doubt, but there was a lot to be gained as well.
Maybe I misinterpreted, but the gist of your original post irked me. You said the notion of experience over formal education was "complete garbage" when it has served me very well and when my results compare very favorably against others who took the opposite path.
The article doesn't go far enough. Language theory is important. Formal methods are important. A basic understanding of low level concepts is important. What the article doesn't mention is the importance of an in-depth understanding of architecture and design, specifically subsystem design. All the theory in the world will not help you write a program that conforms to your required "ilities"... maintainability, reliability, reusability, scalability.... etc. The fact is that this is what you deal with in industry. When you leave school all of a sudden you're not the only one that needs to understand and make use of what you write. Making multiple classes in your system singletons and calling that "design" simply won't cut it.
:)
What's even more interesting is that I've found that old-school programmers are victims of their tools. The languages available ie C and Fortran, create way too much complexity for the simplest of tasks. This leads to very complex systems that have code-segments no-one, including author, has a prayer of understanding a year later. The developers coming out of school now have the opposite issues and discussed in the article. They don't know enough theory to program themselves out of a paper-bag, let alone build a large-scale system reliable enough to actually be used.
-RIT grad of 8 months
I wouldn't blame Java, but I'd blame the following attitudes:
We don't need to optimize our registers; but ignoring the realities of performance when trying to make everything look like pretty objects is just holding us back.
No, I will not work for your startup
Actually, since class definitions are bound in C++, the two base classes inherited into the new class, can not, by any definition or possibility, interfere with one another. Java uses "signatures" and so, the classes could possibly be so harmfully interjoined.
So your concern about the "dangers" of multiple inheritance and semantic cross contamination are based on a false dichotomy. They are predicated on the implementation of a particular language, but not on language theory. So when I say "language X has missing feature Y" it is false dichotomy to argue that "feature Y is essentially flawed" based solely on the reasoning that "since it would be dangerous in language X" it must be a mis-feature wherever it is found.
See in a language like Java, where "signatures" are searched for in a purely derived-to-base class order, a call in an ancestor could, in the presence of multiple inheritance, cause an implementation in one class to cross-invoke a method from another ancestor.
In a bound language, where symbols are bound at compile time to the symbols available in fixed scope visibility (like C++), the symbols are bound to either explicit entry points or vtable offsets, that is to known symbolic quantities, there is _NO_ possibility of _accidental_ cross-tree calling. That means that the danger you claim wouldn't be possible.
The difference is inherent in the difference between the languages, where in java everything is overridable unless it is "final" where as in C++ nothing is overridable unless it is "volatile".
This actually points out _another_ weakness of Java. At any point in a C++ class one cannot "forget" to finalize and have a descendant bone a stable class. In Java you have to remember to lock every door, or it is opened. In C++ you have to explicitly unlock a door to let your descendants participate in your paradigm.
Or, to fold it the other way:
In C++ you _can_ create an interface class with no default implementation at all, or you _can_ provide a default implementation. In Java you cant provide a default implementation. If Java let you provide an implementation for an interface, that interface could _bone_ your class hrearchy because of signature search order. Since every implementer of an interface in Java must recreate predominantly identical code, the empty interface is more likely to induce mistakes born of repetition. Lucky you.
In short, your entire argument is bunk _outside_ of Java. Indeed Java "invented" the problem you claim they solved by making interfaces only workable as empty lists of functions, because they cannot multiply inherit code because they can only find functions by signature and to classes could implement distinct functions with the same signature....
Your position is logically circular... With a through understanding of both C++ and Java (and compiler theory and symbol resolution etc) your position reads to me as: "nuh uh, they did it right, because they did what they had to do, because they did it wrong."
This, of course, is another support of the fact that Java breaks young programmers understanding of important and subtle concepts. You have been mentally infected with some sort of late-binding meme that you think is universal to languages instead of being restricted to, well, Java...
More clown music here maestro!
Innocent people shouldn't be forced to pay for inferior software development.
--"Code Complete" Microsoft Press
Just as losing my car in a parking lot, or a bet, doesn't cause my car to explode into its constituent pieces and resume their life as raw materials...
losing the last reference to memory isn't destruction.
So your first point which talks about "the memory being available" is immaterial, and a tad vague.
Meanwhile...
Custom end of life routines _do_ automatically occur in C++ as long as the object reaches an end of life condition. Leaking an object doesn't imply end of life in C++ (though it is the only way to reach end-of-life in Java), it indicates a serious semantic error in the code.
So where end of life is managed (or not boned up by a bad programmer), which in C++ is automatic for automatic variables, automatic for reference-counted pointers to heap objects, and manual for manually managed objects (manual management being the default heap lifetime model in C++), end of life calls happen _precisely_ at end of life. So there you go. I did explicitly mention that for full heap-based automation you have to add pointer reference management.
Also, I made the point that "waiting for the garbage collector" to notice the object needed to be finalized was not the same thing as having a _predictable_ point of destruction at a _predictable_ end of life. (though I must have used less-clear wording.)
Consider a specific example. I have an object that represents a cache of the image of an open file. It has one reference on the stack and that reference is passed into various methods as well. An exception is thrown and all of the referencing pointers on the stack are unwound. Now I fix the problem and reenter the code, where I make a second cache object and call the hierarchy of functions which runs to completion.
In C++ (with proper lifetime management via automatics and reference counted pointers as necessary) the first cached region on the file was taken _COMPLETELY_ out of play by the exception. The destructor, with absolute certainty, has flushed the cache and closed the file during the exception, and so the open read and cache update and close cycle of the second, successful pass can take place in absolute safety and with proper closure and no uncertainty what so ever.
In Java I potentially have two separate caches that _think_ they have authoritative knowledge of what the file _ought_ to contain, and when "finalize" comes around to flush and close the file I could end up with _either_ set of data in the file or, worse, some combination of both.
So in Java I (the programmer) _MUST_ add a manual end-of-lifetime call that YOU-or-I (the user) _must_ call in every possible logical branch out of the code. {hence "finally" clauses etc added into the language.} The problem is, _requiring_ this _extra_ call to the object violates the whole concept of objective encapsulation as you _must_ end up with an "object is no longer a file" _OR_ an uncertain object validity that, by definition, extends to some uncertain time in the future (possibly "never" if the program ends).
Now yes, in C++, a "bad" programmer may leave trash on the heap at exit and violate his the fundamental lifetime of an object, but in both languages a bad programmer _could_ do damage in any number of places.
Okay? Java doesn't have destructors. It has "finalize" which has no _predictable_ semantic over the domain of time. And you can _add_ a method to do anything, including and especially, to invalidate an object that will still exist, leaving you with an invalid object {look up "invariants" to understand what I mean by "invalid" here} in scope. This is _not_ better.
So... you don't understand destruction...
The music is still playing here...
Innocent people shouldn't be forced to pay for inferior software development.
--"Code Complete" Microsoft Press
In C++ a reference is a pointer with two additional traits:
1) The value of the pointer cannot be changed after initialization; that is, it is "immutable".
and
2) Since the value is properly immutable by virtue of item 1, the language provides the "syntactic sugar" of relieving the programmer of the chore of explicit dereferencing (using the "*" operator) on use or using the address-of ("&") operator on construction.
ASIDE: As a consequence of 2, the uninitiated may be confused by the use of the address-of (&) operator on references to regain the raw address of the referenced object. This operation is, however, inevitable in this form since [reference_name] is the same as [*pointer_name] &[reference_name] is the same as &[*pointer_name] so the auto dereference is preserved in exact semantics. This leads, for the purposes of semetry, to the auto-address-of operation takes place when a formal function call argument is initialized "by reference" since G(T&x){} F(T&x){ G(x) } {T thing; F(thing);} would be asymmetric for the calls of F and G if I had to take the address of thing, but nof of F::x etc.
Since Java _does_ let you change the value of the pointer using the assignment (e.g. "=") operator, it is not immutable and it fails to qualify in item one.
Similarly equality (e.g. operator "==") in Java compares the addresses of the two operands, which tests whether the two pointers point to the same object, as opposed to the equals() method which, when present, compares semantic equality of the contents of the object so pointed to. In c++ "[reference_name] == [reference_name]" is actually "[*pointer_name] == [*pointer_name]" whereas in Java it is "[pointer_name] == [pointer_name]".
So given that there are three possible metrics to determine if Java "object references" are "more like" "pointers" or proper "references" analysis reveals that at two-to-one out of a field of exactly three discriminants (counting the gross appearance provided by the "sugar" just to be nice to you here and spare you utter humiliation), they most closely resemble pointers. Losing the test of distinctiveness two-to-one cannot, by any measure mean the defeated proposition is "*Much* more" victorious, no matter how much punctuation you add.
Sorry about that guy, but you are completely utterly and inarguably wrong. You really _should_ just take the hit and move on with your life.
But were I to cede you the "they are like C++ references" out of the pure kindness of my heart, you would then have just proved my initial contention, that Java only has pointers, because remember, C++ references are pointers with syntatic sugar on them.
So, more simply said, you have agreed that Java uses pointers with sugar coating.
I already and initially said that those pointers are lame because you cannot do interesting pointer maths on them (a la pointer_name++ etc). This is, again, not "immutability" because that word doesn't mean what you think it means.
Immutable: Not mutable; not capable or susceptible of change; unchangeable; unalterable.
So it doesn't matter what _you_ mean by immutable. I can do "thing=null;" or "thing=other_thing;" which changes thing, so thing was and is mutable no matter what you care to think. And _again_ that makes it a pointer. You are arguing that they are reference because since they are such lame pointers they must not be pointers at all (or something equally dense and pointless, if you will excuse the pun).
In super-super-simple terms that even a Java bean can understand: You are _insisting_ that "it isn't a vehicle its a car!" when you insist "it isn't a pointer its a reference" since references are _specializations_ of pointers with most of the methods hidden. (Was that clearer son or do I have to get out crayons and crate paper?)
And now you should understand why I "laugh a little" when people _insist_ that there are no pointers in Java. It's like arguing that there is no water in the ocean because p
Innocent people shouldn't be forced to pay for inferior software development.
--"Code Complete" Microsoft Press
Do you relay think that the ability to voice insults are an adequate replacement for being knowledgeable?
/. or elsewhere are positive.
BTW: I was not commenting on you spelling - I would not do that as my spelling isn't any good either and I too sometimes slip the keyboard. I was commenting on the fact that you are uninformed and do nothing to to rectify that. Note that I would not comment on a programming language without doing some research first.
Have you had courses with those professors? Probably not - all comments from former students here on
Do you know anything about Ada? Did you program anything in Ada? Can you give me an example on a weakness of Ada? Can you tell me where Java is superior to Ada.
I can answer all of those questions and not only for Ada but for Java, C, C++ as well. And of course the answer to the first two would be "Yes" on all accounts.
And last not least: You are not the only one with 6 figure salary. There is noting special about it - here in the offices are dozens of Ada and Java programmers with a 6 figure salary - so what.
Martin
Very True. Batch programming, sequential access (like you said for DBs), Actions, Schedules, etc., are not exactly OO stuff.
Moore's law damaged computer science education to a great extent.
By enabling Intel et al to increase clock speed by increasing transistors on-board, the same visual or performance effect could be achieved even after doubling bloat onto it.
Much like: If my Ford Focus gets a power Atomic engine powered by Plutonium and capable of going 0-60 in 4 seconds, would i not want to add 1 more tonne of extras/trims onto it?
"Doing what i can, with what i have." ~ Burt Gummer
Even in poor countries like Mexico, University students are meant to have an all around education that teaches them how their technical skills and decisions will affect society as a whole and allows them to place technology in a wider context.
We have mandatory lectures in economics, accounting and electives in literature, sociology and political science for example.
IANAL but write like a drunk one.
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.
NO wonder people have got so little free time left, are less rounded and in general more frustrated.
Somebody having the verb to say the above just shows one aspect of how wrong corporate life can be nowadays.
Pathetic.
IANAL but write like a drunk one.
My point is that a degree (or lack of) is not a good indicator of a person's skills.
I'd say a degree is necessary but not sufficient for a well rounded professional. Yes you can pick up a lot of it in your own time, but there are things you learn at uni that are difficult to learn on your own. Disagree all you like. Many employers don't disagree and many won't look at you without a degree. If you want to maximize you job prospects you'll get a degree. That's the way the world works. Deal with it.
If you're going to write a compiler then hopefully you'll be doing some on-the-job research beforehand. At this point you will likely discover the HP and its relevance to the task at hand. Otherwise it is more or less useless academic trivia.
You simply don't understand, so let me put it differently. The broader a spectrum of problems you've considered, the better a coder you'll be. University is an excellent way to gain exposure to a very wide variety of problems. You'll be able to draw parallels with those problems, work out ways to adapt some of the solutions and work out which problems to avoid entirely (which is the point of learning about computability, and problems like the travelling salesman and the halting problem).
I don't quite understand what you're saying. I interpreted it as: "If you don't understand these things and you come across a complex problem then you can bring a project unstuck." Maybe you meant to say "If you understand these things..." Anyway, the halting problem in and of itself is not significant unless you are writing a compiler (correct me if I'm mistaken). Like you said, it is part of a whole class of unsolvable problems, but you don't need college to realize that such problems exist.
You're completely mistaken. The halting problem has nothing to do with compilers. My example about writing the compiler was completely separate. You've just exposed your ignorance and made it clear you're discussing something you don't even have a basic understanding of. Go look it up on Wikipedia at least. You certainly DON'T need a degree to understand this stuff but if you learn it in a structured way through a degree you won't be making silly statements like this.
(Since you probably won't look it up, the halting problem is about writing a program that will take as its input a program, and tell you if that program will eventually halt. Though it sounds like a straightforward problem, it can't be done).
doubt that anybody read my comment anyway, but if it helps deter somebody from going thousands of dollars into debt while missing out on investment opportunities (aside from the time-value of money), then it was worth it.
If you have to get into debt to do a degree you have to weight whether it's worth it. I'm not in debt. My wife is. Frankly I think higher education should be free. In Australia it was free until 1987. If you have to go without food, housing or health care to do your degree I'd agree that's not a wise move.
However it was not illogical. Too often we justify our life decisions to ourselves and others because it is painful to consider what could have been if we had made different choices. I'm as guilty as you, thanks for pointing that out.
My point was not to put you down or ridicule your life choices. As far as I'm concerned anyone who gets off their backside and tries to excel is 1000 times better than any jerk with a degree who simply paid for it and put in no effort. HOWEVER I do disagree with you about degrees being worthless. If you have the chance to do a degree, even if there's some sacrifice involved, if it's the right degree - a good one - it will make you a better professional. You will have experiences and opportunities in the short years doing it that you won't get in the rest of your professional career. It will open doors for you. That's not to say you should be considered lowly if you don't have one, and it's true that degrees aren't for everyone, but if you can do it, I'd say you
These posts express my own personal views, not those of my employer
Turns out those redundant COBOL programmers actually had the business processes of the company in their heads and notebooks. There were not enough business analysts to get the business transformation done fast enough to satisfy the ogres on Wall Street. Queen Carly lost her head.
Moral of the story: in the business world, many programmers know a lot more than they are given credit for buy their (pointy-headed) leaders. Getting business process changes rapidly and accurately is not reliably done in C or C++.
That's why IBM is working so hard to get its customer's applications into Java under SOA, even while the IBM company needs thousands of computer scientists to develop those tools.
Have a look at Clean (http://clean.cs.ru.nl/) for a use of pointers (internally) that makes for efficient execution. An interesting read concerning the subject is found here:
http://clean.cs.ru.nl/contents/Addison__Wesley_book/addison__wesley_book.html
Actual benchmarks to show the efficiency can be examined here (note the comparison is with C-versions of the same algorithms compiled on gcc):
http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=clean&lang2=gcc
Here's Java 6 (server version) for comparison:
http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=java&lang2=gcc
You'll notice that differences are mainly in the memory footprint, already known to be attributable to the large number of libraries (classes) loaded into the vm at start-up, something the Clean runtime isn't quite as encumbered with:
(Java) http://java.sun.com/docs/books/performance/1st_edition/html/JPRAMFootprint.fm.html
So, the difference in speed is often-times negligible, and it's been shown that the memory footprint can be reduced to a size where you can run an embedded jvm in a mobile phone (really!), and rumour has it that someone even wrote an operating system in Java, but the memory footprint still seems the biggest culprit:
http://www.jnode.org/node/573
In other words, it's not Java - the language, but Java - the massive OO-framework, and JVM - the specific implementation, that's the problem. Even C++ or C with an OO-framework can be made into a large memory footprint, if you can believe it:
http://www.microsoft.com/windows/products/windowsvista/editions/systemrequirements.mspx
Then, of course, memory is cheap:
http://www.simmtester.com/page/memory/memprice.asp
But, the over-use of which, sometimes stays with us as itching bugs for too long:
http://blog.wired.com/monkeybites/2007/11/firefox-3-add-o.html
If memory serves me right (http://www.google.com), there's something to be said of the virtues of garbage-collection applied to systems programming:
http://www.digitalmars.com/d/
and the actual (memory and) time efficiency of such an attempt:
http://shootout.alioth.debian.org/gp4/d.php
But I could be wrong. After all, no-one in their right mind would ever attempt to write an operating system in something like, say, Lisp:
http://cbbrowne.com/info/lisposes.html
- let alone design an actual computer around it:
http://en.wikipedia.org/wiki/Lisp_machine
It simply wouldn't run. No, the skills of an engineer depend solely on the language he/she speaks, not on the abstract concepts he/she masters, applied to whatever tool he/she chooses to use/create.
That is why I propose we all forget about abstraction all-together, and revert to coding like this:
010101100001111010110101101101111101111...
But wait, that is itself an abstraction - Turing must have suffered from premature abstraculation. No, let's hear it for using copperwires instead of silicon, so we can attach some large, hand-
What I used to do in those situation is to point students to the necessary documentation, and then carried on with concepts.
Learning to use a tool is not CS, no matter which way you want to spin it.
IANAL but write like a drunk one.
You can find a 1-star review of Frederik Pohl's "Gateway" by Googling the quoted phrase "Bonobos in space", must concede there's truth to that assessment. Anyway as the Wikipedia entry under HeeChee explains, the HeeChee built this network which goes all sorts of places, but their technology being incomprehensibly advanced( like pointers ? ) all we can do is push the buttons and go where their magic ships take us.
Yes!
you are instructed to pretend that the pointer isn't a pointer, it's an "abstract link". If I tell you to pretend that an integer is a grapefruit it doesn't make it one.
Ta Da!
Broken computer science students everywhere applaud you for concisely showing why Java is a bad language for learning computer concepts.
Everything else you say is crap. The Java vm has a garbage collector. If I want a garbage collector in C or C++ I can link it in (see libgc etc). The fact that I then don't have to worry about freeing my memory doesn't then magically convert my pointers to something else. they are still pointers.
You overstate your understanding of my point. _PLENTY_ of languages have had pointers with feature-impoverished sets of operations. (See COBOL for examples) but you know what? The lack of interesting operators on a type doesn't change the nature of the type.
They are pointers no matter how deeply you cram your fingers into your ears and no matter how loudly you shout and stamp your feet.
P.S. Learn to READ. I didn't call "not having to type an extra character" a "fundamental characteristic of references"... I called it "syntactic sugar". The only feature of a reference that makes it a reference is immutability, and we have already demonstrated that you can re-point your pointers in Java via the assignment operator. (Getting out the crayola) See I took where you were trying to invent all these differences between pointers in C++ and references in C++ and boiled it down to two facts. First (labeled with a little "1") was immutability, and then second (labeled with a little "2") was the syntactic sugar. I made no statements about "fundamental characteristics of references" because "references" are "pointers" because, in truth, and as stated, references are, first and foremost, pointers.
Answer me this: What is the difference between a duck and a Mallard?
One is a general kind of thing and the second is a more specialized version of that thing. So references are pointers because, well, references are pointers. They are the same damn thing. period.
Now take a lollipop out of petty cash and STFU you clueless noob.
Innocent people shouldn't be forced to pay for inferior software development.
--"Code Complete" Microsoft Press
Not sure what this Java is, is it the stuff I drink at Storbucks? However, I would dearly love some help- any help! for my project:
I am writing a program to translate ADA into COBOL (and optionally PL/1).
I hope to make big bucks upon its completion! You can too! (with the right input)
It is currently being written in APL. Sorry, but I gave up up on that freaky Pascal stuff.
Anyone who can supply me with a genuine APL keyboard stands to gain mucho pesos, if you know what I mean.
Bill Gates has apparently taken a recent interest in COBOL, (seems to be something to do with Africa) and I suspect this may just be a killer app!
I will let you know about the forthcoming IPO. No triflers please!
.
- aqk
F U
... it's the university. I study informatics at TUM, europe's top university for informatics (#1 or 2 in every study for the last 5 years ... ).
We started with Java too, but we also learned asm and how a CPU really works on a hardware level in the 1st semester. 2nd semester was VHDL and OCaml, while keeping Java as the language for most homework in the Algorithms and Data scructures and Software Engineering course. 3rd semester we got C in Operation Systems and SQL for databases ... I'm not a particular fan of Java, i use mostly Python, Lua, OCaml and C# (if i have to), but bashing Java is completely ridiculus and doing so on basis on a study from a university where idiots seem to lecture is even stupider.
The main reason given to the first year computing class I was in for that class being taught Haskell was that there was buggerall chance that anyone would already know the language and have an advantage over students who hadn't programmed before. The fact that it is a completely different style of language to c/c++/vb et al was seen as an added bonus.
Another reason given was that a lot of students they'd had previously had learnt bad habits when picking up what smatterings of c/c++ etc that they knew, and it was easier to teach them good habits in a completely different language then getting them to apply the same principles to a useful language than trying to do both at once.
A degree (at least one that isn't ridiculously shitty) is a good deal more than just the starting line. Some people even do research as part of their undergrad program; not necessarily ground-breaking, revolutionary stuff, but research nonetheless. Some undergrad science programs even require active participation in a research project.
Students also found it extremely challenging to understand the implications of a simple goto statement....
and (most damaging) did not understand the semantics of pointers at all, which made the use of C in systems programming very challenging
I thought pointer arithmetic was frowned upon these days...
Show a man some news, distract him for an hour. Show a man some mod points, distract him for the rest of his life.
The broader a spectrum of problems you've considered, the better a coder you'll be. University is an excellent way to gain exposure to a very wide variety of problems." I got that the first time around. Working in the field is a better way to gain exposure to practical problems. You get the added benefit of coming up with solutions on your own. Better than trying to shoehorn the lessons you learned in college into real life.
Go look it up on Wikipedia at least.I did, when you first commented on it. The only practical application I found was adding a feature to a compiler that will tell you if your program will infinitely loop. I suppose you could also assess other programs (plugins to your own perhaps), but the halting problem by definition simply tells you whether a program runs forever or not. Care to enlighten me as to its significance beyond that?
If you have to get into debt to do a degree you have to weight whether it's worth it. I'm not in debt. My wife is. Frankly I think higher education should be free. It should be, but it isn't. You aren't in debt, good for you. I hope you're doing a lot better than "not in debt".
HOWEVER I do disagree with you about degrees being worthless.I never said they were.
(with one possible exception. If original thought is required and you're a genius, a degree may make your thinking more rigid than you need it to be. I'm thinking of Einstein here, not just anyone writing some business code for a living) While not an Einstein, I'm quite a bit smarter than the average bear. I was going to bring up the "original thought" argument myself but decided against it. I can't even tell you how many times I was able to come up with creative solutions to problems that my educated coworkers didn't even know how to approach. That goes back to my earlier point about trying to shoehorn problems into the solutions you've been taught instead of approaching with experience and intuition. Oh, and I'm not planning on writing business code forever. With what I have saved I'm going to take a break very soon and invest in some other opportunities.
I've spoken in depth with many of my educated coworkers, most of whom I've already passed on the career track. I considered getting a degree and spoke with several of them about it (including the few that held higher positions at the time). They all told me that aside from having some fun and learning about different things, it would do absolutely nothing for my career. They all say that with the experience and skill that I have, a degree would only slow me down. I remember interviewing a graduate of Cornell and turning him down because he had poor communication skills.
I agree that a degree can significantly increase the earning potential of your average Joe. However if you're making six figures before you hit 25, you might not need it after all. It reminds me of a certain Bill something or other who started a $oftware company. Maybe he should have asked for your thoughts first and gotten that degree.
ps - I would have responded sooner but I had to take the day off to go snowboarding.
I got that the first time around. Working in the field is a better way to gain exposure to practical problems. You get the added benefit of coming up with solutions on your own. Better than trying to shoehorn the lessons you learned in college into real life.
...and they'll keep telling you that while presenting their degrees as justification for every promotion they apply for until they're earning more than you and/or they're in a position of authority over you. Then they'll take credit for your hard work.
There are problems that look simple but actually turn out to be complex. There are problems that are deceptive in that you think you've solved them but in reality you've left something out that will bite you in the ass. Learning in the real world about these problems may mean creating a system that appears to work but really doesn't.
Care to enlighten me as to its significance beyond that?
The significance of the halting problem is teaching you a way to deduce whether or not a problem is computable. ie. whether trying to build a computer program to solve the problem in the first place is a sensible thing to do. If you're telling me you'd have come up with that particular proof by counter example on your own in what is considered a reasonable time frame commercially, you're telling me you're a genius. However once you've seen this proof you can try to apply something similar to a problem to work out whether a problem is computable.
It should be, but it isn't. You aren't in debt, good for you. I hope you're doing a lot better than "not in debt".
I do okay thanks.
While not an Einstein, I'm quite a bit smarter than the average bear. I was going to bring up the "original thought" argument myself but decided against it. I can't even tell you how many times I was able to come up with creative solutions to problems that my educated coworkers didn't even know how to approach.
Having a degree doesn't make you good at the job. You're telling me you're good at your job and I believe you. Some of your co-workers clearly aren't. No degree is going to make them creative thinkers. However if you had been exposed to the knowledge they have been I don't doubt for one moment that you'd be even better.
They all told me that aside from having some fun and learning about different things, it would do absolutely nothing for my career. They all say that with the experience and skill that I have, a degree would only slow me down.
I remember interviewing a graduate of Cornell and turning him down because he had poor communication skills.
My current job is in support and writing software in both Java/J2EE and C. My last had some Java and lots of Smalltalk (which isn't much sought after where I am anymore). I was told 2 years after I got the job that there was a technically stronger candidate but that he was going to be a problem fitting in with the team (they alluded to ego issues). As I said a degree is necessary but not sufficient. Plenty of people that understand the technical side of computing well have almost no social skills. The degree doesn't filter for those which is why you need to when you hire.
However if you're making six figures before you hit 25, you might not need it after all. It reminds me of a certain Bill something or other who started a $oftware company
There's a different reason for his success. If you're willing to play dirty and step all over people you can go far especially if you have luck such as Mr Gates did. Don't get me wrong - the man worked hard. But he also left his scruples and manners behind.
Degrees aren't JUST about earning potential (though that's important). If it were I'd never have done my Astronomy masters knowing full well I'd never use it in my work.
ps - I would have responded sooner but I had to take the day off to go snowboarding.
Hope you had fun. It's clear we may never agree on this, but you've definitely been fun to debate with (and unlike many heated debates here it hasn't gotten too nasty)
These posts express my own personal views, not those of my employer
Lets all reinvent the wheel 1000 times.
It is scary to think that the above is said with a straight face.
IANAL but write like a drunk one.
In all the years I have programmed that knowledge has been not needed.
It is nice to know that stuff, in the same way it is nice to know the three laws of movement or Fermat's last theorem.
IANAL but write like a drunk one.
Perl is an abomination that we have to use because, well, I don't know why.
Most code I have seen in professional environments in the real world is unmaintainable, given the idioms of the language this is unsurprising (sometimes I think it was designed with the purpose of enhancing nerd's egos to see who can obfuscate any given program the most).
IANAL but write like a drunk one.
Yes, Java is a very crappy language when it comes to how it handles memory (ugh! has anyone looked at its heap code? appalling.), and it is geared towards GUI programming, but then again most next-gen languages are. The executables it creates suffer from hyperbloat due to the fact that it has to include so many extraneous libraries that don't really need to be there, and all of that needs to be loaded into memory. Thus, if you're writing a very large application in Java, then you're gonna have problems with memory real quick. Forget about using Java for embedded apps unless you like the frustration of porting its JVM to an embedded system. However, on the gripping hand Java is basically a C++ work-alike, which means that Java-indoctrinated CS students will be able to pick up C++ fairly quickly. Also, students can safely ignore the details of how certain languages work and just get to the fun stuff like data structures and algorithms w/o learning a new programming language (which they can do in their spare time anyway). I don't recommend that option, however, but some might. IMHO, C++ should replace Java as the de facto CS instruction language, since it is more flexible than C and more efficient and extensible than Java. BTW, IMO, I think most software tech employers, in the corp sector or otherwise, look for folks with solid C++ skills AT LEAST. They'd prefer someone to know a vast body of information regarding current software trends and new languages/tools, but C++ is so widely used that it should be a requirement at all universities and colleges with a CS degree program.
Hey, was slacking on my reply... release crunch and all that. I'll understand if you don't reply.
There are problems that look simple but actually turn out to be complex. There are problems that are deceptive in that you think you've solved them but in reality you've left something out that will bite you in the ass. Learning in the real world about these problems may mean creating a system that appears to work but really doesn't.
The point I was making is that college won't teach you how to solve these problems. I've arrived at this conclusion from my experience working with mostly college-educated people. Instead of seeing the problem for what it is, you are stuck trying to make the problem fit into the solutions you learned.
The significance of the halting problem is teaching you a way to deduce whether or not a problem is computable.
Are you telling me that you've personally applied this proof to determine the feasibility of a project? I'm going to go out on a limb and say that real-world experience designing, maintaining and repairing computer systems will give you far better insight into the feasibility of solving a given problem than the HP proof.
However if you had been exposed to the knowledge they have been I don't doubt for one moment that you'd be even better.
I disagree. Early in my career I had the chance to sit in on a discussion at a local trade school (this was ITT tech, so not really a university) where the teacher of an RDBMS class actually said "primary keys are nice, but they aren't necessary." Learning from a bad teacher is worse than teaching yourself. If you're teaching software engineering there is a decent chance that you couldn't cut it as a software engineer. There's an even better chance that you're unfamiliar with the problems and technologies relevant to the industry today. On the other hand, I worked under very experienced developers early in my career. They were my teachers and role models. My classroom was a software development shop, and my homework was designing, writing and supporting real software.
As I said a degree is necessary but not sufficient.
I still don't see it as necessary. I've performed my job far better than coworkers who had degrees, and I'm paid as well or better. I have great technical, communication, and for the industry, above average social skills. Saying a degree is necessary doesn't make it so.
Instead I'll invest the money I would have spent on college and visit the library, bookstore or google whenever I yearn to learn.
It really is a personal choice, and it depends on your individual circumstances and aptitudes. One size does not fit all. College is not the answer. Further reading (sorry, had to throw this in): http://en.wikipedia.org/wiki/Choice-supportive_bias
I have been teaching at the College level for about 10 years now (not in the US, though). I first taught "advanced" topics (operating systems, compilers), but I was so shocked by the programming skills of the students, or the lack thereof, that I candidated to teach basic programming.
I think that programming education (which is important for software engineers and computer scientists) should address first programming in the small and then programming in the large. Programming in the small includes basic programming constructs, memory management, basic input/output, algorithms and data structures. Programming in the large would include object orientation and patterns. It may be possible to start introducing the latter while teaching data structures, as some concepts such as polymorphism and encapsulation are needed to implement them in a reusable fashion.
However I find that teaching programming is extremely challenging, and the question of the programming language is only part of the problem.
Best,
David.
--
Not until you have interviewed for a job will this sort of BS go away. Most managers want a project done yesterday. They don't want to hear you say that you are trying out some ideas before you actually present a solution. Most often times, your beta version is the released version. I wish it weren't that way. Tell me where to send my resume, and I'll join you. The other issue is that there are lots of people who are accountants or what not, who have been recruited to solve a problem via programming. They just don't have the time to piss around with pointers and want a language that handles that for them. They aren't interested in hand scratching their mnemonics on bare metal either.