Why Senior Engineers Hate Coding Interviews
medium.com
medium.com
I worked with a guy who spent weeks writing a CSV parser. Firstly there are a ton of libraries to choose from. Secondly while CSV is simple it can be surprisingly difficult to handle all possible options. When we got a look at his code it was filled with really odd usage of reflections and dynamic code generation. This was supposed to process huge files so performance was supposed to be a priority.
Or the other guy who complained daily about maven then one day he comes in on Monday right before a major deadline with a big shit eating grin on his face and when someone finally asked what he was grinning about he said he spent the weekend replacing maven with ant.
I’ll take someone who can’t program their way out of a paper bag over one of these guys any day. At least when they’re in the paper bag they can’t destroy anything.
We've had required code reviews for every bit of code written. Those are always harder for the new people, but exactly how hard depends on the person. I have seen PR reviews which require major things like "let's refactor those changes into separate class with proper interfaces". And the good old "this code is too hard to understand, let's simplify"
As for CSV story -- if you new people can go off for weeks and work on new project without talking to anyone, there is something wrong with your org. You want to have status meetings periodically (weekly? every sprint?) where everyone talks what they are working on, and what difficulties are they facing. Those are really great -- they let the team feel together, they let people whom to ask for help, and they may help discover hidden talents.
And we did have people who would spend time doing integration with their favorite IDE's build system. It is not quite "maven vs ant" -- but if this helps them be more productive, why not! Of course this would be still optional, so other people would not have to use this, and it is up to them to maintain the integration.
I don't want to hire people who think coding is beneath them or are so far removed from the actual tech that they can't code anymore.
I once had an interview for a front-end midlevel position. I had some prior front-end experience in another framework, but mostly worked on midteir and vendor products. I was notified the morning of my interview that it wasn't just a regular interview but a code screen and I could use any language/tools/etc that I wanted. I got there and found out that was not the case - he was not following HR's procedures. So he hands me a Mac (which I'm not familiar with), tells me to use Angular (which I've never used), in Webstorm (I played around with it once), and tells me to build a page to upload a CSV file and display the contents in a table on the page. I have 30 minutes to do it, and then I'll get 30 minutes to dress it up in CSS. Needless to say, I bombed it. I was sort of impressed with myself that I had it almost functional, but yet ashamed at my abysmal evaluation. He said I didn't do well and that he was looking for an expert. Shouldn't you open a senior posting if you want an expert? I asked him why he gave me an interview if my resume listed none of the technologies, with my cover letter stating that I was looking for a change and wanted to learn new technologies. His answer was that maybe I knew the tech from personal projects. I had Android personal projects listed on my resume, so why would I have left off other ones more pertainate to the position? My guess is he was too lazy to read and understand the resume and cover letter, not to mention ignoring HR's instructions. What a waste of both our time (moreso mine since he was on his laptop most of the time).
The phrases "can't code" and can't pass "fizz-buzz" are loosely used. What exactly is fizz-buzz? To me, it's writing a for loop to reverse a string, but to someone else, it's implementing Dijkstra's algorithm in a 40 minute period to solve some made up problem.
A few years back I was working at a company that had a policy that they didn't have recruiters do any pre-screening of candidates who had prior development experience listed on their resumes. I was a frequent stage 1 interviewer for our team, and we gave the candidate an hour to write a function to count the occurrence of words in a string (e.g. "the old man and the sea" -> {"the":2, "old": 1, "man": 1, and" 1, "sea": 1}. Candidates were allowed to select any language they wanted, use their own editor/environment or use a cloud based IDE if they preferred. They were allowed to search any API documentation they wanted, to use any libraries, and were explicitly told to not worry about any edge cases like punctuation, capitalization, etc.
I'd guess about 1/2 of the candidates I interviewed were able to complete the assignment in the provided time, with about 1/4 of them finishing it almost immediately, and another 1/4 unable to even write a single syntactically valid statement or line of code. Some candidates claiming years of experience with a language couldn't even write something that looked at all like the syntax of the language.
The organization of their code tells way more about their skills, than some stupid L33T coding problem that they must solve in 5 minutes.
I’ve interviewed candidates who were clearly not the person on the phone screen, for example.
Given 10 positions you need to fill anticipating these hires will stick around for 3-5 years each.
Pick one:
- [ ] 10 "less experienced" developers for 3-5 years
- [ ] 9 "very experienced" developers for 3-5 years + 1 "no experience" developer for a few months which you'll then have a 90% chance of replacing with a "very experienced" developer
Interviewing is a two-way street. Especially with senior engineers. You're trying to convince the candidate to work with you. After all, they could say no, and walk away. Moreover, nobody wants to work for an incompetent boss, and we know there are a ton of incompetent bosses out there. What if I, the job candidate, want to give you, the interviewer, a test to make sure you know what you're doing? Don't worry, I can give you a take-home test to do in your "spare time". ;-)
I don't think companies realize how many potential senior candidates they drive away with audition-style interviews. I've religiously avoided them, just never applying to companies who do them. I'll walk away if I don't like the hiring process.
As an interviewer, we always allow for that! Our standard procedure is to leave last 10-15 minutes for "questions for the interviewer".
People usually ask things like "which stack do you use" and "how many hours per day you work", but once I had candidate ask me programming question, related to the one I just asked them. We've had a nice conversation about algorithms and runtime performance.
Every time I come for an interview, I ask: did you check out my github? Only once in a while somebody responds with a yes. I mean, it's not a big deal - I just have a bunch of weekend projects there, nothing really outstanding, but it might give more information than any 15 minute coding quiz can give you.
And, always the whiteboard coding... madness!
I mean, it's all explained better in the article, but focusing on competence: if they don't measure the competence [of a senior software engineer] they will not hire a competent engineer. And I've seen plenty of senior engineers who can produce reams and reams of awful, unmaintaineable, and buggy code.
And, I am sure, they all aced the whiteboarding.
I mean, I’m not sure what you’re assessing if you throw 4 different problems at me to complete in an hour using an editor I’ve never seen before (that may have bugs of its own).
“Homework assignments” seem OK to me though; feel free to give me a few days in my environment of choice to produce quality work. Anything less is not a good benchmark.
For example someone was the lead Senior Engineer for 10 years at their previous company. Their biggest project was a rewrite and migration of the invoice handling system to optimize for data analysis leading the millions more in revenue.
Based on this description I have no idea if this person
a) Went to hundreds of meetings around priority, resources and timelines while other engineers did the actual work. While he went to the big wig meetings as the technical resources because he was trying to make optimal "architecture decisions" not because of talent but because his role as lead was built on having been with the company 10 years he knew how to navigate the internal politics as well as being an SME in the companies specific systems.
or
B) He was making major architectural decisions, leading the engineering team, mentoring other engineers, helping ensure best practices and trying to find time to squeeze coding in while trying to prevent the PMs and Execs from making the wrong decisions and getting the wrong ideas.
The problem is these pieces of information can be hard to distinguish between based on the information that most people have access to during the hiring process.
Now the looking at the github can be useful but if you are applying at a large organization a lot of the rules and processes are controlled not by the hiring manager but by HR who is trying to avoid anything that could lead to a lawsuit, so hiring managers have to try and navigate this field in a sub-optimal way.
This code can be presented to interviewers for subsequent positions.
Interviewers can be allowed to review a hardcopy during the course of the interview, but can't keep it.
If the hiring company wants to use the code, a license must be obtained from the employer who has copyright.
Not to defend the current interview system, but what other scalable solution do we have other than LeetCode type of questions? How would we be able to show that someone knows how to write code without testing them on the fundamentals of CS?
Genuinely curious.
Asking "what is a priority queue" is a totally fair question (if your job may reasonably require it), because knowledge that such things exist is a big part of being a senior person. You don't have to be able to know the class name, or exact notation, but you should be able to know what to Google for.
A person who does now know what a priority queue is will happily write O(n^2) algorithm which repeatedly calls max() and completely kill your app performance. There would be no opportunity to Google anything, because only senior people get business requirements, not names of algorithms they need to use.
That's the purpose of LeetCode. If you're saying you can't solve all of them, what happens when you get one of the ones you don't know?
Don't attack the person. Attack the argument.
This question is based on a flawed assumption that interviews need to be "scalable".
If you're interviewing more than 3 or 4 candidates for a senior position, you're probably doing almost everything wrong, starting with your method of finding candidates. (Job postings are almost universally terrible. Why is everyone so bad at it? I don't want to hear excuses like "HR". If hiring engineers is crucial for the company, then you need to fight HR.) You may need to interview only 1 or 2.
Don't "screen" a bunch of people. That's a giant waste of everyone's time, both employers and candidates. Start at the top of your list, and only interview your top candidates. Spend the time to research those few individuals — even before you interview them — instead of spreading out your time relatively equally on a large number of candidates.
My suggestion isn't particularly novel. It's often how hiring works in other industries that aren't as insane as tech. Software engineers have their own special snowflake hiring process that they hold onto almost like a cult. They rhetorically ask "What's the alternative?" without actually empirically looking at the rest of the world outside of software engineering. The fact that "FizzBuzz" and "LeetCode" are words everyone recognizes just shows how much of a cargo cult software engineering has become.
If the interviewee does not work well under pressure, they'll have 30 minutes to do the question. Hopefully they'll worry less during the interview, and perform better.
If the interviewee breezes through your question, you give them next, more complex variation ("and now you cannot assume X anymore"). Make sure you have a few of those.
Basically, don't be a computer. Your goal, as an interviewer, is to get the candidate to show off their skills. Putting extra pressure does not help with it.
(and yes, this is pretty scalable. we are still having a single meeting for each candidate)
One of the other commenters mentioned people doing phone screens who were clearly not the people in a f2f interview.
So maybe it's something along those lines? eg: people who've not really written the code, then being asked to edit it... and boom, they're screwed.
If you're having a run of people doing that though, it sounds like something about the way you're finding candidates needs adjusting. Maybe try through a different avenue?