I lucked out in 1999 when I scored a job at a technology startup doing HTML. It was a complete career switch for me. I had been teaching restaurant managers how to manage and lead people, handle inventory, recruit new team members, and deliver quality product and service. Then my best friend called me at the perfect time, and told me to teach myself HTML and apply for a job. So, I grabbed Sam's Teach Yourself HTML in 24 hours, and did just that. Applied, and started formatting content for static web sites.
Since then, I've learned a bit more and have fallen head over heels for the art of computer programming, system design, and the software development lifecycle. However, I still felt like I was missing something that everyone else who had a computer science degree had. I didn't know anything about bits and bytes. I didn't know what assembly language looked like. I'd never de-allocated a pointer, written a linked list, or done my own garbage collection.
So, a few years ago, I enrolled at a institution known for their computer science program, and got started on my Bachelor's of Computer Science.
So, I think that I have an interesting perspective on the whole "Why can't programmers program" that started with Joel Spolsky's blog a few month's ago about the state of the undergraduate curriculum and it's need of restructuring.
I'm not sure restructuring is where I'd start. I think the same rules apply when proposing a new standard. You'd better know everything about the problem before suggesting a brand new solution.
What I see as the problem is the pressure the professional community is putting on the education system to change the curriculum. And what we've got now is teaching staff that is trying to teach modern software development technology and methodology that they've not used or been taught themselves.
The teaching staff is severely lacking in expertise around the technology and methodology they are teaching. They're being forced to use Java. They don't know Java. They have no idea there's a ArrayList<E> class. They're pressured to teach TDD, but they've never experienced the feeling when one of those unit tests saved their ass.
In the CS courses that I've had so far, I've yet to see an instructor that comes even close to some of the most talented engineers that I've worked with. Our instructors should be the best developers out there. They should know their subject inside and out.
At this point, I'd rather have the instructors speaking to what they know. Let them teach convoluted, uncommented, functional programs in C if that's what they are experts in. I'd rather be taught how to punch cards and feed them to a machine if the instructor is going to speak to me knowledgeably about the process, know all the little details about what's going on with those cards, and tell me what kinds of things they got burned by in the past.
Compare it to Mathematics curriculum. Tonight I had to spend a half hour and 3 pages solving an trigonomic integral. God knows that wasn't the most efficient way to do it, and you for sure know I'll never have to do it again. But I learned it, and know I know how the calculator probably does it. And now I can make assumptions about what is going on under the hood. That experience is invaluable. And all that said, if I were to ask my teacher a question, she'd be able to rattle off the answer instantly and make me feel like a total idiot. She knows what she's doing. She can rattle off exactly why my approach won't work.
I'm not getting that with the CS curriculum, but that's what I want. That's what I'm missing.
I think ultimately we've swung too far to the other side and we're missing what we really need in the CS undergraduate program. We need to learn mechanics and the details of constructing software in school. Once we're done with school, we learn the art of programming in the workplace. We'll never get that expertise in an institution. And the more and more we press institutions to deliver the art of programming, the less programmers we get in the workforce that will be in a position to become masters.