151 comments

[ 3.8 ms ] story [ 208 ms ] thread
Nice post. The world is lacking tons of culture (although you don't always need to go to university to get it, especially if you are a self-learner). Enjoyed the post though.
Love the post. Having done college and then post-grad, I have to say that I missed out on the immense opportunities of learning about culture, art, history and so many more things.

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.

It's difficult to take this person's point seriously when he claims

>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.

(comment deleted)
Just a quick nitpick - I've known people to be not particularly impressed by the Halting Problem.

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.'

Really? They're impressed by Rice's theorem but not the Halting Problem? I find that surprising, I would expect someone unimpressed with the Halting Problem would simply view Rice's theorem as an obvious consequence of the Halting Problem.
If you aren't impressed by the Halting Problem, you probably aren't so sophisticated and able that Rice's theorem is an obvious extension of the Halting Problem.

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.

Also, check out Blum's speedup theorem. Very odd.
If that's counterintuitive, than the most basic physics already teaches you that many things are counterintuive. The 3-body problem does not have an analytical solution. We can't even properly simulate the solar system a couple of thousands of years ahead. Nearly everything in physics is numerical approximation, despite what theory would lead you to believe. After that, the halting problem is far from surprising.
There's a significant difference between "Nobody can solve this problem, despite it having a well defined answer, regardless of the power of the computer and the time given to solve it, no matter how clever you are" and "I can only get an approximation to the solution, but the error will always be well defined, so I can get arbitrarily accurate solutions, say within a nanometer given a few billion years or so."
Although you can't solve the general halting problem, there are many halting problems that can be, and are, solved in practice. To me, that's the same thing as a numerical approximation to something that doesn't have an analytical solution.
tl;dr: Don't major in it unless you're attending one of Stanford, U.C. Berkeley, CMU or MIT.

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.

If you are not going to top 30 schools, then it is likely that the "culture" being taught their is no better! How can you say that CS dept in non top 30 school is bullshit but other departments would be glorious?? It boils down to whether you go to a good school or not!

Also how many liberal Arts Majors get job?? And then Why not Major in CS It wont do any harm at least!

I cannot let comments like this stand. I have seen little difference between students from the top few schools and the rest. If you are only doing an undergrad I see little reason to hold these top 4 on such a pedestal. Any school in the top 20 or even probably 40 are more than a java school at the undergraduate level. The differences are marginal. However, if you plan to go to graduate school I would certainly try to attend one of the top 4 schools.
Perhaps ... but that's not been my experience.

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.

Dude, the normal career path of pretty much everyone is over by 35-40. Lawyers that haven't made partner, traders that haven't made been made head of their desk, engineers in general that haven't made it to management, teachers that haven't moved into administration.

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.

That's not been my observation for engineers outside of software (there's some truth to it, certainly GM plays that game) and certainly not for teachers. Nor is it true for scientists. Don't know about mathematicians. Certainly not true for doctors.

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.

CORRECTION: but we all know that most suits are interested in paying as little as possible
People will most certainly ask you why you studied Art History in college if it turns out that you came out the other end with no marketable skills, especially when articles about your woes show up in the New York Times as though your poor planning and choice of topic did not lead directly to your inability to find work.
The thing that grates is that I am guessing he chose not to seek out the multitude of ways that are offered at university to assimilate "culture" (which, by the way, is a rather nebulous term. Does going and partying three nights a week count?) There's the university newspaper. Bands. All sorts of sports classes. Charity groups. Activism. In some countries, you can get minors in things of interest, like philosophy of science or something.

His view seems blinkered, at best.

Another misinformed post by someone who thinks CS education is useless and that ability to code at age of 19 is suffiecient to become a superstar!

If someone follows his advice I would really sad for that person, CS is an amazing topic! And its main purpose is not teaching programming but whole other things.

It depends a lot on which school you go to though, if you are goint to top 30 schools is US, then i can assure you that the CS departments there will offer you much better opportunities than you can ever imagine!

For rest of the universities their other programs are most likely to be as useless as their CS programs.

Let me put here harshly: There is NOTHING,NOTHING that programmers have achieved in last 10 years!!

All the advancement in this field has came from people who introduced novel paradigms (which requires creativity and not programming!) or came from CS / CE / EE Academic departments!

The Web, Google (PhD Students), advances in chip design, Virtual Machines (VMWare) etc, came from People who had siginificant university education in CS EE or Physics!

Just because you can write code does not means that you have mastered CS.

I bet all smart-ass programmers on this forum, cannot understand most of the mathamatical concepts that go behind stuff such as Machine Learning or Information Retrieval or even Theory of Computation.

