Two recent interviews with Prof. Robert Dewar of NYU, Who Killed the Software Engineer and The ‘Anti-Java’ Professor, have recently been popular on the web and I wanted to add my own commentary to the situation. These interviews arise from Dewar’s article in the Software Technology Support Center: Computer Science Education: Where are the Software Engineers of Tomorrow? As someone who takes his role on a university computer science / computer information systems professional review board very seriously, I have spent much time considering these very questions.
Firstly, Prof. Dewar is hardly alone in his opinion that Java, as an indicator of the decline of computer science education in America, is destroying America’s software engineering profession. The most popular example of someone with similar opinions would, of course, be the ubiquitous Joel Spolsky (of Joel on Software fame) in his Guerrilla Guide to Interviewing or in Stack Overflow Episode 2.
The bottom line in these arguments is not against Java but about the way in which colleges and universities teach computer science. Computer Science is an extremely difficult discipline, but universities will often substitute simple classes for core CS classes. Dewar states that this is widely because enrollment has dropped off in these programs as the field is less attractive and students choose lower-hanging educational fruit. Universities put pressure on the departments to increase enrollment, often by lowering standards and eliminating hard requirements. However, difficult programming classes like deep C or Assembler, require more highly trained, and therefore expensive, resources so this too causes academia to avoid teaching such categories. A trained C or C++ developer has much better compensation prospects in the “real world” than they do in academia.
Java itself is a great language and no one, in this case, is saying that Java is not or should not be popular in real world development. But Java is a language designed for rapid software creation and includes a staggering amount of built in libraries. Almost anything truly difficult has been addressed by Sun’s own highly skilled developers already and does not require reworking by a working developer. Working with Java requires only a rudimentary knowledge of programming. This, by its very nature, makes using Java as a learning environment a crutch. Learning to program in Java is far too easy and many, perhaps most, programming concepts can be easily avoided or perhaps missed accidentally. (Anything that I can say here could apply to C# as well. Both are great languages but extremely poor for teaching computer science.)
Far too often university computer science programs teach no language but Java. Computer science students need many things including deeper system knowledge and a more widespread knowledge of different languages. Computer science programs need to stop focusing on single, limited skill sets and start teaching the field of CS, and students need to stop accepting the easy way out and demand that their schools live up to the needs of the workplace!
While, by and large, I agree with Dewar whole-heartedly, he does have one comment that I find very disturbing – although very unlikely to be wrong. He mentions, in more than one place, that Java is inappropriate as a “first language” as if computer science students at NYU and other universities are learning their first programming languages in college! This is an incredibly scary thought.
I guarantee that international students looking at careers in software engineering or computer science wouldn’t think of entering university without a substantial background in programming. I can’t imagine a school like NYU ever considering such a case. If we are allowing the entrance bar to be set so low than can we even possibly consider what we teach when apparently it matters very little? Would we accept college students who didn’t do algebra in high school? Didn’t speak English? Know no history? Failed physics? How then could we possibly consider allowing non-programmers into what should be one of the most difficult possible collegiate programs available, and how can we expect good, proficient programming students to learn something of value when forced to learn alongside new learners?
Dewar’s argument for the necessity of a higher standard of collegiate computer science education is that by dumbing down the curriculum and handing out meaningless degrees to anyone willing to pay for them (hasn’t this been my argument against the university system all along?) we are fooling outselves into believing that we are training tomorrow’s workforce when, instead, we are simply accelerating the rate of globalization as developing countries see a massive opportunity to invest in core disciplines and outpace the United States at breakneck pace. Software development is a field with very little localization barrier inherent to the work and is a prime candidate for offshoring due to the nature of the work and the advanced communications commonly associated with its practitioners and the higher level of skills generally present in its management. But by created a gap in the American education system we are making a situation occur that simply begs to be globalized as our own country is mostly unable to produce qualified candidates.
Lacking from many discussions about computer science curriculum is the need to discuss the range of IT curricula in programs such as IT and Computer Information Systems. Computer Science is a very specific and very intense field of study – or so it is intended. Only a very small percentage of Information Technology professionals should be considering a degree program in CS. This is not the program for administrators, managers, network engineers, analysts, database administrators, web designers, etc. Even a large number of programmers should be seriously considering other educational avenues rather than computer science.
There is a fundamental difference in the type of programming that a comp sci graduate is trained to perform compared to a CIS graduate, for example. CIS programs, even those targetting programming, are not designed around “system programming” but are generally focussed around more business oriented systems often included web platforms, client side applications, etc. CS is designed to turn out algorithm specialists, operating system programs, database programmers – the kind of professionals that companies like Microsoft, Oracle and Google need in droves but not the type that the 300 seat firm around the corner needs or has any idea what to do with. Those firms need CIS grads with a grasp of business essentials, platform knowledge and the ability to make good user interfaces rapidly. These are very different job descriptions and the best people from either discipline may be pretty useless at the other.
All of this points to the obvious issue that companies need to start thinking about what it means to higher college graduates. If all but a few collegiate programs are allowing CS programs to be nothing more than a few advanced high school classes in Java – why are we even looking at college degrees in the highering process? Highering practices need to be addressed to stop blindly taking university degrees as having some intrinsic value. We are in an era where the universities are wearing the emporer’s new clothes. Everyone knows that the degrees are valueless but no one is willing to say it. The system depends on it. Too many people have invested too much time and money to admit now that nothing is being taught and that students leaving many university programs are nothing more than four or five years behind their high school friends who went straight to work and developed a lifelong ability to learn and advance rather than to drink beer while standing on their heads and spent their parents’ or borrowed money.
Computer Science departs need to start by developing a culture of self respect. Teaching Java is not bad but a CS grad should have, perhaps, one class in Java and/or C# not a curriculum based around it. Knowledge of leading industry languages like Java is important so that students have some feel for real world development but a CS degree is not preparing many students for work in Java based application development but for systems programming which is almost exclusively in C, C++ or Objective-C.