Daniel Lemire's blog

, 28 min read

Computer Science is shallow

27 thoughts on “Computer Science is shallow”

  1. Jacob Schlather says:

    I’m sorry, what?

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

    I don’t even know what it means to eschew paradox, or that we don’t have have unanswered questions? How can you ethically say that when it’ still an open question whether or not cryptography is actually secure.

    How is computer science not a deep field: Data Mining, Machine Learning, Cryptography, Networks, High Performance, Complexity Theory, Artificial Intelligence, etc.

    Maybe he’s talking about software engineering, but he’s certainly not talking about the Computer Science that I know.

  2. There is of course the questions of what constitutes as computer science. The pure software part is an engineering science (or a form of art, depending on your point of view). I suspect that Zed’s criticism is more to do with software than the whole field and its branches that deeply go into math.

    Nevertheless, I remember I once wrote somewhere that machine learning in particular is at the Stone Age compared to other sciences. But one could argue that this is because automated computation is fairly young.

  3. In an ironic twist of rhetoric, the author derides potential CS students who want to study nothing but coding, but depicts the CS curriculum as if it were… nothing but coding.

    And while he cries for CS lacking “deep philosophy”, he dismisses less mainstream languages, such as LISP (used to teach recursion, functional programming, etc.) as mere “pet languages”.

    CS might “eschew paradoxes”, but the author surely “eschews contradictions”.

  4. Greg says:

    There is a big difference between programming and computer science. Computer science is the research of computation. Programming is building stuff using existing tools.

    It’s similar to the difference between a research doctor and a nurse. One advances the field of medicine. The other applies existing knowledge to help people.

    Look at computer graphics for example. Computer scientists work on new techniques to render more realistic scenes quickly. Programmers use existing tools to create fun entertainment.

    Or look at human computation. Computer scientists research how to effectively blend what computers do well and humans do well to make both more productive. Programmers use existing tools like MTurk to build a useful product.

    Zed may be right that you don’t need college to program (though it certainly helps). But I don’t think that says anything about computer science.

  5. @Ismael

    Ah! I just realized that I’m not linking at the original post!!! Thank you. I fixed that.

  6. Greg says:

    Good point, Ismael. Daniel was emphasizing the question of programming versus computer science and the value of a computer science undergraduate degree, but Zed’s point was more about how poorly computer science is taught at the undergraduate level.

    I wonder if Zed’s point isn’t true across all fields though. Thinking way back to my undergrad days, I don’t think anyone I knew in any major was seeing particularly interesting coursework until the advanced undergraduate classes. The early, core classes tended to be huge and routine, with little intellectual curiosity encouraged or enthusiasm rewarded, across all fields. This was certainly true in the fields I was directly exposed to (political science and computer science) and seemed to be a common experience of my friends in other fields.

    The smaller, advanced classes do get more interesting — in computer science and other fields — but it may be true that early, core undergrad coursework is shallow. But I don’t think that experience is unique to computer science.

  7. Itman says:

    you don’t need three or four years of college to do great in the software industry.

    I disagree. You probably don’t need a Master’s degree, but a Bachelor’s degree makes most students better programmers and better thinkers.

  8. Ismael C says:

    For all those saying that Computer Science is not what Zed is describing:

    My understanding from this rant (I mean, the whole thing, not just what was quoted here) that Zed is not talking about Computer Science per se in his complaint, but rather about *how* computer science is taught in most colleges.

    It is utilitarian, most of the really interesting and core questions of CS won’t be seen until you take the “advanced” courses. And many times is just the industry which is pushing his own agenda, trying to get software engineers instead of computer scientist, ready to join their ranks to do mindless ERP software over and over again with whatever skills are required to make them money and nothing more.

    I think it’s a shame because CS does have a lot of interesting, new and unsolved issues at it’s mere core.

  9. Akshay Bhat says:

    Also the author assumes that other courses are not shallow as well! If you didn’t go to a top 30 CS school, It is likely that the culture offered in that school is not up to the mark as well.

    I agree with Ismael when he says

    ” And many times is just the industry which is pushing his own agenda, trying to get software engineers instead of computer scientist, ready to join their ranks to do mindless ERP software over and over again with whatever skills are required to make them money and nothing more.”

  10. @Ade Thank you. It is nearly always the case that the comments are an order of magnitude more interesting than my posts. It is acutely true this time around.

    Nice book, by the way.

  11. Kevembuangga says:

    @Itman
    I disagree.

    I disagree with your disagreement, I think you are confusing causes and effects or at least not acknowledging a shared distal cause.
    Having the right kind of brillance makes you good at software development as well as some scholarship achievements (not of all kinds).
    Of course, practice and learning the tricks of the trade will bring improvements but the core skills are for the most part inborn.
    Yet another anecdote, when I was working with one of my customers long ago they decided, for “social fairness”, that one job opportunity in the IT department had to be open to all current employees irrespective of their qualification (?), a “nobody” girl doing obscure paper work (not even accounting) applied and was given the job (COBOL development!), in a few weeks she caught up to a very good level and was given a raise.
    It changed her life, up to the point she had trouble with her boyfriend, they were not in the same social class anymore.
    OTOH I have seen brilliant engineers from one of the top french “elite school” (Polytechnique) been utterly daft when it came to lay down a dozen lines of code.

  12. Ade says:

    I thought you might be interested in the discussion about your blog post that sprang up on Buzz: http://www.google.com/buzz/adewale/bxzkJUnFYaq/Computer-Science-is-shallow-Daniel-Lemires-blog

  13. Itman says:

    @Kevembuangga I disagree. I disagree with your disagreement, I think you are confusing causes and effects or at least not acknowledging a shared distal cause. Having the right kind of brillance makes you good at software development as well as some scholarship achievements (not of all kinds).

    I am not confusing anything. I know exactly what I learned and how it helped me become a better programmer.
    Plus, they taught me how to learn and gave a “boost” to my abstract thinking.

    And that anecdotal example of yours: it is just a simple job. I am afraid, pretty soon, very simple jobs will be scarce in US. The only ones that will be available will require solid knowledge of math, numerical analysis, machine learning and statistics. Note that you cannot learn all of these by being a COBOL programmer.

  14. Paul says:

    Your experience learning C.S. or programming is a deeply individual one. For one thing, there’s tons of different programs you can take. I’ve heard the complaint that schools pump out flavor-of-the-month technology programmers without any deeper knowledge. I’ve also heard complaints that universities focus on this useless theoretical stuff instead of giving students real life preparation. Some universities lean heavily to either side.

    And we all have our own learning propensities. I can point to database, OS and machine learning concepts that definitely made me a better programmer. It’s certainly true that others developed mastery of such topics on their own. Mix in the fact that natural aptitude appears to be a major factor in performance (there’s an interesting article somewhere on the internet about a double normal curve in CS student grades).

    This all combines to give people very different views about the value of a CS degree, even the field as a whole. I guess it points to the importance of finding the right school for students. Do you want a deeper theoretical foundation, at the cost of learning the practicals on your own? Do you just want the training necessary to throw together web frontends? I think we’re well served by having schools that represent the whole gamut of pedagogical philosophy on the matters. We need researchers expanding the field, we need practitioners to put together simple programs, we need the folks in between.

  15. @Itman

    And you don’t have anyone to correct your mistakes.

    I know. Nobody ever tells me when I’m wrong. Ever. It has been like this ever since I graduated. Only as a student did I get feedback. Now? Now everything I do is just perfect, so it seems.

    😉

  16. Itman says:

    @Paul,
    What’s the point? Let’s dump CS eduction, or what? CS education maybe useless only to people who slap frontends. And I am afraid that in the near future these people will have to relocate to India.

  17. Paul says:

    My point was that I don’t see a high level point here, other than that education could be better (it can always be better). Individual schools may have serious problems, but I at least don’t see the systemic issues. I think a lot of this is extrapolation from individual data points.

    My experience is that CS grads are finding jobs just fine (again, a limited data set). I don’t see how programming is that much more susceptible to outsourcing then any other intellectual task. Plumbers might be immune from overshore competition, but if the rest of the jobs go away the weak economy will drag them down too. The weakest programmers are going to be in trouble, just like the weakest in any field. Some will make it without degrees, so will fail with them, in general having a degree is better than lacking it, if for no other reason than appeasing HR.

  18. Itman says:

    … for no other reason than appeasing HR.

    Do you think that a programmer without a degree will do a better job with programming some numerical algorithm (I had to do it last year) or some statistical model for EPA?

  19. Paul says:

    Wasn’t arguing that that is the only reason to get a degree, just that even if you want to question the educational value of a particular program, there’s a clear correlation with job success and degrees. I’m better trained with my degree, but for whatever reason it’s not a universal opinion in this field.

    But to answer your question, I’d suspect it to help in general but not universally. There are libraries out there that make expressing lots of math easier. There are research papers on optimizations for common equations. Thus, I don’t doubt a competent programmer could implement a formula, even if they don’t understand the details. Now, if you’ve got to come up with the algorithm, or mathematically optimize (as opposed to just general performance tweaks) then formal mathematical training (which may or may not be part of a given CS program) will make all the difference.

    But again, intellectually heavy programming isn’t the only game in town. Your prospects are better if you can grok difficult concepts, if you’re familiar with advanced techniques, but a market certainly exists for bargain rate programmers. Would a programmer with a degree do markedly better at building a word processor?

  20. Itman says:

    Yep, but to read a scientific article, you need some training in reading these article. And if the only thing that you do is cracking PHP/ASP coding, you will find it hard to navigate between sin and cos.

    If you write a word processor, you better understand what is BTREE and HASH. And data structures in general. If you want to make your word processor efficient, then, you probably want to know what Boyer-Moor is (among other things).

    Of course, you can learn many things yourself. However, self-education is often lopsided. And you don’t have anyone to correct your mistakes.

  21. Alain Désilets says:

    In my experience, software development projects are dominated more by people issues than deep technical or scientific one. I recently looked at the curriculum for a number of CS schools, and was shocked to see that most of them have compulsory courses on data structures (how to implement a linked list, stack from scratch, that sort of thing) but still don’t have compulsory courses on requirements engineering and user centered design. Yet, there are probably 100 times more projects that fail because they did not correctly capture user and business needs, than projects that fail because they did to use the most efficient data structure for such and such part of the system (and when is the last time you implemented a stack from scratch anyway?).

    The CS curriculum is too much focused on teaching elegant solutions to small, well defined “toy” problems, when the reality of the workplace is that you need to find messy solutions to large, very fuzzy problems. Things like: what do my customers REALLY need, how can I make sure we deliver value to them before we run out of money, etc.

    You don’t learn how to solve these kinds of problems by studying science and theory, but by taking part in large, meaningful projects (and with Open Source, there is no shortage of projects that students can get involved in), preferably under the tutelage of a good mentor. This is what the CS curriculum should be mostly about in my opinion.

  22. Itman says:

    @Alain
    The CS curriculum is too much focused on teaching elegant solutions to small, well defined “toy” problems, when the reality of the workplace is that you need to find messy solutions to large, very fuzzy problems.

    Dear Alain,
    The lack of reality in CS training is a drawback. However, it is not clear how much reality do we need to add.

    To my best knowledge, none engineering department is teaching how to deal with workspace reality. Primarily, because it is more of a management problem.

    Making engineers solve management problems does not sound right to me. I suggest we sack some 300k lazy bums and hire hardworking and skillful folks instead.

  23. Itman says:

    I know. Nobody ever tells me when I’m wrong. Ever.

    Daniel 🙂 Pretty sure reviewers keep telling us we are wrong all the time. However, we never know names: I suppose they may be not real people at all.

  24. Alain Désilets says:

    @Itman

    > Making engineers solve management
    > problems does not sound right to me.

    So in your opinion, understanding what end users and business stakeholders need, and making sure that your code meets those needs is SOLELY the responsability of management? You, as a a developer have no role or responsability to play in this? I beg to disagree.

    I am not saying that we should turn developers into managers. But I do think that it’s essential for developers to have the skills and knoweledge neeeded to efficiently engage with end users, customers and their representatives, in order to make sure that they are building the right thing. This is much more important than knowing the algorithmic complexity of such and such sorting method.

    There are many other skills that I think are really important and are not being tauhgt formally. For example:

    – Underengineering: Start with the Simplest Thing That Could Possibly Work, and only add more complex stuff if that doesn’t work.
    – Test Driven Development (apparently, some CS schools are starting to teach that)
    – Prioritizing tasks according to which provide most value to users or customers.
    – Rapidly evaluating 3 open source frameworks, all claiming to do something I need for my project.
    – Find my way in 1M lines of messy code written by folks who left the company.

    None of this is scientifically deep, yet they are vital skills. I’m sure all CS students end up having to do some of them in their school projects, but the assumption is that it’s something that students will have to learn for themselves.

    But if those are the most important things to learn, why not try to find creative ways of actually teaching them explicitly? For example, having the class do a task that calls upon one of those skills, do it in pairs, write a report about their experience, and discuss in class their best tricks, etc…? This is what the CS curriculum should be mostly about in my opinion.

    Of course, then it would be harder to assign grades to students, and we all know that this is what education is all about right?

  25. Itman says:

    Test driven development, bottom up developments, stubs etc… is usually taught in schools, but not satisfactorily. I agree. A good workshop would be nice. Client interaction, maybe, but it is not convincing to me.

    The main point is, however, that all the practical knowledge will be obtained anyway through internships and work on open-source project. Therefore, I see no reason why should not school focus on technical things instead of teaching workflow?

    I also disagree on algorithmic things: you don’t have to know details of algorithms, because we have ready implementations in most cases. However,
    you must be fully aware what the cost is.

    An anecdotal example from my practice: a person implemented a bubble sort algorithm (I don’t know why didn’t she/he used an already written one) to rank results of a small search engine. This worked only in case when result was small.

    Another example is a relational database: people don’t understand how indexes work. That is why they come up with poor database design.

  26. Kevembuangga says:

    @Alain Désilets
    But I do think that it’s essential for developers to have the skills and knowledge needed to efficiently engage with end users, customers and their representatives, in order to make sure that they are building the right thing.

    Sure, the answer is Asshole driven development.

  27. To the list of deep questions I would add the lambda calculus – universal turing machine correspondence. Why is it that these represent the same model? Are there any other models of computation that could take their place? Do we have any way of proving non-existence of such models? (It’s possible that we do and that I’m ignorant about this fact!)
    What I was taught at university was that we simply assume that this is “the” standard model simply because two seemingly different models could be shown to correspond to each other. That is a marvellous little “paradox” in my view.