So we’re hiring another senior developer for our team at my day job, and I’ve spent a fair amount of time in the last week brushing up my list of questions (and coding exercises). There are tons of posts strewn across the web of developer interview questions, but I thought I’d add my own thoughts to the mix. Here are the questions you’re likely to encounter should you interview with me.
Tell me about your general experiences.
I will ask you about past projects you’ve worked on, and I’ll dig in to anything you’ve listed on your resume. If you call out a technology or API, I will ask you why you used it, if you looked at alternatives, and what you thought about it. I’ll ask you for specifics about how you’ve contributed to teams in the past. I won’t ask you about every single thing on your resume, but it’s all fair-game. I’ll push you and challenge you, not necessarily because I think you’re wrong, but because I want to gauge how you react and to see how confident you are in what you know.
Tell me about object-oriented design.
I will absolutely ask you questions about OO design. I expect any senior developer to be very familiar with the concepts, and more importantly, to understand how to apply them (and why!). You’ll earn big bonus points if you correctly define encapsulation (hint: wrapping fields behind properties is only a small part of encapsulation). I will ask you if you are familiar with SOLID. Answering “no” is not necessarily the end of the interview, but it’ll be a strong mark against you. If you answer “yes”, be prepared to define the principles and why they’re useful.
What design patterns have you used?
While I can possibly forgive a senior developer for not being familiar with the acronym ‘SOLID’, I’m a lot less forgiving if someone isn’t familiar with design patterns. I don’t expect you to know them all, but you should be able to name off a few, define them, and explain how you’ve used them in a real application.
What’s the coolest thing you’ve ever done?
I want to know what class, API, or system you’ve worked on that you’re most proud of. I will ask for details. I’m looking for a few things when I ask this question. I want to see if you have indeed worked on anything cool, and I want to see if you’re passionate about what you’ve worked on. You would be surprised how many people I’ve posed this question to that will sit silently for a few minutes before saying “I can’t really think of anything.”
How do you learn about new things?
As software developers, we’re going to be challenged with new problems on a fairly regular basis. If that wasn’t the case, all software would truly be an off-the-shelf commodity or something that business people could create using wizards. What do you do when you encounter a new challenge? What do you do when you have to use an API you’ve never used before? How do you even determine which API you should use? I’ll ask you detailed questions about your process. If you learn mainly from books, I’ll ask you which you’ve read recently. If you learn through Googling, I’ll ask you if you’ve found certain sites to be more useful than others. Who do you look up to? What bloggers do you follow? I’ll ask you to walk me through a recent problem you had that required you to learn something new and how you went about it.
Tell me how you’ve used (library/API/etc X)?
Depending on the position you’re being hired for, I will ask you specific questions about various libraries, languages, tools, APIs, etc. that you have either listed on your resume or that you will be required to use as part of your job if you are hired. This will almost always include things such as T-SQL, jQuery, ASP.NET, and MVC. If the position description calls out a specific library or language, expect questions about it. For example, I almost always ask C# developers if they know the difference between ‘throw;’ and ‘throw ex;’. I also will ask you to explain the purpose of database indexes and the impacts they can have on performance (hint: they don’t always “make things faster”!)
Can you write code?
The final thing I’ll ask you to do is write or evaluate some code. I don’t mean on a whiteboard or something like that, I mean in the IDE. While I understand and appreciate how uncomfortable it is to write code while someone is judging you, it’s a necessary test. Yes, it’s going to be a little awkward, but it’s still pretty obvious when someone is or isn’t comfortable writing code. I’ll likely also show you code samples, both good and bad, and ask for some feedback. Some will contain very obvious bugs, some will contain design problems, and some will contain subtle violations of good OO design principles.
Do you have any questions for me?
Ok, so I do have one more question. I’ll ask you if they have any questions for me. This is a great opportunity to find out if the position is right for you. When I’m asked this question by a developer, I will always ask them to walk me through their typical day. I highly recommend you do the same.
Most of the questions I’ll ask aren’t immediate pass/fail types of things. I’m using them to carry on a conversation with whomever I’m interviewing in the hopes that I can gain insight into their strengths, weaknesses, and general fit. If you’re being interviewed, don’t be afraid to stand your ground or voice your opinions. Having strong opinions (within reason) is actually a good sign in my opinion, as it means you’ve been creating software long enough to have found things that do and don’t work for you.
What about you: do you have questions you like to ask candidates? Have you ever been asked something you found unusual or intriguing during a (software development) interview? If so, speak out in the comments!