Not much to say lately, I’ve been sort of dead to the world. As a small miracle, I managed to get hit with something that snapped me out of my funk for a few minutes.
I received an engineering computer science degree in 2003. I was looking at many different higher education options, but UIUC provided a nice balance of program reputation and expense, coming in about $15k less than ivy-league (remember, I was out of state, as a Michigan resident).
When I first started, I was startled by the lack of “programming” classes. In fact, the only outright programming classes were designed for students not in the computer science program. This was confusing to me, since I wanted to work with computers, and the neatest way to work with computers is programming, right?
Over the course of several years, I developed an appreciation for the struggle a CS program faces. On one end, they have a bunch of hot shot computer science undergraduates coming in, expecting to get a diploma and go write Java for a Fortune 500 corporation. On the other end, they have companies giving them money, expecting professional programmers in return.
Neither side pulling at the department wants computer scientists. The incoming student has the thought that they are coming to school to become a programmer. The corporates are expecting to get programmers out of the school. The perspective that I didn’t appreciate at first is that a computer science department doesn’t give a shit about programming. More importantly than that it doesn’t is that it shouldn’t. The line I was given: Specific languages and architectures are just toys and tools, and not interesting problems. It took me a few years to fully appreciate how correct the computer science department is, and how wrong I and the corporates were.
If you want to hire a programmer, go to a vocational school. You will get a horrible programmer, but they will know a programming language.
If you want to hire a good programmer, get somebody with a computer science degree and side projects/employment. They will be more productive and more expensive. Vastly more productive than expensive, though. And their shit will work.
Unfortunately, departments have to make money. After a point, standing on principles ceases to become profitable, and the department fails to attract new students, grants, and sponsorships. As cash cows go, having your computer science department go the way of the philosophy and English department (surviving only because of mandatory enrollment for most of the student body, in one way or another) is probably not the appropriate business model.
So, departments bend. They start introducing classes that have nothing to do with computer science. It starts with a senior project class, in place of a thesis. It’s heralded as a positive step by the corporates, because it’s a chance to do “real work” and “work as a team” and so forth.
I took a senior project class. It was lead by one of the gang of four of Design Patterns fame. The project was designed by said professor, with the goal of stealing Internet connectivity and giving it away for free over wireless. The design of the project had complete ignorance of wireless networking technologies and design, and I was foolish to even get involved in it. Being good at smalltalk and object-oriented design does not mean your head is screwed on straight. Perhaps more succinctly: Theoretical aptitude does not imply any particular talent at reality. Ignore this point, because it undermines this rant. We did zero technical work, and I managed to get a generous passing grade (I believe, at a B-, the lowest mark by far I received in-major) by writing up a 100-page document explaining our categorical failure.
It’s hard to talk for 100 pages about how you didn’t do anything, because a project never made sense in the first place, and what I learned from the process. Because I didn’t learn anything. It was stupid. I learned more about computer science in my class in advanced nonlinear dynamics (in the physics program) than I did in senior project. I learned more about software development too! To add to the insult, I’d skipped intro to nonlinear dynamics, so it was only a half semester instead of a full year like senior project. Crazy, right?
Right, so first you add a senior project class in lieu of a senior thesis. Dumb. The easy next step is a less intensive project, but one that brings in the corporate buzzwords – A “software engineering” (XP, RUP, Agile, PLZDIAF) class. The idea is that one is better engineered to fit in as a corporate cog in the machine, and that the project is more successful. Suuuuuuure.
Next stop: Courses in computer security and computer ethics. I narrowly escaped this requirement. Yeah, that was added because it was needed for accreditation. This makes as much sense as a course in “mathematical ethics,” if one wants to pretend we’re still talking about a theoretical education here.
Security and ethics are not, in my opinion, academically interesting topics in a theoretical computer science education. I know I’m going against the grain by stating this. Security is a fascinating topic, and if one is studying cryptography, we’re talking real computer science. If one is looking at buffer overflows, social engineering, and cross-site scripting, we’re not teaching computer science anymore.
Add a programming lab class now, whose goal is to actually do some software development. One writes a project more substantial than a file system or a b-tree implementation in c++. Seems like a good idea at first, right?
It took me until my junior year to realize the folly of this trend of curriculum change. A few things were happening at the same time. First, I finished CS373 (introductory combinatorics and computational geometry, since renumbered with grad students split into a different class, if I understand right). Second, my campus job, working for the atmospheric sciences lab, was allowing me to move away from just web development (for which I was hired). I was starting to write small programs with real-world performance implications that could not be solved with hardware; the way to make them faster was with smarter software decisions. Data structures. Algorithms. Complexity. Architecture. Languages. Compilers.
What I realized was that the theoretical bent that the computer science department held was the right one. For anybody who wants to grow up and become a “software engineer” or “programmer” or “software developer” of any quality, I still think it’s the way to go. This isn’t to say that to be a good programmer one needs a good theoretical CS education, but I think the odds of being a good programmer without a good theoretical education are much lower. I’ve met good, even great, programmers without one, but they’re damn rare. And, I continue to believe that somebody with a good theoretical CS education will be a better programmer in a year than somebody with a vocational education.
I’m sort of starting to wonder if these sorts of educations still exist, seeing what is happening to my own program.
Anyhow, having a side job where I did programming fit well with my education. I don’t think I would have gotten the same experience in a mandatory one or two-semester project; it was the product of (eventually) four years in the same job, with an extremely talented programmer as my boss. So, I think a good programmer should at least have some big outside projects or jobs during their theoretical education. I don’t think it’s something one can teach, however.
I just got an email from the UIUC CS department, encouraging me to enroll in continuing education computer science classes at the university. The class? CS 598 HCI – Healthcare Infrastructure.
What does that mean? Fuck if I know. Last I checked, healthcare infrastructure is not a computer science topic. Let’s quote (my emphasis added) from the course description:
Healthcare is the largest industry in the country, but the current infrastructure for providing healthcare is not viable. Recent advances in information technology promise radically different infrastructure that could provide a viable model for providing healthcare. This course will examine healthcare infrastructure through lectures and discussions, through text readings and web sites. There is a particular focus on measuring the health of populations in the demographic era of chronic illness. Information sources are discussed in detail from medical literature and records to health brochures and monitors. There are no prerequisites for this course and students are encouraged to use background experiences. Practical topics will be emphasized with the aim of revolutionizing an industry in transition. A semester project on information technology aspects of population health measurement will be required.
It’s an industry-motivated information technology class about solving industry issues. This has exactly nothing in common with computer science, beyond that it involves computers at some level (for the web browsing). This is not computer science. This makes me sad.
This makes me sad because I frequently encounter people that are writing software and don’t understand:
- Data structures.
I don’t understand any of these things either. But I at least have enough of a training to know how to look up an answer, or what to read for further understanding. I’d never heard of a burst trie until yesterday, and now I have a paper I can read and understand. Maybe I’ll implement something using a burst trie. I can do that sort of thing. If I run into some sort of problem, I can figure out why it’s a problem, whether it can be solved, and what a pragmatic solution might be.
I sometimes encounter entry level people in programming positions. I get a bit worried when I have to explain to somebody that an operation that should be linear (or constant, for that matter) with respect to input size is quadratic (or worse). I get very worried when I explain this and get a blank stare back like I’m speaking an incomprehensible language.
This isn’t rocket science. We’re talking freshman-level computer science material here, but something that’s not taught in a vocational program. Stuff that’s not taught in a computer engineering or electrical engineering program. There’s a huge difference even at the most basic level of education, and I think it’s important to understand it, and understand why programs in healthcare information technology are not interesting problems, at least from a computer science perspective.