May 192011
 

One of my recent pet peeves is that our universities are producing graduates that know very little about how computers work. My apprehension was recently affirmed when we interviewed a few people for an internship. They had high a GPA, were from top 10 EE/CS schools, and clearly knew how to write functional code. What they didn’t understand was what happens when they compile or run the program. This could be the root cause of sub-optimal in-efficient code that we see everyday. Needless to say that this lack of basic understanding also stifles innovation. I share two stories to show the gravity of the problem.


One candidate we interviewed, who knew coding (in JAVA), did not understand how pointers work. He was honest and up front about it: he learned pointers at one point but forgot about them since he never uses them. When we asked him how a linked-list is stored in memory, he answered “in contiguous memory locations.” However, ironically, when we asked him to write code, he wrote functional JAVA code within a minute. He knew all about public and private variables but had no clue if they are a compile time construct or run-time construct. When we asked him to explain the performance trade-offs in his code, he was again clueless. He is not the only one we have had a similar experience with.
My point: With this focus on JAVA, we are producing programmers that write crappy code without even knowing that its crappy. I appreciate the importance of abstraction layers but obfuscating important stuff that does have serious implications is clearly wrong. We need programmers who know computers.

Another story worth sharing is of a CE student at one of the good east coast schools. The student proposed using a hash table to solve a given problem. His code was functionally correct. When I asked him what is a hash, he had no clue. To him, hash was this black box magic library. He had no idea about hash functions, chaining, probing, etc. Again someone who can write code but doesn’t really know what’s going on. Again, this is not the only interviewee who thinks hash is some kind of magic.

Stories with slightly deeper questions about caches, virtual memory,and cache coherence are so disappointing that I would not even waste your time with them. I think the fault lies in the stress on high-level coding with pre-existing libraries. Students either never learn how to code without those libraries or get out of practice.

Here is my call for action:

If you are a professor,  please try to understand if your university is producing such graduates and try to fix it. If my fear is mistaken, please correct me.

