If I go into an interview without studying and fail legitimately on questions that relate to the job (and who hasn't done that?), then it's a good thing because I obviously wouldn't be able to handle the day-to-day work and therefore am a poor fit. :)
Really, to my mind, it's a win-win for everyone.
The interview should be all about READING code. The original reason for writing code during an interview was to filter those who can't code. And so problems like fizzbuzz were created and that expanded into leetcode. But does anyone really think that if you ask someone to read a moderately complex piece of code and they can fully explain what it's doing, they can't write a simple for loop? If you can read code, then you can write code. And reading code during an interview if far less stressful than writing. So you will get much higher signal from the interviews since the stress of writing code during an interview causes many good engineers to do poorly. Or never try at all since they don't have time to practice to the point where the stress doesn't matter because it's rote memory.
Reading code is also better at showing the difference between a junior and senior engineer. If a junior or senior crams leetcode and spits it out during an interview, the result will look the same and you really don't know if they are junior or senior. But reading code is where years of experience can really shine.
And I want to stress again, reading code is so important, I think more so than writing. If you're only good at writing, then you can churn out tech debt filled junk quickly. If you read well, you can see where to add a few lines to get the same result. If you only write well, you copy/paste stackoverflow answers without really knowing what's going on. If you read well, the stackoverflow is simply a starting point you modify or discard entirely because you can recognize junk. Or even that the top rated answer is actually not the best one.
1. There's a lot of self-taught developers, so there isn't a high bar to enter the industry like in other professions like Engineering, Law or Medicine (and these usually include an apprenticeship period as well, often missing in programming).
2. While I love that we are well paid, that's a huge risk for a company to hire someone and this being a potato hire. So I understand that companies really really want to do their best to only hire great people, however misguided these attempts are.
3. It isn't usually "totally unrelated", it's more like they are testing the theoretical part of things instead of the practical. This, as I said, happen in other professions as well and that's why normally there's apprenticeship periods.
I'm definitely not defending some of the ridiculous, cargo-cult practices of many interviews today (like "esoteric questions"). I'm just explaining why I think it makes sense to have an "entry exam" of sorts in the interviews.
When I am interviewing a new employee, the last thing I care about is if they can whiteboard some arbitrary algorithm or concept on the spot. This is a stupid waste of everyone's time. I honestly don't even know where this sort of practice began. The only time whiteboards are used around our shop is when we are doing actual work with them and trying to work with stuff we cant fit in our heads all at once.
For us, we have realized that the way we do business does not align as well as we would like with a certain clique of developers who are entering the job market. Determining this fit takes a lot of time and is not something that can be answered over the course of a day, week or month.
My developer interview process for 2021+ works something like this:
1) We find your resume/github/linked-in/etc. and take interest in the fact that you have a respectable portfolio or other demonstrable evidence that you give a shit about the work you would be doing. I.e. don't call us, we will call you.
2) We send you an email to see if you would be interested in a 6 month contract offer with potential for FTE+benefits+options. We briefly outline what we do, who our customers are, what our technologies are, and how we generally do work.
3) You decide you are game for trying out 6 months with us. We onboard you in a few days, and you WFH full-time just like the rest of us (we don't have a physical office anymore). Within a few days you are on our daily standup call and are being assigned issues. You work with other developers and start taking initiative.
4) After 6 months elapses, we have the real interview.
Now if my experience and track record convinces someone I’m a good hire, but my ability to implement something on a whiteboard is questioned? That job isn’t for me.
I’d be very happy to do a code review excercise, or implement a full system as a homework, or describe a project I wrote. But studying for knowledge that would remain in my head for maybe a day or a week? An interview process that selects for that is broken. I don’t want to work for a company that doesn’t realize that.
I sometimes hire. When I do, I want people that will do what I say.
For the interview part, if they have the basic competency I want, I couldn't care less about the actual skills of the person: if I later find they underperform, if I can't find a proper role for them, they will be fired. But that's a waste of my time, and also it can create bad blood.
What I do care about is people who I can easily get to do what I want - not what they want, so I can redeploy them as needed.
I don't want them to play with the latest framework: if I say it will be done in perl, it's going to be perl, end of the discussion.
> just a waste of everyone's time.
No, not a waste of my time, a waste mostly of the candidate time. I will spend at most an hour on the interview. The candidate will have spend days preparing.
It's not a bug, it's a feature: a contrived interview process with a lot of hoops to jump and pointless trivia that requires days of preparation beforehand self select for me :
- people who are willing to waste that much time in something that will be pointless later (so either they are gullible or desperate enough, both are fine for me)
- people who will obey and follow procedures as complicated and pointless as they might be.
See that like "proof of work" in crypto - they are demonstrating they will do what I want.
That has yielded me the best employees. The next best are the hires straight from university: unexperienced and disciplined by years of training to do things like homework.
"What the candidate has done in the past" is always a good one, and I prefer to start there when interviewing engineering candidates too, but it's very limited! If you aren't already in a job where you're working on interesting, difficult things, you're gonna be more limited in your ability to talk about that!
The knowledge/coding-based interview is something of a potential equalizer there... though in terms of everybody's free time, "nobody studies for them" would be a better equilibrium than "everybody studies for them" ;).
https://news.ncsu.edu/2020/07/tech-job-interviews-anxiety/
>“For example, interviewers may give easier problems to candidates they prefer,” Parnin says. “But the format may also serve as a barrier to entire classes of candidates. For example, in our study, all of the women who took the public interview failed, while all of the women who took the private interview passed. Our study was limited, and a larger sample size would be needed to draw firm conclusions, but the idea that the very design of the interview process may effectively exclude an entire class of job candidates is troubling.”
Also, I have to agree with the other commenter here that it could be way worse if professional credentialing starts to be required. Then you have to shell out big money and deal with way more bullshit requirements than just whether you can write code on a whiteboard (e.g. boring classes, standardized tests, diversity quotas, etc.)
I'm just curious to know
FWIW I don’t personally like them and am general not smart enough to pass them (probably never will be on the level I hear some companies require). I may one day give and try though to pass them though.
People in other industries study up on the market, the company, and relevant regulations if they don’t have immediate experience, so why shouldn’t we?
If the technical questions asked during the interview are relevant to actual problems encountered on the job (unfortunately, they often aren’t), having to brush up beforehand is a good test of the candidate’s ability to apply their existing skillset to novel problems. However, many technical interviews ask algorithmic puzzle questions that are totally irrelevant to the job; having to study those (and administer those interviews) is a waste of everyone’s time.
In lieu of a formal coding interview, I sometimes like to give a short 1-2 hour takehome assignment that asks the candidate to solve a simple but real problem I’ve faced on the job. The candidate’s response to this is infinitely more informative than any coding interview could be.
This is how most jobs are filled. The 3rd party recruiters, the online job boards, the e-applications on the company's website, they're a smoke screen. They are how they get to say they are an "equal opportunity employer".
Most places won't give interviews to 99% of the people coming in cold. They are mostly used as a pool of beards to make the hiring process look open when they have someone on recommendation for a job. They'll pick the 3 best resumes out of the pool and then put them through the impossible technical interview. They will fail and all that is left is the person with the recommendation.
The reason they can do that is because there are national standards for graduating which includes a board exam to test academic knowledge as well as a multi-year paid internship.
There are pros and cons to this type of system. Pros include knowing that anyone with a degree is qualified and maintaining minimum standards.
The cons is that is very much limits supply of doctors and locks out a lot of otherwise qualified people who can't get into a program, often excluding poor and minority folks.
But maybe there is a hybrid? Maybe we as an industry can come up with a test that anyone can study for and take and once you pass it you don't get trivia coding exams anymore. We just assume that you know what you're doing. Like a certification that everyone accepts.
I'm not going to ask you esoteric trivia questions about the Go compiler. I'm not going to ask you to implement a BST. I do have to see you write something because my team has been burned in the past because we hired someone who could talk a big game but couldn't deliver. We didn't have them write code in the interview.
Answer this: would you hire a welder for your construction job without running them through a couple exercises first to see how good they are?
There are many examples of maladapted "solutions" to practical problems in the software business and they tend to propagate in spite of being "disfunctional."
It took a long time for me to come to terms with the simple fact that conducting job interviews (at least for technical positions) is a process that is imperfect in the extreme.
Coming to terms with this fact allowed me to stop seeking 'silver bullet' solutions like algorithm challenges -- which ultimately amount to a plausible (and perhaps even clever) "solution" but does not actual do anything meaningful to remedy the imperfection.
It is theatre. It is a feeble attempt at transmuting a job interview into an Apprenticeship.
The core challenge is there is the job of understanding the machine and the science, but then there is the task of building products for humans. We only have a good sense of how to measure one and not the other.
The frustration that I have is that knowing the machine and the science is like... less than 5% of the job (and that's being generous). Fortunately, I made a good career in infrastructure where instead of 5% it is more like... 25%... as the architect.
When people say that other engineers don't study for their interviews what they are actually saying is that other engineers can't get a better job than they currently have no matter how hard they work. If they could get a better job by showing that they are great at their job in an interview they would study to be able to show that side and get that salary increase. Instead the interviews are just formalities and you get hired and your salary is based on your resume.
If you really want a job at FAANG, you may need to study to get past their ridiculous and pointless interview process, but if you want to work anywhere else, just show up knowing what you're talking about from experience.
It takes time and lots of practice (which CS grads did in college) to learn these things. Once you get the hang of it and are good at using DP to solve these problems, you'll probably remember it for the rest of your life.
And, a handful of solutions will solve most all of these questions. The 'lots of practice' you do in college is basically training you to quickly identify which solution to apply to the problem you face.
It seems like your actual problem is you don't like rejection. Just accept that you have a 10-20% shot at any given interview you go on. It's often not you (sometimes it is you) there are many variables outside your control. Blaming the system isn't useful.
I would give everyone a home test - program X or Y in one of languages (L1, L2, L3). And I would watch:
a) the overall quality of the code and documentation,
b) whether the person asked about intentionally vague part of my request,
c) how much of the code was taken literally from StackOverflow or other source and whether the person acknowledged it,
d) whether I received the solution from them in the last hours before deadline or a bit sooner.
This, taken together, would tell me much more about that person than a highly technical and esoteric interview.
For mobile engineers, I'm a fan of laptop coding interviews where you give candidates a problem and an hour or two to work through it, or take-home projects. I know that people have concerns about the time investment required for take-home interview problems, but I'd like to separate that (reasonable and fair) point from the question of "are they effective at measuring relevant skills".
For server engineers, posing a problem and asking them how to architect a service on a whiteboard seems reasonable.
I'm on the fence about algorithms questions. The pro is that they're somewhat "easy" to grade. The con is it's unclear how relevant these questions are to on-the-job performance. Ideally (with a large emphasis on ideally), these kinds of algorithms questions would help you avoid problems like https://accidentallyquadratic.tumblr.com/. Obviously these kinds of problems still happen at companies that test for algorithmic knowledge, so who knows. It's hard to say without the counterfactual, but it's possible that we'd have more of these performance problems if we didn't test for algorithms at all.
This recent HN convo was very relevant: https://news.ycombinator.com/item?id=26152335. I think there's some validity to a point that was raised: "I would argue that the majority of developers are juggling half a dozen tasks that need to be done ASAP and a simple quadratic solution was fast enough for the use case they had in mind and there definitely was no time to optimize for the case of invisible icons." However, I also think it's a lack of skill there. I'd like to believe that someone who was very algorithmically-minded would never accept that as a solution in the first place. I would almost never allow myself to write a doubly-nested for loop and in general would constantly be asking myself whether or not something I'm writing has the potential to be superlinear, especially if I'm iterating through a list and doing any operation on every element of that list.
Instead I want them to come as they are and show me their real skills.
I've always wondered how is it I Chemistry or biology fields? When you are interviewing for a position, do they ask you to balance a chem equation in the whiteboard or the optimal way to combine two carbon based constructs?
Some are practical enough to assess whether your knowledge and skills match the specific role they are looking for.
Others (famously Google) would say that they are looking for software engineers in general, not narrow specialists, and thus use more artificial challenges intended to assess the candidate's computational thinking in general.
I always loved a good travel to a nice location (e.g. Seattle) for a few days break and interview in a company of interest.
You can make a sport of it but yeah it's worth it for some top tier companies.
The one issue that I can see are the low paying companies with simple work related problems to solve requiring LC Hard problem solving skills. They think they're google when they're nothing.
I try to fit in my interview study with general study of trying to have a deeper understanding of the framework, language and programming concepts in general. When I am trying to get something done I just skip over things, but if I am studying something and it makes a reference to, say, anonymous functions, and I don't really have a firm grasp on what anonymous functions are, then I go study that. I also take notes and quiz myself on topics, and sometimes I go back and quiz myself again.
I sometimes get asked for a given work sample home, so I study to be able to put together the kind of state-of-the-art 2021 best practices work sample. Sometimes they say I can give my own code sample, not one to their spec, but I have to keep it up to date and similar to the work sample.
The waste of time is things I only memorize for interviews. I rarely use characters don't need to memorize string to character conversion for my normal work, but I do so due to interviews. Or how to create a multiarray and print a specific element from it. Or how to divide a string into an array of words by the space. These are common things you need to do on 30-60 minute coding exercises, so I memorize them pretty much only for interviews.
I also have been asked about IS-A, HAS-A whiteboard class design of the UML kind so I practice that as well.
Then there are the host of programming, language and framework questions you can get. Or ones about git.
I don't mind much as most of this stuff I find useful, other than memorizing how to convert a character into an integer which is something I rarely do for tickets, but have done more than once on coding interviews. And that memorization is not that hard. I try to fit in my study with a broader study, I am not just doing leetcode at night, not really learning anything. I am studying my language right now, in a couple of months I might go on leetcode and see how my skills have progressed. But I have the time now to spend weeks and months taking my time to study abstract things to get a deeper understanding of all of this, it will be a few months before I get back to learning tricks to sling out 30-60 minute code samples faster. But I have a programming day job that pays OK and is OK much of the time so I am in no rush. If I was unemployed or work was bad it would be a different story.
There are a lot of indicators eventually, code clarity, thinking clarity, problem-solving, handling edge cases, analysis of the runtime, choosing in between different solutions. If someone has managed to study leetcode problems, and he is good at them, when presented with a different topic he would study it and be good at it. The leetcode problems provides a common set of framework for all companies to measure by, a common baseline for all programmers, a common topic for all programmers a specific line of thought.
The crazier thing is that developers are willing to do oncall shifts without vacation day compensation.
thats the rationale to make it not crazy, whether this is the best way to accomplish that is not resolved.
“Cracking the Coding Interview” covers this pretty early in the book
But to be honest one perk is that it's a filter for intelligence.
And it's nice to know you're working with mostly smart people and not people who are just good at schmoozing interviewers.
Much like "culture fit", it's a way for employers to weed out applicants that aren't desirable when they normally fall into a protected class.