Two Thoughts on Computer Science Courses

   By chris on January 21st 2008 in /dev/random | 6,448 views

ekinoderm’s “Who did Kill the Software Engineer?” ruminates upon Robert Dewar and Edmond Schonberg’s excellent “Computer Science Education: Where Are the Software Engineers of Tomorrow?” (both well worth reading) and fostered in me two thoughts about computer science classes:

I can remember students in my classes constantly grousing about how topics like Scheme or Finite State Automata were “useless” and we should spend our time doing “useful” things like learning how to use VB to make a database app or something.

the adoption of Java is driven almost entirely by a desire to make programming “fun” and to alleviate students’ fears that they won’t learn anything “useful” from a course taught in an academic language like Scheme

My first thought: if your comp-sci course is easy then you’re either a genius or you’re wasting your money. The odds on that are not in your favour.

My second thought: if your comp-sci course takes you to the edge of weird when it comes to computing (to put it another way: if you’re constantly thinking “when will I ever need to use this??”) then you’re probably really quite fortunate. Drink it in.

As Hunter S. Thompson put it:

When the going gets weird, the weird turn pro.

All the rest learn Java.*

Personally, after fifteen years writing various kinds of software professionally I find that every day I wish I’d had a deeper, weirder comp-sci eduction in my youth. I suspect I would have written better code sooner, understood more easier, and saved a lot of the time I’ve spent this last decade and a half playing catch-up (functional programming is a concept only two years old to yours truly… sigh) which could have been used learning even weirder stuff.

While I don’t believe that Java is to blame for the evils of modern puppy-mill comp-sci (I really try not to blame the tools) I also don’t believe I shall ever take seriously any developer who only knows but one programming language.

Or to put it in human terms, wouldn’t you laugh at someone who calls themselves a “linguist” simply because they speak English?

(*I couldn’t resist one shot)

Update 22:01: This topic seems to be one that’s growing in popularity around the web. If this is of interest to you, also check out Reg’s No Disrespect and then track back for Why You Need a Degree to Work For BigCo. And then I recommend Brian Hurt’s What good is a CS degree?. Here’s a teaser:

Here’s the kicker- there was not one class at the college I could take that would teach me C. Not one. How unfair was that? Their attitude, when the issue was brought up, was “we’ve taught you Pascal, we’ve taught you assembly language- here’s a copy of K&R, figure it out.”

One thing I want to make very clear is that I don’t believe that Java the Language is to blame. In fact, I know it because a couple of the smartest developers I’ve ever had the pleasure of working with were Java developers creating stuff that still fascinates me six years later.

It seems to me that when people blame Java what they’re really saying is “computer science has started teaching languages that are easy to teach the basics of and call that a comp-sci degree”. When put that way, what fault the tools?

From this point on should I comment on the subject I’m going to use the venerable Blub rather than Java, or VB (remember the good ol’ days when VB was everyone’s favourite whipping boy?) or ActionScript or even <your most hated language here>.

I also don’t think a degree is necessarily useless. Like every other degree it depends on where it came from, who gave it to you, and what you did to earn it. More importantly, it likely informs what you did (or will do) after you earned it: if it instilled a love of programming and seeking the esoteric then chances are you’ve got a personal project that speaks volumes about your abilities.

If you skimmed through the puppy mill to get the piece of paper you probably don’t have an interesting personal project and that says just as much, yeah?

Update 2008-01-22, 15:23: Ben asks an excellent, important question down in the comments:

What is a student who doesn’t get into the big name schools (MIT, Caltech, Stanford, etc.) do to ensure a good CS education?

If you’ve got thoughts on that please post them to the comments or even better write them up in a blog post and link ‘em. I’m really interested in hearing that answer too.