These are uber loosers who think that wearing Star trek shirts and writting Glorified Enterprise fizzbuzz makes them smarter than any CS dept grads.

If you are following their advice, I really feel sorry for you!

If CS education was really so useless, Why would Google take some many PhD's??

I must thoroughly disagree.

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...

Where did you get your CS degree? Or more importantly, which institutions do you know of that actually teach CS as applied mathematics and aren't just "Java Schools?" I went to roughly a school with what was and still is an incredibly mediocre CS department and, as far as I can tell, this is the case more times than it isn't. I spent time working on a Pure Mathematics degree but eventually switched to CS and I still consider it to be one of the biggest mistakes of my life.

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.

Did your CS program require a discrete mathematics course?
Yes, and it was my favorite part of the program!

(Sorry about the multiple login, I mistakenly logged in with clickpass last time)

Ah ha! I just guessed and confirmed that that's a requirement for ABET accreditation. Which of course doesn't mean the program as a whole will be infused with a mathematical or engineering ethos, I'm sure you can get ABET accreditation while still (mostly) doing Cargo Cult Computer Science.
Most decent schools should teach CS as an applied math course. In fact most undergrad CS majors should graduate not too many credits shy from an undergrad Math degree (or at least a minor).

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 level of college you go to is important. The Author even says places like MIT teach you more theory and mathematical aspects of CS. That is also true of Berkeley and Stanford (I can't attest for any schools other than that).

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 attended the University of Central Arkansas (Go Purple Bears!) starting in 1998. This is obviously not a top-tier school by any stretch.

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.

You're lucky (you attended a school which is a variation of one of those "hidden gems" benatkin talked about). ABET only requires:

"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 disagree with this article. I thought I could code prior to university but had no idea. If you have a chance to go to school, go. If you want to be a software developer, major in CS. Definitely have a minor or double major too.
It was a great post right up until the part where he started talking about computer science. It left me with the feeling that either Zed did not study computer science, and is just talking out of his ass, or went through a very bad computer science program and has generalized that all of them must be that bad.

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?

This poster is really The Idiot! What abotu AI, Machine Learning also CS lies on a fine line between engineering and Computer Science, thus like other engineering problems there is a focus on solving real life problems rather than philosophical paradoxes!
The termination with extreme prejudice of 6.001 suggests that some people mostly agree (http://www.wisdomandwonder.com/link/2110/why-mit-switched-fr...).

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....

(comment deleted)
In any successful field of engineering, the job growth explosion will be among the assembly-line workers. Cars and aircraft, now solar panels and semiconductors. Extrapolating from that to say that an engineering education is worthless is a huge extension of reasoning. Those assembly-line jobs only exist because of years of research by well-educated engineers.

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.

I think that there's a big factor that goes largely unacknowledged. Lots of non-Computer Science students have to take introductory programming. Given the choice between teaching a mechanical engineer something like scheme, which he will in all likelihood never use again, and python, which is a lot more widely useful, the choice is clear.

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.

BZZT!

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.

I think characterizing the courses that replaced 6.001 as exercises in "pasting libraries together" is unfair. The new introductory courses 6.01 and 6.02, are focused on introducing fundamental EECS design principles, in the context of mobile robotics and digital communication systems, respectively.

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.

Agreed with the first point, 6.01 and 6.02 are as you point out a lot more than that.

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.

Eliminating 6.001 also seems to me a part of a trend to allow more freedom in the EECS curriculum. Aside from eliminating 6.001 (which is the most talked about change), computer science students now have more freedom to take computer science courses (rather than certain required electrical engineering courses) and vice versa. For example, in the old curriculum, electrical engineers had to take 6.001 and computer scientists had to take 6.003 (signals and systems).

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.

"Eliminating 6.001 also seems to me a part of a trend to allow more freedom in the EECS curriculum."

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 had the best of both worlds in a way. I did my entire CS degree in my last year, after sampling a lot of random stuff for 3 years. Also, I had known how to code since age 11, so I didn't need to learn it in college.

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!

Well, I agree with his first part; and here is why.

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! :)

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.

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.

I'm in the uk :-) What you mention is perfect - and Ive seen a few of these courses in the last cople of years. We definitely need more - and they should be pitched as a solid alternative to pure cs.

You are right; this is one area the eu is doing better in.

It makes sense, I've studied 'IT engineering' here in Italy, and we can also get the best of both worlds. The sad thing is that as an engineer you'll be always labeled as a technical person, and somehow not competent when it comes to crucial functional decisions, especially when you end up working for a big corporate, where business analysts are more likely to be former MBAs..
Another italian here, and other than confirming what cesco said i can also add that one of the two CS-oriented degree available in italy also contains the dreaded "Philosophy of Science" referred in the linked post :)
Hmmm, that's true in the US as well. Are there any countries/cultures in the world where "technical people" get a seriously greater amount of respect?

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.

