My outdated Computer Science degree: Was it a waste of time?
blog.calbucci.com
blog.calbucci.com
CS isn't about learning technologies. It's about learning the math and science behind computation theory. You don't learn things like Visual Studio 2010 or how to set up an EC2 instance or how to build iPhone apps. You learn how to build a compiler, the data structures behind file- and operating-systems, and networking fundamentals (among many other things of course) so that you can then learn specific technologies on your own.
If you know why TCP was invented and the core networking stack, and you know what a compiler is and how it does its magic, and when to use a linked list instead of a dictionary, then you have the tools to figure out how to build an iPhone app--or how to use any other computer technology--on your own time.
Edit: I also want to add that CS does change, and learning networking or something like RDBMS theory might not have been common 10 or 20 years ago. But there's few fields worth learning that don't change in that sort of timespan. Core CS principles do change, but probably not much slower or faster than things like physics or medicine. You probably wouldn't argue that a physics degree is worthless because 10 years ago they didn't teach the Higgs Boson (or whatever, I'm not a physicist :) )
--Dijkstra
I think half of my CS curriculum in college was done as pencil & paper assignments. Logic, algorithmic analysis, and the like. You learn enough "computer stuff" to be able to use it as a vehicle for learning how to think.
We learned enough of Java in CS101 to explain abstract data types, encapsulation, invariants, etc. We learned enough C++ to explore OO design by patterns. We learned enough assembly to explore low level stuff like how a call stack actually works. We learned enough Lisp to explore language concepts. And so forth.
Anything else, well, that was yours to learn in an internship, or on the side with whatever project you want to do to explore it. And employability after graduation was pretty much correlated to how willing you were to work harder than what was required in coursework.
What a complete load of shit. People in technology love to reinvent the wheel, mostly because they don't know someone already did that wheel about 8 times. It's very rare to find an idea that is completely new and unique.
Also, at the risk of repeating myself, CS != IT.
On the contrary, the mathematical, logical, and algorithmic underpinnings generalize to all sorts of issues, which apply at all scales of computation. Algorithms for governance? Traffic planning? Applications in other sciences (e.g. biology, medicine, etc)? Yep - all of these. The concepts are completely agnostic to the computational substrate, and I don't think this is going to become obsolete any time soon.
For what it's worth, I'll unpack my first sentence a little more, which is admittedly inaccurate due to its absoluteness. I did take several CS classes that actually involved computers, but a surprising amount of the learning took place during lecture, and every test I ever took was written on paper.
As for "science," I am really riffing on empiricism. the closest CS gets is writing inductive proofs, but this is very different from the empirical underpinnings of other sciences, which tend to rely on statistical inference instead of induction as the primary tool for discovering "truth." ...which is yet another reason why CS is valuable.
The degree should teach you the techniques to manage your own learning. It is a piece of paper that certifies you can work by yourself or in groups on non trivial tasks, with insight and advice from a more experiences peer.
The majority of my lecturers at university were behind the latest technology, so how could they teach them.
I learned exactly one thing in college that has helped me as a professional programmer. That is that I enjoy programming. Everything else I learned through internships, freelancing, and side-projects.
Those things were a bit of a terror to learn in class, whereas the basics of HTML took a day or two, the basics of CSS took a good week or two to completely get my head around, and the worst part about javascript was getting my head around a C looking language that didn't behave at all like C. All of this was stuff I couldn't help picking up because I had to complete projects for money. Understanding how a O(n log n) algorithm looked or how fast something was going to fill up all of my ram would not have been something I learned on my own without years of experience of benchmarking and debugging, without school.
edit: I do share the experience of the author of not using any language that I used in college, since college. That's certainly not the fault of the languages, C++ and Java, which are still probably the most widely used outside of the web (well, servlets, but I hated Java.) But if it had been a .NET college teaching me how to automate Excel, I may have killed myself, though I have collected paychecks for doing just that, since.
This is the very definition of vocational training.
But there is so much more to computer science, and technology than vocational training. I hate to say it, but your math classes and algorithm analysis classes? They were some of the most important classes you took. Even classes like compilers are not invalid, even though we dont quite build compilers in the same way as the dragon book says we should. But some things are the same, and the nature of them does not change as fast as people think. For example, parsing has a number of approaches, but they are all inter-related, and learning about one in depth lets you understand why that approach is not ideal or what kinds of tradeoffs one is making.
Another example... as much as operating systems have evolved, many aspects of them just .. have... not ... changed. EG: IPC in modern Unix systems. Pretty much all the same as 1995 (the first year I coded sockets).
This is pretty much the general education vs vocational argument all over again.
- A CS degree in any era signals persistence and an ability to solve non-BS problems that have a distinct right answer.
- Modern technology is so much fun, I am happy to learn it.
- Google and StackOverflow have made learning specific technologies so much easier. No more staying up until 2 with no resources.
- The earlier you get into the field, the more likely you will know things at the bottom - memory management, database tuning, etc.
This isn't meant to imply that CS is easy now. There is a larger body of knowledge to master with many moving parts. Just that an old degree isn't so worthless. (Neither is a 20 year old Physics degree)
I went to undergrad in the same time frame and credit my schooling for the fundamentals. Now go build your house on that foundation and never stop building!
~year 2000, MVC was all the rage in J2EE development, Struts etc.
Probably was invented and even popular long before that also in other environments.
Uh, no.
(Hands up, anyone else who used to subscribe to the NCSA "What's new on the web" newsletter in 1993 and visit all the new web servers ... before 10am, every morning?)
That stupid Yanoff List wrecked everything. =)
(http://www.google.com/googlegroups/archive_announce_20.html)
Even ignoring binary groups a Usenet feed would have been considerable in 1993.
(http://en.wikipedia.org/wiki/Usenet#Usenet_traffic_changes)
I had a core list of 4-5 newsgroups that I would check once daily. On a busy day there would be maybe 20-30 new messages per group.
After Eternal September some of those groups went to hundreds daily and got to be too much to cope with in a day.
This must have been 92 or possibly 91