May 20, 2007


Today I got mail from a young, impressionable lad that read thusly:
Hey Will,

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.

Labels: ,


Anonymous Anonymous said...

Oh, man! You know Tony DeRose?

I taught a Cocoa/Obj-C/Project Builder introductory seminar at Pixar a week before WWDC 2003, and I learned something from Tony about how to teach. I was really worried that we didn't have enough machines for everyone (this was before Pixar committed to using Macs), and he assured me that it would be fine to have one machine for every two attendees, and he was absolutely right.


May 20, 2007 3:07 AM

Anonymous Cameron Hayne said...

And for those who haven't benefitted from a CS education, read Jon Bentley's book "Programming Pearls" ( and you will learn about hash tables, O(N), etc in the context of concrete examples. This is my favourite programming book.

May 20, 2007 3:13 AM

Anonymous Stuart Dootson said...

Good advice, Wil. I didn't do CS at university - I did device electronics (and in the UK, 20 years ago, so the publishing and tenure thing didn't apply in the same way). Ever since I left University, I've been developing software (on VAX for a fair amount of time - I still remember VAX assembly quite fondly), and there are times when I wish I'd done CS.

However, what doing my degree DID give me was the ability to learn for and by myself - which is one of the big things you should be taking away from an undergrad course, IMO - which means that I've been able to pick up the CS things I need as I go.

May 20, 2007 3:33 AM

Blogger nevyn said...

I always thought I was a pretty rad self-taught programmer back in the days. Then I went to college and realized I wasn't: you get to learn a lot of stuff there that is either boring enough that you'd never learn it otherwise, or that you just wouldn't know existed or know how to learn outside school, but are all things that are very important and make you a much better programmer. While the course in compiler technology I went to doesn't sound like it was even close to as interesting as Wil's, it taught me among other things about stack and frame pointers and how memory is generally organized in a C application, which is very valuable.

So yeah, go to college/univ (especially if you're in a country where it's free (go Sweden! ;) )).

May 20, 2007 3:41 AM

Anonymous Anonymous said...

