I will probably regret it, but here is my general FWIW tip
1) Observe the interview for the candidate, not the specifics of the job.
You have a minimal set of Essential's in your specification that you will not compromise on, then look at the candidate and see what other skills they will bring to their place - they may even bring skills that you did not know what you needed.
2) Test the candidates
A test may consist of several verbal questions, a written test, etc. It doesn't really matter, but you definitely need to understand what the candidate knows and what they don't know.
3) Have candidates write code
You will learn more about someone, how they approached the problem, how they implemented it and more importantly, how they explained what they did to you than anything else. Remember that this is what you hire for them, this is what they will spend most of their time on
4) Do not ask a lot of questions about memory
Asking someone to remember the exact format of std :: algorithm or all methods in System.Xml.XmlDocument has no purpose. People use documents and Intellisense overcome this.
5) Ask open-ended questions.
Ask a few questions that do not have a “right” or “wrong answer” - this way you give the candidate the opportunity to offer their opinion, and you have a conversation, rather than an illustrious “tick list”. Two-way conversation helps because it allows the candidate to relax and just as importantly, it allows you to relax. The discussion can tell you a lot about the candidate, and they listen to your opinion about how they react to the counter-arguments.
6) See if they did their research
Always ask a candidate if they have heard about your product / team / game / company. If they cannot tell you just a little about the company they are contacting, then you do not want them to be in your company. It will take 30 seconds to type on Google, so be cruel about it. Believe me.
7) Do not interview yourself
You can be super smart, you can know what you want, you can think that you can read people, but software development is primarily a collaborative effort to get into a couple of people and just not get into another manager or senior coder - bring your team and listen to their opinions. The main thing is to catch up later and discuss the candidate while he is still fresh in your mind.
8) Do not rush to interview
The time spent on the interview depends on the type of position that you spend for the younger, experienced, senior, but always give yourself an extra hour for how long you consider necessary. It gives you the opportunity to breathe, and if you do it early, then good. If necessary, go to a second interview. I often do two interviews - the first is technical, and the second is more focused on the individual and the team.
You may not feel that it is suitable, or you do not have time, but do not discount it. If you feel that you did not have enough candidates for the first time, and still have the potential, then return them back. If they want to work in your company / team, they will return.
9) Ask for evidence
If the candidate says that “made a significant contribution to development ..... then ask them what they did, in detail, what they learned from experience and what they will do again. If they cannot give you evidence and details, most likely they didn’t make a significant contribution. Beware of candidates who use “we have been doing all this time.” Of course, development is done in teams, but they should be able to say what they have done and describe the team’s efforts.
10) Be prepared to be honest and frank.
Most candidates resell themselves slightly. That's great, their resume is what gives them an interview. However, if you think that the candidate is not completely in your own experience, then say so. Make sure you learn the strengths and weaknesses. Too many interviews end up being a continuation of the exchange. Yes, it’s great that the candidate knows what UDP is, but does he know when they made a bad decision and how they handle it? Ask them the last time they were wrong or the last bad decision they made. Be careful not to be too heavy or judgmental, although mistakes in use are absolutely natural, and most of us do all the time how we deal with this is important.
11) Do not take into account.
Theres a fine line between knowing your things and thinking youre better than everyone else. In a knowledge-based profession such as programming, this is always a temptation for all of us. I agree with Jeff Atwood on this. A good programmer knows that coding is complicated, and that they make mistakes, and their code sucks a lot of time. Bad programmers don't think - they think every elses code sucks. Caveat Emptor.