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?
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?
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).
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!
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....
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.
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.
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.