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.