Screen Door


Gretchen and Zoe and Heather have been blogging about the process Microsoft uses for recruiting and hiring.  Once you’ve made it past the recruiter gauntlet, but before you go through the formal interview loop, my team puts the candidate through a technical screening.

The recruiter will usually dig into your background in an effort to weed out people whose technical skills aren’t strong enough to make it worthwhile for us to spend our time talking with you (if you can’t code, then sorry, but you don’t have a place on our team), but just because you pass muster with the recruiter doesn’t mean you have what it takes to survive here.  We use the technical screening to give your technical skills a thorough beating.

And beat on you I do.  My typical screening goes something like this:

  • Typical “Hi, how are you, would you like something to drink” getting-to-know-you chit-chat.  This is a blatant attempt to make you comfortable while I prepare my attack.  <g/>
  • Design/coding question.  I use a real-life task I had some time back.  It’s not especially hard, but it’s not easy either.  As is often the case when coding, there is no one single right answer.The straightforward answer is a procedure or two.  There’s also another solution that is ever so much better.  This is the second most important part of the screening.  I’m looking at such things as:
    • How do you approach the problem?  Do you ask a bunch of questions and then code non-stop, or query and code in a continuous intermix, or code without any further investigation into the problem, or…?
    • How do you write code, and what kind of code do you write?  Do you start with pseudocode, dive right into your language of choice, or some mixture thereof?
    • What language do you decide to use?  How facile do you appear to be with it?
    • Do you start at the beginning and work straight through to the end, start at the beginning and take various detours on your way to the end, start at the finish and move backwards to the start, start at a random point and work out from there?
    • Do you think about topics like security and internationalization?
    • Do you follow accepted coding standards for the language you are choosing?  Coding in a .Net language and not following the .Net Design Guidelines (http://msdn.microsoft.com/library/en-us/cpgenref/html/cpconnetframeworkdesignguidelines.asp) is a major black mark against you.
    • How do you debug your code?
    • Whenever you decide you’ve finished:  Tell me how you would test the code you just wrote.  Bonus points for talking about this without prompting from me — especially if you tested your code as you wrote it.
    • OO design question.  There are several obvious answers that are also wrong, and a somewhat-less-obvious answer that is what I’m looking for.  However, there is another answer that would make me very happy.
    • What programming language do you know best?  What programming language do you like best?  Why?  Compare contrast both against C# (or C++, or VB, depending on your answers).
    • What are your technical strengths? 
    • What are your technical weaknesses?
    • Define the tester mentality.
    • What would be your optimum mix between manual testing, writing test automation, and writing test frameworks?
    • How do you test your own code?

Not the easiest hour you’ll ever have, eh?  Those last few questions may seem somewhat out of place.  Others will drill into your testing skills in much more details, certainly.  However, I’m not only evaluating your technical skills — I’m also evaluating how you will fit in with my team.  Understanding what you think testing is all about helps me do that.

I said earlier that the design/coding question is the second most important part of the screening.  The most important part isn’t a particular question but rather your overall attitude.  I’m looking for passion:  passion for testing, passion for design and coding, passion for the customer — passion.  Why do you want to be a tester?  What side coding projects do you have going?  Curt over at The Occupational Adventure (sm) has helped me realize how important passion is and how much more productive someone who is passionate about a topic will be than someone who is just doing their job. 

If you’re a stellar tester or designer or coder but don’t have passion for the work my team is doing, you don’t have a chance of joining my team.  If, on the other hand, you demonstrate abundant passion in areas where we are working, but your testing or designing or coding skills aren’t quite up to par, you have a good chance.  We’ll help you grow your skills if you have the passion to make doing so worthwhile.

And if you a stellar tester and designer and coder, *plus* you have immense passion for the areas we’re in, well — email me right away!  <g/>

*** Comments, questions, feedback?   Or just want a fun job on a great team? </g>  Send two coding samples and an explanation of why you chose them, and of course your resume, to me at michhu at microsoft dot com. I need testers, and my team needs a data binding developer, program managers, and a product manager. Great coding skills required for all positions.

Comments (18)

  1. Flatlander says:

    micahel: "The design/coding question is the second most important part of the screening. The most important part isn’t a particular question but rather your overall attitude." Amen. Ability is important, of course it is, but ability without commitment, enjoyment or

  2. Modian says:

    "Do you follow accepted coding standards for the language you are choosing? Coding in a .Net language and not following the .Net Design Guidelines is a major black mark against you. "

    How strict is this? The guidelines ay not to use Hungarian notation and not to prefix field variables. I do both in C# out of habit from C++. Plus I prefer it because it’s easier to read when I print code or am quickly skimming and I can tell instantly what is a local variable, what is a member variable and what type they are. I can’t stand camel cased variables which is one reason I hated Java. So would that be a black mark if I did something like "int nCount = _arrItems.Count;"?

  3. The Braidy Tester says:

    Yes, that would be a black mark. We (Dev and Test) follow the .Net Design Guidelines stringently, FxCop everything, yadda yadda yadda.

    Of course, just because you get a black mark doesn’t mean you’re out of the running. <g/> We know that not everyone has found the Design Guidelines religion yet. If you do well enough on everything else we’re willing to train you up.

    But if you really do prefer Hungarian notation and prefacing variables, and you really don’t like camel cased variables, then you are not going to be happy on my team.

  4. PeteB says:

    "The guidelines say not to use Hungarian notation and not to prefix field variables"

    I thought private member fields should be prefixed with an underscore, or has that changed now? I can’t find the original guidelines doc which stated that, and in some of the examples in the class library guidelines they weren’t..!

    I must admit, I do miss the hungarian notation too (especially for just glancing at code and seeing the type), and sometimes wonder what the rationale for the change was. Is it maintenance, or that the IDE can tell you the type, or just that Simonyi left 🙂 ?

  5. Andrew says:

    Passion is something I’ve been recently thinking about a lot too, but from a slightly different perspective. You talked about the hugely important need to hire engineers with a lot of passion, but all of that effort is for nothing if the organization doesn’t maintain that level of passion in its people.

    There are so many ways to suck the passion out of people. Constant sustained overwork will burn a person out, too little work can turn an engineer into a lethargic ghost, endless repetitive work will reduce someone to an automaton (love the Sacrifice One Person pattern!), layoffs get everybody looking over their shoulder, and so on, etc, yadadada.

    The solution, as I see it today, is to ensure people are always thinking. In my experience a thinking engineer doesn’t get bored, gets vocal before crossing the burnout event horizon, is constantly learning and inspires creativity and passion in others. Of course creating and maintaining a thinking environment is easier said than done, but I see it as a key part of a technical lead’s role.

    Too many places hand out technical lead roles to engineers whose main skill is being good at blowing their own trumpets (environments that encourage code ownership and fiefdoms seem particularly prone to this). For me it’s almost the reverse. A technical lead should be the one ensuring everybody else on the team is thinking and that all the thinking is heading in the right direction. Managers typically struggle with this as they lack the visibility into the current state of each contributing mind that comes from a day-to-day immersion in the technical depths of a project.

    Hmmm, I seem to have meandered somewhat. I should probably stop now.

    Andrew

  6. Random Interviewer says:

    Wow, I can’t believe style would be considered a "black mark". That seems very inflexible. Over the course of a career, most developers and testers will work with a variety of coding styles, idioms and even programming languages. Every time you join a new team your coding style has to alter – sometimes slightly, sometimes a lot – so that you can understand and contribute to the existing style of the team. Heck, 5 years from now we might all be coding in D-Sharp instead. I can easily teach you where you should put your curly-brace, but I can’t change the way your brain works at the higher levels. To penalize somebody because their last job liked the m_ prefix for members and thats what they instinctively write is a good way to miss out on great employees.

    When I perform interviews (admittedly for dev and not test positions), I’m much more interested in how the candidates think rather than the details of their variable names (as long as they’re not just x, y z of course. 🙂 ). Do they understand the concepts of computer science? Can they analyze a problem and apply the appropriate algorithms? Do they understand various tradeoffs involved in their decisions? Can they decompose a complex problem into solvable chunks? Can they recognize security issues in their design (andor code)? Is their code (regardless of style) clear and maintainable? Is it well thought-out, with a clean design, good error handling, and a usable interface, etc, etc, etc.

  7. The Braidy Tester says:

    Of course I’m looking at those other aspects as well, and giving great weight to them. However, different languages have different accepted styles. A candidate that pretends to write C# but in fact seems to be writing C is a danger sign.

    Whether you follow the Design Guidelines is just one data point, but is an important one.

  8. Hey Michael,

    Had a look but couldn’t find what team you work with. In your post you noted that you were looking for passionate people who could code to join the team in roles like Program Manager (the job I’m looking for at Microsoft).

    But, without knowing what the team really does it’s difficult to tell if I’m passionate about it.

    The coding samples aren’t a problem (I ‘grew up’ as a designer and developer), but I don’t want to waste your (or my) time.

    Feel free to drop me a line: jeremy AT ensight.org.

  9. Anon says:

    LCA will probably not be excited about you soliciting and reading third party code.

  10. [Serializable]

    public class CustomRemotableException : RemotingException, ISerializable {

    private string _internalMessage;

    public CustomRemotableException(){

    _internalMessage = String.Empty;

    }

    public CustomRemotableException(string message){

    _internalMessage = message;

    }

    public CustomRemotableException(SerializationInfo info, StreamingContext context){

    _internalMessage = (string)info.GetValue("_internalMessage", typeof(string));

    }

    public override void GetObjectData(SerializationInfo info, StreamingContext context){

    info.AddValue("_internalMessage", _internalMessage);

    }

    // Returns the exception information.

    public override string Message{

    get {

    return "This is your custom remotable exception returning: ""

    + _internalMessage

    + """;

    }

    }

    }

  11. The Braidy Tester says:

    Yes, you would get dinged for using an underscore. You use it consistently, though, so that’s a point in your favor. Your code is organized in a logical manner, so that’s another point in your favor.

  12. Ah hungarian, it’s a religous issue. My problem with the "banning" of hungarian is the usual justification given, in that Intellisense will tell you what type an object is. Which is nice.

    What’s my problem then? Simple. Not everyone uses Visual Studio. Not everyone has intellisense turned on. There’s always the situation where you fire up notepad to fix just one small tiny problem on an aspx page. Where’s intellisense then 🙂

    I enjoy arguing this, doing it in an interview would be a bonus. Heh.

  13. I tech screened a tester this morning for a position on my team. I always ask the candidate to describe

  14. So you made it past the Recruiter? Now what?? As a follow-up to my post on HR Screens , Michael Hunter

  15. So you made it past the Recruiter? Now what?? As a follow-up to my post on HR Screens , Michael Hunter , a Test Technical Lead here at Microsoft, posted his thoughts on the equally (if not more so) dreaded &#8220; Tech Screen .&#8221; Not all teams choose

  16. So you made it past the Recruiter? Now what?? As a follow-up to my post on HR Screens , Michael Hunter , a Test Technical Lead here at Microsoft, posted his thoughts on the equally (if not more so) dreaded &#8220; Tech Screen .&#8221; Not all teams choose