Good advice but most of it pertains to state universities. Private colleges(like your sister's) often encourage one on one interaction but it does really depend on the professor. I was in the same situation as your young friend last year and am now a very happy CS major at Stanford. Another good field to look at would probably be computer systems engineering, which is basically a hybrid of CS and EE.

May 20, 2007 4:23 AM

Blogger Darcy said...

Can I just say thanks for such an informative post - I'm 16 atm and going to University next year to hopefully do Computer Science. This really put alot of it into perspective and made me think about it. That and make me want to finish year 12 faster haha :D

May 20, 2007 5:24 AM

Blogger Ed said...

You? A snot-nosed brat? Impossible!

Thanks for the many nice comments, Wil, and also for providing lots of sane advice.

Just two quick notes:

First, over the past 15 years, the attention paid to undergraduates at most research-intensive universities (the distinction is "research-intensive universities" vs. "teaching institutions", not state universities vs. private ones) has increased tremendously. That's certainly true at UW. The impact is felt socially as well as in the classroom and the lab. (In just the past week, I've been to the hospital to spend time with an undergrad from 10 years ago who was in an accident; I've been to a party at a faculty member's home to which I dragged a former undergrad who was in town from CA with his girlfriend; I've been to an alumni event at the Bellevue Art Museum attended by more than 100 mostly-undergrad alums; I've given a talk at MIT before which I had a session with 7 former UW undergrads who are now MIT grad students, because of which I missed the honor of going into the dunk tank at our annual ACM bbq; tomorrow I'll do a focus group with high school teachers who are helping us to plan a summer workshop for high school teachers to help them introduce "computational thinking" into their classes (and send us even more great undergrads); etc.) As you point out, there are tradeoffs. The reason one chooses to be an undergrad at a research-intensive university is the opportunity to work with people who are defining the future of the field, and to learn how to do that yourself. Yeah, there are some drawbacks too. But, honestly, I think that today things are much closer to the "happy medium" you talk about. Plus, hey, you've done pretty OK! Check out our news items and our student recruiting videos.

Second, no large-scale organization is 100% jerk-free. Yeah, you ran into a couple at UW. But you ran into a bunch of great people too -- students and faculty both. Honestly, I think a pretty good ratio is all you can ever hope for.

Keep up the great work!

May 20, 2007 6:51 AM

Blogger Robert said...

You made my day.

May 20, 2007 7:20 AM

Blogger Robert said...

You made my day.

May 20, 2007 7:21 AM

Anonymous Anonymous said...

The best answer to the question "What is computer science" that I've ever seen is given in the first minute or so of this movie:

May 20, 2007 7:51 AM

Blogger _WTH__ma77yg said...

But what about the difference between Computer Science and Software Engineering?

May 20, 2007 9:06 AM

Anonymous Anonymous said...

It seems like you didn't really answer his question about what CS is, exactly. To the guy who sent the question: try Wikipedia.

May 20, 2007 9:40 AM

Blogger Ravuya said...

Thanks for this. I thought it was only my school that had such a disgusting separation between undergraduates and the professors.

The few professors I've been able to have really significant conversations with are not accredited Ph.Ds; they're something akin to sessional instructors, which my university frequently uses as they're cheaper than "real" professors.

May 20, 2007 10:21 AM

Anonymous Anonymous said...

I don't think the question was answered.

"What is computer science?"

Computer science is the study of the theoretical foundation upon which computers are built. Think of a certain computational problem you would like to build a machine to solve. Suppose this problem is basic arithmetic. We can build an abacus to solve arithmetic problems. Now, suppose we want to extend our abacus to compute matrix operations. Well, we will have to devise some sort of system to calculate these efficiently. Now, suppose you want to compute ANYTHING. Then we need to devise a universal computational system.*

Computer science is the study of these computations in an fast and efficient way. Of course, this is CS at the very root level; many fields stem from it, such as operating systems, programming languages, security, robotics, machine learning, natural language processing, theory, and much, much more.

Someone so interested in programming at such a young age belongs in computer science. Most people expect they will learn how to program in a CS curriculum, but instead, you will be learning the theory behind your programs that you can apply to your programming or design or research or what have you.

* Many theoretical computational systems exist: Turing machines, lambda calculus, etc.

May 20, 2007 10:44 AM

Anonymous Anonymous said...

Thanks, I appreciate these kinds of posts. My educational experience has been extremely bittersweet. I would love to get that engineering degree one day, but the right school has not shown itself. Once you've started reading books by passionate authors, you're spoiled and can hardly stand the idea of uninspired educators talking to you.

May 20, 2007 10:58 AM

Anonymous Tom said...

I saw an excellent article on this topic years ago, unfortunately I can't remember where.

Anyway, that YouTube video that was linked above is part of a series of MIT lectures by Hal Abelson and Gerald Jay Sussman called "Structure and Interpretation of Computer Programs". I highly recommend them, especially if you'd like to learn about Lisp:

May 20, 2007 1:03 PM

Anonymous Peter Cooper said...

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?

That's not strictly true. Computer science is, at a simplified level, the study of process. We all perform processes every day and these processes could be optimized, queued, run in parallel, etc.. so while people might not think of computer science when performing routine tasks, they're probably not thinking of physics when they drop something either.

May 20, 2007 5:04 PM

Anonymous Gareth said...

_WTH__ma77yg said...
But what about the difference between Computer Science and Software Engineering?

As a final year Software Engineering student I think I can take a stab at this.

Computer Science is, as Will pointed out, based largely in programming theory. O(n), hash tables, operating systems and how they work etc.

Software Engineering is a level of abstraction above. It's more akin to project management, or the methodologies followed to create software from scratch. Requirements gathering, Design specifications, Architecture specifications, testing plans, the whole life cycle of a project.

My course, luckily, was identical to the Computer Science course until the 3rd and 4th year where large year long group projects and industry experience kick in. So I got to see both sides of the dice before deciding which path to follow.

If you can find a university/college that has a similar course where the first couple of years are the same and then you can specialise then do that. It's always nicer to leave decisions until you have more information :)

May 20, 2007 5:59 PM

Anonymous lucas said...

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

I have to disagree with that, people do experience Computer Science daily, when they are cooking or writing a recipe, when they wonder where to look first to find a lost key, or when they think of witch streets should they take, and in what order, to get from place A to place B.

Actually you can think of a lot of stuff as processes, even people, and that puts them within the field of study of Computer Science.

What some CS courses actually teach is informatics, of witch Computer Science is only a part, here is a nice read.

May 20, 2007 6:30 PM

Anonymous Anonymous said...

BTW Wil, don't protect the guilty. What was the name of the professor who treated you like you didn't matter?

Public exposure of this kind of behavior is an excellent means of controlling it.


May 20, 2007 7:43 PM

Blogger Wil Shipley said...

I don't really care to embarrass this guy over something that happened 15 years ago. Last thing I want is to start some net.feud.

Maybe my interpretation of events is totally wrong? Maybe some kid had just had an abortion and he was trying to comfort them. He doesn't need my one-sided story dogging him for all his days.

May 20, 2007 7:49 PM

Blogger Joe said...


I wish my CS studies had been 1/10 of what you described. I went to a medium-size university and the CS courses were utter crap. Think along the lines of what you said about printing "Hello" over and over.

But, I guess that is the norm in this day and age. Most of the important stuff I've learned has had to come from teaching myself, unfortunately I know that there is much more that I could have learned had the program been worthwhile. Universities and instructors are more concerned about making large piles of money than in passing on knowledge or skills.

My question is this, having been chewed up and spit out by a university for even attempting to earn an education; do any of you think it would be worth it for me to go back and finish my degree? Deep down I really want to, but at the same time I don't want to deal with the shitstorm I did last time.

May 20, 2007 8:11 PM

Blogger Wil Shipley said...

I should point out most of my professors were amazing, and I loved the classes themselves. Compared to other courses I took, or even other majors where I saw the coursework, CS at the UW was stellar.

My big complaint was that I didn't get enough face time with the professors themselves, not that they sucked.

May 20, 2007 8:19 PM

Anonymous Anonymous said...

Wil wrote:

Too many programs are written by programmers who, frankly, suck at theory, and they write slow, crappy programs as a result.

Good article Wil.

The obligatory contrary opinion: I think it's a little unfair to single out a lack of CS-driven theory as a cause of slow, crappy programs.

In my time, I've seen great, fast programs written by self-educated programmers, and I've seen awful, slow, buggy code written by CS-educated programmers beyond number.

Is the theory helpful? Sure. But a well-motivated, smart programmer can write a hell of a lot of good code, and maybe one or two really good, fast programs in that same 4 years, as well as gaining enormous practical experience. It really comes down to the individual.

There are giants in this field who have created apps you and I use every day, and some of them never went anywhere near a formal CS class.

Finally, this may seem picky but I'm pretty sure your ego can take it: you mention "slow programs". Now, DL is a lot of things, but fast it aint. Nobody is ever going to give DL 1.x an award for performance. You've made design and API choices, and they've worked for you and your customers (or at least those that own G5s and CoreDuos) but your app is also paying the price for those choices.

May 20, 2007 9:09 PM

Blogger Wil Shipley said...

Well, yes, Delicious Library 1 is not fast in some cases, especially with large collections.

Acting as the primary programmer, and doing it in seven months, I'm actually very proud of the performance I got. Compare it against iPhoto 1, written by an entire team of programmers over who-knows-how-long, instead of iPhoto 6, which is the result of five more years of development.

The question is not "is it fast" but "is it fast considering how long it took to write and how bug-free it is and how many people worked on it and how many features it has." Those are always the trade-offs. I stand by the decisions I made, and defy anyone to do a better job without sacrificing the other vectors.

Plus, DL2 ownz0rs.

May 20, 2007 9:19 PM

Anonymous Owen Anderson said...

One of my professors has a good way of explaining what Computer Science is: "Computer Science is to computers as Astronomy is to telescopes: a vital tool, but not the focus of study. Computer Science is the study of problem solving, and the computer happens to be our tool of choice."

In my view, software engineering differs in as a (semi-)academic field in that it is a study of the tool and how to use it, rather than the study of the ideas behind it, similar to the difference between an optical engineer who builds telescopes, and an astronomer.

On another note: I'm a CS senior at a small liberal arts college (Macalester), and, while we don't have as many courses or as many professors as big schools, I've been very happy with the quality of the education I've received. For instance, I can't _imagine_ being limited to only visiting professors during certain hours. For us, office hours are just a guaranteed time they'll be there, but we're allowed to come by almost anytime they're in their offices.

There really is a much freer flow of knowledge.

May 21, 2007 7:46 AM

Blogger Brady said...

And a (minor) tip for those undergrads that do want to get invited to all the various faculty/grad student gatherings - get a job with one of your professors. When you work in their lab, you get access to their equipment, their gatherings and their knowledge. Once you are in the door, you can actually start to raise questions about undergrad issues. Heck, in some labs the paid undergrads are treated better then the grad students.

May 21, 2007 12:22 PM

Blogger Wil Shipley said...

I actually did a special project at the request of one of the professors while I was at the UW (I wrote a GUI drawing application in X11 that could output LaTeX commands, and I actually used LaTeX as my native file format) , but although I got access to one of the labs, I still wasn't invited to picnics. Rats!

It might have been because I spent all my time staring at the extremely HOTT research assistant who was at the UW at the time. Oh, man. So hot. What the heck was her name?

May 21, 2007 12:52 PM

Anonymous Damien Sorresso said...

Computer science is a branch of mathematics dealing with algorithms. Philosophically, there are issues with calling computer science a "science". The things that computer scientists study (algorithms) exist in a world of absolute truths and falsities. Science deals with reality, a domain where we can only seek to accurately describe what's going on, not prove what's going on. In short, science is based on empiricism, which yields descriptions and varying degrees of accuracy. Mathematics is based on truth.

The scientific part of computer science, though, comes in the empirical study and comparison of algorithms. Classifying an algorithm as O(n) or O(n!) is a matter of mathematics. You can prove that an algorithm has a certain order of running time.

But actually running those algorithms and comparing which one is faster in reality and on real hardware is the scientific part. You can have 2 algorithms that are both O(n) but that have wildly different running times on a given CPU. Things like caching, memory accesses, branch prediction, compiler optimization, etc ... all come into play. Big-O notation tells you how an algorithm's running time will grow with respect to the number of inputs it has to deal with, not how much actual time it will take to run.

So computer science is what you get when mathematics meets empiricism. It's sort of like mathematical engineering. It's not very well-defined, but there are definite mathematical and theoretical foundation to the technical skill of writing programs. Knowing and understanding that foundation will make you a better programmer. As Wil said, there is a marked difference between some code monkey who went to ITT Tech and took "Java Programming for People Who Don't Know Any Better" and someone who went to a 4-year computer science program.

But whatever you do, if you go into a computer science program, do not expect to learn everything you need to know in those 4 years. I've been out of college and working for about 8 months now. I learn new shit every day. And don't ever, ever be afraid to go beyond the bounds your professors lay out for you. That's when you make yourself stick out and learn the cool stuff.

May 21, 2007 11:04 PM

Blogger AlBlue said...

I recall making a decision to go to a computer science degree which was heavily theoretically bound over one which looked much more immediately practical at the time. (I chose the theoretical one becaue of the University.)

However, since being through it (and looking back over 10 years later) the theory has given me a firmer bedrock on which to stand than any practical-oriented course could have done. Learning to program Hello World in the language-of-the-day is one thing; learning how to program in any language is a much wider ranging skill (and the practical-course now runs in different languages than it did when I was looking).

Different styles of programming -- logic, functional, object-oriented, procedural -- are way more important to experience than 'Here's Java; Here's C++' comparisons that you might get. And the logic side (knowing about upper bounds of functions) become really important as the data size scales. Why do you think that Google uses mapreduce?

Also, looking further ahead to the future, computing is going to change over the coming decade. We're not growing faster, we're growing wider (whether that's memory or number of cores), and we need to use it efficiently. Running on top of a VM (like the JVM or CLI) will help somewhat; you can take advantage of the improvements that others are making to your program (or, in e.g. Obj-C world, improvements in the frameworks). But you need to split the algorithms to make the data work.

It wouldn't surprise me if Apple's got a longer-term plan about using multi-core code by virtue of CoreData and CoreImage, effectively allowing people to declaratively program what people want to happen rather than how it should happen, and letting the framework vectorise it to take advantage of the CPUs.

So, the theoretical stuff might look fairly worthless whilst you're on the 'before' side of the equation, but you really get the benefits not only in the immediate future but also the distant future as well.


May 23, 2007 6:37 AM

Anonymous Anonymous said...

Briefly, 'programming' is the skills to write code, 'engineering' is about building products, and 'science' is the theoretical aspect. If you want to build products, become an engineer. If you want to explore ideas, not necessarily bound to practical purposes, go for a career in computer science. Of course, Google's search algorithm is an example of science being turned into a product. This is also the difference between Xerox PARC and the Macintosh project -- the Mac 'productized' the great research.

But a CS degree isn't just about 'what can I learn about computers'. The more you know about non-computer stuff, the more valuable you are to an employer, or to your own future business. Take advantage of the opportunity to broaden your non-computer knowledge, and your creativity will be expanded (and, let's face it, you'll meet more girls).

I once had a software manager who went completely through medical school. He would obviously have advantages if he wanted to develop medical software. I know a developer who composes new music compositions daily, in his spare time. If you hope to have your own business, take business classes. And get to know those professors, too.

Since optimization keeps getting mentioned, I like to think of it as "not doing what doesn't need to be done", which is the strategy to achieve "doing less work". For example, not drawing a white pixel where their is already a white pixel, which is the essence of P-frames in video compression. Or, rather than reversing the order of an array, would it be okay to march through it backwards? If so, you saved the work of reversing the array, by not doing it, since it didn't need to be done.

May 23, 2007 9:35 AM

Blogger Andrew said...


I love your blog and read it all the time. So thanks for that.

To the soon-to be college student who sent you them email:

Another degree to consider is one in Mathematics or Applied Mathematics. I attended the University of Washington as well, though well after Wil did, and opted to Study mathematics instead of CS.

If you *are* really, really interested in CS and programming in general, much of the subject matter is relativly easy to study and pick up on your own time, provided you have the knack for it. (This is not to say that the time involved in doing so is trivial, rather that you'll be able to do it if you apply yourself). A solid knowledge of Mathematics and the comfort one develops in 'proving' things about systems as a result can be useful.

The two diciplines have a bunch of bleed-over and a good programmer really has a good grasp on both. If you study mathematics you can easily learn what you 'missed' by not studying CS, if you study CS, you can easily learn what you 'missed' by not studying mathematics, both just require some drive and time on your part.

Physics is not a bad route either, for many of the same reasons - some of the best guys I know have physics degrees (and one has a degree in History!)

Best of luck!

May 23, 2007 11:55 AM

Anonymous Anonymous said...

One way to avoid feeling like a second-class citizen as an undergraduate is to get a job doing tech support for the department. That's what I did. I spent so much time around the grad students and professors that I was part of that community, more so that the students who just went to class and office hours.

May 23, 2007 11:56 AM

Anonymous Anonymous said...

Maybe also worth pointing out that at 16, it's hardly the deadline for deciding what you want to do with your life. Dude, go out and have some fun, don't sit in the computer lab programming all the time. Play sports, play music, kiss girls (or boys). The other stuff is--literally--academic.

May 24, 2007 10:57 AM

Blogger Wil Shipley said...

Well, I disagree. I started programming when I was 12, by age 16 I had been doing it professionally for two years. I spent my high school years learning BASIC, Pascal, Modulo-2 (anyone remember that?), 6502 Assembly, and finally C.

Yes, I missed out on some parties. I didn't get to screw around as much as some other kids. But I'm pretty happy with where I ended up.

Why waste your youth? Kids learn at an incredible rate. Don't piss away a single moment of your life.

May 24, 2007 11:44 AM

Anonymous Anonymous said...

I totally agree with Wil on the age thing. My father offered to teach me programming when I was 10, but I wasn't interested (in my defense, I think he wanted to teach me FORTRAN). I wish now that I had taken him up on that, because it would really kick ass to have 10 more years of experience than I do now without having to be 10 years older.

It's not as though knowing where you want to go in life means you can't have fun. Heck, it doesn't even mean you HAVE to keep going that way if something more attractive comes up. There's really no downside to having direction in your life.

May 24, 2007 1:55 PM

Anonymous Anonymous said...

Can't believe you passed up a chance to take a dig at Dick "You're all cheaters and I will catch you!" Pattis.

May 24, 2007 11:00 PM

Blogger Wil Shipley said...

Honestly, I had fewer issues with Mr. Pattis than some of the full profs there. I mean, his class was just a right of passage to get into CS, and he was essentially cerberus.

May 25, 2007 12:38 AM

Blogger Rich said...

i was wondering Wil, are you involved with, or have ever written, any other apps? even just random ones? it would be interesting to take a look.

May 30, 2007 3:08 PM

Blogger Wil Shipley said...


I don't know if any of my apps could be considered "random." But, you can find a listing of them pretty easily from, like, wikipedia or something.

May 30, 2007 6:09 PM

Blogger Thomas said...


I found this blog post highly entertaining and I'll defintely start reading your blog on a regular basis.

Although I went to Lehigh which was a smaller private university so we actually had the ability to form relationships with our CS professors, I totally agree that the grad students were the more favored.

To the original question asker,

I thought getting a degree was a total waste of time because I was the shit coder. Using computers when I was 4, programming when I was 8 in BASIC, etc. But, I learned after being in the real world for a while that like someone else stated there's a lot of things you don't know about or seem too boring to you that you'll miss otherwise.

I learned a lot of fundamentals in college. Do I use everything I learned day to day? No way. But, it was a great starting point. The first time in my life I was around people that actually wanted to learn about stuff, unlike primary schools where you're just being babysat.

So definitely do CS if you're interested in Computers and software development. You'll realize it's an adventure worth taking.

June 07, 2007 8:39 PM

Blogger trhaynes said...

Computer Science is, as Will pointed out, based largely in programming theory. O(n), hash tables, operating systems and how they work etc.

Software Engineering is a level of abstraction above.

I disagree. I claim that Software Enginerring is a level of abtraction below. It's knowing how to write programs and create software, while CS is the science of how those programs actually function.

Computer science is to software engineering as english literature is to novel writing.

June 10, 2007 11:32 PM

Blogger Daniel said...

"Computer science is to software engineering as english literature is to novel writing."

Ahem. Um...No.

Rather you should have said "as English grammar is to novel writing."

CS is the study of the construction software solution to problems: architecture, patterns, theory, math, models, tools, simlulations, UIs, structures, etc. etc. Englsih literature's equivalent would be, well, like Wil's blog analysis of peopel's code. While that deconstruction helps you learn techniques from an accomplished programmer, it isn't a formal course and doesn't replace one.

Even CS doesn't teach creativity nor artistry which is involved as well. But it does teach things of great value in solving problems elegantly.

June 22, 2007 6:06 PM


Post a Comment

<< Home