Two of my former grad. school professors published a short article criticizing the modern academic curriculum as practiced by the majority of the computer science programs. While something tells me that Dewar and Schonberg may suffer from the Auld Lang Complex (diminishment of things present and glorification of things past), I can't help but wonder -- why do so many of the recent graduates from today's programs in comp. sci. have absolutely no depth to their knowledge ?
Someone who has just graduated with a bachelor's degree in computer science must:
- Demonstrate a basic knowledge of operating systems and computer architecture concepts. This includes Turing machine, Von Neumann, NUMA, SMP, multiprocessing, threads, concurrency, locks, semaphors, etc. When asked you should be able to say what you think is the most interesting aspect of modern computer architectures and discuss why.
- Demonstrate basic understanding of programming languages. At the very minimum you should be able to read source code in just about any commonly used language and identify what it does. By the time you graduate from a 4-year program you should've identified your preferred language and be able to discuss why.
- You must have basic understanding of human-computer interaction and GUI concepts. I don't care if the course on GUI design is not required. You should be able to think critically of user interfaces that you use and you should be able to describe the components, the layouts and the event handling of a simple GUI application.
- Display basic knowledge of data structures and algorithm analysis. At interviews I don't ask complex algorithms and automata theory questions. However, I do expect the candidates to demonstrate ability to eye-ball the time-complexity of a search and a sort algorithm.
- Demonstrate basic knowledge of tools. Pretty much all comp.sci. programs make students write simple projects. You have to understand what a compiler does and what a debugger does. If you claim you know how to use a particular OS then you should also be able to discuss commonly used tools and techniques.
- Demonstrate basic problem solving abilities and out of the box thinking. This one is somewhat hard to judge and I've been attempting to come up with a good line of questioning that can help tell a problem solver from someone who requires handholding.
- Finally, you have to be able to identify an area of interest in computer science that you are passionate about and discuss it. You have to demonstrate general curiousity about technology, problems and solutions.
Now, if you have a Masters or a few years of experience, or both. I would like to see the following:
- Demonstrate knowledge of all the basics as above.
- In addition to the basics you should be able to debate the specific implementation of the frameworks and tools you use. For example, a common question I ask at interviews is how does a ConcurrentHashMap work in Java ? If you say you've looked at the source code because you were curious then I will most definitely recommend you to my boss. If you haven't I expect you speculate and discuss pros and cons to different ways of implementing it.
- Have a common theme to your experience and a story. For example, if you have a masters then you should be able to discuss your area of concentration, why you chose it, etc. If you have years of experience then I'd like to see some commonality to each of your projects, some sort of a developing narrative. Noone writes software in a vacuum so you must have some business or application area of interest, i.e. financial, manufacturing, inventory management, healthcare, etc. There must also be an identifiable thread to your contributions -- i.e. improvements to engineering process, software quality, refactoring, reducing costs, etc
Last year I read "Java/J2EE Job Interview Companion" (see my review) and, frankly, I don't think that book is helpful as an interview prep material. I am now contemplating my own pet project of an interview prep guide and I will be posting more ideas over the coming weeks.