Archive

Posts Tagged ‘recruiting’
  • You're not a compiler!

    Passed exam

    :page-liquid: :icons: font :experimental:

    At conferences, it’s common to get gifts at booths. In general, you need to pass some some sort of challenge.

    == An innocent puzzle

    Some of those challenges involve answering a code puzzle, like the following:

    [quote] __ What would be the output of running the following snippet:

    [source,java]

    public class Sum {

    public static void main(String[] args) {
        System.out.println(0123 + 3210);
    } } ----
    

    . 3293 . 3333 . The code doesn’t compile . The code throws an IllegalArgumentException . None of the above __

    My usual reaction is either to leave the booth immediately, or if I’ve some time, to write the code down on my laptop to get the result (or search on Google). You could say I’m lazy but I prefer to think I’m an expert at optimizing how I spend my time.

    == Simple but useless

    There is a single advantage to this approach: anybody can grade the answers - if the correct results are provided. And that’s all.

    Otherwise, this kind of puzzles brings absolutely nothing to the table. This wouldn’t be an issue if it stayed on conference booths, as a “fun” game during breakouts. Unfortunately, the stuff has become pretty ubiquitous, to filter out candidates during recruiting or to deliver certifications.

    In both cases, skills needs to be assessed, and the easy solution is through a multiple-choice question test. Of course, if one has no access to an IDE nor Google, then it becomes a real challenge. But in the case of the above sample, what’s being checked? The knowledge of a very specific corner-case. This specific usage I would disallow on my projects anyway for this exact same reason: it’s a corner-case! And I want my code to be as free of corner cases as possible,

    == Another sample

    This is also another kind of puzzle you can stumble upon:

    [quote] __ In the class javax.servlet.http.HttpServlet, what’s the correct signature of the service() method?:

    . public void service(ServletRequest, ServletResponse) . public void service(HttpServletRequest, HttpServletResponse) . public int service(ServletRequest, ServletResponse) . public int service(HttpServletRequest, HttpServletResponse) . protected void service(ServletRequest, ServletResponse) . protected void service(HttpServletRequest, HttpServletResponse) . protected int service(ServletRequest, ServletResponse) . protected int service(HttpServletRequest, HttpServletResponse) __

    This kind of question asserts nothing but the capacity to remember something that is given by the most basic of IDEs or the JavaDoc.

    NOTE: In fact, the complete title of this post should have been “You’re not a compiler, nor a runtime, nor the documentation”.

    == The core issue

    There is no single proof of correlation between correctly answering any of the above questions and real-world proficiency of applying the skills they are meant to assess. Is there an alternative? Yes. Don’t simply check shallow knowledge, check what you want to assert, under the same conditions, including IDEs, documentation, Google, etc.

    • You want to check if candidates are able to read code? Make them read your own code - or similar code if your code is secret.
    • You want to check if candidates are able to write code? Make them write code e.g. fix an existing or already-fixed bug.

    The same can be done in the context of certifications.

    Of course, the downside is that it takes time. Time to prepare the material. Time to analyze what the candidate produced. Time to debrief the candidate.

    Is this feasible? Unfortunately for those who would cast that aside as an utopia, it already exists. The best example is the https://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=654&get_params=p_id:164[Java EE Enterprise Architect^]. Though the first step is a multiple-choice questions test, other steps include a project-like assignment and an associated essay.

    Another example is much more personal. I’m working as a part-time lecturer public in higher education organizations. In some courses, I evaluate students by giving them an assignment: develop a very small application. The assignment takes the form of specifications, as a business analyst would.

    == Conclusion

    For the sake of our industry, let’s stop pretending puzzles are worth anything beyond having some fun with colleagues. You should be more concerned about the consequences of a bad hire than the about the time spent on assessing the skills of a potential hire. There are alternatives, use them. Or face the consequences.

    Categories: Miscellaneous Tags: hiringrecruitingcertification
  • The sad state of developer interviews

    Recruiting is a complex process, and recruiting developers even more so. In this post, I will focus solely on the interviewing part (and leave the rant about recruiters who are paid 1 year of the candidate’s salary to just match buzzwords for another time).

    I recently stumbled upon an article about interview questions, again, telling you about “right” answers for such and such questions. There are plenty of such articles on the World Wide Web, full-fledged sites dedicated to this topic and a couple of books too. A few of them are “free”, the others paying. But let’s be straightforward: I believe it to be complete and utter crap. Now that it’s said, let me develop.

    First, a little explanation about my experience in such matters is in order. I’ve been working around 15 years in the software industry as a consultant, so that I’ve been interviewed a lot by employers and customers alike. Also, I’ve been on the other side - technical recruiting, either alone or as a part of a recruiting task force.

    Here are some examples of the situations I’ve experienced as an candidate in no particular order:

    • The lightweight interview:  - "Do you know this?"  - "Yes"  - "And that?"  - "No, but I can learn"
    • Multiple-choice questions on a very specific subject (EJB). Interestingly, albeit passed with not a bad score (28/30 if I remember well), I was not chosen
    • Multiple-choice questionnaire. Then, on some questions, I asked about the context because different answers could apply but the person who made me pass the test couldn't answer.
    • Multiple-choice questionnaire again. But a question was incorrect and I told the recruiter about it. In the end, I was recruited... then my first task as a new employee was to browse through all questions to find other potential errors.

    IMHO, there’s a 0 - let me emphasize that, zero correlation between the ability to answer correctly on a multiple-choice questions kind of test and the ability to be an effective programmer. As additional evidence, as a teacher, I also used this kind of test as an exam once and that was an great disappointment, good students failing miserably. May I also mention a certified Java X programmer - certification is based on this kind of test, not being able to explain the overall architecture of his latest project?

    At least, the chit-chat kind of interview doesn’t over-promise. It’s generally friendly and based on human interactions. The key here is for the candidate to be as truthful as possible. I always tried to do that, and it worked every time. Why would I tell something which is not true? Otherwise, at some point in the future, I would be exposed as a fraud. I’d have lost time as well as my employer, and my reputation would be tarnished. However, some people don’t think likewise so interviewers have to take precautions.

    In the end, the only interview method that does work is to put the candidate in the exact same situation he would be during regular work: in front of a computer and to make him solve a problem. Sure, it’s still miles away from a real situation but it’s hard to get closer. There a lot of such code-related problems available out there, but you should cook your own. As above, you don’t want candidates to rehearse for a specific problem but to show you what they can.

    And yet, despite everything, some recruiters - if not most, still prefer to go the multiple-choice questions road. And candidates read and sometimes are willing to pay to rehearse for such kind of interviews. Why is that, then? Well, my guess is that because most people still don’t understand software development, don’t know how candidates can be evaluated and thus go the only way they know. As I understand, at least Americans have a bias toward tests because they’ve been used to them in public schools (please correct me if I’m wrong); Europeans have no such excuses.

    However, this is not limited to recruiting. It seems managers at all levels prefer wrong information to no information at all. Hell, it’s even worse because most of them know it’s wrong, but they are happy to pass it to the upper echelon nonetheless - that’s their job. Come to think of it, this behavior is very widespread. Take time-sheeting for example: people cannot be totally precise, so let’s assume 5% uncertainty. Readers with scientific background know that uncertainties add. So, a company with 20 persons has 100% uncertainty on their time-sheets. Another golden example for preferring wrong information to no information is project planning. Everybody know that in most cases, it’s a lot of bullshit, but yeah, everyone goes along with the flow.

    Recruiting, planning, timesheeting… Sad state, isn’t it?

    Categories: Miscellaneous Tags: interviewrecruiting
  • Dear recruiters

    I had been pleasantly surprised last time when, after connecting on LinkedIn, a recruiter sent me a personalized mail. It was the first time it happened, and I found this gesture showed that the recruiter cared about the relationship. Besides, the job I currently have was found on LinkedIn - or more correctly, a recruiter found me for this job. This is to say that I have nothing against neither recruiters nor LinkedIn.

    Unfortunately, more often than not, I usually receive such messages:

    Hello Nikola,  (First name basis because we’ve known each other since a long time. And do not forget to misspell)

    I’m currently searching for a junior PHP developer and I believe you would be a perfect fit. (thanks for reading my profile, I really appreciate custom tailored emails)

    The job is located in Bulgaria (oh yes, relocating there has always been the goal of my life, thanks for asking!)

    and the daily rate is $200 (wow, what a great incentive to relocate!)

    Cheers, your friend the recruiter (located in UK, India, anywhere unrelated to my location or the job location)

    Those kind of mails directly end up in my spam folder. However, last week saw another usual but still annoying story:

    • A recruiter cold-contacts me for a dream job - at least from his point of view. Fortunately, this time was by mail this time, not by phone, interrupting me during my work
    • I ask about trivial details, such as the job description and the expected salary
    • The recruiter tells me he cannot disclose them at this point

    So, that’s it, dear recruiters, this is the last straw. I would really appreciate if you put yourself in my place (for once). When you take time for me, you’re doing your job - and earning your pay, while when I take time for you, it’s unrelated to what I’m paid to do. The only thing I get is only a vague possibility I can get a better job (if it’s possible). If I ask about details, it’s because I do want to optimize the time consumed, both mine and yours. By the way, I have no interest in running to your competitor and telling him about your extraordinary job offering, I’ve many more interesting things in life so telling me about the job details is mandatory, not something that I have to bargain for.

    I’ve devised a little something that can help you, please read the following classes:

    public class JobMatchEvaluator {
    
        private final Company company;
    
        public JobMatchEvaluator(Company company) {
            this.company = company;
        }
    
        public InterestLevel evaluate() {
            if (!company.focusOnSoftware()
             || !company.investInPeople()
             || !company.staysUpToDate()
             || !company.allowsAnotherLife()
             || !company.respectCandidates()) {
                return InterestLevel.NONE;
            }
    
            InterestLevel interest = InterestLevel.NONE;
    
            if (company.getTraining() == PROACTIVE || company.getTraining() == NOT_ONLY_SOFTWARE) {
                interest = interest.increase();
            }
    
            if (company.getConference() == ACTIVELY_SENDING) {
                interest = interest.increase();
            }
    
            if (company.getTime() == TWENTY_PERCENT_PET_PROJECT) {
                interest = interest.increase();
            }
    
            return interest;
        }
    }
    
    public class ContactDecisionHelper {
    
        private final JobMatchEvaluator evaluator;
    
        private final Recruiter recruiter;
    
        public ContactDecisionHelper(JobMatchEvaluator evaluator, Recruiter recruiter) {
            this.evaluator = evaluator;
            this.recruiter = recruiter;
        }
    
        public boolean shouldContact() {
    
            if (!recruiter.canDiscloseDetails()) {
                return false;
            }
    
            InterestLevel interest = evaluator.evaluate();
    
            switch(interest) {
                case NOT_ENOUGH:
                case NONE:
                    return false;
                case TOTAL:
                case SPARKED:
                    return true;
                default:
                    throw new IllegalStateException();
            }
        }
    }
    

    Here are the guidelines to use the previous code:

    • If you don’t want to bother reading it, please don’t contact me
    • If you don’t understand the general idea, please don’t contact me
    • If you think it makes me sound better than you, please don’t contact me
    • If it doesn’t make you smile, or you find it not even remotely amusing, please don’t contact me

    The complete project can be found on Github. Feel free to clone and adapt it to your needs, or even send me pull requests for generic improvements.

    Categories: Miscellaneous Tags: recruiting