Saturday, April 15. 2006
This is something thats puzzling me lately. I whole heartedly agree with Joel Spolsky and many others that it's a bad idea for a comptuer science department to simply churn out students with a proficiency in Java, and zero skill in Computer Science or Software Engineering. But I don't know why...
Out of every class that I see in Maynooth I would estimate about 25% actually still want to do Computer Science (or CS-SE) after 3 months. The other 75% fall into the following categories...
Disclaimer: It is very rare I will talk about CS Education using such loose anecdotal evidence, I am doing so here merely to illustrate a point that I think we can all agree on. In Maynooth very few Computer Science students are excited about Computer Science
Unfortunately for both Maynooth and the students, the Irish education system is structured in such a way that changing your choice in degree costs you about 3,800 euro. To most students, this is a lot of cash. Plus they have no idea what they would change it to, they'd probably make the same mistake again. So as a result they sit it out. It's a nice thought that exams will weed out these weak unmotivated students. I like nice thoughts, don't you?
Students realise at some point that they are in college for the long haul, and they realise
What's this got to do with Java Des?
Well, my question is "What is wrong with just beating Java into these guys heads until it hurts?". The students want jobs. Most companies just want "J2EE developers". Giving the students significant J2ee exposure is basically giving them a good chance of getting a job. Why fight it?
But Joel said, and you said, and I think...
I know. It's not right. It's not a proper education in Computer Science. But thats not what they want. They want jobs. Very few companies seem to be shrewd enough to realise that a programmer who has "Lisp, Scheme, Python, C, Prolog, and more" on their CV will be up to speed with Java in a few days. (And will most likely be a better programmer, than the all Java superstars that are currently working there). So, if you try to teach them these other languages and paradigms you may be succeeding in giving them a rounded education, but there are few companies that require a rounded education to be a programmer.
What do you guys think?
I've a great selection of readers on this blog. Some of you are students, some are programmers, some are postgraduates. Some even interview programmers! What do you guys think we should teach in university? I know what monster.ie (an Irish jobfinding site) says...
Over the course of this month, I hope to post twice more on CS-Education. I use the word hope, because real life is a serious obstruction to blogging. The next CS-Ed post will be the long awaited semi structured study of "What do you want students to know when they finish CS1". Until then, please leave me a comment on what you think about this article.
Yes, I realise I could replace Java with ASP, or Visual C++, or soon enough C# when talking about the jobs going. However Java is by far the most taught language in schools around the world, that's why I am picking on it.
The best blog posts of 2006
Now that work is winding down for Christmas, you might have some spare time to browse the net aimlessly. Well, I've provided some targets for you all... The following is a list of posts that struck a chord with me, either through my head or my heart. Rec
Tracked: Dec 20, 01:33
Display comments as (Linear | Threaded)
This is a response to something that was mentioned on the comment thread with this on the Joel reddit. For those who haven't been, a commentor suggested that Java schools do a disservice to the smart ones. DT responsed that the smart students basically look out for their own learning at university anyways.
That is true to a certain extent. But the thing is that the smart ones generally do it by working on projects of their own. Quite a lot of the time they stay inside their CS Theory comfort zone. They'll work on a program which is pretty cool but I'd be very surprised if any of them go off on their own and learn about Lambda Calculus or one of the other High-Flying CS concepts.
I've recently switched into a Computer Science taught postgrad from a Maths undergrad. I did my CS study on the side and generally I stayed entirely within programming concepts and software engineering. Now the people on this course are generally amazing programmers (I would easily be the weakest around) but even the best of them with CS Firsts aren't particularly well read on CS theory. Of course I could be generalising based on my own experience, but based on that experience quite a lot of the best programmers at this age are interested in what they can do than in theory.
Where am I going with this? I suppose its kind of this. There doesn't seem to be any streaming in Irish CS courses (except at Limerick but you never know which is the honours course until you get there). In Maths there is almost always an easy path to a degree if you want it. Maybe what CS needs is to recognise that there are people who are their for the "Java school" the people you describe, let them take pass courses and get out after three years with a degree. Otherwise there is the four year honours degree route that can be taken.
Thanks for reading. That's a really interesting point. If colleges offered a "fast-track" way out, for people who are literally looking for job training, and little else, then at least their education wouldn't come at the expense of the serious talent.
It would certainly be a nice structure to a degree to have a "way out" that basically covers APIs and programming, and kicks you out the door, and have a double honours degree that gets into the theory based topics and the stuff that only interested students could stomach
Cheers for the comment,
Slightly off your topic but I need to find someone in Dublin that would be willing to give me a crash course in Java using the processing.org and jdom libraries. I have a good working knowledge of c++, but need to set up a framework core structure urgently. I will travel anywhere in Dublin and am willing to pay for all help. I am an older student doing a research project that now involves JAVA and am under time pressure to get a handle on Java. the potential "savior" can also work with me from home in Malahide Dublin. please call on +00 353 1 661 1099
Many thanks for any help
I recently finished my MSc in Comp Sci at Otago University in New Zealand and have begun working in the capital Wellington. I've taught first year programming for 4 years, and I can say that the reason that we teach Java first is that it nicely insulates the beginner programmers a lot more than C/C++ would.
We need to teach an imperative-style (i.e. C-style) language because we need our grads to get jobs in order to market our courses. Java's stack traces and clear compiler errors make it much easier for beginner students to learn, and the GC also simplifies memory management for beginners.
We still teach C at second year, C++ in the third year OOP paper, so that they can learn things like memory management and so on, but most still prefer to stick to Java when they get past the C/C++ courses, which is a shame. Having said that, at work we use Java for the application development stuff (compiled into native binaries with Excelsior Jet), and only use C++ for the "hardcore" stuff. It is easier, safer, and faster to code Java than C/C++, and a well written Java program can be of comparable speed to a C++ program, and produced in a fraction of the time.
In terms of the actual details of teaching, I've found that one of the most useful things that beginner students can understand is scoping and the correct use of indentation. Once they start indenting correctly they begin to mentally group code in blocks enclosed by curly-braces, and then treating the program as made up of these blocks, rather than just a bunch of magic incantations. It teaches them to think in a structured manner, which is critical for an industrial-strength programmer.
I finished my Honours degree in Computer Science from Otago University, er,
a while ago, and we definately had two tracks.
A plain Bachelors degree for people who wanted a job, and they would at least end up knowing other parts of the field existed,
or Honours, where we learnt pertty much everything. Those days we used ADA and Pascal, and I remember talking to my supervisor after graduation about teaching first year students Java.
Joel Spolsky has a point about Java making things too easy, but he has the knife backwards. Java makes bread and butter work easy, but it makes hard, big projects survivable. Reliability, robustness and safety.
Some poeple say that they don't need that kind of environment for their software and I say to them: so it's okay to give your customers buggy crap.
Mind you, I work in defense, in embedded Java and any time Joel and the rest of the Windows apps boys want to come and see our stuff: M101 CROWS.
We don't produce bug free software, but it gets better.
And to Chris Pearce: it's good the see the old school still turning out hard liners.
I have to say that I agree with Joel's premise on this one. Teach them something harder to start, and make the language du jour an elective in the Junior or Senior years. I understand that a student who majored erroneously will despise the fact that it's hard, and that the only options they have are to get tougher and do it, or pay through the nose and get out. Consider, however, those options. The former really isn't so bad because if they can stick it through, they will beat out other applicants, because they will, likely, write better Java code after a year or two of Java at the end of their schooling than a student who coasted through four years of Java alone. The other important aspect is that, while there are a lot of Java jobs now, this won't always be the case, just ask a programmer who only learned C++ 20 years ago. Giving a more rounded education wards off language death, and will do a better service to them in the long run. After all, Bruce Tate has already heralded the death of Java (dead as in Cobal, not as in Elvis...)
I am one of those Maynooth graduates who didn't have a compelling interest in Computer Science. I mean, I had friends who were passionate about computer science but for the last 3, 3 and a half years of my degree, I was hoping my parents would win the lotto so I could bugger off to Philosophy.
Seriously though, I think my case and people like me might be instructive. I didn't just want to come to Maynooth to get into college or to get a job. I wanted to study computer science at Maynooth. (oh the naivety) I was motivated, even fascinated by computing. Maybe computer engineering was the course for me but I could definitely have been swept up by my enthusiasm and carried along to above average proficiency if there was some conduit to travel along.
But when I arrived at college there was a step change in about the 8th week. We had done our loops and our statement assignments and declared Hello World. Then a new and vastly inferior lecturer stumbled through an introduction to object orientated design. From that point on, programming took 1/4 of our scheduled time (if I'm right) and the rest of it was given over to vital courses like SE114- Testing.
The curriculum needs to be firmer. An enthusiastic student in any subject needs to come up against problems that phase them, that bounce them back and then be given the tools to create their own solutions. Easier said that done, I know. I know it from developing theology training programs now. But a rosetta stone for this connundrum is more intensive 1st year programming in a tutored lab environment. Throw the students into battle with the problems they expected to face (or at least signed up to face) and I think you will either start producing better computer scientists/software engineers, or have a gulf dividing 2 sections of the class that can serve as your harvest time wheat-chaff divider.
The authoritative opinions of a CSSE mediocrite.
I don't agree... to use a variant of a popular saying, if you teach a man how to build houses, that's great, he can be valuable. However, if you teach him the underlying science about building houses, he will be far more valuable... with a little more effort, he can also build bridges and skycrapers, while the person who was only taught how to build houses would have severe difficulties with it.
I'm currently a student software engineering and was taught Java in the first year of my course, as an introduction to OOP, after which I was taught the basics of C++ and that's it. Now, really, at the moment I haven't been programming Java for about 2 years, but it would probably only take me a few weeks max to get "back in the game" for Java. Sure, I might have to learn how to use struts, JSP or whatever, but that's only temporarely difficulties. Knowing how the underlying virtual machine works, knowing how compilers work and knowing all the backgrounds behind language designs are far more valuable than knowing how to USE a programming language.
Just to clarify, I don't agree either. My point is that It's very tough to teach Computer Science concepts when the industry, in general, doesn't value them, and as a result the students don't want to learn them.
I agree with you that it is more valuable to teach students the how and the *why*, rather than the what but it's not what the students want to learn, and its not (in my experience) what the industry wants to hire.
Thanks for reading.
It sounds like the real problem to fix is the rigidity in the Irish university system, and Java job training as CS is a distraction from that. It's not fair to ask people to decide irrevocably what they want to do with their lives before they've ever done anything.
Sometimes it's worth a premium to make that change. I took my first CS class when I was already 22 and had a degree in Asian Studies. It cost me more than 3800 euros (wel, for me it was dollars, and euros did not exist yet) to become a CS major (and ultimately a CS grad student). Luckily for me I had the financial resources to make that choice. I was an extreme case, though. It's bad policy to effectively tax 19 year old kids for changing their minds after 1 year about what they want to do for the next 46+ years.
It's also debatable whether throwing trained people at job slots is the best thing for a society. Maybe it's better to outsource the jobs that would be given to uninspired but vocationally trained locals and encourage the locals to find the field in which they shine and blaze their own trail. Chances are those jobs on Monster will someday be obsolete or move offshore anyway, and you're left with a bunch of miserable locals in need of re-training.
I don't think teaching in Java is such a terrible thing - I work as a Java coder now - but Joel's point that good coders have to have a sense of what's going on at the machine level when the code is executed is somewhat valid.
FWIW Alan, the Irish education system is slightly novel in that going to college is very very cheap compared with other countries. i.e. you don't pay course fees, you only pay registration fees(about 1,000 euro).
The major cost is that if you do change your mind, you then have to pay full fees (3800 +1000) for each year you are re-doing. (i.e. if I do 3 years of my 4 year degree, and switch. I pay full fees for 3 years)
"It's also debatable whether throwing trained people at job slots is the best thing for a society" I wholeheartedly agree but universities are competing with each other for students. Most students will flock to the universities that have a high % of sector employment. And thats a big problem for universities.
Gotta agree with Alan on this one--the problem is in the inflexible structure of the Irish University educational system (as described here) and the solution should be on that level. I explored a lot during my tenure at University. I think I ended up changing majors four or five times. I would have hated being locked into my first choice with such a strong economic penalty for switching...
I have many disagreements. I'm coming from a bit of a different background, I'm self taught, recently been taking grad courses in CS, but I've been making a living with java and J2EE for years now (yes, I have worked with other languages, including functional paradigms, so I don't feel like my comments are coming from the limited perspective of a java-only guy).
First off, I don't really think java's that bad. It's fashionable to knock it because it's popular, I suppose, and because it doesn't have some of the really impressive generic power of C++, which it was supposed to "improve on", or those lovely functional idioms. But it's certainly a reasonable choice as a "sandbox" language to teach new cs folks about oo design and basic coding. It's probably better that C#, which I think is what Joel's company uses, and which seems to me ( from my admittedly cursory reading of it ) to be full of proprietary and overcomplicated crap (do we really need a special syntax for property accessors? how about operator overloading that's only recognized by some parts of the .net runtime? ick.)
Anyway, about java...
A few arguments in favor of it as a teaching language:
1. You can argue, as some do, that "my grandpappy had to dig raw silicon from the mines every time he wanted to write a new char, these newfangled languages don't make you do X" (X usually being memory management) , but I'd argue that that's the benefit. The flip side is that it allows students to learn basic oo concepts without the distracting complications of what are essentially implementation details. I'd argue that there are many complications, that are essentially pointless distractions.
2. From watching and mentoring developers for some years now, I think that there's a natural and time-dependant evolution one goes through as a developer (that is ,the ones who care to- some certainly stop growing), you've got to master the basic syntax and constructs before you can start thinking about design and architectural issues. For me, it wasn't until I'd been working for some years that I began to appreciate what was in C++, for example, that wasn't in java. That seems to me to be at least as valid a learning path. It's not clear to me that learning C++ first would have helped me much in the long run.
I'd be curious to hear if anyone who learned on a more traditional path feels that they were shortchanged by learning java first. It seems as reasonable a place to start as any (python?)
Started with Java moved to Python as soon as I could and I would have preffered starting with Python. Python carries all the benefits of Java but brings more to the table. In your first Java program you just have to accept all this voodoo about classes, main, static, void and that String args thing. It's never a good sign when you are told in your first lecture that more than half of the simplest program in the language is far beyond your understanding.
Python cuts all of that out. It is perfectly possible to introduce someone to the language without showing them anything other than the simplest constructs and working your way from there, adding complexity at your own pace.
I'm a (mostly) self-taught developer, I learned basic from books and some kid courses and then learned Pascal and C from books. That was all well before university.
At university level we were taught C and C++, there were also courses that did functional languages and others, I didn't get to attend them since my major was in Math and only the minor was in CS. My time in university was spent hacking on Free Software and advancing my practical knowledge while learning theoretical CS (didn't bother attending the language courses, waste of time).
I learned SQL to implement a database based system as a freelance project, I picked up a book on relational calculus and got most of what I needed about it fairly quickly, though I probably didn't do it all too rigorously as one would do in a proper CS course.
From what I saw around me, the fellow students had a hard time to learn C and cope with the basics while also trying to figure out cryptic error messages. But I doubt any of them would even be able to understand anything from a stack trace, even if they could fathom what a stack is. Most would need the hand holding in the same way in C as in Java.
The advantage of learning C (at least for me) is the knowledge of the computer operation, memory management and an improved ability to understand what happens when a program fails. And it doesn't matter if the program is written in Python, C or Java.
But then, my vision is probably clouded by the fact that I'm doing mostly Embedded Linux development and not Java application servers. In my case I've interviewed candidates and it showed very easily that most graduates have no clue about memory management, pointers or any other relatively basic C concepts. This experience is what motivates my thinking that C should be taught over Java.
I wouldn't consider Maynooth graduates fit for the job I'm doing, I'd be surprised if they could figure out a makefile, not to mention actual C code. But then, I've also checked the job market around here and it doesn't look like there are many interesting jobs so I guess the universities here simply provide the cannon fodder that is needed around here. From my limited observations many CS graduates won't even be programming anything anyway.
The problem is that if you want the best you have to have other experience not just Java learning functional programing languages like Scheme/ML/Haskell/Erlang or some heavy duty meta-programing and lisp macros are more useful than just knowing Java but i would with all that experience would balk on having to write for loops and iterator for loops, instead of map select reject etc.
My name is Des, I'm the UX Lead and COO of Intercom, a fantastic CRM & messaging tool for web sites and web software.