It's an ego problem. They can't do your job, so they assume you can't do theirs. If you could, then clearly you're smarter and that's hard to handle.

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.

I attended (but sadly, never graduated) the University of Central Florida in the US as a Computer Engineering major and the courses were as you described: Engineering + Math + Computer Science.
Computer Science in the US is very similar. Just replace the advanced low-level courses with algorithms and data structures (we still do computer architecture and assembly).
UC Davis has both Computer Engineering and Computer Science and Engineering, in addition to its Computer Science degree.

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'm really not sure what you mean. I have a CS degree from a ~50th ranked US University. It is not considered a math degree, but instead a CS degree from an engineering department. My education was engineering focused. My degree says I am a graduate from the Engineering school. I can write assembly, program a fpga, write OO programs, OS drivers and System calls. Shoot, I even wrote My own file system. I learned java and C++, in the first 2 weeks of 2 classes, and that was all the programming instruction given. Though I had good experience in MIPS Assembly, Java, C, C++, Scheme, Lisp, ML, Haskell,Prolog, C+ and Fortress.

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?

That sounds exactly like the sort of degree I mean. It's not all that common though, in my experience, to find a CS degree with that sort of curriculum.

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.

So what on earth do they teach in CS courses these days? That course sounds similar to the one I did in the 80s in the UK - especially the bit about not really getting that much instruction on languages, you were expected to be able to largely pick that kind of stuff up by yourself.
A lot of them tend to be just "java schools" plus a load of pure CS.

> 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...

The problem is that the majority of CS is taught as a pure subject with a smattering of applied theory.

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.

Im not really sure how you the employer, knows what schools teach CS like mine did and which schools are Java schools. is it just a trial and error process? Should somebody like me, say that their CS degree is from an engineering dept on their resume?
It would efnitely be useful IMO to highlight engineering type skills alongside the cs ones on a cv.

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.

Well that is good to know, thanks.
This pretty much matches my university experience. I went to a public university which ranks in the top ten for computer science programs. It appears there is a large divide in the quality of computer science education.
"the least good are CS majors, the best are usually engineers or physicists. The reason is that CS is a theoretical degree..."

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

Every engineer or physicist programmer I've met has been really good at taking math in their domain and converting it to code a compiler can understand, but none of them know how to design software or would be capable of writing larger-scale software systems. That's ok. Most of the code they'll be writing will be < 100k lines of code, and you'd be amazed at how much hackery you can survive, especially if you're reasonably smart, at that size of program. Just don't ever ask me or any other competent software engineer to ever have to maintain or extend that system! Let the physicist who wrote it do it.
What if all but about a dozen with a great reputations (MIT and others, as he said) and about a dozen hidden gems have the problems Zed describes? Or do you have a solid argument against it?

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.

And you know, it doesn't take much to teach context and (domain specific) culture while the professor is teaching the basic course. Look at these quotes from my favorite chemistry professor: http://en.wikipedia.org/wiki/Daniel_S._Kemp#Quotes

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.

> .. went through a very bad computer science program and has generalized that all of them must be that bad.

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.

Sadly, the post is just a rant in my opinion. The desire to know, to improve yourself, etc... can't be linked directly only to the fact that you are attending university x pursuing a degree in y. You can have it, you can develop it or you don't have it. The environment can help to improve the development rate, but if you don't have it you can't develop it even if you follow some "humanistic" courses.

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.

Zed is an angry man with a chip on his shoulder. His words should be taken with a large pinch of salt.
After reading this post, I can't help but remember 3 people:

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 agree, culture is important.

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.

What BigCos don't hire without degrees? I know people at Google and Microsoft without a degree. I work for a giant corporation, without a degree.
Lucent in theory didn't, although that was a result of their union contracts which required people not covered by them to have college degrees.

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.

That brings up the question; when did they get into the industry? Back when there was no such thing as a Computer Science degree, you of course didn't need one to get a job as a programmer

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.

(comment deleted)
you need work experience /or/ a degree. If you have neither, you must first do the job you want for the pay you are qualified for. I spent several years doing computer work while earning a McDonalds wage. (I got lucky, and was able to dramatically shorten this period of time because, well, it was dot-com time, and I could spell C.)

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.

