I did a technical interview for Neudesic earlier in the week that has left me pondering the interviewee’s response a bit. It’s been bugging me so much that I decided to do a post. Normally, I wouldn’t post on the results of an interview, but this one is important because it’s on a subject that I feel very strongly about, and I’m interested in other’s opinions.
You see, my educational background is as a computer engineering/computer science major. That means that I’m educated in chemistry, physics, magnetism, electricity, electronics, differential and integral calculus, statistics, numerical analysis, differential equations, discrete math, and linear algebra, among other topics. In fact, in my career, I’ve actually used a lot of these topics, especially the mathematics when I was doing finance and retail. One subject that I’ve found a use for almost every day of my career has been data structures and algorithms.
When I do technical interviews, I like to challenge my interviewees with problems of increasing complexity. Actually, they sound complex, but if you were to apply basic computer science concepts to the problem, the problems are quite easy to solve. For example, I usually ask a question that involves sorting an array of randomly sorted data and performing a binary search of that data. I’ll usually allow the interviewee to say “sort the data,” but I’ll give them bonus points if they can say to use the QuickSort algorithm. I don’t ask anyone to write the sorting algorithm for me. To be perfectly honest, I’d have to look up the exact algorithm because I don’t keep it in my head and most frameworks provide it for you automatically. But the most important thing is that if I needed to do it, I could and I know how to find the information. However, I do expect my interviewees to know how to perform a binary search, because it’s so damned easy.
I also like to ask questions involving recursion. Recursion is such a valuable tool, especially when searching through hierarchies. I like to ask interviewees if they know the difference between an array, linked list, stack, queue, and dictionary, and what the benefits are of one over another, or how they decide whether to apply them or not to a solution. I rarely ever get to ask anyone about red-black trees or graphs, although I really want to.
This specific individual sent me an email Monday evening after his interview and told me that (paraphrasing) while the academic topics are interesting, their value is becoming less and less over time because frameworks such as .NET make them useless. The question that I’ve been struggling with is: can this be true?
Are linked lists obsolete? Do I need to have the knowledge about singly-linked lists, or circular lists? Do I need to know about the QuickSort algorithm or how to do a merge sort? Do I need to know about B-tree or B+ tree indexes, even though I’ve rarely had to ever write one myself? What about binary trees or how to implement a red-black tree? Is all of that knowledge obsolete because of the .NET framework? Do these algorithms no longer apply in the modern age of software development?
It seems to me that I don’t come across many computer science majors anymore and that’s unfortunate. I see a lot of Computer Information Systems or Management Information Systems majors, but very few actual Computer Science major. I think that it’s unfortunate. While I know and respect many with CIS or MIS degrees, I feel that it’s unfortunate that they don’t have the knowledge that is typically studied during the normal Computer Science curriculum. I also feel that it’s unfortunate that some that are graduating with CS degrees also don’t have a command of computer science theory, data structures, and algorithms. I feel unfortunate that few know or understand Big-O notation.
While I’ve never read it, I remember the title of Niklaus Wirth’s book “Algorithms + Data Structures = Programs.” That has been the mantra of my career: the application of the right algorithms with a strong set of data structures to support them.
I’m just interested in the thoughts of others. If you read this blog, tell me what you think. Am I wrong to insist on a general knowledge of computer science theory including data structures and algorithms out of modern software developers, or am I holding onto a former age of computer science and software development that is no longer applicable in the modern world?