One of my interests is the ‘art’ of coming up with questions and problems to use when interviewing software developers. It should be evident that the questions you ask in an interview will be based on what you think are important characteristics and traits for good developers to have. Therefore, trying to come up with good interview questions is effectively asking ‘what do I think is important for a developer to do/have/be?’ Once we know what we expect from a good developer, we can progress in certain ways, like improving university courses etc.
I plan to have a series of interview techniques posts, of which this is the first. This post focusses on purely technical questions to ask a developer in an interview.
By ‘technical knowledge and understanding’, I mean things like OO theory, relational theory, use of UML etc, and not things like which C# namespace to use in a particular case. I consider such knowledge to be necessary but not sufficient for a good developer. A developer cannot write code without understanding these concepts, and conversely somone who understands these concepts is not necessarily a good developer. I feel that these technical questions should be the first questions asked in an interview, but certainly not the only questions. They are just the beginning.
I also want to make clear that often candidates are given automated tests that test things like whether the candidate knows which namespace to use for a task. I don’t consider these tests useful, because a. this knowledge can be easily looked up in a just-in-time manner, and b. just because you understand how engines and gearboxes work doesn’t mean you can drive a car.
I have built up this list over a number of months, while interviewing candidates, and discussing with colleagues what kind of knowledge we’d like fellow developers to have. The list is graded, so that certain questions follow on from earlier questions, and shouldn’t be asked if the candidate does not give a satisfactory answer to the earlier question – if the candidate doesn’t know what generics are, there’s no point asking about the difference between IEnumerable<> and ICollection<>.
So, forthwith, my list is below. Please comment if you have any suggestions.
- OO Programming
- Describe object oriented programming.
- Contrast it to another paradigm (aspect-oriented, functional etc)
- Explanations of:
- Design patterns
- Value and reference types
- Classes and Structs
- Casting and boxing
- Access modifiers (public, protected etc)
- Abstract, virtual
- Difference between an interface and abstract class
- IEnumerable<> vs ICollection<> vs IList<>
- Nullable types
- Anonymous delegates
- Web services
- WSDL, SOAP
- Relational Theory
- Object-relation impedance mismatch and O/RM
- If used ADO.Net, ask about how to translate between DataSet etc to objects and vice versa
- Relational Theory
- Describe MVC
- Compare with other architecture (Winforms, MVP etc)
- Version Control
- Why use version control
- Which systems used
- Different locking models
- Branching & merging
- Unit testing
- What is unit testing
- Unit test systems used before
- Unit and integration testing
- Difference between stubs and mocks
- Card shuffling algorithm design
- Object orientation