Go To University, Not For CS
sheddingbikes.com
sheddingbikes.com
How arrogant can you be? There's nothing for you to learn from 100 years of algorithms, complexity theory, language or operating systems design? Nothing?! All you need is code?
Certainly there's an ever increasing role for people pasting together big libraries and frameworks without a deep understanding of what goes on behind the curtains....
If your school's Computer Science curriculum is a series of courses on the LAMP stack, that's one thing. But in the fields like algorithms, distributed computing, machine learning and information extraction, to name just a few, there is plenty of room to build a career around a degree.
Introductory programming is all about what functions, variables, etc. are. I doubt many intro-level students ever grasped the fact that they were working on more or less the raw AST or the "code as data" thing anyway.
6.001 was never a service course and while it was taught the EECS department even stopped teaching their service course due to lack of resources (MIT doesn't let departments get too big for a long time until they're sure they aren't going to suffer a crash like Aero/Astro, which of course turned out to be very wise after the dot.com bust).
Other departments taught and still teach their own relevant for their fields programming service courses, and surprise, surprise, the EECS department has started teaching a Python based service course ... although partly because the new 6.01 course doesn't have the time budget for students to learn Python's syntax and other irregularities (you can't take 6.01 without proving you can program in Python, as I recall).
ADDED: that said, there are a lot of students outside the EECS department who are very upset they can no longer take 6.001, which in times past quite a few did.
Having just taken 6.01 and 6.02, I have mixed feelings. One the one hand, you had to write relatively little code within some larger skeleton that had been written for you. But the code you had to write emphasized important engineering design principles without making you write an entire mobile robotics system from scratch (which is not the point of the class).
On the other hand, the problems were somewhat contrived, and didn't allow much room for creativity. There was only really one way to fill in the blank code. This required understanding the structure of the rest of the code to figure out exactly the way in which the professors might want you to write the missing code. The intention seems to be that this is a valuable skill, but for me it was at the cost of stifling any creativity.
Time and again, I would be partnered with someone (we had randomized partners for 6.01) and I would say "this is interesting, maybe we can solve it like this" (and I would start proposing some ideas), and my partners would say something like "I don't think that's how they want us to do it." A lot of times, they were right --- and this was a successful strategy for the class. Ultimately, the final robot did cool things, but I didn't feel like I made a creative contribution to those cool things in any way.
It sounds like from what you're saying that the software component of them are as Sussman has commented, mostly "exercises in 'pasting libraries together'" with little deeper understanding of what's going on. And if you don't take 6.004 ("Computation Structures", from CMOS circuits to designing your own RISC processor)---it's not required for everyone anymore, right?---then one might graduate with an EECS degree without ever gaining that deep understanding of what's going on that starts with 6.001.
The real shame, or at least what I've guessed, is that when you take the new 6.005 which is supposed to teach most of the rest of what 6.001 taught which isn't covered in 6.01/2, you'll be doing it in Java, a language which for this purpose isn't even wrong.
I'd be very interested in your comments on 6.005.
IMHO, the more freedom, the better. If you are concerned about having a well rounded education in EECS, then you can sit down with your advisor, or talk to your friends, and ultimately decide to take the old curriculum anyway. On that note, it would have been nice if they kept 6.001 for those who still wanted to take it.
What the elimination of the required for everyone 6.001-4 (EECS's Unified???) says is that the department no longer believes there's a broad core of materiel everyone needs to learn. As described to me, a MIT EECS degree used to mean that an EE wouldn't freeze up when asked to do some embedded programming and a CS wouldn't freeze up when having to integrate digital electronics into a project.
Today, a MIT EECS degree means something different. This new thing may be better, may be worse, which will depend on lots of things and the judgment of history.
And agreed on the dropping of 6.001. If I had been able to finish my degree in Chemistry (finances prevented that) 6.001 would have been all I would have really wanted to take out of the department's offerings.
It certainly was and it a tremendous and pioneering crown jewel of CS (and just happens to cover or provide the foundation for just about all of CS that I'm really interested in). And the promise of teaching a 12 unit version of it (the old version was 15 (that means number of hours per week it in theory consumes)) somehow dropped by the wayside....
I will say, however, that there's a lot of CS ignorance in the industry. Even really paying attention to a weekend course about "two dozen good things to know as a programmer" would put someone ahead of about 1/2 of all the big-company coders out there. As an industry, we could probably reap billions of dollars of increased ability over a 4 year span from adopting this sort of continuing education becoming common. (Doctors have this sort of continuing ed.)
Once, at a company I worked for, there was a project that lost millions because they didn't know you can't translate one context free language into another with only Regular Expresions. (Before I got there.) And I keep on being some kind of guru because lots of corporate coders don't understand that naive Array add operations are O(n^2). (FFS!)
I also think I'm 1 of only 3 in my group who has any inkling of what you need to deal with concurrency.
Arrgh! I need a new job!
I've employed a goodly few programmers - invariably the least good are CS majors, the best are usually engineers or physicists.
The reason is that CS is a theoretical degree, and far too many people do it assuming they will become a "programmer of value", rather than a potentially important CS researcher. I've had applicants bore be with details of compiler theory they learned, or algorithm programming they worked on and so forth. All interesting stuff I admit - but the question of "can you write a program" is skipped around :)
Compare that with a degree like engineering (any engineering really). They have learned one skill, that is driven home over and over: how to solve problems. The actual knowledge from their degree is irrelevant (you don't generally learn all that much at university) it is their analytical and solution skills that are key.
There is nothing wrong with this setup. The problem is that CS is treated like an Engineering degree rather than a Mathematics major. Really it should be the latter; if you wish to do research in CS, teach it, work in sort of related fields (CS Majors make good traders, for example, like mathematicians) then CS is the way forward. If you want to be an industry programmer it isn't.
What we need is an intermediary; an Engineering degree that hands you some basics of CS and a whole lot of critical thinking. The whole aim of a degree like that is to point you in the right direction and let your interests develop into a career. This needs to replace CS as the majors for most people - and I think, actually, it would make them happy :)
Hackers are an odd exception; personally I think a good hacker would get much from any of the degrees - theoretical or not - though it is worth remembering that a good hacker will generally be a good programmer anyway because they can hack around, and solve, problems.
(Just to point out: I disagree with all of what Zed has to say about CS itself - clearly there is a lot to learn there, if you go for the right reasons)
University is a great choice for someone to further their education; not because it will teach you much (if you expect university to be the peak, or even the start, of your education you've failed already :P). But because it teaches you the ability to learn for yourself, think critically, break the discipline cycle that school drilled into you, get drunk, make important friends, find people to bounce ideas off.. the list goes on. Somewhere down the bottom is "sit in lectures and learn stuff". Learning is easy; the rest is far more important! :)
You may not have it in the states, but the rest of the world does. I graduated a five-year (160 credit hour) curriculum in "Computer Engineering" which is a bundle of low-level courses (circuts, electronics, assembly, microelectronics, digital integrated circuits), programming courses (c++, c#, object oriented software development), software lifecycle courses (software engineering, project management), math, pure engineering courses (statics, electromechanical systems), and more. It's recognized as an engineering degree by the Engineers Guild, and has given me, above all, the "Engineering Sense" that I apply daily in my development work.
You are right; this is one area the eu is doing better in.
MIT takes it position as the world's preeminent technical school seriously and in the mid-80s decided this was the single biggest external issue it/the STEM professions had.
Of course the real problem is that non-tech people rely more on political skills and networking to get and keep their jobs. Their day to day work skill set is often quite low.
They are points along a gradient of a mixture of CS classes and digital circuits classes.
However, at no point do the CS classes move from theoretical to practical, all the CS classes you end up are the traditional type. So at Davis you're still not getting a "industry programmer" type of CS education, you're just getting academic CS + circuits :)
Your situation sounds similar, with the additional of the two software PM and process classes you mention. Although I'm curious if you think they were helpful, is that a teachable subject?
I designed my own soda machine, calculator and even designed/created a real world solution which companies were interested in, though I cant mention because it would be me not anonymous.
I was not a computer engineer, I was a CS student. My school also had computer engineering, but I was not really interested in the EE stuff.
I took all of the Math that engineers take, and I took the Engineering Chemistry and Engineering Physics.
Due to my CS dept being a subset of the engineering dept, the goals were the same. Everything was problem solving. Every class had its set of rigorous problems, which students had to succeed at or they simply would not pass.
I learned Algorithms, internal Operating systems, Complexity, Computation, fundamentals of Programming languages, distributed systems, organization, Computer Architecture, VSLI/HDL, etc. Im sure you get the point.
I personally think I bring a good bit to the table, as do the other few graduates that survived the curriculum.
You very well may find a more well rounded candidate than myself from the non traditionally educated pool, but they will be few. If you lump all CS graduates in the same pool, you are doing yourself a disservice. While yeah, somebody from a Java school may suck. What do you say to a candidate like myself, who really can bring what you need to the table. Do you just cross me off the list because I have a CS degree. If so, I think its you who may need to recalibrate.
Sure pure engineers and physicists may be good programmers, but do they understand the inner workings of a computer? Do they understand complexity, even the basic data structures. I assume you want efficiency?
Do you just cross me off the list because I have a CS degree.
That's silly :) You may have noted from my post that I do hire CS majors.
but do they understand the inner workings of a computer? Do they understand complexity, even the basic data structures.
Yes, usually a lot better than most CS graduates. Because generally speaking in the real world these are engineering problems rather than pure problems.
This is just my observation, but I don't think I am wrong - CS majors are generally worse programmers (and usually more full of themselves, but that's another matter) than CS engineers.
I would consider you (based on your post) an engineer; as you explain, you were part of the engineering dept.
(that's not to say CS majors are all bad - I've met some extremely good ones. The problem is that the majority of CS is taught as a pure subject with a smattering of applied theory. There is a distinct lack of problem solving involved. Traditional disclaimer: YMMV)
Also I should point out that being an engineer does not automatically make you a great programmer. Clearly you need an interest, an amount of aptitude and the ability/willingness to learn the pure subjects (if they were not part of your degree). The last of those isn't all that important - to be a good programmer you only need the amount of pure theory that is required (and you learn to pick it up as you go) - this is a common trait of all engineering.
> you were expected to be able to largely pick that kind of stuff up by yourself.
I think the main problem lies here; because a lot of people are possibly too lazy to do this...
Curriculum wise UIUC actually does an excellent job of addressing this issue. I imagine other schools are similar. We basically have our three core theoretical courses and everything else involves programming. Every course that isn't a theory course involves several significant programming assignments. For example, in our networking course the final programming assignment (in C) is to implement TCP over UDP. We have a seperate course called Programming Studio that is required. The entire course just focuses on learning programming well. And students can opt to do a large software engineering project instead of a thesis their senior year (the vast majority do software engineering, not a thesis).
I think all these measures help, but despite the heavy emphasis on programming, a lot of graduates are still horrible programmers. I think the root cause is that we are still learning how to teach programming well; we've had a much larger head start on learning to teach mathematics.
In our particular case we would check out the degrees people had done (just Reading the websites) to get an idea of what they had learned - I only really do that for new graduates though, it's less relevant to more experienced people.
I found the same thing. I think the reason is that CS in general is easier than engineering/physics (or math) so on average the engineer/physicist is smarter than a CS person (lots of exceptions of course). Just look at the math involved (I've been in the three places btw).
Also, the dozen hidden gems don't do the people asking Zed for help any good, because they're hidden. They're great for the people that happen to be going to them, but if an outsider thinks one might be a hidden gem, it's not a great risk.
My computer science education at a small state university exhibited all the problems Zed describes, and more. For all classes, except those taught by two or three of the instructors, there was very little culture. We were taught what was a subset of what was in the books, designed to help mediocre students pass. Learning extra was not encouraged. How the knowledge came about, or is used practically, is glossed over. Half of my classes were Computer Science, but what I remember is mostly from non-CS courses. And on top of it, a lot of teachers gave me pointless exercises and confusing tests and some had grading that wasn't at all straightforward. Less dedicated students who knew how to game the system did much better than me, grade-wise.
Ummm, well, OK, except for the first one they aren't so great, but let me relate this tremendously useful and memorable anecdote he told us in first term organic chemistry:
There was a company manufacturing a molecule and at some point their yield randomly started going to hell, an impurity wasn't getting removed. They just about went crazy trying to figure out what changed until they set up 24x7 cameras, reviewed the footage and found out that a night watchman was relieving himself into the vat.
But here's the neat part: it was only when he did that that they got pure product and the cause of their new problem was his semi-retirement and not working as many nights as he had been.
Their real problem, of course, what that they didn't truly understand their process, they didn't realize they needed to e.g. include some urea or whatever to complex with the impurity and help it get washed out.
I had the same feeling. I attended a program at a school which (at least at the time) wasn't extremely selective (the school as a whole admitted 60% of applicants and was extremely generous with financial aid) and highly industry connected (located in Silicon Valley with alumni all over the local technology companies).
Nonetheless, the first language students learned was C, followed by Haskell. Compilers, discrete math, operating systems, EE courses were all required. Upper division courses would expose students to other languages (Scheme, C++, Java) and I only remember one undergraduate class requiring a single Java based lab assignment. Graduate courses either required C (I focused in systems and networking) or were language agnostic.
While i agree that these "java schools" are nearly useless, even if i don't know deeply the usa scenario, i guess that is still possible to skim out this kind of places and choose a university with a more well-rounded curriculum.
And just looking at communities like HN, everyone can notice that even CS majors can have a multitude of multi-faceted interests.
1. Alan Kay on ACM (http://queue.acm.org/detail.cfm?id=1039523): Once you have something that grows faster than education grows, you’re always going to get a pop culture.
2. Paul Graham: I’ve never liked the term “computer science.” The main reason I don’t like it is that there’s no such thing. Computer science is a grab bag of tenuously related areas thrown together by an accident of history, like Yugoslavia
3. Edsger W. Dijkstra: Programming is one of the most difficult branches of applied mathematics; the poorer mathematicians had better remain pure mathematicians.
How I finally disagree/agree with the author: if you plan to take a bad CS course, you are probably better off just getting a job. If you going for a good CS course, don't think you will learn just programming. You will learn it, not all of it, and it will probably be one of the least important things you'll learn.
>Another way to explain the shallowness of Computer Science is that it's the only discipline that eschews paradox. Even mathematics has reams of unanswered questions and potential paradox in its core philosophy. In Computer Science, there's none.
No unanswered questions? Rubbish, 'P=NP' anyone? Correctness of the assumption of the Church-Turing hypothesis (which is falsifiable if not provable) ? Granted, I'm not sure exactly what he means by "eschews paradox", but I assume this is mostly because the author doesn't really know himself. If he simply means "lacks counter-intuitive ideas", than he's dead wrong. I'll put forward the Halting Problem as an obvious example. Counter-intuitive if for no other reason than people are simply used to problems being solvable.
The real result, if you want to wow someone, is Rice's theorem (http://en.wikipedia.org/wiki/Rice%27s_theorem): 'Not only can you not decide halting - you can't decide anything else either.'
Intuitively, I can convince myself that Rice's theorem is true ('just write a program that runs itself and halts or doesn't halt on whether it has that property'), but I can't really follow the math and I only think of that because I've already heard of a number of results that use similar translations/compilations from one sort of program to another.
> is that it's the only discipline that eschews paradox.
> Even mathematics has reams of unanswered questions and
> potential paradox in its core philosophy. In Computer
> Science, there's none. It's assumed that all of it is
> pretty much solved and your job as an undergraduate is
> to just learn to get a job in this totally solved area
> of expertise.
Zed is confusing software engineering with computer science. CS is a branch of applied mathematics, and it's not different from mathematics. There are unsolved problems and plenty of areas that require further research.
That's a compelling case for commoditization of talent, but in the end I think it's just a heuristic improvement. It gets you pretty far, but at the end of the day you still have huge teams of PhDs and M.Archs doing the actual engineering. (If that was commoditized it would be a scary world indeed!)
Let's see if it's still standing a couple decades from now.
> Let's see if it's still standing a couple decades from now.
I didn't realise that it was solely teams of skilled engineers and artisans doing the riveting on Empire State back in 1930.
I seriously doubt 30's margins are still being applied.
A little bit of Darwin, on why things are the way they are.
Frankly, anyone flying at a low speed and very low altitude (which I define here as few hundred feet) with jet engines at idle needs to have their head examined. Whatever the software did or didn't do, the pilots knew all of these details and that with their craft's low energy level and the engines spooled down they had little or no margin for error, their's or the new (less than one and half years since first flight) fly-by-wire software.
http://news.ycombinator.com/item?id=968013
You can test the depth of CS for yourself when you take your first formal methods course.
First off, I agree on the importance of culture. But equating a CS degree with coding is just plain wrong; Dijkstra has a nice quote on this. CS is and should be applied mathematics, and what more timeless topic is there than math?
Secondly, there are some serious doubts whether university teaches you to think independently. As a counter argument, read "The Disadvantage of an Elite Education"[1]. Summary of this article: university teaches you--if you're somewhat ambitious--to become an excellent sheep. In other words, it promotes you into being the same mediocre person as anyone else.
That said, I still believe there's a ton of things to be gained from spending four years in a university: network, culture, more-than-average-but-still-pretty-mediocre ability to think, fun, and being inside a solid recruitment base for cool companies.
[1] http://www.theamericanscholar.org/the-disadvantages-of-an-el...
I agree with Zed to an extent, but only because so many CS programs focus on the wrong things and are little more than trade programs. For most young people I meet I strongly recommend they steer clear of CS unless they're going to a school with a proven program.
(Sorry about the multiple login, I mistakenly logged in with clickpass last time)
The problem is that student demand isn't for CS. Student demand is for Information Systems and Software Engineering. Schools either respond to that demand and turn their CS programs into glorified trade schools, or they keep CS as an applied mathematics program like it's supposed to be and risk angering new grads (e.g. "I didn't learn anything useful in my CS program!")
I think the higher universities with older programs would be more inclined to teach theoretical than younger programs just starting during the dot com boom or during the past few years.
I felt like it was an excellent program. We spent all of a semester on C/C++. My program was heavy on the math (Calculus, Differential Equations, Linear Algebra, Statistics, and a few others I can't bring to mind). We studied algorithms, number systems, analysis, and all sorts of topics.
The amount of time we spent 'learning to program' was minimal. Maybe I was lucky, but I have to imagine it's hardly different for the majority of programs.
"One year of science and mathematics:
1. Mathematics: At least one half year that must include discrete mathematics. The additional mathematics might consist of courses in areas such as calculus, linear algebra, numerical methods, probability, statistics, number theory, geometry, or symbolic logic."
(http://www.abet.org/Linked%20Documents-UPDATE/Criteria%20and...)
MIT requires differential equations or linear algebra and no statistics (although I think they used to before the '80s) and of course discrete mathematics which is one of the things I'm sure you're not bringing to mind. (MIT does demand a relative high level of mathematical sophistication, every undergraduate must take or place out of single and multivariable calculus in their freshman year (where it is taught at speed), and SICP/6.001 and 6.01 both use math freely (in 6.01 at least as initially taught you have to use differential equations right off and they don't assume you've previously thoroughly learned them).
I've worked very closely with a UVa Applied Mathematics graduate who was taught C++ (but not C, I taught him the new/malloc distinction :-) back in the early-mid 90s. He's not as good a programmer as I am, but he's very solid and most importantly understands what he's doing and the implications of it. Our designs don't fail because we e.g. didn't realize or think correctly about scaling issues.
I think better advice for students choosing a program would be to go to University, spend a year studying as many different things as you can, including CS, to see what engages you. Learn how to code at the same time. You might be happier as a physicist who knows how to code than a computer scientist who wishes he knew more physics. There are plenty of coding jobs a CS grad can't do.
There are many fine schools besides MIT, CMU, Caltech, etc. Saying you should disregard CS as your major because you aren't able to attend one of the elite schools is downright depressing. There are many great schools for an undergraduate that have an excellent CS curriculum.
Any programming at the schools I attended were optional 0 credit labs. And except for the CS 1 and 2 intro classes, there was no designated programming language, you could use any language you wanted. Some chose Ruby, Python, or Java while some others chose C or C++. They were more concerned about your ability to design and implement a proper working solution to the problem given.
However, there is one caveat: if you go into embedded or get a serious security clearance and stick to government work that required it, you can with much less difficultly continue programming. In the former case the field appears to respect gray hairs, in the latter, it's pretty hard to get the first job (they can't have you working on classified stuff until you get your clearance and you can't apply for or hold one without a job requiring it) so once you have your "tickets" you're in very good shape.
Then he decided that he wasn't going to piss off and fire up his usual quota with just that so he added an opening and closing attacking a CS education. I'm in pretty decisive disagreement with him on what he says about CS here, but there's a valuable point in here.
CS students, and engineers in general, are a little too dismissive of the liberal arts. There are some genuine reasons for this, but Zed is right in that it's supreme arrogance to think we have nothing to learn from thousands of years of human achievement in the arts. Ultimately, culture is how humanity expresses itself with the time and energy we've bought for it by making life easier with technological progress. Taking some time to understand the human condition through culture before we transform it would be a good thing.
Plus, on a personal level, meeting people who aren't fellow engineers is generally a good thing. Guys, there are a lot more girls outside of CS than there are therein... Hell, girls, that goes for you too if you just want to talk to another girl for once.
The impression I got was that not even the scholars knew what digital media was. However, I did acquire a large pool of information of what this grouping of similar people were up to. They were a great source of inspiration and if art is one thing, it's building upon the works of others and the humanities offers a larger pool for you to build upon.
However, when it comes to better understanding how people react to their environment, I turn to the social sciences for a more concrete explanation. My naive understanding of the humanities is that it's based upon assumptions and opinions, but I bet a wiser scholar can show me differently.
BTW, depending on where you go, a CS degree can be more of a liberal art education than a technical one.
As Dorothy Parker said "You can lead a whore to culture, but you can't make her think"
I think this post would be much more accurate if Zed had chosen a more fitting marquis word. There's tons of things that you learn in college but wouldn't pick up going straight to work. What I think has been most useful, for me, that I would not have picked up on my own is writing for different audiences.
In high school, you most likely wrote like a high school student: (generally speaking) unrefined, undirected, and usually lacking a clearly defined audience. When you get to college, you get used to the academic environment - you learn to communicate an idea efficiently to someone who isn't an english teacher. It's where you learn that all those "rules" they taught you aren't as steadfast as they would have liked you to believe. It is ok to start sentences with "And" or "But" and end with a preposition.
Judging from the output I have seen, though, I'm not sure college is the best place for that.
but, how much money is it worth? is it worth 20k? 50k? 200k?
on the flip side, not all of us are brilliant alpha programmers with entrepreneur-class egos. the labor-class parents of one of my best friends are incredibly proud of his BigCo software job, and BigCos don't hire without a degree. The cynic in me wants to call a [software] degree an average person's investment.
This seriously screwed over the undegreed Ascend employees after the acquisition; anything that might bring them to the attention of the union like putting them in for a promotion risked a grievance (or whatever) filing that Lucent would lose.
Companies that do contracting work for the Federal government generally need to hire people with degrees, and that's probably generally to universally true for consulting companies in general, where they're selling appearances to get their foot into the door.
I'm sure there are some people still who get into Google and Microsoft with no work experience or degree, but I suspect that number was higher when these things were new and all. I also suspect a good number of the people you were thinking of when you made that post had good work experience to help them land the job.
As far as I can tell, though, requirements for degrees at BigCo type jobs are becoming less stringent, not more stringent. (again, I emphasize, this is only for people with work experience. BigCo is usually not the place to do the skilled work at unskilled wages.)
My understanding is that in my father's day, it was /much/ more difficult to get in without a degree. Sure, the degree was in math or business (my stepfather has a degree that sounds like a business degree but that actually was one of the early computer degrees.) or something other than computer science, but my understanding was that degrees were more required then than they are now.
(I am exaggerating a little, but there is a shortage of programmers.)
It's usually better to apply anyway and let folks reject you if they really don't like what they see, rather than taking job postings literally. They're really just guidelines.
this is key. It has been probably 13 years since I've had a job that didn't require a college degree in a related field.
Take plenty of lab courses; try to get some summer science internships involving programming -- science labs need programmers, so that should not be hard to find.
I'd get a minor in CS, maybe. But, frankly, if I went back to school today I might still prefer to take courses in art and design -- a subject that would sure be handy for my career -- or statistics, and teach myself the CS in the evenings.
If I were giving advice to incoming freshmen (which, I guess I am, since there're bound to be some reading), I'd tell them to try out a whole bunch of different courses, and then major in the one where the homework makes them come alive. Because when you end up spending a good chunk of your life in a field, the important thing is that you enjoy the day-to-day work, not that you enjoy the trappings of success. (Of course, you should probably keep an eye on how marketable the field is - I don't recommend choosing a major just so you can get a high-paying job, but if you find you like CS and you find you like Beowulf, being a programmer will net you a much more comfortable life than being a Beowulf scholar.)
Incidentally, I also took the "don't take courses in subjects you can teach yourself" approach. It worked very well for things where teaching myself involved reading a book, like history or economics. It worked not at all for things where teaching myself involved working out problems, like statistics and linear algebra. I suspect CS is closer to the latter than the former.
Personal data points, third party anecdotes even less so, are not a reliable way to extrapolate how CS (or any major) is taught outside of the MITs of the world. Your experiences, shockingly, are one among many, and remain yours.
That said ...
The culture thing is spot on. That is what getting an education is all about.
On the other hand, there are a lot of other sources of accreditation available here that conduct courses exactly like those Zed mentioned. In those cases, I would have to agree that it's not worth the money to take those courses. Then again, they're usually not called CS over here. They have names like Business IT or some such. IMO, you cannot call yourself a CS course unless you teach, you know, CS, which is pretty much the case here. What's the situation in the States? Are there a lot of courses teaching you how to code Java billed as CS?
p.s. of course I've forgotten most of the CS stuff that I've learned in university, but just knowing that they're there if I need them and gaining the big picture How Things Work was worth the time spent and makes me a better programmer.
OK, that's in part my spin---he only mentions MIT---but it's also my considered recommendation post-the dot.com crash. If you plan on/desire to stay programming, I think you really need to be severe about approaching this, seeing as how the normal career of a programmer is over by age 35-40; beating that is going to take a lot more than going to a Javaschool or just starting with your native programming talent.
ADDED EVEN LATER: see this other posting in this thread for two exceptions to the 35-40 problem: http://news.ycombinator.com/item?id=1391516
ADDED: going into serious debt to attend a Javaschool for the purposes of becoming a better software developer strikes me as a particularly bad bargain nowadays. If you don't have what it takes to be an autodidact after graduation for the rest of your career you should think really hard about getting into this field to begin with.
On the other hand, now that we're in what looks to be a long Great Recession at best, this may be your best bet, it's just probably not a good one if you don't get into the best school you can and engage in serious extra career long effort.
A previous HN discussion where there was not merely no agreement but no strong opinions on what school ranked as #5 suggested to me that there's really something to this.
At the very least they deserve their pedestal. On the question of whether it's not worth going to a school that ranks below them, I'm not so sure.
It's not like they take all the programmers over 40 out behind the cubicle farm and shoot them or something. I also feel compelled to point out that "programmer" as a career is a fairly new option and information technology is still growing rapidly, so the field in general will indeed look a bit younger.
And, finally, I think your real point is just that going to a school with a worthless Java-lego-blocks program for CS is well..worthless. Dismissing everything but the top 4 schools is just inflammatory and obscures the real point..and, admittedly, I couldn't keep down my gut reaction of inflammation as an alum of one of the schools usually mentioned as a contender for #5.
They may not "shoot them or something" but they do stop hiring them. I have some interesting personal anecdotal experience here:
I look much younger than I am (at 49, until a few months ago when I started getting a few gray hairs, I was routinely mistaken for an early '20s college student (this is a family trait, no one thinks my 77 year old father is beyond his early '60s)), so it's trivial for me to not let on to my age until I slip and e.g. mention working on PDP-11s (had one interviewer exclaim "How old are you?!?!!!" that time :-).
Starting about when I turned 35 I found it increasingly difficult to find work in the D.C. area ... until in the middle of one job search I scrubbed my resume of all the info that signaled my age, most especially when I attended college. Bam, it was like night and day, in that job search and in future ones.
Anyway, I believe that the nature of the field of software development rewards experience in terms of quality ... but we all know that most suits are interested in playing as little as possible, even if this results in technical debt or outright project failure that kills the company (one problem is that non-programmers just don't understand the field and its constraints and so on).
To finish, I'm not dismissing all but the top 4 schools, I'm saying that if your goal is to continue programming past age 35-40 attending any other is going to put one more obstacle in your path and by no means will attending 1 of these 4 make it easy anyway. Since you don't believe in that goal I'm not addressing you or your career or whatever.
And then immediately thereafter:
>Except for a few places like MIT, Computer Science is a pointless discipline with no culture.
While I agree with some of the points made in the article (do go to college, because you'll be a better person for it, regardless.) This is where the article completely loses cohesion.
The way I see it, there are two ways you can teach computer science, and in both it is useful to you as a programmer, provided you apply yourself.
1. You are taking software engineering, learning to code. It may not broaden your horizons, but you spend four years looking at code and writing code in a structured environment, you're going to get better at coding.
2. It is a hopelessly abstract mathematical endeavor that has nothing to do with programming. If that's the case, it's just like philosophy of science. Despite its apparent inanity, simply the act of dissecting the how and why of computing will affect you as a person, enhancing the way you look at the world.
My plans to go into International Business haven't yet materialized and I'm currently in IT, including both web and Windows client development.
Being a one-man programming team means I have to learn a lot by myself and don't have the expertise of others to lean on. Because of that, I feel I'm held back from my potential. For example, I'm having a hard time teaching myself how to do TDD, or learning new languages or techniques.
I think a CS degree would have given me a great background to be a better programmer. So, I wouldn't discount it and I think you still learn the culture because of all the GenEd classes you have to take in University.
So your average university can't teach me to code, but it can impart to me the wisdom of the ages. Not my experience.
At least at a state university, most kids are there to party and walk out with a credential that (they hope) gets them an agreeable, good paying job. That is the culture that the university has to share, at least by default.
Yes, you can get more out of university than that, and some do. But the idea that your horizons will be broadened and you will acquire culture and Learn How To Think just because you had to pay a pile of money get in the doors . . . no, I'm afraid not.
I've observed this directly or indirectly at 2nd and 3rd tier schools as well (and MIT's humanities departments aren't by and large first tier as far as I know).
"There are many situations where you may need to find existing objects (objects already saved in a store) for a set of discrete input values. A simple solution is to create a loop, then for each value in turn execute a fetch to determine whether there is a matching persisted object and so on. This pattern does not scale well. If you profile your application with this pattern, you typically find the fetch to be one of the more expensive operations in the loop (compared to just iterating over a collection of items). Even worse, this pattern turns an O(n) problem into an O(n^2) problem."
Our introductory course is based on SICP and Scheme (with a little Python at the end). Our second course is roughly about OO, taught with Java (but without letting us use most of the libraries at all).
The design of our program is that you choose an emphasis (I'm in network security; there's also networks, graphics, AI, etc., and yes, software engineering). All emphases have theoretical elements, at least to some degree.
I have also had great experiences doing research with professors, who are very open to undergraduates.
Personally I have little interest in the alternate university path he is suggesting, I would probably eventually get sick of it and quit. That's not to say I don't find a broad range of subject interesting, just that I'd rather pick up that other stuff online in small chunks when it interests me and spend the 4 years I have of study to focus on something that really interests me like CS.
Additionally, One thing that that the article did not mention is the environment in the CS departments(just for hanging out... and getting new ideas) which is way more better then the things you'll learn in class.
I already knew how to program in Java (poorly) before going to university to study a double degree in Commerce and Software Engineering (which is just CS + 1 more year).
So you have someone who's a proto-programmer - learning programming but not quite getting there yet.
I don't go to any of the few places like 'MIT'. We have `learned` python, C, Java and c++, so far. (I put the learned in quasiquotes because my classmates tend to completely forget the language after the course finishes.)
Sure, some courses like Project Management is completely useless, but I do study courses about machine learning, and how to design algorithms.
I'm now in third year and I feel that going to university to learn software engineering has made me a much better programmer than I would have been without it. Stuff like Object Oriented Design and unit testing, I wouldn't have gone and learned it myself... It would take a university to teach me that.
Funny... I was just having a discussion with my lecturer the other day... He was complaining the university's courses were too `theory` and didn't help students get jobs... especially compared to competing universities. I was telling him the point of university isn't to get students jobs but to teach them how to think. If students wanted a place to teach them so they can get jobs they'd just go to technical colleges. I think he was convinced... hopefully.
What about my commerce degree? Well its mostly boring but occasionally something really interesting comes up... like e-business and economics. I've only done commerce because my dad made me to.
The article makes me think though, maybe I should've gone for a Commerce/Science degree majoring in Mathematics instead. Or a Commerce/Engineering majoring in Electrical engineering...
Probably not, if you look at magazines like the Communications of the ACM you will see that academia sees their "failure" to churn out programmers for industry as a crisis, and are more concerned with appealing to women, minorities, and people who may not find theoretical CS topics like algorithms and data structures easy or fun enough.
They want to increase their rolls basically, and they saw how switching from CS to learn java style trade schools during the internet boom helped do that.
Now that the market has stabilized a bit, they hate to see rolls dropping, they hate to see CS classes filled only with the right sorts of people (i.e. geeks and nerds for want of a better term) to carry the discipline further, so they want to dumb it down even further, make it more mainstream, get all the cool kids in.
I don't blame them I guess. It is mostly the fault of industry blaming them for not churning out experienced senior software engineers.
Computer Science should stay pure, the right people will always come, even if it won't be the biggest or coolest department at uni it will always have a rich culture.
People have their whole lives to gather experience and become great developers, they can do that on the job. You only have a few years at university so you shouldn't try to use it to become a good developer, you should use it to learn core CS theory and whatever else leading edge topics interest you that may or may not yet be used in industry.
Industry would be better off asking themselves why they don't do a better job training developers themselves, providing great career paths, and even contributing back to academia, cooperating with CS departments writing papers, doing research and taking part in conferences.
There's a disconnect in the market here. Numbers like enrollment and hiring of recent grads are easy to measure and make for fine report fodder on academic committee meetings, but give a completely inadequate picture of the quality of education. Hiring is a bad metric -- too much of hiring is through buzzword matching, which is horrible. Then again, HR hasn't any reason to get better, if the pool of available hires is so poor, buzzword matching is good enough. This may not be so true in the startup world. It still seems to plague big companies.
This is inaccurate, but excusable since I assume Zed hasn't been to high school in a good number of years. Things have changed greatly from then—high school courses are far more rigorous than what he describes as "failure to expose yourself to <x>"—and if you're going to a top 30th percentile school, chances are that you took an AP class as well, if not more than one.
My school system had dropped its honors program because it was "discriminatory", but somehow nowadays they offer 12 AP courses including Calculus AB, the sciences, literature and foreign languages, music, US history, etc.
Anyway, I feel your pain, I came out of my high school not having learned hardly as much as I wanted to or needed. At least I had some good to great math teachers until my senior year (that was a literal life saver along with a summer school course on a UNIX V6 machine). Senior year was a total loss with no insurance, or "It's a bad sign when JROTC is by far your most interesting and useful class."
How well have you learned your math? That's a key foundation.
Although at the same time due to the senior class math teacher having refused to teach I had to learn the calculus at speed, but I managed and it probably works better when you have real physics problems you're solving at the same time. E.g. I learned why trig is really important.
This is an unintended admission by Zed that he's working off of 2nd or 3rd hand knowledge.
This is the power of education. I agree, you don't have to study CS, but for gods sake, if you want to be a programmer don't study a humanistic subject (except maybe philosophy). Study something that can push your brain to think and to create complex in-brain connections.
The reason I say don't study something like history is because I believe that in some decades simple facts won't matter much, only analyzing the facts will. I believe that in less than 50 years we will have computers connected to our brains that will be able to hold all the facts we learn and even perform simple analysis. But the complex tasks will be left to the brain, and so one must learn to increase its mental processing capacity and not to increase memory capacity The other reason for studying CS are connections. Meeting people, potential partners, employers and all the rest. You don't get that if you don't study CS. University is the easy way to come to meet people and get a job. You'd have to have a much better portfolio to get a job if you don't have a technical degree.
On the bad side, universities are expensive. But there's hope to earn the money back with a great degree.
Maybe, I'm just overly bitter, but he's absolutely right about the current state of undergraduate level curriculum.
Also, the ABET accreditation requirements require serious teaching of engineering whereas you could skate on serious math outside of the one specifically required half-year discrete math course plus one other serious one (no doubt most if not all require single variable calculus).
His view seems blinkered, at best.
I was a major nerd through high school. We got a great teacher my Sophomore year who taught us all the basics of algorithms, and gave us enough freedom to pursue our own interests. I taught myself 8086 assembly language, and thereby grasped pointers in a way my classmates couldn't.
Fast forward to college. I wasted my time for four years. The most memorable CS things I learned were i, j, and k as iterators (in other words: some accepted formatting which makes reading each others' code easier), SQL (not well, and how hard would it be to pick this up on my own?), and finite automatons.
The memorable non-CS things are vastly more numerable. Anthropology, physics, philosophy, and mathematics.
Ten years down the road, I've found that most of my career has consisted of a) finding and fixing bugs and b) gluing code together. I have devised precisely one original algorithm (I don't mean simply writing fresh code, but writing an original algorithm). An awareness of computational complexity has been necessary, but a deep understanding of algorithms has not.
Here's the kicker: getting a job without a lot of algorithm and puzzle talent proves difficult. Of course, I find this hilarious in the face of my career experience. If I were brilliant at algorithms and puzzle solving, I would have been terribly, terribly bored for virtually all of my career. It's been my experience that interviewers tend to overestimate the complexity of the tasks their team faces each day.
So, I would advise a young'un who already has substantial computer talent to pursue education in a different area. You'll meet more interesting people, develop your character, and have the option of a very different career path if you tire of software or vice-versa.
Of course, all of this goes out the window if you truly want to be a computer scientist. But it seems to me there are at least ten well-paying "code gluing" jobs for every one research scientist position, so I hardly see this as defining necessity for a career.
He's completely wrong about CS as a subject of study in general but very right about the problems with CS as a formal academic subject of study. Academia is a religion of sorts. It's primary goal is the replication of the academic system itself, control over a generation who desire an education whereas actual education of people is merely a secondary objective. Just one quote from Chomsky among many regarding education : "A lot of the educational system is designed for that, if you think about it, it's designed for obedience and passivity."
Education is Ignorance, Noam Chomsky - http://www.chomsky.info/books/warfare02.htm