It's incredibly hard to get that work experience without a degree. Why would a company hire someone without experience or CS degree for a programming job when they could hire someone with a CS degree for only a marginal amount of extra money ?
It wasn't particularly difficult for me, and I don't think I'm particularly exceptional. I was working phone support for nine bucks an hour; as soon as the boss noticed I was a passable C and Perl programmer, I got my programming job. (It was a while longer before I got paid like a programmer... but my point is that if you have the skills, and if you are willing to work for below-market wages, it's not too difficult to get the experience.)
I'd say nearly every company whose focus isn't software (they employ more programmers than software companies and they use the degree as a screening tool).
All I know is that we pay near the top of the industry, and we can't find any programmers. If there were some massive influx of programmers, then a degree might be a good weed-out tool. But the reality is that most people we interview barely get past "write a function to reverse a string", and beggars can't be choosers. Have you written a computer program on your own before? You're hired.

(I am exaggerating a little, but there is a shortage of programmers.)

I recently saw a posting at Altera which said they required a full transcript for anyone with less than 8 years of work experience. Needless to say, I did not apply.
Job postings (and HR reps) often lie. Google claimed they needed a full transcript for anyone with less than 5 years of experience, I said "Sure, but it'll take 2 weeks to arrive, and my other offer is getting antsy", and they promptly forgot about it.

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.

> 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.

fwiw, google and microsoft are in the top 10 BigCos for software people. Lets focus on 11-1000.
I regret studying CS. I would have rather gone for CE and learned more in depth about how the computer works. It seems like all the computer engineers at my school are really good coders too, and they understand the hardware better. Opens up more jobs where you can do more hardcore coding like drivers and stuff.
CS != Programming. Honestly. No, really.

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.

A university CS program that only teaches you how to code is nothing more than a technical degree. Some universities do this. Many, besides MIT, do not. They should teach everything from hardware architecture to compiler design to basic quantum computing in a decent undergrad program. Some of those will be advanced options. That's fine. Depth comes at the cost of specialization, and every CS grad should have a tiny bit of depth somewhere. The basic first year courses often do not assume knowledge of coding, but they should have a point besides learning to code.

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.

> 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. 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.

It's not like software engineering doesn't have unsolved problems either, like why is it still so hard to produce bug free software, why programmer productivity has only gone up a small amount despite 30 years of language advances and why most software still has to be mostly custom. The dream from the earlier days of software engineering where we were eventually meant to have components that could easily be mixed and matched to create whatever we want hasn't eventuated.
I don't think we'll ever get around having to build software with code and highly trained developers. The world is still very much custom engineered, from architecture to civil engineering, electrical to mechanical engineering, even mass produced items have relatively few interchangeable parts.
I agree. However, it is worth examining places like Dubai -- the tallest building in the world, and indeed practically an entire new city, was built by unskilled laborers working for dollars a day.

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

> an entire new city, was built by unskilled laborers working for dollars a day.

Let's see if it's still standing a couple decades from now.

>> an entire new city, was built by unskilled laborers working for dollars a day.

> 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.

You do, of course, understand how over-engineered is the Empire State by today's standards.

I seriously doubt 30's margins are still being applied.

Yeah, I'm not sure I agree with him at all. I would say that the human race knows approximately nothing about building software. Yeah, we can do it, but we're not very good at it. If bridges and buildings were software, we would have all died in collapsing buildings and the human race would be extinct.
Software is built the way to collapse _because_ it's not like brides and people don't lose lives if it collapses.

A little bit of Darwin, on why things are the way they are.

Given that the flight recorders were tampered with I can't see how you can be so sure it was caused by software.

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.

Seems to be talking more about Software Engineering, Business Systems, and Information Technology degrees which started to replace CS (and the awesome CS/Philosophy double) during the late 90s.

You can test the depth of CS for yourself when you take your first formal methods course.

Abso-blooming-lutely. Whatever happened to NP-Complete as an icky problem nobody can solve? That's exclusive to computer science right there.
Erm... Not to say too much, but I'm pretty sure mathematicians would envy CS not having paradoxes.
While I agree that your not always learning useful things in a CS degree for someone to have left high school and said they already know everything the CS degree and industry will teach them would be very very surprising.

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.

One good friend of mine best said it, (although university may not be the only place to get all your programming skills honed) it is one of the best places to meet future connections in business or just on a collaboration of a tech project.
I'm probably wasting my time posting here.

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

Don't go to a school that teaches programming.

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.

I agree it's depressing, but if your goal is to continue "programming" past age 35-40 I'm not sure you can make the case for others. See my other posting discussing autodidacticism.

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.

Meaningful answers to questions such as "Should I study CS?" are critically informed by the questioner.

Obviously, if you want to make a living in IT and already know how to code, heck, get to work and make money instead of giving it to some corporation masquerading as an "institution of higher learning".

