I'm still not sure what I think about Joel Spolsky's JavaSchools post.
On one level, he just seems to be saying that he wants schools to be
harder to weed more people out. Sure, I think it's justifiable that
you have to have a certain kind of intelligence to be a good
programmer, and that it's good to identify people who will be most
successful based on that. (Similarly, if you aren't getting enough
majors, making sure people succede isn't the answer, rather finding
the right people and attracting them to CS is the answer.)
He's also arguing against vocational education (as Java has become a vocational skill), though that doesn't
seem to be what people are picking up on. It makes
sense that vocational education is part of the issue, because in vocational education
it is expected everyone passes. You sign up, you pay your money,
they graduate you, period. Unless you simply don't try, you will
graduate, probably with any degree you want.
There's always been schools like this, but they've become much much
more common. Honestly I think we -- the programming community --
really should call out some of these schools as frauds. It makes me
sad when I see an ad where somebody says how successful they are
making computer games with their degree from DeVry. It's such obvious
bullshit to me, which makes it more pathetic that kids are conned into
this sort of thing. But that's an aside. The point is that the same
thing is happening to more reputable universities, and what Joel is
talking about is this trend. You pay your money, they make sure you
get through school, and as long as you try you should get a B or
better.
But I'm not excited about the model that Joel wants -- one where you
present these fairly small, quite mathematical, and fairly difficult
concepts, and use that to eliminate students. It can work, sure,
because those are useful and important skills that represent a useful
talent; but they don't represent all the important skills and
talents.
I think it would be much more interesting if there was more of an
emphasis on the size of the problems, not just a sampling of
challenging techniques. Pointers and recursions are useful concepts for
algorithms, but as a programmer writing algorithms is not central to
what I do, nor is it completely clear without experience why you use
those concepts. I'd rather have someone good at designing and
understanding the larger systems of software, than someone who was
just good at algorithms.
We need to give students large projects, not just
exercises and algorithms. Large projects aren't about pointers --
in fact, in a language with pointers it is unlikely that a new
programmer will ever get far enough to encounter any of the truly
interesting problems. And recursion is useful and important, but it's
not a prerequisite for anything.
These projects need to be large enough that the students will fail,
regardless of their talent; hard enough that they'll fail in small
ways (forced to throw away bad code and ideas), and ultimately in
larger ways (likely creating a big, confusing, buggy system they can't
maintain). All learning is best done through failure. Instead of
Joel's model where failure is a way of weeding people out, failure
should be seen as a requirement for learning. I learned way more in
the programming I did outside of my schoolwork in college, because
those tasks were ambitious and naive and prone to failure. Any
passionate and talented programmer should be able to point to a pile
of failed projects. If they haven't stopped learning -- and it's not
okay to stop learning -- then that pile should be growing.
But is this really good for employers? Maybe not. If schools don't
produce passionless programmers who are afraid their inadequacies will
be exposed, then who will work in the enterprise environments, who will write the
accounting software, who will submit to using their B&D languages and
their top-down methodologies?
Sorry, I've become snarky. But enterprise software aside, fear of inadequacy is a big
problem. It's what makes people defensive and territorial and hard to
work with. It makes people unwilling to learn new things, unable to
guide themselves independently, unable to recognize their utility in the context of
a team. Recognizing and becoming comfortable with one's own
inadequacy -- for we are all inadequate -- is important. Humility is
very freeing. I think schools should teach more of that.
How can you interpret literature if you haven't written an angsty poem? How can
you work in science if you haven't royally messed up an experiment, if you've never
drawn the wrong conclusion? How can you practice mathematics if you haven't been
convinced of a proof that later turned out to be wrong? How can you be a philosopher
without believing firmly in something you later come to detest -- and moreso, having
tried ernestly to convince others of that ill-considered idea? How can you be a musician
without writing a sappy or derivative song? Even cello players should be forced to write
at least one love song.
So maybe that's what I'd ask of a prospective employee. Tell me about some of the things
you failed at.