I've been reading your blog for about a year now, and I thought you would be the best person to answer this question.
I'm coming to the point in my life when I need to decide what it is I want to do (I'm 16). I've been programming for 4 years on mac and for 6 years in general, and I'm looking into computer science as a major, but I just don't know what it is! I've read the pamphlets, course outlines, etc, but they don't just answer it, what the fuck is computer science? Is it math, physics, programming? I honestly can't get a straight answer.
I've seen people parade their knowledge of O(N*log(2)) or whatever, but I just don't see how its relevant to programming. Everywhere I go I get mixed signals about what I will actually be learning during Comp Sci (for instance, my high school 'computer science' course consisted of Microsoft BASIC, and boolean logic, the fuck?).
I guess what I'm trying to ask is what you learned during you comp sci days, and what you actually gained out of it and continue to apply to this day (if anything).
Well, young lad, I think this is an excellent question, mainly because you asked it of me, and that means I get to go blah blah blah some more, which is my nigh-favorite activity.
First off, high school computer classes are, in my experience, a joke. In my day I literally got an 'A' for showing up -- the teacher knew I could program circles around him so he didn't even bother assigning me problems, I would just go to class (sometimes) and do whatever I wanted for an hour, and every quarter I'd get an 'A'. I'm disappointed with this teacher for not trying to challenge me more, but, hey, free period, so I didn't complain. (Now that I think back on it, a lot of my high school teachers gave up on me this way -- "Here, have a free 'A', in return you must not bug me for the rest of the quarter.")
There are myriad reasons why nobody can answer what kind of science is "computer science" -- prominent amongst them is that it is its own science, so it's not math or physics or programming, per se. Also, most people don't know, since unlike math or physics, computer science is not something most people experience every day in their normal lives. You drop an apple, you see physics in action. Tip a waiter, you're doing math. But what the hell is computer science? (To be fair, I think most people think majoring in math would mean, "like, learning 2+2 and shit.")
Another reason is that "computer science" programs vary INCREDIBLY from school to school. At a Real University(TM) you're going to be studying actual science and engineering principles in the context of designing and programming systems; at one of those technical institutes you see advertised on late-night TV you're going to be taking a class in "Advanced Java Programming" where you learn how to print "hello" over and over.
I went to the University of Washington, which was, at the time, ranked one of the top schools in the nation by some ranking organization. I honestly have no idea who does those ranking, or what kind of criteria they use. There were distinct advantages and disadvantages to going to a big school.
Let me first say some good things: I got to study under some amazing professors at the UW. Dr. Jean-Loup Baer was our department chair (which is a catchy rhyme if you sing it) and taught a course on machine language that I still remember. (I wrote a "Connect-Four" program in VAX assembly that won... some of the time.) I did my honors thesis for Dr. Hank Levy, who literally wrote the book on assembly that we used for Dr. Baer's class. Dr. Ed Lazowska was pretty famous in the community and taught a bitching course on operating systems which explained the fundamental functions of and problems faced by any operating system, in the context of real operating systems (mostly UNIX) -- we wrote a fully-functioning OS for that class, with demand-paging and protected memory, and it was cool as hell. My student advisor was Dr. Tony DeRose, who now is a Pixar bigwig and was and is a hell of a nice guy (but unfortunately I took my graphics class from the OTHER graphics professor in our department, who was, well, a big jerk-head). It's pretty cool to go to the movies and see my old advisor's name in the credits.
I got to take classes from Dr. Alan Borning (who was part of XEROX Parc in the really cool old days) and got to think about what programming languages could be instead of what they are.
And, yes, I learned O(n) and O(log(n)), and they are extremely valuable to everyone who writes code. I learned the then-current approaches to simulations and to artificial intelligence (which was mostly, "uh, maybe one day") and to operating system design and graphics libraries and all kinds of things that I have used over and over, because it turns out that none of this knowledge ever goes out of style -- optimizations will ALWAYS be about finding ways to do less work instead of finding ways to do the current work faster, and there will ALWAYS be bottlenecks in the system that require thinking about; whether they are giant mag tapes or hard drives or nvram or holo-memory doesn't make a difference.
But this points to the problem of the school I attended, and my strongest advice for anyone considering colleges and universities: at state-funded Universities, professors live or die by the papers they publish in coordination with grad students. Their performance in the classroom counts for almost nothing, and most of them wouldn't teach at all except that they are required to by the state. Their funding comes from research projects (that the grad students do), and the more successful and widely-praised their projects are, the more money the professors get. Period.
For instance I had the extreme privilege of learning compilers from a professor who was famous in the industry and who was one of the best teachers I have ever met -- he actually taught using the socratic method, letting you figure out the answer by asking you exactly the right questions. Every year students rated him the best professor on their evaluation forms. However, he left while I was there -- he didn't get tenure at the UW, because he hadn't done enough research for them -- he spent all his time teaching undergrads, which is verbotten at the UW.
This system also means the grad students are in a lofty class above you, the lowly undergrad -- to an extent that I believe puts most other departments to shame. I'm not even going to try to guess at the millions of dollars flowing into the UW over the years from DEC, Intel, Microsoft... but it's a LOT. The computer industry has money, and loves research, because turning a research project into a real product takes years in our industry, not decades. Microsoft backed a dumptruck full of money up to the UW shortly after I left, and I'm not sorry I missed that.
So, at the UW, the grad CS students all hang out in locked labs with personal desks, and hang out with the professors in their offices, go to picnics and BBQs at professors' houses... whereas undergrads worked in public labs, had no access to the 'better' equipment, and were only allowed to talk to their professors during very restrictive "office hours" that were, like, from 7am to 8am every other Tuesday. There was no learning by osmisis for undergrads. The idea of an undergrad going to a party at a professor's house was anathema! We weren't even invited to the TGIFs that were held in the very same building.
Now, in contrast, my sister, who was a year older, attended Reed, a small, liberal college, and majored in medicine or drugs or some this. She constantly told me how she'd have dinner parties with her favorite professors, get high with them, etc, etc... mind you, this was Reed, but, still, I really felt like there was some happy medium I was missing. I wanted more from my college years. I wanted some professor to takes me under his wing and teach me there is joy and subversion in poetry, and then he's fired for it, but not before one of my classmates kills himself because he wants to act, or something.
I'll give you a story from my undergrad years that still sticks in my craw, to this day:
- As head of the student chapter of the UW ACM, I walked into a professor's office (not one of the ones mentioned above) to ask for something for undergrads. I wait and wait while he shoots the breeze with two graduate students, who are lounging around his office with their legs over the sides of the chairs, talking about some scandal or BBQ party or some damn thing. Finally, he looks up at me, and I present my case: could one of the many, many laser printers that are scattered around the building in locked closets (so that only the graduate students could get at them) be opened up to undergrads, so we could use laser-printing on occasion, instead of only having access to a line-printer on a public second-floor lab?
This professor asked me some question in response -- I don't remember what it was, or what my response was -- this was 20 years ago. But I do remember what he said after that: "Why are you wasting my time?"
I looked at the two grad students still flopped down in the chairs in his office -- his office, which I had never been inside, before; even now, I was just hovering at the doorway -- and I left. I never spoke to him again.
But let's not end this on a bitter note. There are many nice postscripts to my college career.
Years later, when I was at Omni, we were asked by Apple to meet with some representatives from Pixar, who were considering using Cocoa technology, and wanted to talk to some outside experts, and, you know... we were just so damn bitching at the time. So we're at WWDC, and we're sitting at a table with some Apple homies, and a certain Pixar fellow sits down, and we start talking about how great Cocoa is and what all Pixar could do with it, and then he stops and turns to me, "Hey, don't I know you from somewhere?" and I say, "Yes, Dr. DeRose, you were my student advisor fifteen years ago. And you were awesome, thank you." I can't tell you how happy I felt to be able to tell him that.
(I should mention at this point that normally I wouldn't blog about a meeting like this from WWDC, since it would be assumed to be NDA, but pretty much every NDA says you're allowed to talk about events that have been announced through other channels, and it's well-known now that Pixar uses Cocoa -- in fact Wave gives talks about the amazing things he does with it fairly often.)
Plus, Dr. Lazowska saw my name in the paper a few years ago and wrote me, as well, and I was pretty touched that he remembered me and that I was his student. I don't know if he remembered what a snot-nosed brat I was -- hopefully not.
It's got to be a neat thing, to see your students go on to success, to know you were a part of it -- I really do owe a lot to Dr. Lazowska and the other professors. I realize that more and more as I try to teach people myself -- I find that I'm using their lessons to teach a new generation, just much less formally.
So, those are my tales of college CS. Is it worth it to go through a CS program? Yes, if it's a good one. I would certainly recommend a smaller college or university if you're an undergrad, but even large ones are going to teach you a lot, you just can't expect that you're going to have drinks and dinner with your professors. Unless you are a hot co-ed, and the professor is my dad. (Just kidding, dad, I know you stopped dating your students after you married one... Oh, SNAP!)
Are you going to use the lessons you learned in CS in 'real-world' programming? Yes. Not all of them, but the ones you do use are going to make a HUGE difference. The delta between programmers who know when to use a hash table and those who don't is enormous. The delta between programmers who understand the O(n) stuff and those who don't is also huge. Too many programs are written by programmers who, frankly, suck at theory, and they write slow, crappy programs as a result. Get a solid basis in the science before you become a programmer.