17 Responses to “Two Thoughts on Computer Science Courses”

  1. Isaac Z. Schlueter responded on 21 Jan 2008 at 8:15 pm #

    Or to put it in human terms, wouldn’t you laugh at someone who calls themselves a “linguist” simply because they speak English?

    It’s actually worse than that, even! Would you consider someone a linguist if he only spoke English, and couldn’t properly explain the difference between “me” and “I”?

    A lot of graduates from the Java tradition of CompSci education don’t even speak one language very well. They know the syntax of Java, and can copy and paste “patterns” (aka, swaths of multipurpose boilerplate code) to solve certain problems. But O() notation is lost on them, they tend to have little if any grasp of when and why to use recursion (if they even know what it is,) and they never learned anything about how a computer actually works.

    Practical skills are good. Users don’t fork over money for a box of O() notation and recursion. But the mentality of memorizing tasks is fundamentally inflexible, and leads programmers to the pit of obsolescence. IMO, CS education at 4-year universities should do two things:
    1. Teach programmers how to practice. http://steve.yegge.googlepages.com/practicing-programming
    2. Weed out the ones that would really be happier getting an associates degree in VisualBasic and spend 30 years cranking out junk until they retire.

    When I went to college, there were 3 classes that would typically end with about 40% of the people that started them (if that), because of people changing their majors: Object Oriented Programming (in C++ and Ada), Programming Languages (a project in a different language each week—including Lisp and Haskell), and Data Structures and Algorithm Analysis (recursion, maps, trees, and big-O notation.) I was appalled to learn recently that people are getting Computer Science degrees where they study Java or ActionScript exclusively. Those are two great languages, but, I mean, *seriously*!

    There’s a reason why neurosurgeons get paid more than nurses. No shame in being a nurse–it’s a vital profession, but it’s one that more people are capable of doing, thus the demand/supply ratio is different. The same principle should apply to computer scientists and code monkeys. You don’t see see the Yale Medical school softening up just because a lot of would-be doctors don’t like studying advanced physiology and would rather learn “practical” skills.

    I feel bad for these kids. They’re not being given the education they pay for. It’s hard on the hiring side, too. “Oh, here’s a guy with an MS in Computer Science. He must know his stuff!” And then you find out that he spent 5 years getting really good at figuring out which Java package would solve his problem, reading the documentation and modifying the sample code slightly–he doesn’t have the slightest idea how to design software, and never learned how to pick up a new language. The sad thing is, his educators basically told him that that’s what programming is all about!

    Sorry for the long comment. I’ll have to write my own post on this at some point, apparently. :)

  2. chris responded on 21 Jan 2008 at 10:00 pm #

    Thanks for the comment! (And no worries about the length, comments that are content are always welcome indeed).

    Personally, I don’t think that the problem is Java, Java’s just another language that’s simply quite popular and apparently easy to teach (I don’t know Java which is why I’m adamantly trying to stay away from judging it or the teaching of it in this discussion and if I fail in that then Java developers are right to thrash me soundly for it… except for the one tongue-in-cheek shot I took in the post above simply because it fit the moment).

    When I say “knows but one language”, I mean any language. If all you know is Lisp, you too are going to get on my nerves really, really quickly (this I know from personal experience) simply because of the lack of perspective and breadth of problem-solving experience (simmer down all you Lispers getting riled up, if it helps insert your anti-favourite language there instead).

    I simply know that the programmers I’ve learned the most from are the ones who in turn have sought out the most they can learn, and presumably so on and so forth.

    Is not striving for that the fault of a modern, LCD Comp-Sci program that strives to teach “business programmers” or is it a product of programming becoming more mainstream and thus attracting more people who are attracted to just “business programming”?

    I’m curious about that.

  3. Bobby The Programmer responded on 22 Jan 2008 at 12:09 pm #

    Some business programming can get pretty hairy, and there is more O(n^2) code out there than I like to think about.

    For example, I’ve seen people with many years of experience who didn’t understand the problems of using floating point for monetary calculations, and resisted the idea of even adding proper rounding.

    However, there is plenty of the “move today’s date on the first line from the left side of the report to the right side” and I know guys who have consciously chose that path because it’s less work and the the center of their lives are elsewhere. The only problem is that when the center of gravity of the programming world shifts, they may be all but unemployable, like the DBase/FoxPro guys I used to work with at one company.

  4. Ben Hughes responded on 22 Jan 2008 at 3:16 pm #

    The issue is really hard for students as well. It is insanely difficult to really separate good computer science programs from bad programs at good schools. I am currently in the college application/admission process and the huge difference between good CS programs and puppy mills certainly adds another degree of stress to an already stressful process.

    What is a student who doesn’t get into the big name schools (MIT, Caltech, Stanford, etc.) do to ensure a good CS education? It’s hard to discern whether your education is going to be useless until you are actually in the institution and then your options are severely limited.

  5. Ryan Cerniglia responded on 22 Jan 2008 at 4:12 pm #

    I think it’s worth noting that there’s already a degree for people who just want about the more practical side of programming - a “Computer Information Systems” degree. The differences between a CIS degree and a CS degree are monumental - you are taught to program in a wide variety of languages, but without the same depth into the core subjects behind computer science.

    I’m currently going to school for a CIS degree (going through an “accelerated coursework schedule” - 10 week terms), and while I’m not going to be well versed in the mathematics behind computer science, I’ll have experience with C, C++, Java, JavaScript, PHP, SQL, and I’m sure others (I’d have to dig through the catalog to find the rest). At 10 weeks for each language, there’s only so much you can learn about the specifics… but it reinforces those things that are common among programming - the basic logic and tools that you can use in any language.

  6. adam responded on 22 Jan 2008 at 4:49 pm #

    Well, I’m a senior at a small liberal arts college studying computer science. I would like to comment that even though many people have never heard of my college, we still get hired at big name corporations and contractors (being close to Washington D.C. helps also). But I think it is exactly because of the reasons listed above. In order to graduate, I had to take OOP (C++), Programming Languages (looked at Fortran, Lisp, Prolog, and some Java), Data Structures & Algorithms (which was rough but I, personally, learned a lot about Big-O notation and recursion), and Assembly (on a VAX, but the theory is what is important). We also had to take a course in Discrete Mathematics, but no more math than that.

    I think I got lucky to get into such a good CS program even though I didn’t research it entirely too much. I would say if I were to go through the admission process again, I would find out which schools I was interested in, then see what Computer Science courses are offered and check their descriptions. Also check what the requirement for the major is. If they offer all the classes that I mentioned above, but only require one or two of them, I would be suspicious of the program. I don’t think it would be hard to research this if you have a guidance counselor (a high school or college one). And if you don’t, I know that my school has all that information online. I don’t think any good school would try to censor that information.

  7. hdh responded on 22 Jan 2008 at 8:00 pm #

    background: I’m a lazy 19-year-old who dropped out of Monash College (Australia) CS course, out of pure laziness. The last time I saw a Uni top-50, Monash was the 43th. off-topic: I also advocate a third WW.

    Regarding what somebody who can’t/don’t want to get to the big name Uni should learn instead, I would introduce them to the ideals of free software, and its open source side-effect. That’s real stuffs that get done under the public (well, at least from people who care about the project’s subject) eyes.

    Also, they should split the department into Computer Science and Software Development, with some things like source version control being taught in both. Except that the first department won’t see as many enrollments as the second, and will be dropped in due course. And we’ll be left with a more accurate name.

  8. afongen » links for 2008-01-23 responded on 22 Jan 2008 at 9:24 pm #

    [...] Two Thoughts on Computer Science Courses (tags: computerscience education via:raganwald) [...]

  9. Isaac Z. Schlueter responded on 22 Jan 2008 at 10:06 pm #

    You know what’s odd about this: I went to an awful school that had a great computer science program, and didn’t end up with a degree in CS (changed over to an interdisciplinary physics/math/cs program), or, hell, even a degree at all (left with an incomplete in Spanish 2, and never finished it.)

    One of the best programmers I know never went to college at all; he just started playing with VB right out of high school, got a job, and learned as he went along.

    A few of my professors were absolutely brilliant computer scientists with little to no real-world software development chops. We learned a lot about a lot of interesting things, but we never covered important real-world basics, simply because the teachers didn’t know about them.

    The way I look at it, electrical engineers don’t really need to know all the finer points of quantum mechanics, but they’d better know enough to understand how electrons behave. By the same token, not every programmer needs to be able to prove abstract theorems about Turing Completeness, but they should know enough to “get” what’s going on.

    Like Joel Spolsky and others have suggested, I think we (read: society) really need a BFA in programming that covers what you really need to know, without glossing over the niggly bits. Make them keep their code in CVS. Make them take and file bug reports. Have them build something in Flash, something in C++, something in ADA, something in Java, and then make them extend and change those programs the next year, once they’ve forgotten everything. The year after that, they have to adapt someone else’s first-year code, and that someone else has to answer their questions while doing a project of their own. That’s what real life is like, and until you’ve felt the pain of your own crappy decisions, you can’t really consider yourself a competent developer. (Come to think of it, maybe it should be a Masters program.)

  10. Fred Talpiot responded on 22 Jan 2008 at 11:49 pm #

    In the US, by the way, some Nurses get paid more than most programmers. Registered nurses can pull down around 60K or up to 100K with experience and their job won’t go to India.

    Nurse Practitioners and Nurse Anesthetists earn even more than RN’s do.

    But it’s very physically demanding.

  11. Fred Talpiot responded on 22 Jan 2008 at 11:55 pm #

    You need to know how to code to appreciate the CS. I started working with only a few programming language courses and wrote a lot of okay code. Then I had an opportunity to take a lot of CS courses at the universities, at night. I did very well and learned a lot. And the CS knowledge has been immensely useful.

    My coding background made taking the CS courses much easier, and I gained more from them.

  12. Todd W responded on 23 Jan 2008 at 12:05 am #

    > if you’re constantly thinking “when will I ever need to use this??” then
    > you’re probably really quite fortunate

    Wrong. If you are thinking that you are an idiot.

    I was with a buddy once and we hopped in his buddy’s car. I see an intro to Java book in his back seat. The conversation then went like this:

    me: oh, you study programming
    him: yeah, but I really hate that class. Learning about arrays and that stuff.
    him: …
    him: I’ll never use that in real life, right?
    me: actually, I use arrays every single day
    him: …

  13. chris responded on 23 Jan 2008 at 8:34 am #

    You and I are in agreement on that Todd (though definitely not on the “idiot” aspect, it is human nature to not understand a solution until faced with the problem), I think you just misunderstood how I was phrasing it.

  14. Binary Code » Follow-up Reading on “Computer Science” responded on 23 Jan 2008 at 10:36 am #

    [...] comments on my Two Thoughts On Computer Science Courses are mostly excellent and interesting, especially the ones from real-world students and [...]

  15. sam responded on 24 Jan 2008 at 11:05 pm #

    some random mumblings

    I have an engineering degree, but sofware dev that I do isn’t engineering. I think of myself more as a craftsman, or maybe a tradesman. I think ratcatching is disrespectful. You need real engineers, but you also need people who can put there hands in and actually build something…

    One thing that is different about software is that I suspect anybody that would classify as “real engineers” (like sucessful applicants at amazon) would also be an extremely competent software developer. This is different, my dads a fine instruments maker (an extinct trade, he’d be lumped in with tool and die makers, now). Anyhow, he’s really, really good at making things. From scratch, sometimes that means making the tools he’ll need in order to make something. But, he’s not an engineer, and the engineers that come through his machine shops… not so good at actually making things (most of them, a few are brilliant).

    So, software might be different in that the idea that one person does the math and draws the pictures, and somebody else comes along later and builds it doesn’t work so well with software.

    Another thing. When encyclopedias first came out, the skilled crafts masters were concerned - anybody could just read things and learn how to do what they did (cast cannons, make paper, build houses, whatever). This is kind of vague, but one thing I like about software is that unlike quantum mechanics, which I also had to study, I learn something or read something about s/w, and I can sit down at my machine, and I can try it. I actually can learn from reading, because everything I need to experiment is available to me. Maybe that makes software a craft that I like, whereas the engineering, well, theoretically I can design a flat panel liquid crystal system powered off sunlight and good intent, but how can I build it in my basement?

    To get back to the first encylopedias, the stuff taught in them that had never been written down before could also be learned by experimentation, people had tools, were used to doing things by hand, building there own houses, making shoes, etc. So an article about the secrets of shoe making, that really spread the knowledge. It doesn’t bother me that software developement is a craft. It does bother me that it isn’t taught like a craft. Learn the fundamentals. Learn all the tools, how they are built, when to use it, how to build your own when thats appropriate. Don’t stop learning, your degree makes you a journeyman, maybe, not a master.

    Ok, back to bed.

  16. Value of computer science degree « Randomicity’s Weblog responded on 29 Jan 2008 at 11:05 pm #

    [...] Two Thoughts On Computer Science Courses [...]

  17. Scott’s Blog » Fixing Computer Science responded on 30 Jan 2008 at 11:47 am #

    [...] switched to using Java as the initial language when I started.  I agree with Brian Hurt and Chris Cummer about the value of a computer science [...]

Trackback URI | Comments RSS

Leave a Reply