Java as a first programming language: Bad idea?
January 22nd, 2008 by Jesse Hsia
There’s been quite some debate about the article from The Journal of Defense Software Engineering. It states:
It is our view that Computer Science (CS) education is neglecting basic skills, in particular in the areas of programming and formal methods. We consider that the general adoption of Java as a first programming language is in part responsible for this decline. We examine briefly the set of programming skills that should be part of every software professional’s repertoire.
Too easy?
Simply stated, the article explains that programmers who learn Java as their first language are only capable of putting together simple programs. This article is not meant to single out Java, and their argument extends to other conglomerate frameworks and high level languages. Programmers become unaware of runtime costs and how systems work at a lower level because much of the code that deals with that are all hidden in giant frameworks and libraries. If it is so bad, why do schools, including the top computer science programs, teach Java as a first programming language? Some say schools do it to keep CS enrollment high as Java makes programming seem fun without all the complex math involved. Others say it is taught to satisfy corporate recruiters’ demand. All are very valid arguments.
What about ICS?
This is particular interesting (or should I say scary?) since ICS taught Java while I was there. Does this mean I am forever labeled a bad programmer? I certainly don’t hope so!
I think learning Java will undoubtedly make fundamental concepts in programming such as pointers and garbage collection harder to come by but from my memory, it still served well enough to weed out most of the non-programming types. During my days in ICS, the lower level curriculum were taught in Java but students were definitely exposed to other languages (i.e. Prolog, LISP, Assembly, C++, C) in mid to upper level courses. So I don’t think it’s much of a problem since it was not the ONLY language taught in ICS.
However, I’m definitely not dismissing the argument. In fact, I think its message is reflective of software engineers today, that it is easy to omit what goes under the hood when learning high level languages and new frameworks. This is very dangerous and can be life threatening as the same engineers are working on airplanes and defense weapons. To make it work, we have to take responsibility as software engineers to have deep understanding of what happens behind the scenes.
When I was a newbie to CS, it was hard for me to appreciate the theory and software quality/process classes. I thought to myself, “Wouldn’t it be worth more of my time to teach me skills that are directly applicable in the job market?” I quickly learned that the answer was no. The job market will change, the in-demand skills will change, but the fundamentals will remain the same. What I learned from these classes were language agnostic and thus easily transferable. And we all know how quickly things change around software, so to be able to learn something that can endure time, is golden. On the same token, we can’t possibly make a living as a software engineer/developer without actual programming. So I think the curriculum that I had at UCI, which consisted of the intensive programming classes (i.e. anything Klefstad taught basically) and the project courses served that purpose real well.
More thoughts
I have to say I was worried when I first read the article, but after some thought, I think the ICS curriculum did a great job preparing me for the real world in software development through the combination of functional programming skills, computer science theory, and actual project experience. The project courses at ICS really served well in terms of reenacting actual development projects, working in teams through multiple phases with a deliverable to an actual client. Not only was programming important, good communication and mitigating risks were part of the daily routine.
What are your thoughts?
What did you think of ICS’ curriculum? Did it adequately prepare you for the real world?
Can anyone comment on what the current curriculum is like?

I don’t know anything about the current ICS curriculum.
I started studying computer science in 1968.
I’ve been programming professionally since 1975.
Java was announced by Sun in 1995, and I’ve never used it.
Has (I)CS grown, and computer technology developed,
to the point where a single undergraduate CS curriculum is
no longer sufficient? Back in 1900, “Engineering” came in
only two flavors: Civil and Mechanical. Times change,
and new specilizations developed.
Perhaps we should be considering distinctions between
- IT (including networked, large scale financial and commercial,
corporate infrastructure) computer science,
- Mathematical and scientific computer science
- Embedded and specialized systems computer science
After a lower-division common introduction to data structures, architecture basics, and some intro to programming, there is
more than enough distinctive material to fill the remaining two years for distinctive degrees, just like engineering.
Java would be part of the IT track, but not much use for the others.
Numerical analysis and algorithmic approaches such as Adaptive Mesh Refinement would be part of math/engineering CS.
And Embedded and specialized systems could explore a number of architectural alternatives, machine languages, topologies, etc.
For the last 23 years I’ve worked at a national laboratory,
and for the last 12 at (by some estimates) the nation’s premier
center for scientific computing. I’ve never seen Java used.
About 80% of all the scientific code in the world, covering
application areas from cosmology and supernova search,
through global climate modeling, and materials sciences,
protein and molecular studies, particle physics, etc., is
in Fortran. The remaining 20% is in C++, C, Python, Perl
and a few other scripting langauges.
But I have no delusions about any academic CS department
teaching Fortran. It’s not going to happen in the current
environment.
When I worked for a bit in the defense industry in the early
1980’s, I spent most of my time working either with
Fortran (for aircraft flight simulators/trainers),
or a wide variety of machine languages (for embedded systems
on aircraft and tanks).
I didn’t learn Fortran, C, C++ or various assembly and machine languages at UCI. The most useful thing I learned from UCI-ICS was:
- a solid foundation in data structures,
- a solid foundation in programming language theory
It is the parts of the curriculum that are not tied to any
particular language, or architecture, that are most useful
30 years later.
Best regards,
Frank
I never thought about java that way before. I have used it a lot on my website at http://www.originalnintendo.net
It was very interesting because I am a college student at Millersville working on web design. It was very informative.
Thanks,
Matthew Corgan
Date: January 29th, 2008
I am currently a third year Computer Science major. I actually don’t enjoy programming in Java too much because the challenge of manually using the lower-level programming knowledge for software efficiency is eliminated.
However, I do think it’s a good idea to learn Java as a first programming language because it’s easier to learn object-oriented programming, and it definitely helped me learn C++. I learned how to program in C++ on my own by reading “C++ How to Program” 3rd edition by the two Deitels. And I learned many of the lower-level programming details through reading the C++ book and by programming in C++.
As for UCI’s current curriculum…It hasn’t changed much. It’s still very much based on concepts, but still not teaching all the details there is for any course topic. For example, in my Introduction to Data Management course, the instructor lists the chapters he goes through in the book, but he skips many parts from the book in lecture. I found that I get a more complete learning experience by solely reading the assigned course book rather than solely attending lectures. However, I’ve been learning from both reading the book and attending lectures. Although extremely rare, there are occasions (1 or 2 lectures out of 10) where the instructor mentions something I find is important that is not mentioned in the book.
As for learning about the lower-level implementations of systems, there’s a required introductory Computer Architecture course, which teaches the fundamentals of lower-level programming and fundamentals of the computer system. I learned how to program in assembly for Intel x86 based systems. However, we are moving to x64 now, so I’m not sure how much longer knowing how to program in assembly for 32-bit environments will be.
There’s also the mandatory Digital Logic course which teaches general details about transistors to gates and the basic structure of a computer; how the processor interacts with main memory through the bus.
I hope this answers your last question.
Sincerely,
Johnny