But if your ambition in life includes 'solving the tough problems in computer science', then by all means, pick a top notch school and be diligent in sucking brain content from peers and faculty. Its is not a trivial intellectual domain, and the "primitiveness" of the discipline is actually indicative of how early in the game this thing is.

So , wanna to be the Plato of Computer Science? Either way, you'll need to get that "computer science" education. From the ground up.

You can dole out 40k/yr and isolate yourself from the real world for "culture", or you can go to your local library (where they still are funded) and read a book. Your call!
My main regret about university isn't that I studied CS, but that I didn't study mathematics. Coming out of high school, I didn't have the faintest idea what mathematics really was. I did study philosophy, but the parts that appealed to me most were, frankly, the most similar to mathematics (symbolic logic and proof-writing). And then when I studied CS, my favorite parts...were mathematics again! All quite ironic for someone who always hated what he thought mathematics was.
I studied mathematics as an undergraduate and am now pursuing advanced study in computer science. The foundation that studying advanced mathematics provided me for further study in CS is rock solid, particularly since my interests lie in artificial intelligence realms of CS. I've also found that in "the working world", once you prove you can code, you are a favored candidate for more interesting, complex job assignments by your employer.
I agree. I went through my junior year of a CS degree and dropped out because it wasn't worth it. If I was to do it over again, I would definitely have chosen a different degree. I'm 100% certain that doing a different degree, I would have turned out a better programmer and better at something else. CS (or any programming degrees) are not as intellectually challenging as they should be. If you want to learn how to program than, I have yet to find any degree that will teach you much about becoming a good programmer, so I would recommend going to school for something else.
I got a degree in physics which I regret not at all. I recommend the hard sciences: Physics, biology, or chemistry. Or a similarly 'hard' engineering degree: EE, ChemE, MechE, or whatever the engineering equivalent of biology is. ;) (The name for that is still being invented. "Biomedical engineering" is one term you'll hear.)

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.

I always figured I'd do that - I entered as a physics major and spent six semesters as one - but ended up graduating in CS and really wishing I'd done CS from the beginning. I wanted to be a physicist, I didn't want to do physics; conversely, I didn't want to be a computer programmer, but I liked to write computer programs.

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.

> You my friend, are an idiot. I hate to tell this to you, but your lack of education makes you that way. Your failure to expose yourself to literature, art, poetry, science (real science, the icky kind) has made you stupid. Another data point against you is that you learned to code and you are questioning whether you can get something out of a university education. How arrogant can you be? There's nothing for you to learn from 2000 years of Philosophy, Biology, Physics, History? Nothing?! All you need is code?

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.

Hmmm, an interesting point. I'll note that my high school in the late '70s had only one term of the calculus at the end, and the fact that the teacher refused to teach, full stop, wasn't caught by something inconvenient like the independently administered AP tests.

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.

I'm currently coming out of high school (11 days until graduation), and, I haven't learned much. 6 AP courses are offered at my school, none of them are pushed on you until after you sign up for the class and decide that wasn't a good idea. I haven't ever done "real science". AP Physics B (non calculus) is the only ap science course offered, and it still was just "here's a lecture about physics, do your homework, few labs".
Sigh, algebra based non calculus physics is cargo cult science much in the original sense that Feynman started the meme. No one outside of education does it this way, or as I like to put it, there's a reason Newton invented the integral calculus to develop classical mechanics and why Edison couldn't compete with Tesla (self-taught Edison didn't have the math to do polyphase AC, which was the only practical approach back then).

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.

On math? I gave up a few years ago, borrowed some math texts from the library and taught myself up through single variable calculus. I still take the math courses at my school because I need the credits to graduate.
Great! If you now do calculus based classical mechanics and electrodynamics to cement it (you'll need some more calculus for the latter) you'll be in great shape. Ask if you'd like some book recommendations.
I just finished a 2 year course on Physics from a high school that was algebra based. I'll attest that algebra based Physics is the biggest waste of time ever. The worst part, if you know some calculus, is that you can glimpse what is happening behind the scenes of the formulas they give you. All I really learned from the course was a shortcut for doing the homework problems: make your givens somehow come out to the units required by the solution; double or halve in special cases. I just hope that mindset won't get in the way when I take a real physics course.
Indeed; I now realize I was really lucky when I took my high school physics course in that the teacher didn't assign any homework, it was all lecture and an automatic A. So the next year when I did physics for real with the calculus I had nothing to unlearn.

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.

I started University in Computer Science, and then after some time abroad in Mexico, I switched to International Relations and studied politics and economics.

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.