Preparation and Dress code
You need to prepare well for all steps in the process.
- Research the company. Know the culture, the vital stats (HQ location, CEO name, number of employees, primary technology).
- Research who you are talking to. Company about pages and LinkedIn are your friend. If you know what your interviewer likes and doesn't like, you can present the side of you that best fits. It's up to you how far you want to take this process.
- If this is a phone screen, have some water ready, a copy of your resume you sent them, and all your prepared answers and summaries. Make sure to lock the door and turn off all distractions.
- If this is a personal interview, pick your clothes well. For CS, you probably want no more than business casual. Definitely no formal suits or ties, unless it's a vibrant tie and some wacky shirt. Definitely don't wear another company shirt. I tend to avoid wearing the logo of the company I am interviewing as well, it just seems shallow.
- Practice coding on a white board and in google docs. You need to learn to manage space.
How the Process Works
Thirty minute phone screen
This is usually your first contact with the company, done over the phone with a HR person. Expect to be quizzed about your resume (past work, projects, etc) and your goals (ideal company environment, location, what you are looking for). This is the psycho-screen. If you are a normal person and seem to fit with the company culture, the process moves on.
The next step may or may not be a coding challenge. This is usually a simple task on some collaborative site such as hacker rank or top coder, where you are given a problem and a hard time limit, and told to solve it. You will need live and working code, that passes all the tests. It can also be a challenge where you just write dry code (never ran) and submit that.
This is what people traditionally think about when you say technical interview. Expect a 30-120 minute phone call, where you solve multiple problems. Usually you use google docs or some dry environment, so you will have no syntax highlighting, spell check, or an opportunity to run your code. I suggest having headphones and a mic so your hands are free to type.
This process is iterative. At first, you will be asked a simple question, where efficiency does not matter. You just need to get a solution on the board. Once you do, they will ask you to either optimize the problem, or add some caveat that makes it harder. Once you get that done, there is often a third complication, in the form of some crazy memory or runtime limits.
Some handy tips - always clarify the problem. Is the input sorted? Are there any crazy memory or runtime constraints? Once you determine the problem, take some time to discuss the general approach you want to take, clear it with your interviewer, and dive in. Remember, it's OK to ask for help! If you forget some library function, ask. Worst case scenario they say no. Just don't ask too much.
While solving the problem, talk out loud and often take a look at the original problem to make sure you are still on track. Don't silently think for 15 minutes - talk out loud, describe what you are working on, and explain why you chose that approach and why it works.
Once you have code up, walk through it and run some test cases. If you are doing a live interview, turn back to your interviewer with a smile and ask what they think.
Topics To Know
For the phone screen
- Know your resume well. Be able to summarize what you did at a job, what was hard about it, and what you learned. These should be ready snippets. I keep an alternate resume with all of these answers made ahead of time.
- Prepare a 30 second summary of your background, and a 2 minute summary. Practice both, and know them well.
- ALWAYS prepare questions to ask at the end. My personal favorites are a deep question relating to the person's interests, or asking why they chose this company over the plethora of options they had. I also like to ask for book recommendations, one technical and one pleasure reading.
For the technical interview (phone or in person)
- You will need to know everything you learned in any data structure and algorithms classes.
- Know the following: strings, arrays, stacks, queues, linked lists, hash tables, and binary trees. Know when to use them, how to use them, and the time/space complexities of each of their operations.
- Be able to write good recursive code, and know general algorithms (divide and conquer, brute force, DFS, BFS, sorting, searching, and tree traversals)
- Also handy to know is memory management, concurrency solutions, API design, and various database schemas.
- Here is a handy zip with some books and guides.