The Problem with Computer Science
Browsing Slashdot this morning, I saw a link to an MSNBC article entitled “Who are the new computer whizzes?”
The article is actually quite surprising. To cut to the chase, “colleges” like DeVry and Strayer are finding a large amount of older workers coming in to take IT-related courses as a means for advancement in the workplace. Workers are finding that computer skills pay off well when trying to advance in their careers. However, colleges are finding a constantly smaller pool of students going for IT degrees, specifically Computer Science.
So why is it that we’re seeing more and more older workers demonstrate a workplace need for IT and programming, while students pass the IT degrees up? I think the answer comes from a few places.
Outsourcing
During the last presidential campaign outsourcing, particularly offshoring, became a hot topic. The press, and some sizable portion of the IT industry itself, were reporting regularly that IT jobs are being offshored to India. This is certainly happening in our industry to some degree, though it’s highly debatable how large the impact is on highly skilled tech workers. Speaking from personal experience, the company I contract with has had some not-particularly glowing reviews of the work and code that came from their small experiments with offshoring work (within my project).
It doesn’t help that many economists and others who are wholly unrelated to the tech industry speculate on the usefulness of IT careers and degrees as well. Many simply think that IT is, and will continue, to track the manufacturing industry – a “low skill” job that will be offshored due to globalization. In other words, we’ve already hit a point where IT is too easy and will go to India, so we better move up another rung on the career ladder (i.e. Managing, Marketing).
Is it any wonder why students wouldn’t want to enter this field? Our career is already considered a dead-end among many non-techies.
My personal opinion is that the economists and chick littles are all wrong. Certain aspects of “IT” certainly are lower-skilled jobs that can be done elsewhere (some of the administrative and support related jobs can be to some degree). Perhaps because it’s my own job, I fail to see how programming will ever truly be offshored successfully. The core of the job is translating business requirements and true business value. The overhead and hassle of doing that across continents and over many time zones would seem to complicate this a bit. But I suppose if you compare it to the state of many projects where communication happens through a vague requirements document thrown over the wall with a release date attached, well then I can see how you might think that you could just send that same document to India and expect similar results. The solution for us is to improve the state of our industry at home to emphasize constant communication and working closer with the customer.
Computer Science is Afraid of the Computer
The other problem that’s keeping the number of Comp. Sci graduates and major declarations down is the curriculum itself. Computer Science is afraid of the computer. No, really – let me explain.
I went to a great private school that actually was the first college to hand out Computer Science degrees. I hated my classes. Not all of them, mind you. I like Political Science. The Architecture class was neat. But all those Theory classes in Computer Science? God awful. Tell me – how many times since you left college have any of your projects or companies asked you to use formal math logic and Turing machines to describe algorithms?
The first few classes are fine, though if you’ve programmed they can be slow – and the projects are a bit boring. They actually teach you how to program in the first year and a half. The rest of the time they ask you to actually change majors into Math and do logical proofs, evaluate complexity of algorithms, and draw funky diagrams talking about Tape machines.
Now granted, it’s a necessary thing to know if you’re writing an algorithm that’s overly complex and won’t complete in a reasonable amount of time or memory. For most people this is as simple as seeing how many loops or brackets are nested. If you work for someone like Sun, you’ll use this knowledge a bit more than the rest of us but for the most part we only tweak algorithms when we profile and find a hotspot.
And yes, if you plan to write languages yourself I suppose context free grammars and BNF are useful to you. But I haven’t actually defined a language myself. I have, however, managed to create simple file formats and parsers without ever resorting to my theory books. (They cost $150 a book, but I can’t give them away now. No one wants them. I can’t blame them.)
They should teach people to program, then teach them to program well. They achieved the first. I learned the second on my own (and still am) through experience and reading many books that were never texts in the classroom (Refactoring, Patterns). They talked about polymorphism and inheritance and interfaces – but they never really drove home how to use the concepts in real life. They would just give you a red check mark on your printout where you declared the variable in its implementation class, not in the abstract superclass or interface. My program worked and I was never going to look at it again after I handed it in (since it was useless). So why build in all these abstractions? It was a one day project!
It might actually help to have them write semester long programs with requirements that are added, removed or changed each work – forcing them to see why the abstractions are useful and how to deal with changing longer-term code.
Conclusion
Students don’t take Computer Science for two reasons: people keep telling them that their job will go to India, and the colleges keep telling them to learn math and logical proofs rather than to program. Where are all the people who will tell you that programming gives you the ability to have your own workers work for you on anything at anytime (computers) - allowing you to start your own (very) successful business easier than probably any other industry. You could be the next Yahoo!, Google, Flickr, Dodgeball or 37Signals. Really. Just stop listening to everyone elese, start programming, learn from other good programmers, and keep writing your own projects.