Recently, a developer needed to undergo a tech interview at US immigration:1
This may surprise some people I've worked with, but I didn't have formal computer science training in school. I'm not actually a computer science major. Yet I've worked as a software developer for more than a decade now. Literally zero times have I needed to write a sorting function or balance a BST.
I have a rudimentary understanding of some sorting algorithms (mostly just bubble sort and selection sort), and I have some idea of how to balance a BST. And if I needed to implement any of those I could probably whip something up after a few tries. (Something buggy and/or inefficient probably.) If I had to interview at a company that used one of these whiteboard interviews, there's a good chance I wouldn't pass.
For maybe 90% (or even as high as 99%) of modern-day programming work, it simply isn't needed to know these things by heart. Those skills are more necessary if you're doing low level things like writing an OS or a graphics driver or such. For everyday web development or Java or Rails or whatever, it's an indulgence. And even for those instances that you need them, well, the internet is right there.
I'm not a fan of the idea that not knowing data structures and algorithms means you aren't a real software developer. I have a couple of developer friends who jokingly refer to themselves as “fake devs”. It's supposed to mean someone who doesn't have any formal computer science background and has at best a passing familiarity with data structures, algorithms, and other computer science concepts. As one of them stated “I wouldn't know how to make a map without using a map.” (I thought about writing a post about that, but it's surprisingly easy – just look it up.). One of them even asked me to give them a quick crash course in data structures and algorithms because he was applying in a large and well-known software company.
For me, this term is silly. If you're doing software development work, then you're a software developer.
I'm not saying knowledge of these things isn't useful. If you want to do more complicated work it is certainly useful to have these tools in your toolbox. Knowing them also makes you more flexible and expands your thinking. And certainly one should be the type of developer who is willing to seek out that knowledge if it turns out you need to use it.
But the problems with the whiteboard interviewing process isn't that they require knowledge of these things; it's that they require it under pressure, off the top of your head, without access to the internet. This doesn't reflect how programming work happens in the real world, where you often have a team, an IDE, and even the entire internet to help you.
Unfortunately, it's often far too costly for companies to evaluate you under real-world conditions, so many resort to this common interviewing process. After all, it is difficult to evaluate the performance of even developers you have been working with for months, what more someone who just whipped up a short function on a whiteboard in twenty minutes? We tried some variations on it at our last company, but for me it is a problem yet unsolved. Maybe someday…