Dumbed down?
Joel Spolsky wrote
an article that has gotten quite a bit of reaction. From Tim Bray saying
he mostly agrees to Frans Bouma
saying its absurd,
there is a lot of feeling that this article has aroused. It aroused
some strong feeling for me as well and I wanted to get them down while
still fresh. The comments are entertaining as well.
I think most
of the posters have missed the point I came away with. I disagree with
much of what he says about java and will counter some of those points.
But one point is not lost on me. I find it very difficult to work with
new graduates. This point rings especially loud with me for two
reasons. First, I will be going out to visit with university teachers
in the coming year to tackle this very point. I have been very
frustrated by the things that interviewees are not able to answer,
haven't done, haven't even heard of. I need to answer this question
more thoroughly so my expectations of what I will be able to hire are
more in line with reality. But the more important point is trying to
answer without huge amounts of thought: is a person from school X
likely to be able to do the work I need done?
I am currently
reading Thomas Friedman's "The World is Flat". One of his chapters is
dedicated to the crisis he sees in the lack of young
Americans
taking on science and engineering degrees, and especially advanced
degrees. There is no lack of Chinese, South Koreans, Indians and others
pursuing these degrees and indeed they make up over 60% of the
graduates in those programs according to figures he quotes. But I can't
easily hire those graduates because of both immigration laws and
increasingly because these graduates are going home to improved
conditions, lower costs and probably greater opportunity at home. In
his view, this will increase over time and the Americans like me will
mostly have to look at Americans for hires.
Great, I like
Americans and want to hire them. Joel's point is that the education
received is not rigorous as it should be and this means he can't count
on the fact that those that made the degree are smart enough and hard
working enough to be trained in the specifics of whatever your
environment is. I think he makes terrible points saying that java has
dumbed down the curriculum, and that "rigorous training" must use
pointers, closures and recursion to be effective. My fist CS101 class
was done in fortran with punch cards, but while I got though that one
OK, I was a music major and thought it was way to dull to ever consider
as a career. I started over again about 10 years later. This time cs101
was everything Joel described. I was working full time, and this one
class took up nearly 40 hours per week of class and homework time. It
was taught in pascal and honestly I don't remember anything resembling
pointers. The teacher was a
mathematician
who was absolutely maniacal about clean code, perfect procedural style,
and perfect comments. As in the classes Joel describes, at least half
of the students weren' t there at the end of the semester. There was
outrage and in some ways the students had a point. In part it was the
amount of work in that first class which could have been shifted to the
second semester. In the end though, I was able to convince a number of
other students to write the administration in support of the teacher
because in fact those of us that remained learned an incredible amout
that semester. This ended up being factor in the teacher's eventual
tenure decision, which he acheived. The attention to cleanliness in
code has stuck with me to this day and eventually is what led me to OO.
But it wasn't enough for me to be a good programmer.
I ended up
leaving my systems admin type job and taking a programming job before I
finished my degree in '96. I had taken all the core classes though. As
I found out during the next few years, in addition to having to learn
languages, I had missed some really important concepts during my
academic period. In particular, as program size got larger, the
concepts needed to deal with that and to still write clean code were a
huge stretch for me and led me to OO. I had to really unlearn the
procedural style. I had to unlearn the database oriented styles I first
learned with the new languages I was working in business programming.
Based on Joels derisive comments about OO, he obviously doesn't think
those concepts have much value, but I would argue that have at least as
much value as learning to write pointer arithmetic in a data structures
class. Wouldn't certain design patterns be just as challenging for a
new student for the hard thing to keep the bar high? Recursion is not
limited to Scheme. Closures can be simulated in languages like c# but
there would be no reason not to do that in Ruby whose basics can be
picked up in a few days. Closures point to techniques that do need to
be taught, those of using program structure rather than procedural
programming to solve problems. Concurrency is a problem that is hard in
every language. How about cache invalidation?
Really, the
problem at hand for CS graduates is to learn challenging concepts over
a wide enough array of problems to prepare them for a lifetime of
learning. The inital CS learning will hopefully be a little closer to
what they will actually do when they graduate to make them hirable, but
more important is that they can use their minds to solve problems they
are likely to encounter. These problems transcend languages and to pick
on java as the cause of dumbed down graduates is silly to say the
least. To think that CS programs couldn't think of hard problems in
java to solve and filter out those who should find another career is
silly.
I actually shared Joel's point of view when I first
started hiring people in the late nineties. At that time we were doing
a lot of VB programming and a little java and I felt that if I could
hire experienced C programmers, I could train them in the languages we
were using fast enough and their get it factor would accomplish the
rest. Those were some of the worst hires I ever made. Even those that
could code with function pointers with ease somehow got completly lost
with even pretty basic OO techniques. It was the concepts that were
wrong and the hard language issues of C didn't help at all.