If you are in the industry, please share your thoughts on what you look for in CS/EE candidates.

  26 Responses to “CS/EE Professors, we want graduates who understand computers!”

  1. @FutureChips Just read your site. Teaching iOS development helps address some of these concerns (in my humble view)

  2. My state university taught intro CS courses using C and C++ (though I think they’ve since switched to Java). After courses on data structures, algorithms, operating systems, compiler design, and a couple of crossover EE courses programming for microcontrollers in C and assembly, I think I came away with a fair understanding of pointer management, data structure implementation (linked lists, trees), etc. I was probably somewhere in between the level you want and the level of your candidates.

    Those things atrophied because I didn’t find any entry-level positions that made use of deep knowledge. I’ve spent the last five years working with interpreted languages, solving single-threaded high-level business problems that don’t benefit from the kind of optimizations you can make with deep knowledge.

    In my experience, the software industry does not expect junior candidates to have that kind of knowledge; those are the things you find in listings for developers with 4+ years of experience. So while I strongly agree that these things should be part of a CS/EE curriculum, I think companies need to develop strong graduates into strong programmers by exercising that knowledge or recognizing potential in inexperienced interns/candidates.

    On a related note: That’s what happens when your CS curriculum is entirely Java based. (reddit.com)

  3. I’m a PhD student of mathematics with a strong computational bent. I learned a bit of this stuff in college, but I’ve learned much more by reading about it in my spare time. And… as many computational mathematicians will tell you, we know a helluva lot more about optimization than most computer scientists. Indeed, some of us view math as applied computer science: for us, asymptotically fast algorithms, compiler tricks, data locality and dirty little hacks make the difference between 5 minutes and 5 centuries to solve a particular problem.

    The problem is not with the education system. Remember, a university education is first and foremost an academic endeavor, not job training. Our job is to expand the minds of students and prepare them for higher academics. You can lead a horse to water, but you can’t make it drink. Those of us with passion drink deeply, and the rest will do the bare minimum required to pass their courses. Ironically, those are the ones who you end up interviewing — the really passionate ones are self-starters who don’t go out looking for jobs, or just prefer to stay in academia.

    In short, suck it up and treat recent grads as what they are: inexperienced. You’re going to have to shell out for either a rockstar programmer, or training for your n00b.

  4. If I read it correctly, you’re basically writing the opposite of http://existentialtype.wordpress.com/2011/03/16/languages-and-machines/, which can be summarized as: don’t think about the machine, think about the language itself.

    • I think the point is more along the lines of there are two aspects of writing a program, writing an algorithm this can be done in psuedo-code, and implementing a solution. I’d guess when talking about performance, we’re talking about the latter, while the former is about correctness. In that I think the two articles address different sides of the coin. The performance of the implementation does depend on the hardware being run especially in the parallel world.

      Now there is a balance on how much attention you pay to implementation cost, portability and performance but the program you run is going to be run on a machine. And for all their differences in microarchitecture, they are remarkably similar. When you’re working in a high-level language the amount of control you have should be sufficient to address the mistakes common to almost all architectures. Sure you can argue that it may be better for your purposes to put your variable accesses in a function because you may want to expand the definition into something more complex at a later point but there are many decisions that need to be made with thought being put into how architecture actually works. Why does it matter if something is row-major order or column-major order, contiguous array vs linked list or tree. A basic knowledge of a simple pipeline (doesn’t even have to be a specific pipeline) is enough to help you keep in mind what would be absurdly stupid. Afterwards any more work would require proper profiling, finding the bottlenecks and restructuring your code to eliminate them, rinse and repeat.

      Still I think unless someone is in the business of describing and creating algorithms instead of making implementations a knowledge of the hardware would be very useful.

      • They seem to teach functional programming specifically for parallelism, as functional programming lets the language deal with the parallelism itself. A functional program can be parallelized automatically (as it defines the rules and dependencies, thus allowing the language to do independent tasks at the same time), a machine not (it defines an ordered set of commands, where almost each command depends on the previous one).

        I guess that’s described http://existentialtype.wordpress.com/2011/03/17/parallelism-is-not-concurrency/.

      • > Still I think unless someone is in the business of describing
        > and creating algorithms instead of making implementations
        > a knowledge of the hardware would be very useful.

        Describing and creating algorithms is the core of real computer science. Implementing algorithms using (software) machines is software engineering or applied computer science, but not CS itself.

        • Hi Julian,

          Sorry for the late response.

          I agree that implementing algorithms is different than coming up with algorithms but I disagree with the concept that algorithm developers need not know hardware. However, it is impossible to come up with good algorithms without knowing the underneath computer. Donald Knuth, a great computer scientist indeed, mentions in his book that the choice of algorithm indeed depends on the size of physical memory. Today, caches play am major role in physical memory. Thus, an algorithm developer who does not understand caches cannot come up with the optimal algorithm.

          In fact, algorithms that only think Big-O are often poor choices. For example, look at my post that compares arrays with linked list. Linked lists seem better from an algorithmic standpoint but arrays perform better in real systems. An algorithm designer who understands this will design the algo very differently, perhaps reducing insertions etc.

          Aater

  5. There are very few people out there interested in hardware these days, at least in the universities I have been to. The professors who knew it are now all old-school, and being replaced by people with an interest in things such as HCI. Useful, but quite a long way from the machine as these people tend to have a social sciences or psychology background and very sad if you are losing your people with a low-level understanding. Very few people in the departments seem to know which end of a computer is the pointy one, and a lot of people don’t believe it is important to know.

    • Hi zen,

      I am sorry for the late response. It is clearly unfortunate and that is why I am trying to change. There are many people who agree with you and me on this topic. It is important to teach UX stuff but it is also important to stay in sight of how computers actually work. Apple, the champion of UX, are the perfect example. They have people who understand hardware and software which allows them to write some of the most efficient code there exists.

      Aater

      • I think you’re dead wrong about Apple. And I think you’re dead wrong about the knowledge of professors in universities irrespective of their age.

        The fault with the developer community we are discussing has nothing at all to do with the specializations of individuals. It has to do with the selfish attitude of the generalist; the commodity engineer who can solve any problem. They will solve your legal licensing issues and they will shoot down any suggestion that expertise or specialists are needed for strategic or tactical solutions. They want the work, they want the expressiveness of (many) false DSL’s (that lack any domain knowledge) so they can solve the problem quicker than they did last time.

        Yep. Nothing like being mobile in the community and reusing design and code paid for elsewhere to impress your new bosses and keep those pesky specialists from profiling or optimizing your code. Hey I unit tested it, don’t worry.

        Generalists are as important as specialists. However, the generalist who doesn’t understand the hardware might as well be the V.P at google who came up the idea of throwing cpu’s out the door if they misbehaved, eh?

        remember that utilization of hardware is the only metric that matters, right?

  6. Hi Aater. A fellow semiconductor colleague pointed me to your blog. I’m glad he did.

    In my spare time, I teach a graduate course in Hardware-Software Integration at Portland State Univ. While this course typically focuses on higher-level issues rather than the details of SoC- or embedded-related development, the basic problems are similar. Engineers with a background in HW must understand the basics of SW and vice versa. The tricky part is deciding how much of each other’s discipline does the other need to know. Cheers. — JB

    • Hi John,

      Thanks for reading. I am glad you liked the blog.

      My take is that the amount of required cross disciplinary knowledge is very small. For example, you may have seen my list of Ten things every programmer should know. It is a short list and can be learned by any programmer in a short amount of time. I would love to hear your feedback on the list. Perhaps we need to offer short internet-based courses title “hardware for software guys” and vice-versa. I wonder how many will attend.

      There is a lot of work required in this area but I am optimistic:-)

      Aater

  7. Went to a Java school myself, had to teach C and C++ myself, cos profs were too lazy / incompetent. Love this post :)

  8. This paragraph provides clear idea in favor of the new users of blogging,
    that in fact how to do running a blog.

  9. Thanks for some other great article. The place else may just anyone get that type of
    information in such a perfect method of writing? I have a presentation subsequent week, and
    I am on the look for such information.

  10. I think this is one of the most important information for me.
    And i’m glad reading your article. But should remark on some general things,
    The website style is wonderful, the articles is really excellent : D.
    Good job, cheers

    Check out my web site – desktop wallpaper size 1366×768

  11. Amazing! Its really remarkable post, I have got much clear idea about from this
    paragraph.

    Visit my web-site – desktop Wallpaper free download
    for pc (http://www.cdeducation.org)

  12. Getting desktop wall papers may seem simple to you. You can find thousands of free of charge desktop wallpapers websites these days.

    Also visit my blog wildlife wallpapers high definition free
    download (Monte)

  13. My spouse and I stumvled over here from a different web address and thought I should check things out.

    I like what I see so now i am following you. Loook forward
    to looking at your web page again.

  14. Very rapidly this website will be famous amid all blogging and site-building users,
    due to it’s pleasant articles or reviews

  15. Sustain the spectacular work !! Lovin’ it!

  16. Thanks regarding offering these types of amazing content material

  17. Thanks, this website is very useful

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>