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.