Stop Interviewing with Leet Code
fev.al
fev.al
You might ask, so why do startups do leetcode too? I heard startups are supposed to be, uh, innovating, developing new technology, and working on hard, meaningful problems? Shouldn't they want brilliant, super effective people, instead of smart-enough, obedient workers? Apparently not. Apparently they want the same workers bigcos want. The implication of this is left as an exercise to the reader.
"How you hire is whom you hire."
those who will overwork, be on call 24/7, doing 10 men's jobs at once and can tolerate abuse from managers, because you want your stock options to vest
10 what now?
Or Pixar which required you to excel in atleast one thing in your life
But overall that may be a good thing for society. If Google fired all their leet coders and replaced them with real engineers they would not need as many. And the biggest problem may be that there is a limited number of real engineers in the world. Companies have to figure out a way to make so with the people that are available.
In my mind, a real engineer really shines in the non technical aspect of things, like coordination, communication, prioritization, and getting hard questions answered. But that's just me, I'm curious what everyone else's experiences are.
For example, suppose your team generates and shares some kind of data. You want to change the wire format. You could just go ahead and do it, letting the chips fall where they may, but I think that's bad engineering/engineering management.
It'd be better to coordinate with the folks consuming the data. Can you make their migration easier? While you're making a breaking change, are there others that would make sense to roll in? Are there times when it'd be better/worse to roll out the new version? Being proactive about this sort of stuff seems like good engineering to me.
Terry Davis was a great engineer and he had the worst commutation skills you could imagine.
And I don't mean that as criticism, I mean ythat as "it is not their job"
Leetcoders just find the most efficient solution for the problem at hand. They don't see connections to other problems, whether current or potential. They're a scalpel when you really need a massage.
I've seen leetcoders throw away less-efficient, safer solutions just to implement something more efficient and clever. And when things fail, they're nowhere to be found. Too busy with whatever current Story they're on.
I've worked with many people much smarter than me. And I've watched smart, very technical engineers silo themselves off. And then I've watch smart technical engineers that make an effort to communicate and lead initiatives to improve the codebase, make arguments to management for tackling tech debt, and speak up during technical grooming to propose better solutions. And while the siloed off introvert might be able to write better code faster, the engineer that is looking at the whole picture makes an entire team move faster.
I think a bunch of this "engineers don't actually need to know stuff" comes from a generation that never had to deal with things that might kill people if it fails.
The right information is usually somewhere in the organization, but it isn’t shared or acted upon appropriately. The Challenger report is pretty clear that it was “an accident rooted in history”. They had a decade of data about O-ring performance in the cold, but it was ignored/overruled in the decision to launch. It certainly wasn’t the case that The New Guy just grabbed some rubber from the wrong shelf and blew up a space shuttle. The Mars Climate Orbiter was lost because of a metric vs imperial mixup, but it wasn’t one dev who capriciously decided to work in inches; there were whole teams that weren’t synced up.
Engineers certainly need to know something, but I’d bet the farm that a team of B+ engineers with good coordination can run circles around “rockstars” that won’t work together.
In fact, I'd go so far as to say that if a lone idiot can wreak havoc, it's usually a coordination problem further up.
The problem is not LC. The problem is companies not tailoring the interview to the position.
nice gatekeeping. Shame on them for working to get a job they want.
You wouldn't let someone do surgery on you that hasn't been to medical school.
The former can deliver good software with less bugs, the latter might be able to, but are more likely to bikeshed endlessly, while being hamstrung by “best” practices that turn out to be inapplicable in a given domain, or even damaging.
Do wake me up when software engineering becomes a standardized practice that isn’t a mere cargo cult.
I swear, if I read one more comment about doctors and surgery and licensing I’m going to have to diverge on a rant exposing the multiple flaws in popular SE best practices.
A good engineer does not have to be a leet hacker, in the same way a good architect does not have to be a geeky concrete fanboy.
Culture is important at companies. Without it quality engineering can’t/won’t happen. People will rise to the bar set by their leadership unfortunately.
Example: The engineering of the Boeing 737 Max
Source: - https://www.netflix.com/title/81272421
> Ingenieurinnen und Ingenieure sind alleine oder – bei arbeitsteiliger Zusammenarbeit – mitverantwortlich für die Folgen ihrer beruflichen Arbeit sowie für die sorgfältige Wahrnehmung ihrer spezifischen Pflichten, die ihnen aufgrund ihrer Kompetenz und ihres Sachverstandes zukommen
Translated with Google translate:
> Engineers are solely or – in the case of collaborative work – jointly responsible for the Consequences of their professional work as well as for the physical performance of their specific duties, which are due to them due to their competence and their expertise
Carrying this responsibility is a (indirekt) requirement for being legally able to call yourself engineer here.
Edit: a Netflix movie is a form of entertainment and not a valid source.
You can hire the best artisans for your pot making company and make some of the best pots. However, sooner or later you will encounter problems like disparate outcomes of quality (due to different people having different standards of style, crafting and discipline), unpredictability and reliability.
An engineer role is to standardize processes and turn things like quality into a predictable outcome. It's not just about being good and not being bad.
What you are describing doesn’t match my lived experience in this industry
Getting a random question from an infinite pool and completing it with fewer resources under a short time crunch is a different game.
The low-level/assembly course I took had tests that felt like puzzles, and those tests were a ton of fun to take. Can't say I've had the same feeling for leetcode puzzles.
Instead in my day to day I'm able to recognize when a problem needs something beyond the braindead solution and a sense of roughly where the solution lies, and am able to then go do a bit of research on the topic.
Solving leetcode hard style problems in ~45 mins off the top of one's head is just not a problem many developers face in their jobs. I agree that these tests demonstrate some information, but the ability for that person to be a good developer is not among that signal.
The quality of a product shouldn't rest solely on having faith that you hired good programmers by chance.
You are just apologizing for fraternity hazing
Brilliant engineers don’t make safe planes. It’s actually teams with a culture of excellence and quality.
Source: - https://www.netflix.com/title/81272421
There is no standardized methodology in SE as of 2022 that has anything resembling actual science as it’s basis, or we would certainly have thrown out LC interview hazing by now.
Your comparison is inaccurate. You might as well rail against non-conservatory musicians who taught themselves to play.
For fields where software safety matters, THERE ARE ALREADY EXISTING LEGALLY ENFORCED CODING STANDARDS
The person watching on the other end can evaluate how far over 100 you got, whether or not your form matches best practice, and assess how you were breathing in case... you know... they hire you and then there's a business need for you to do 500 jumping jacks in five minutes.
They might not even end up hiring anyone different than they otherwise would.
First, it’s probably illegal in the USA due to ADA unless you could show that it tested something physically related to the job. Example: a big company is required to make accommodation for a, say, qualified analyst who is blind, but can reject a blind candidate for a job that required driving.
But after 45+ years of hiring programmers, the world hasn’t yet figured out which factors are germaine and which are not.
I thought it was just the leetcode, but it's the behavioral questions and system design exercises, too.
Eh, I'm coming across as cynical. I'll be fine--I just wish we (as an industry) had a better system.
Until, I don't have a job I'm not grinding leetcode. I also dislike people who refer to themselves as ex-faang. I really don't care.
Being able to tell a great story might not be highly valued at most orgs, but I think it's part of Amazon's culture and something they desire in their skilled positions.
The trouble is, they actually can't do that because then the pool would change, quickly.
But I think like you say, what they did do was create a filter that only very patient and technically qualified candidates could get through. Beyond passing the filter, their very standardized process did not derive any useful information about candidates. But I feel pretty certain if they made an offer to every candidate and not just those on the pass side of the filter line, they would have seen some differences.
The other parts of the interview might be doing something per se useful, I suppose.
So yes, that absolutely is who they are recruiting. It probably comes down to no more than believing big tech companies have the very best in the industry (ie. like being in an Ivy League school) and standardizing the hiring bar w/ other companies they're actively in competition with. More than obedience, it probably is the aspect that they're smart and determined to succeed.
Yup that's what it's about!
The problem with trying to test how good you are at the job is that you simply can't do it in a 1 hour (or even a 1 day) interview. You can however assess how smart somebody is, which is definitely correlated to job performance. It's also connected to growth potential - even if it were somehow possible to accurately measure how good a programmer a candidate is at the moment they are applying for the job, companies would still want to try to predict how good they are likely to be over the next few years.
Are you saying the Leetcode-style interview assesses how smart someone is?
If you don't get the answer, you might still be above that smartness threshold, but didn't get it for some other reason (didn't have time to study, didn't sleep enough the night before, interview anxiety, etc.).
I know we try to stay away from the “we’re smarter than you” vibe here because it’s gross, but pretending leetcode style questions don’t require some degree of complex thought is absurd.
Nothing tells me more about someone that is full of it than simply being dismissive of others. I ask for an example to support your argument, instead you chose to be defensive and give me attitude.
I think it's unreasonable to expect people to spend their off time practicing these sorts of problems, in the same way we think it's unreasonable to require everyone interviewing to be working on personal development projects over the weekend. I suspect most working people simply do not have the time.
Why not just give candidates a standard IQ test then? They are probably more reliable than Leetcode...
leetcode is the SAT for coding, not perfect, but at least it's close to fair play.
It would be amazing if leetcode were like the SAT, and you could just get one good score and then never think about it again.
Anything like that would make it much lower-friction to switch between FAANGs (and friends), though, which I suspect is a big part of why they've settled on doing things this way.
In fact I believe software should have some qualification tests, e.g. general coding, database, cloud computing, etc. Like CPA for accountants. Each test should be valid for a few years in each category.
What some of the people in these comments seem to want though is some sort of standardized score/ranking system, which I suspect might lead to even more nightmarish outcomes than the current leetcode-y interview processes. (e.g. Employers setting absurdly high cutoff scores, choosing one applicant over another because simply because they scored a couple points higher, applicants grinding unimaginable amounts of unpaid hours to bump up their scores a bit, etc.)
As many other comments have indicated right here on Hacker News, professional licenses are commonplace for occupations such as plumbers, electricians, doctors, lawyers, and even many types of engineers.
I suppose that central governments (such as the US federal government) should offer licenses for myriad types of software engineers, hardware engineers, software architects, hardware engineers, and so on.
Wouldn't it help companies if they could choose to interview only candidates who were licensed as, say, a level three penetration tester (intermediate penetration tester) or a level five database architect (expert database architect)?
The whole "Let's reinvent the wheel mentality" surrounding software, The Internets, and hardware simultaneously bemuses and frightens me.
"The eye never has enough of seeing, nor the ear its fill of hearing. What has been will be again, what has been done will be done again; there is nothing new under the sun." King Solomon, Ecclesiastes.
and
"I only wish that wisdom were the kind of thing that flowed ... from the vessel that was full to the one that was empty." Plato, Symposium
Why don't we simply allow unqualified, blind, inebriated people to drive automobiles on public roads at whatever speed they would like? Why don't we let a guy who watched a bunch of YouTube videos call himself a brain surgeon, and perform brain surgery on people who don't even need brain surgery in the first place? Hey, wait, i've gotta gureaat idear: y botherr haviing aany ruuules at al! Sheesh.
Without rules, men simply return to a state of nature where life is short, brutish, and mean (Hobbes).
I just found this on Google...
****** Origin of Life is Nasty, Brutish, and Short
This expression comes from the author Thomas Hobbes, in his work Leviathan, from the year 1651. He believed that without a central government, there would be no culture, no society, and it would seem like all men were at war with one another. ******
The “Wild West” mentality of folks who seem to believe that rugged individualists (not federal agencies such as the US Department of Defense) built Silicon Valley, is perched atop the same type of popular, yet nonsensical, mythology (falsehood) as Horatio Alger's famous character who was actually named Ragged Dick. (Really, Ragged Dick was the character's name, I am not being facetious) who metaphorically pulled himself up by his bootstraps to rise from street urchin to CEO (who was a wealthy industrialist).
Imagine a military, any military, anywhere, anytime in human history, that didn't have ranks, titles, and gasp... tests which members had to pass to move up the ranks. How well do you suppose a military without ranks and without tests would fare in combat? Obviously, such as military would be in a state of hopeless disarray.
Licenses are not a necessary evil; they are a good, and proper way to identify and reward qualified professionals, while simultaneously enabling "the rest of us" to know, for example, who's a mere private, whom we can walk past without batting an eye, and who's a colonel, whom must stop and salute.
Imagine a hiring manager say, "Hey, this kid never went to college, but he's a freshly minted level one software engineer, I say we bring him in for an interview."
Why should every company need to create their own initial screening tests? Imagine a trucking company that needs to hire a truck driver with a particular type of commercial driver's license (CDL). In the employment advertisements they post, such companies almost invariably include verbiage such as, "Class A CDL required" or "Must have a Class B CDL." See? The candidate must have already passed an initial screening test, by acquiring a particular type of license, prior to being granted an interview.
This is obviously a huge benefit to both candidates and companies alike because it saves both sides a lot, and I mean, a lot, a lot, a lot... of time!
These days it is comically inane that tech candidates are normally expected to take an endless stream of initial screening tests to prove their mettle to each and every prospective employer (unless they were referred, famous, or for some other reason exempted from the requirement).
Imagine a CPA (certified public accountant) being required to pass a basic auditing test before he was granted an interview for a new job. Why would a company ask a CPA to take such a test? If a candidate is a CPA, then (unless, for example, he cheated on his CPA test, or suffered some sort of memory loss) he has already proven that he has a substantial amount of knowledge about auditing.
Yes, of course companies should administer their own tests. But professionals licenses can, and do, enable both candidates and companies to avoid the sort of initial screening test which companies commonly require of software engineering candidates. Currently initial screening tests, such as LeetCode, are a response by hiring companies that are typically deluged with a sea of unlicensed (and almost entirely unqualified) candidates, all of whom claim to be qualified.
There are React Boot Camp folks who can whip up a frontend in no time who are arguably more competent at this task than a PhD in Comp Sci, and there are PhDs in Comp Sci who never wrote a lick of code in their life.
Technology in software IS Political, and 30 years of development experience shows me various parallel worlds that are arguably better than our current one.
Someone who grew up coding and loves hacking as close to the bare metal as possible is worth more than a dozen of your certified software engineers.
Let me know when the world standardizes on a Comp “Sci” curriculum.
Actual computational science has very little to do with computers and software development, which is a thesis statement I will be happy to support if pressed. For now, I end my rant
this is what everyone said a college degree was for. Or experience. Neither of which matter when a senior dev with 10 years of experience and two kids still has to find an hour or two a day for three months in a row to grind out textbook algorithms to fake problems. Just to switch their fucking job. Thanks to cargo-cult insanity, god help those stuck in miserable jobs that just want out.
Yes, they're rarely encountered in most day-to-day jobs. But that doesn't make them fake...
The actual solution for encountering a differential equation at work is wolfram alpha, not getting a pen and paper to apply heuristic knowledge on solving differential equations
How is it fair, it favors young graduates and people with lots of time to prepare tremendously. Would it seem sensible to you that every time a doctor applied for a job, even if he has 20 years of experience, he'd need to compete with recent medical school graduates on some first year medical school exam?
But if we're saying Leetcode is simply testing for IQ and not really for software engineering ability, why not just test for IQ? IQ tests are designed in a way that after a certain threshold it's pretty hard to improve in them - they actually test some innate ability. Leetcode tests how well you are prepared for Leetcode, and perhaps how well you do under stress. It correlates only slightly with intelligence and even less slightly with programming ability.
Again, no different than having an Ivy League education. There are big advantages to scope/reach/opportunities in the industry.
My coding question, for example,
You have a music player that should be playing a 900 song list randomly. You notice that you keep hearing a song being repeated during your drive and you are curious if its truly random. You also keep hitting skip in the hopes a particular song comes up. Write a piece of code that simulates this.
You should tell me three things; 1) the number of songs played before a repeat occurs 2) how many songs needed to be played before you played them all 3) after you succeed in playing them all, how many times has the most common song been played.
You can use libraries if you know them, and you can use the built in sort method in the language, I will google it for you if you don't remember the syntax.
This is the insanity to me, "Here, do this contrived task that doesn't represent anything you will be doing... to prove that you can do the job"
I once had a whiteboard interview for a senior engineer position where they demanded that I write it in syntactically correct python, indentions and all, on the whiteboard. I'm trying to talk about code at a high level with them meanwhile they are deducting points because I assigned a dictionary key directly vs. using the dictonary's method. It turned me off to the company as a whole and the entire interview went downhill from there.
And they are, frankly, pretty bad at writing code because they have little empathy for the reader and greatly inflated sense of self worth. They’re the kind to use complicated C++ features or algorithms for little reason. Essentially, smart idiots.
They also believe in silly things like LC being a fair and rational way to evaluate candidates and don’t see the bias at all. “Eugh she’s an ugly woman, I think I’ll give her the LC hard and little help.”
There is another class who realizes how stupid LC is, but are happy to play the game to quickly accumulate power and prestige. They usually have psychopathic tendencies and aren’t great coworkers.
LC is great at hiring these types. Feel free to stick to it if you enjoy having them as coworkers.
Yes? Yes. Figuring out how to make a computer solve problems is very much the job of a software developer. They will only encounter harder and less well defined tasks in their actual job. If they can’t do this and you hire them that is like hiring an opera singer who is mute, or a baker who is deadly alergic to flour.
> putting them on the spot in an already tense situation and expecting them to code while you watch
There are mitigating factors one can do. We make sure our hiring managers let the candidates know that there will be a coding challenge. We ask the candidates if they prefer to chat while they work through the task or prefer to be left alone and we acomodate what they choose. We let them know that whatever style they prefer it won’t change anything.
> meanwhile they are deducting points because I assigned a dictionary key directly vs. using the dictonary's method
That sounds very unpleasant. Sorry to hear that. Interviews are a two way street. You are interviewed and at the same time you are interviewing them. I think you were right in judging them, and you dodged a bulet there.
By the sound of it you are a talented, and capable developer. It might be that you can’t imagine it, but there are people who apply for developer jobs, has a really good ability to talk about the job, they seemingly have the right experience, yet somehow they can’t program even super simple tasks. Even after you give them every acommodation immaginable to humankind. If you haven’t seen this yet you won’t believe it. If you have seen it you want a filter against this particular kind of candidate.
I’m not saying that this filter goes always well. Every filter ever invented had both false positives and false negatives. We might lose a briliant developer because some quirk of the task throws them. It is sad. We are trying to minimise the chances of this, but it certainly happens.
Yes.
> I'm disputing is your assertion that there is a correlation between doing the contrived problems under unrealistic conditions and future job performance.
You are projecting something here. You are saying, without any supporting evidence, that the problems are contrived. They are not. They are really the core of what me and my coworkers do day in and day out.
You are also saying that the conditions are unrealistic. What makes you think that?
You are right though I have no evidence they are contrived other than your example problem. The unrealistic working conditions though is indisputable, do you typically relay your google search's for syntax through your boss? Do you often work under extreme time pressure on problems you have never seen before? Perhaps you do, but I can tell you with certainty that it's not the norm in the industry to work in that way.
Indeed, this is a holy grail of the applicant funnel. If a tech-for-interviewing company comes up with a better way to remove the worst 50-ish% of applicants efficiently, they’ll have no worries about their future. (The overall applicant pool is significantly adversely skilled as compared to the have been or will be quickly hired pool.)
# You have a music player that should be playing a 900 song list randomly.
# You notice that you keep hearing a song being repeated during your drive and
# you are curious if its truly random.
from collections import Counter
import random
r = random.Random()
songs = range(1,900)
unplayed = set(songs)
# You also keep hitting skip in the hopes a particular song comes up.
# Write a piece of code that simulates this. You should tell me three things;
# 1) the number of songs played before a repeat occurs
# 2) how many songs needed to be played before you played them all
# 3) after you succeed in playing them all, how many times has the most common song been played.
counter = Counter()
firstrepeat = None
totalplays = 0
while unplayed:
song = r.choice(songs)
unplayed -= set([song])
if firstrepeat is None and song in counter:
firstrepeat = len(counter)
counter[song] += 1
totalplays += 1
print(f"""
Number of songs played before a repeat: {firstrepeat}
Total number songs played: {totalplays}
Most common song: {counter.most_common()[0][0]}
How many times has the most common song was played: {counter.most_common()[0][1]}
""")
Sample run $ python3 foo.py
Number of songs played before a repeat: 50
Total number songs played: 7263
Most common song: 375
How many times has the most common song was played: 17One other thing, I just got a new car, and this was the first time I was using 'next' using bluetooth. So, as I was driving in, I was in my head trying to figure out whether the phone now only had 100 songs downloaded, or whether this bluetooth 'next' function on shuffle was picking a random song from the list, rather than 'next' on a shuffled list.
I'm outside any major metro area, when we've needed to hire there haven only been a handful of people responding. When people come in for an interview it's been pretty easy to tell if they really can't code at all without making them actually code. I haven't found this to be challenging.
I suspect the issue is interviewing a large number of people in a short period of time. If you don't have 45 minutes or so to spend on each person, using automated leetcode style problems probably starts to seem like a pretty attractive way to weed people out.
Lastly, usually one or two people from my team would take part in interviews. If there aren't any developers available at interview time (i.e., it's a manager and a someone from HR), I can start to see how people without any real coding experience can make it through the process. Again, this is probably a place where automated testing looks like a reasonable solution.
Eventually, yes. But it takes time for them to start, time and money to onboard them, evaluate how they’re ramping up, then if not acceptable, to follow whatever performance management process is indicated by the company and local law, then transition whatever work they were doing. This could be several months and tens of thousands of dollars just to get back to a worse state than when you walked into interview that candidate.
Interviewing even slightly better than last year can pay large dividends.
You might as well just stand behind them and breath down their neck for added effect.
Seriously, that's way too claustrophobic, and not to mention a huge practical annoyance -- for the added latency of having to ask you to google stuff for them and then give you the result somehow, instead of just letting them do it themselves, when all they want to do is get past this trite exercise and start having a real conversation.
At one point in my thesis defense, I derived several equations I hadn't seen before, on the fly, such as "What is the time resolved fluorescence of a fluorophore in 4-dimensional space?" and finally understanding ergodicity (https://en.wikipedia.org/wiki/Ergodicity).
My defense wasn't about determining if I was an expert and qualified to write a dissertation in my field (my questioners already knew that), but to determine if I was a well-rounded general intelligence capable of out-of-task prediction.
In my phd experience in the USA we had oral qualifying examinations which involved whiteboard derivations. The thesis defense after writing was really mostly focused on probing the results in the thesis.
In other words, whatever it's intended to do, one of its primary functions in practice is to screen out people who are bright, driven...and poor, working long hours and trying to keep themselves and/or their families going.
That it's a bit of a sacrifice is the point. If you're naturally smart enough this stuff comes quickly, great. If not, you're going to have to work for it - that requires discipline most people don't have.
Better put, smart and/or determined to succeed.
I once interviewed a guy- a CTO at a biotech- and he wouldn't answer the question "I have a million DNA sequences and want to count the number of occurrences of each sequence" (could be hash table, could be any number of other solutions; he just balked and exited the interview).
Only if the person can get all that right would I even consider asking something more complicated.
So usually I end up after 45 minutes finding that the candidate has more or less tapped themselves out at "make a hash table of string keys, use it to store counts" (OK for a very junior programmer) or "make a perfect minimal hash" (I help them get there if they don't know what those are) or "use a probabilistic counting filter". This is about all I need to make a determination.
https://bmcbioinformatics.biomedcentral.com/articles/10.1186...
If all you do in my interview is know that a hash table or other associative data structure is good for maintaining counts, that using a full ASCII byte to store symbols from { A G T C } is wasteful and compress the letters to 2 bits each, you can pack multiple 2 bits into bytes, and can write a function that codes and decodes such data, I'm happy and you get a pass. I'm even happy to sit there and help people through nearly all the steps of the codec. Not trying to trick anybody or select for obscure CS knowledxge.
To me the real question is, how much hinting is reasonable for the coding and decoding function? Many programmers (including senior ones) struggle to implement:
x <<= 2 # left shift the int to make room for the next item x |= pattern # or the new 2-bit item into the accumulator.
Since I never use bit munging in my day job (it's 90% python data science) should I really ding somebody for not knowing about left shift or or-assignment?
What I really don't get is why people immediately jump to trying to implement huffman coding, RLE, or lookbacks as a solution to reduce the size of the DNA string. I still wonder if how I present the question is giving everybody a fair chance to shine.
I think "key/value counts" is absolutely the correct starting answer. Anything after that is optimization. In the real world optimization comes at length through research, learning, grokking, reading, benchmarking, sleeping, mulling things over. The only way to short change that is knowing about those optimizations in advance, so might as well just ask about those algs specifically.
All that being said, I think it's an enlightening question. Thank you for sharing it! You've educated me. I've been coding a loooooooong time and didn't know about bloom counting filters specifically.
Maybe he's just been around the block a sufficient number of times to have gotten tired of the standard SV "here's a hoop, jump through it, now do it again, and again and again" ritual that it likes to call "interviewing" for some reason.
Seriously - your questions are fine for junior or mid-level roles, but beyond that, you should have more important thinks to talk about. And both of you should be able to tell if the other is a bullshitter and/or a lightweight within about 30 minutes at most (and often far quicker than that) of a normal, focused technical conversation -- without having to specifically grill the other person, or otherwise put on the pretension that you're one whose bona fides are established beyond question, and they're the one who needs to jump through a sequence of hoops to prove that they are worthy of your time and attention.
Just cut the crap, get down to brass tacks, and talk what needs to be done as if they're a peer. That's all you have to do.
With Leetcode, you have to retake the test multiple times every few years when you change jobs for each company you apply to.
Leetcode would be a lot more tolerable if it was administered more like the bar exam or like medical exams. Whatever happened to DRY?
Even having to pass such a test on a very aggressive set schedule—say, every 5 years—but only at those set times, would be better—for developers. Not for the companies hiring them.
Which means... Always. Be. Leetcoding. Do the bare minimum at your job and then do LC the rest of the time. Because your job is just your job, but your career is LC. These companies don't yet realize they are optimizing for mercenaries that have no loyalty to the code nor the company.
On a slight tangent, some of the people over on Blind would sell their own mother for a tiny bump in TC. That mentality used to be limited to Wall St. or maybe Big 4 accounting firms, etc. But now it's the whole tech industry. I remember having a software job was a lot more fun, back around 2007ish. That culture is so foreign to me now.
Whether you realize it or not, you're advocating for keeping people who aren't already mid-to-upper-middle-class (among others) out of these kinds of tech companies. Anything that's designed to make you work hard extra, outside of work to learn separate skills just to pass interviews is guaranteed to make it disproportionately harder for people who are, for whatever reason, unable in practice to devote many hours of their free time to fairly complex technical studying.
No matter how "disciplined" they are, people already working 80 hours/week just to put food on the table don't have the luxury to be doing that. No matter how "smart and/or determined to succeed" they are, people raising 2 kids by themselves would be irresponsible to be doing that.
Now, maybe you think that kind of person should be denied an opportunity to join the super-1337 hackaz' club that is FAANG or whatever. Personally, I think that kind of classist gatekeeping is disgusting.
Ah, you're talking about those programming jobs that never require thinking about algorithms?
I've been working as a programmer—largely PHP, Java, Objective-C, and Swift—for over 20 years now, and never, in my work, have I been asked to invert a binary tree, reverse a singly-linked list, or any similarly contrived scenario.
There's a huge difference between "thinking about algorithms" in the most general sense of that phrase (which means basically any programmer who does any of their own design work) and in the sense of the particular "algorithms" that we learned in CS classes and are featured in Leetcode problems.
Search engine: read material about the heart of the problem from domain experts, try different approaches and then decide.
Leet Code exercises are a blight on our industry.
If you want a shibboleth just say so.
Being able to quickly invert a binary tree and that kind of nonsense belongs in library code (at best). It's not something that the average developer should ever need to worry about the actual implementation of, let alone have to implement from scratch in under 30 minutes.
Depending on your definition of success, I'd say determined to succeed could well be the same thing as obidience.
> Big companies want people who are smart enough to do the work, but obedient enough to put up with all the bullshit that comes with working at a big company.
But then you also have the companies who see other companies do it, so they cargo cult. Those are companies you definitely want to avoid. Their entire stack is because of cargo culting not because of an engineering need.
I think you also have a few of the Bro Culture companies who do this as a hazing ritual.
https://www.amazon.com/Destroy-Tech-Startup-Three-Steps-eboo...
People just want to meet attractive people, compatibility be damned.
I'm glad I met my wife in 2010 before online dating became an utter cess pit.
We had one of those people as a client and thought his "special sauce" of Myers Briggs, some Neuroscience research test bullshit we had to build into the system and have people, and some bullshit matching algorithm based on astrological sign would be the next big thing. Of course it wasn't, but my boss was happy to take the guy's money to build it anyway.
The client actually told us that it would have ten million of users after three weeks of release, with basically no money spent on marketing. It did not. Nowhere close.
Based on my experience, you are most certainly correct that the companies using leetcode aren't following any line of reasoning, and certainly not one as sophisticated as what the parent is implying. Most decisions made by "leadership" are irrational and self-destructive as you describe there (your book looks very interesting btw).
However what the parent is claiming, as far as the effects of the leetcode interview process is certainly true. I also think that the parent is correct in that these, perhaps unintended, consequences of leetcode interview in attracting a docile though technically competed work force are beneficial to large organization.
I also think the parents second comment, about these consequences not being beneficial to startups ultimately aligns with your view: startups do great harm to themselves by mindlessly aping the behavior of big name tech cos, mostly out of ego and fear.
And once you hit LeetCode employee critical mass your culture becomes LeetCode employees. Management may have started it, but employees amplify and make it ubiquitous (especially engineers promoted to management/hire/fire).
Bingo. IMO this hits the nail absolutely on the head. $BigCo wants docile people who will show up and jump when they're told to jump without asking questions or making a fuss. And they'll throw a big bag of money at you to do so.
Obviously this is an incredibly narrow/limiting employment experience. But different strokes for different folks I guess
edit: sorry, just realised you are the author!! (lack of sleep - not work related ))). Great reading, really enjoyed it. "Sital" gonna be used as a nickname )) Thanks mate! :praise
And just because in case of companies that purpose is often unspoken, doesn't mean it doesn't apply. And that's why leetcode and inane interview processes.
https://en.wikipedia.org/wiki/The_purpose_of_a_system_is_wha...
I have see an over reliance on leetcode style question in startups actually. May be more fairly, "we want to be google" style companies which is every startup. In fact some large companies have a more relaxed way of interviewing.
I think part of the purpose is to cool competition between them.
Along with "if we all had to go through this shit, so should you".
IME its biggest defenders are people who were a little bit extra proud to have gotten a job at Google and I reckon its as much those types as much as upper management keeping it going.
Like frat hazing rituals the fact it intrinsically makes no sense is sort of beside the point. Like frat hazing rituals it'll have to be rooted out like a weed to actually go away coz it's well and truly baked in.
Leetcode rather measures whether you are into brutal cramming. Let's put it this way: the kind of people that fits this property is in my opinion often "a little bit special", i.e. not the kind of employee that in my experience both startups and big companies prefer.
that being said, everybody talks about like leetcode tests for a week straight is the norm. I've recently been through the whole thing with several big tech companies and some smaller companies, and all of them only used them for the phone screen.
in fact with microsoft for various reasons they skipped my phone screen and I went straight to onsite, and there was no leetcoding involved at all. still some whiteboard coding, but rather about highly specialized problems relevant to my field, none of this algorithm puzzle bullshit.
It’s actually pretty hard and time consuming to come up with a mock scenario and evaluate it, especially when you also have your regular work to do.
Leetcode is seen as good enough and all the effort is on the interviewee. The current employees don’t see the pain and suckage. They already have a job and it’s not their problem.
That's a hard problem for some startup, not for FAANGs. They could do hundreds of those and keep switching them quite easily.
I think most companies are looking for the path of least resistance.
Probably the same people who think JIRA is a great project management tool :>) - when in fact, it (JIRA/Leetcode) gets used a lot, because it gets used a lot by other people - and for no other good reason.
Which is why I love leetcode interviews: I get an insight at how a company, especially tech management, operates. During the dog-n-pony show interview, I will put up with it, but will definitely cast the company in a poor light. I tell companies that I am interviewing with that I will not prepare with leetcode (some will suggest it). I rather spend my time reading higher-level concepts. You know, the stuff that actually helps in modern software development.
I left out the word "big" in my quote. Companies of all sizes do leetcode interviews and want heads down and STFU type of developers.
I've noticed that Apple only uses simple leetcode-y style questions for its phone screens, but for their on-sites they ask very domain specific questions. It is interesting because if you're actually good at the domain you're interviewing for, they are very easy. If you're not they can be intractable. Its clear that each team puts a lot of thought into the interview process and I imagine Apple teams get a very high SNR, at least compared to Google / FB.
The ego and status jockeying appeal of leetcode is very, very high and a lot of engineers just eat it up.
I think discussions of this topic which ignore the fact that there is a substantial population in our industry who fall into this trap are basically flawed.
And in that case the leetcode interview may actually be very valid, and not even evil!
Maybe 1% of startups do this. The rest are shitting out the software equivalent of Juicero.
Personally, I believe the reason companies do LeetCode type questions is because everyone else is doing them and no one can agree on a better way. Large companies want a hiring process that scales and is relatively uniform and LeetCode questions meet that criteria. Is there a better way? Probably, but figuring out what that is takes time, effort, and investment and most companies don't want make that investment for something they may get wrong.
Basically, most everyone knows LeetCode is shit, but as long as everyone else is doing it, there's little incentive to change. If everyone is doing the same stupid thing, at least your company isn't falling behind. If you decide to do something different, there's a real possibility you could spend a bunch of time and effort only to make things worse.
Not all big companies do, not all startups do and not all companies of sizes in between do. It's also a little bit up to the candidates to just not put up with the bs and stop the interview process or not even start it in the first place.
"... However, employers do refer to the educational background to differentiate between high-quality workers and low-quality workers (Kasika, 2015). Consequently, individuals with higher-ability use their educational background to gain the "education signals" that allow them to move into high level and high wage positions"
In this case, the "educational background" is shown by solving leetcode-style algos.
[1] https://www.researchgate.net/publication/299509496_Signaling...
So it turns out that startups also want a culture of meaningless and arbitrary brainteasers instead of building cool shit that works?
A point that I didn't see yet made. The truth is that lots (though of course not all) startup companies just have no idea what they are doing.
I had to deal with the complexities that imagined possible future scalability issues introduced into our stack when the whole customer base could be served by a raspberry pi, and it happened in multiple companies.
And it is not just infrastructure, but also code. I have to follow the twisted clean architecture rules and write tons of boilerplate code (that could make sense on the backend for a complex system) for a mobile app that is basically just a skin over a graphql API (basically no business logic on the client).
The same happens when hiring: we need top talent like FAANG companies do (but we can't pay for it), because we are awesome, where in reality anyone with a sceptical, product-focused mindset and a "get things done" attitude would do.
In my opinion this happens because we don't want to admit that our startups will likely not need the scalability for years, we won't need to follow fancy architecture patterns because our app is simple, and we could do well with developers who don't have top computer science skills.
Is it actually? "Leetcode" is pretty much covered by 6.006 [0] or equivalent. You shouldn't have to "grind" or study for hours if you passed the class (your problem sets should more than cover what you'll do on the blackboard).
Anyone applying for a serious engineering job should have at least done one algorithm class. This is what leetcode filters for.
[0] https://ocw.mit.edu/courses/6-006-introduction-to-algorithms...
I wouldn't be so sure everyone realizes it doesn't measure anything relevant to actual job performance although it should be obvious (since nobody whiteboards algorithm puzzles all day in an actual job).
In all of these threads there will be many people saying they only want to hire the top% of developers (as if it was a strict linear scale, as opposed to hundreds of intertwined skills) and they justify leetcoding as the way to do that in a belief that top leetcoder is somehow a top software engineer, instead of realizing these are unrelated skillsets.
People write all sorts of stuff on their resume. They took a C course in college 10 years ago and write C as a skill. They could be programming managers and not know what a pull request is.
I think its definitely gone too far, but basic coding proficiency is essential IMO.
On top of that, the only people who can really get rid of leetcode are pretty much sr staff or principle engineers and high level HR people. It also doesn't get you promoted or paid more in most companies to go on a long project to change the interview process. Thus it doesn't get changed.
I estimate that leetcode will probably go away in many big companies in 5-15 years from now as today's sr engineers become the next sr management and founders that actually makes these decisions. Many startups today explicitly do not have leetcode interview loops, while 10 years ago many did have leetcode interview loops. When that generation of startups have their facebook that defines their decade and thus defines the next common interview fad, leetcode will start going away.
It also allows you have any engineer interview pretty much any other engineer, which makes interviews overall easier to do.
This person should already have enough of a reputation to get a job at many companies, if their work is public enough.
What do you suggest for the 99%+ other candidates?
But then why do people with that kind of reputation still (at certain companies) have to jump through these hoops?
https://www.theregister.com/2010/04/21/ken_thompson_take_our...
> What do you suggest for the 99%+ other candidates?
What about (instead of forcing a months long decision process upon the candidates and the company) bringing them into the company after a short interview (maybe 2hrs), and making sure they can afford housing, food and everything else they need. If you like their work, they stay employed. If, say after one month, you do not like what you see, you can easily let them go. Of course you tell them upfront what the deal is.
We could call it, I don't know, maybe trial or probationary period.
They don't. Your link is not about the interview.
1. Untenable for employees - of I have a mortgage or family or plans or obligations let alone a current job, taking this kind of risk is unacceptable
2. Untenable for companies - that's way too much investment.
Companies do have probation periods formally but they are exceeeeedingly rarely invoked, for above reasons.
Works here. My org recently ditched a bad hire with it.
Certainly companies have probation periods. And on paper, that reality and what's proposed in previous post are similar.
But I think there's a massive real world difference between "Default stay hired" and "Default not stay hired".
Probation, as it has currently been implemented in most companies I've worked in, exists, is formal, can and has been used, but is an exception. It's used when there's a massive, unanticipated, egregious problem in performance.
What is sometimes proposed in these threads is effectively replacing long/multiple interviews, with a probation period. While such probation period may look similar or same on paper, I think it's a completely different approach: "We're sure of you (though possibly wrong) so we're hiring you" vs "We're not sure of you so let's hire you and see!". I for one would have only touched the latter with a 100ft pole maybe once in my life. Certainly, I imagine anybody with current job and monthly obligations, would be quite wary in taking a "we don't know so let's try it!" approach to hiring. No, let's figure it out first please :)
It's the only kind of context in which I'd ever consider the "we don't know so let's try it" approach.
Your article points out that in this example: "I'm not allowed to check in code, no... I just haven't done it. I've so far found no need to.".
> If, say after one month, you do not like what you see, you can easily let them go. Of course you tell them upfront what the deal is.
> We could call it, I don't know, maybe trial or probationary period.
You make it sound like it's a better solution for candidates, but it's way worse for many of them and it has been explained by other commenters already.
How many companies actually do this? At which scale?
Some companies increased their difficulty to hire by having aggressive PIP objectives. Likewise, having a "real" probation period where you fire, say, 10%+ of employees is not gonna make you competitive when candidates compare their offers.
The internal recruiter said it kept happening for seniors and people with a lot of experience, but his hands were tied, as the leetcode process was deemed important by the CTO.
Why would this be? Old brains not being as "flexible" to think up novel solutions?
So are top leet coders better programmers? Not really, a lot of them are colleges students who have time to practice and they are in similar competitive circle. I’ve interviewed many and couldn’t hire even one
After the 3rd or 4th time doing this, practicing the same problems just to pass interviews isn't very appealing, especially if you've saved money and can do something more interesting.
You could try to "wing it" and derive it on the spot, but you'll be outcompeted by someone doing a lookup of a solution + alternate solutions from cache.
If you’ve never done LC (or any competitive programming) you’ll struggle. Practice more and you’ll recognize the dozen or so patterns.
Also LC is not “novel,” maybe at the time when the algorithm was first devised but not when you have 20 minutes to solve one.
The interviewer themself said "this is probably more aimed at someone who just graduated."
It was for a senior data engineering role, where the odds of me implementing classic dynamic programming problems on the regular are slim to none.
They made me an offer anyway, but I just wonder what value they found in that. Oh, he knows about Big O? He's heard of memoisation?
They were big on FP, apparently. But not Scala, there was too much FP in that for them, hence the TypeScript.
Mind you my first ever rejection was for a Python role back in 2011 when Python was still very niche in my country, and while I had a portfolio of, imo, pretty decent Python code, they weren't interested because I didn't have a degree, and people without degrees write unstructured code.
Which is a very long way of saying, every interview process ultimately devolves into people hiring people like them.
Thinking, ok, this must be an ice breaking joke I responded, "I don't know, how _do you_ sort a list of integers?". In a condescending tone they responded "are you even a programmer?". At the time, I had been in the game for more than 10 years.
I am really not sure how one could successfully build several companies and have shipped several products without knowing "how to sort a list of integers".
Trying to find a good place to grow your career is difficult on many levels, but if you find leetcode questions silly, you might be too advanced for entry level jobs. ...and you probably don't want to work there.
Students are often better at leetcode because school has been drilling this shit into them for the past three years, but it will probably be the last time they see such a compelling algorithmic challenge until their next leetcode exam.
but why must it be mutually exclusive? Are you implying all "robust" solutions, whatever that means, are dumb? Surely you put some thought in it to make it "robust"?
For example, storing some flag in the high bits of a pointer field of a struct is a "clever" solution, whereas having a separate bool field is a "dumb" solution. In most cases, the "dumb" solution is much more robust over time (less likely to cause bugs as the code changes and is modified by various people). Of course, the "clever" solution is necessary in some situations (very constrained environment, critical infrastructure such as an object header used for every type etc), but should often be avoided if possible.
What's important is that the way this is often presented is that more experienced people will prefer "dumber" solutions, as experience often shows that long-time maintainability trumps many small losses of efficiency. So using "clever" and "dumb" in this way is not at all intended to put down the engineer writing the more robust version.
I think there might just be some vernacular nuance here though, maybe we can call it smart and robust, versus clever and opaque. Some problems are just difficult though, and if you get to work on that kind of problem regularly then that is pretty lucky.
Personally I'm perfectly happy to be filtered out by such tests and refuse to practice for them, as companies that use them for senior level positions are companies I really don't want to work at.
You won't create your own linked list library, you'll use one from the standard library.
General runtime analysis can be helpful - but production, real-world benchmarks trump all theoretical performance values.
Code changes - how do I make a change to a production system in a million line code base that has good test coverage and when deployed, won't bring the entire system down. That's an exercise in the coding interviews that is completely ignored but most useful in the day-to-day professional setting.
This is what I always found funny. Most of the software development work these days is related to web apps. Optimizing that nested loop won't do anything if you have to wait 300ms on some shitty API to answer anyway. It literally doesn't matter, noone cares.
Related meme I saw on reddit some time ago where senior developer says 'haha nested for loop go brrrrr':
To apply for the 90% tech companies out there. 10% of all tech companies out there are FAANG or FAANG-like. 90% of tech companies are normal tech companies (they'll care about your education and cv and the interviews are usually just a chat. No IQ tests)
In smaller industry niches this can be true for companies more than people. At this point in my career, the fact that I worked at Company X is evidence enough that I can do the job Company Y wants me for, since it's a tight industry they essentially know of the work I was doing, even though it wasn't a groundbreaking novel technology of my own.
Don't know all the details so I could be missing something crucial, but if not it'd seem that reputation isn't enough
Apple homebrew is used by tens of millions of people daily.
You can't just hire someone based on their reputation at a company of any maturity. That's a legal and HR nightmare. There has to be a process with a semblance of objectivity, and that process has to demonstrably apply to everyone equally, always.
“I have an array with positive numbers, find the n^th largest”
Even then, all thats probably a bonus - a priority queue implementation, or many other possible solutions are probably good enough for me.
Dont mind that half of Google is using his work for free.
Also, nobody at google is using homebrew for work.
I'll admit that surprises me greatly, I can't see why it's considered more efficient, but hey, Google.
A poor little laptop would break down and cry.
I believe that there are also a bunch of IP reasons for this policy, but from a practical perspective doing everything with citc and blaze is really the only option.
The folks developing Chrome for Windows or iOS apps might have different workflows, but even then they aren't going to be using brew because of Google's third party code policies.
But 99.9% of the builds happen remotely. So local vs remote code just isn’t that relevant.
It is also true that Google spends millions and millions on its dev environment every year, so this isn’t your average “no code on laptops” situation.
No one’s running Xcode on the web or on a Linux machine.
Many googlers use brew to install applications on their laptops. This not against policy. Other googlers work with code stored directly on their laptop. There may even be developers who are obtaining deps (for their own builds) from brew.
The problem with the brew author is that he had every opportunity to make himself look hirable at Google but instead chose to write an incorrect screed and publish it on the internet.
At the time I used brew (5 years ago) it didn't require a santa exception with business justfication (and my justification would have been "I need this for my work"). Fortunately this wasn't really a problem for me any way as I don't even look at Mac machines as anything other than a thin client.
But, as usual for internet discussions, it is fun to rathole on side conversations.
You probably shouldn't be using dpkg or rpm for that, either, unless your CI and deployment targets are running the exact same version of Linux that you are, and even then—there are usually cleaner and more cross-platform/distro ways to do it, especially if you need to easily be able to build or run older versions of your own software (say, for debugging, for git-bisecting, whatever). I continue to wonder how TF people have been using typical Linux package managers, that they end up footgunning themselves with brew. "Incorrectly", I suspect is the answer, more often than not.
Where it excels is installing the tools that you use, that aren't dependencies of projects, but things you use to do your work.
Get your hammer from Brew. Get your lumber from... uh, the proverbial lumber yard, I suppose. Docker, environment-isolated language-specific package managers, vendored-in libs, that kind of thing.
I don't install project deps with Brew (it's a bad idea, but, again, so is doing that with dpkg or rpm or whatever directly on your local OS, a lot of the time) but I do install: wget, emacs, vscode, any non-Safari browsers I want, various xvm-type programs (nvm, pyenv, that stuff), spectacle, macdown, Slack, irssi, and so on.
The interview for my current job had something simpler: something like finding random permutations, then what's the algorithmic complexity of this random algorithm. (It was years ago, I forget the details of it.) I just talked through the solution. That was nicer that having to come up with questions. :)
My first round I passed with a less than optimally efficient solution, but he was satisfied every step of the way during my work.
While I was lukewarm to the prospect of working for Facebook, the interview process was very positive and reflected very well.
On a personal level, self interest would have me like the leetcode style problems because I can get most of them right on the first try during a timed interview, without studying. If I were pursuing a job at a FAANG, I might actually study them and I'm sure it would go well for the testing portion of the interview.
However, when I interview this is not what I'm looking for. I'm typically looking for someone who knows the particular language that I'm hiring for. My questions run from the very simple to as deep as they can go on either language or implementation details. From the most junior to the most senior, they get the same starting questions and I expect the senior people to go deeper and explain why they choose something over something else. I'm also testing their ability to explain it to me (not just get it right) as that is part of their job working with juniors.
I really don't even care if they have the names of things right and don't really count things wrong against them if they get the names of two things backwards for instance. For example in Go, a huge percent of the time you might use slice over arrays. Some people get the names backwards, but can identify which one they actually use and they know that one can change size. They are correct in usage and misnaming them. I inform them of the name, encourage them a bit and move on.
I've never liked the "look at this code, what's wrong with it" approach. There are too many contexts that I have to jump into at the same time. There is often an expectation that I find a specific problem with it. I'm lacking the usual tools like an IDE or compiler. What level am I looking at in the code? Does it compile? Are there off by one errors? Cache invalidation? Spelling errors? Logic errors? Business errors?
This guy has missing tests on code that needs to be refactored in order to make those tests. Maybe he has it figured out just right, but the "jump into my code" interviews I've been in on all seemed like they had secret gotchas that the interviewer expected specific answers about.
In short, I haven't seen a proper, repeatable process for interviewing for software development.
The best interviews I've experienced, both as an interviewer and an interviewee, are the ones that feel like two team members collaborating to narrow down requirements and solve a problem.
> about the algorithm or the promise of a particular solution
It's not about "the" algorithm or "a" solution. It's about you the candidate being able to propose multiple solutions, perhaps with space-time tradeoffs, to provide a recommendation based on your judgement, and to ask the interviewer what they think of your proposal.
So many questions. What character encoding is the string? What is human language? Should I honor non-breaking spaces and other similar codepoints? Is the string full of 'simple' characters or 'complex' characters? Graphme's? Emoji's? What's the min and max limits on width? How long (or short) can each string me, and how large could the array be? On what system am I running, and does the array fit in memory or is it paged off a disk? Does the font we're using support all of the graphme's present in the string?
Amusingly, I had a variation of this problem as part of an Amazon L8 IC role interview, framed as a Prefix Tree. Solved the problem, didn't get the role. :(
- an algorithmic challenge. It's related to what we do day to day. I work in domain names so we ask to parse a domain name. There are oddities with domain names so we check multiple things: does the candidate know what basic string manipulation functions exist? do they ask questions to get more info? how do they react when we give additional info that break the code they did so far? What we don't check: whether the code compiles or actually works. We don't care. We explicitly tell the candidate they can write pseudo code or comments defining the steps of the algorithm. We're interested in their reflection.
- an architecture challenge. We ask the candidate how they would scale an API worldwide. There's no code, it's an open discussion. They can talk about whatever they want: asynchronous, statelessness, load balancing, replication, anycast, whatever. We can also guide the candidate to know whether they know some specifics concepts (for example I can ask "what would you do if you have a GET REST endpoint that returns the same thing every time" and expect "cache its result", even with this question I get different answers (which is great), some will talk about HTTP cache headers, others will talk about Redis or in memory caching, rarely do candidates talk about both)
- a refactoring challenge. We work with tons of legacy code. So we show the candidate a crappy piece of code with performance issues and no tests and ask them for what their strategy would be. No writing code here, just thinking and discussion.
So yeah, just a quick screening to check if the candidate can write basic code (you'd be surprised of the results), and open discussions on our day to day problems.
- Showing code is optional. A bit of storytelling to set the scene is enough. So you can keep it generic, or you can add some details, as you wish! Just make sure that the candidate understands the scene. If you present something generic and feel they don't understand, tell it again with more details. If you think you've lost your explanation in details, start over with less details.
- Be sure to know what answer you want. The number 1 thing we want is for the candidate to talk about adding (non-regression) tests. But the candidate can talk about many different things: profiling, tracing, A/B testing of the new implementation, etc. If they don't talk about the #1 thing you want, try to subtly bring them to that point ("how do you ensure that the new implem works as well as the previous one?")
Not specific to the refactoring challenge:
- Ask for feedback. After each challenge, we ask the candidate their honest opinion on the challenge.
- Grasp a feeling of whether or not you'd like to work with this candidate. Try to challenge them, correct them, ask them to explain things in more details and see how they react.
- We do it with 2 interviewers: main and observer (watcher?). Both from the technical team (so 2 devs). We encourage anyone from the tech team to do it if they want, even juniors.
- We do the 3 challenges in 1 hour but that's a bit short. 1h30 would be better, if the candidate is ok with that.
The best one I had was a task where you have to basically brute force an api endpoint that uses a semi known password (you have to generate all permutations of a string with alterate spellings ex "pA$Sw0rD" and one of them will match), if you succeed the endpoint returns a url & token to upload your zipped solution. So you end up with a console application that has: network requests, string manipulation, concurrency/parallelism/throttling if you want (I did it to impress, wasn't a junior role), file access (zip & attach & send async), some error handling, good console outputs/logging and comments.
When you go to the interview we basically discuss the code I uploaded with one of their senior developers, what compromises I made, how would I improve it and so on. I got the job back then but since moved on. But that was the best interview process I've seen in my career. No leetcode etc, just a basic application that test if you know how to do a bunch of different things, without it being a whole framework mess or a whole product in some cases. it took about two hours, so the balance between spending time on and getting judged for my skill was good; it felt fair & realistic.
Other than not using a library, nobody can complain it's unrealistic. Real enterprise devs spend a fair amount of time munging data from one format to another or otherwise "gluing" pieces together. And the kind of person I'd want to hire should be able to complete it to quickly to complain about a "time consuming take home assignment"
And it provides plenty enough opportunity to make sure you're hiring someone who writes code that is pleasant for their teammates to work with.
IIRC the process before that was just the usual 5min recruiter chat and after it was a single on site panel interview before offer.
Finally we had tests for communication skills. For a unprecise formulated requirement, would the applicant ask us or would s/he over-implement?
Usually there was also something which was noch archievable, for which we substracted points if attempted unsystematically and at all.
It was a good test, because the simple leet code calmed the apllicants, and for the rest you goto see something much more valuable. Their approach to work, their thought process, their output, wethere they would go for Quantity or Quality and could self-manage their workflow.
I remember asking the typical "traverse an array in spiral" or "traverse this array in diagonals" a long time ago. The problem is that, if the candidate solved it, I just knew they knew how to play with array indexes. And if they didn't do it, I just knew that they got nervous and were not good using indexed arrays... it didn't give me anything.
That's why FizzBuzz is good: it has no false negatives. If a developer candidate can't do it, it means thay cannot code.
We didn’t reject people if they weren’t able to complete the algorithm, because it’s a lot of unrealistic pressure. For both questions, we mostly just want to see how they think things through, how they identify pain points, how open they are to feedback, and discuss their approach.
Even though we would tell people this, I think they still put a lot of pressure on themselves because of the status quo of leetcode interviews.
My engineering org focuses on tasks that are as real-world as possible. Areas we evaluate on:
- Have the candidate update some code based on a feature request close to real world requirements
- Have the candidate do some code review
- Have candidate describe how they productionize an app
I can usually research a decent solution for most "architectural challenges" in 15-30 mins, but I find it so difficult to have on my brain rolodex a wide variety of possible answers and probe live which of them will not disappoint a specific interviewer :)
High availability is one of our core problems, so a candidate must be familiar with at least some of the answers. And again, we still guide the candidate on the different points if they're stuck ("what about the db?", "what if the clients are in the US and in Europe?", etc.)
If an interviewer expects a single "right" answer, they're doing it wrong.
I wouldn't because my company has been burned before by hiring people who would otherwise have been filtered by your test. I'd say your test is the kind of responsible, yet reasonable test I'd like to see every company adopt some form of.
I'll do take-home programming, I'll do collaborative debugging and coding in a shared IDE with something that looks like a real project, I'll do system design etc. interviews, talk to you about programming, etc. and I'll show you my GitHub etc. projects and you can judge from that, and my 20 year long resume, whether I might be a fit.
Want me to write CS-class algorithm & data structure problems on a timed clock on a whiteboard or equivalent? You've just told me everything I need to know about your engineering culture.
I worked at Google for 10 years and I hated their interview process, it needs to stop spreading to the rest of the job market. If enough of us say to no to this process, it will end.
And to hiring managers: most of you are not Google (thankfully) and don't have a bottomless pit of talent to choose from. Stop pretending otherwise. You'll get better results. If you feel you have to do it, save it for new grads and stop using it for senior talent. All you're testing for is whether people practiced leetcode or whether they're straight out of a CS program.
I've done the same - and got hired anyway after I told the recruiter was not interested in taking any tests - just happened to have the right in-demand skills at the right time I guess.
I highly doubt it, but I do the same. So that's at least 3 of us.
If you’d like to try an interview process I don’t think sucks: https://mckesson.wd3.myworkdayjobs.com/CoverMyMeds_External_...
Many candidates (like: maybe the half) are fancy talkers without any skill in writing code. I really don't know why they are applying for dev jobs. It is easy to filter out these persons with a very simple coding test.
I agree with the article that 'leetcode' tests (find that complicated algorithm in 30 minutes while I am staring at you) are bad. But I think coding tests are good! Give the candidate just a really simple coding task with stuff they normally do every day. Create and delete object, fill arrays, iterate over arrays, and so on. 50% of the candidates will fail! The rest are OK engineers.
A hole in the market!
Do the candidates know that ahead of time?
Your approach seems similar to what I've done as a coding interviewer and to what my interviewers did when I last interviewed (at Google back in 2007). Assess people's coding with something relatively simple. Make sure they can gather requirements, describe why they chose this approach instead of a couple alternatives, and (if they make a mistake) that they can diagnose it if you describe the symptoms. If you have extra time, have them review some bad code. See if they spot the problems and how they gently help the author understand/fix them. (They also should be tested on system design, but that's a whole other interview slot.)
I'm studying to be a coding interviewee for the first time in 15 years. This process is stressful in part because they just tell you coding on hackerrank/leetcode/coderpad, which is so broad. If the problem they pick is as you describe, I should be fine. If it's for example some advanced dynamic programming problem...well, those haven't come up for me in the last 17 years, so I'm probably in trouble. It's a perfectly valid area of computer science, but it's not one that matches my experience or what I'd likely be doing if accepted. I'm not excited about taking the time to prepare for that, but I also don't want to make a fool of myself if they do. They probably won't pick this area...and if they do, it's probably a bad sign about the company or my understanding of the role...but the possibility is stressful nonetheless.
In the defence of LeetCode-style questions, I do think they work, and very well may I add - with the caveat you have the throughput of candidate to make it work well? Their ability to filter out 'those who can't code' in an efficient manor while sacrificing a small amount where it filters out 'those who can code' greatly out weighs the alternatives. The alternatives needing to fit into a 1 hour timebox, be objective while also favouring the positive cases (I think I got that the right way round).
My two cents would be more around the way in which they are conducted; in my experience I've found conflict with the interviewer more then the process itself - with interviewers in my past lacking.... empathy (may not be the right word) for the person on the other end of the screen/table feeling flustered, nervous or down right stupid that they're struggling to solve a simple fizz-buzz/reverse string problem, leads to a snowball effect and pilling onto that can effect the candidate in quite a spectacular way. Best interviewer I've had asked if I was alright and got me a glass of water, props to that guy!
I dunno - I've just come to terms with having to learn how to play the game, even if I find that part of the game really hard and to some parts unfair. Such is life
I've failed more than my fair share of these challenges, but never (being subjective here) because I wasn't actually capable of (1) solving the problem or (2) doing the job. My take here is that I _may_ have been unqualified for these roles, but that the interview failed to actually uncover it, due to spending all the available time on low signal exercises.
Statistically that’s irrelevant, as they optimize for “do not let through rotten apple”, rather than “find good apple”.
We just fired a person on my team who didn't understand pass by value vs pass by reference, or how to debug in an ide, but she could manipulate strings in leetcode!
The problem comes when smaller companies that don't have the same high rate of new applicants use the same process and then complain they can't find anyone.
This is the assumption I was referring to, that the "sacrifice" is small. It's suggesting that the false-negative rate for LeetCode challenges is small, and I'd argue it's actually quite high -- as you also suggest (your rate is 90%).
The problem is that the total number of candidates who apply for the position, Z, is significantly higher than X + Y by a very very large margin, and I mean orders and orders of magnitude. For every position I post I get on the order of 600-1000 applicants in a matter of a week, even though I'm only looking to hire maybe 2-3 people. Of those 1000 applicants, 80% of them are simply unqualified, and that's being really really generous just for the sake of argument (I'd wager the figure is closer to 90-95%). So once again just for the sake of argument that means 200 of them are qualified, and I'm hiring three, which means any process I choose whatsoever will filter out a minimum of 197 out of the 200 qualified people, no matter what I do.
Given that calculus, it's better for me to focus on making sure that I filter out the 800 people who are simply unqualified for the position even if that means I end up filtering some of the 200 good developers, because I have no choice but to filter out at least 197 of the good developers anyways no matter what, whereas I do have a choice about filtering out the 800 bad ones.
But did you consider the number of qualified candidates that did not even apply because they know there will be leetcode questions?
The code part was a small existing codebase simulating the system in said design document. You you are given three tasks, and explicitly told you are not expected to complete all of them. I ended up using virtually all of the time (70 minutes) completing the first two tasks, and using my remaining minutes writing comments about how I'd complete the third task. When that was complete, I was given 15 minutes or so to describe what I would do if I was given another 15 minutes of time to work on the project.
My only real complains were that the time limit added some pressure (that I was able to manage reasonably) and that the grading process is opaque. I know a human grades it according to a rubric, but I don't see any of my results. The company I was interviewing for just said "Everything looks great, we're moving you forward to the next stage of the interview process".
The code didn't involve writing any fancy algorithms, but instead getting to know a (very small) existing codebase and understanding how to use it to add functionality. This is much more realistic a gauge of how good of an employee you are than how well you can implement a search algorithm from memory.
You're presented with a laptop connected to a remote VM, and told "Fix MySQL", or "Rewrite the git history in this repository".
Usually these are simple problems, which have obvious solutions. Every now and again you might get a surprise like an immutable-bit set on a file, or SELinux blocking access to specific files/paths, but the good thing about these kind of "challenges" is that you'll usually also have full google access.
I guess l33tcoding isn't really a thing for sysadmins, but I do appreciate a (fair) simple test like that, especially being given the opportunity to talk through the process.
Followed by "this code needs refactoring, go nuts, and then let's talk about what you did and why afterwards".
But i have also heard people say "Oh my god! They asked me to do a debugging exercise - ON PAPER!!!? What were they thinking?!".
It's an assessment that's designed to find people who are ready to submit to an endless grind with little to no skepticism. Developers who question the technical usefulness of LC interviews are simply not the target audience anymore. The target audience seems to be potential employees that are hungry and without leverage.
The “hundreds of hours” grinding LC is largely for juniors without experience. I don’t know any senior engineers who had to grind LeetCode like that for their FAANG interviews.
Don’t read too much into blog posts. This is engagement farming to capture search traffic and trending topics related to LeetCode.
Taking months off to grind LeetCode all day isn’t common and doesn’t even make sense. LeetCode can be done on a lunch break. Even one problem per day in the evenings is more than enough for a senior to prep for an interview.
Having done LeetCode, I’m not even sure how a senior could justify spending 2 months doing all of the problems full-time.
The lifestyle/compensation gap between top tier tech and everything else is enormous and it's a tough pill to swallow that the only thing keeping you out is some light studying every day for a few weeks/months.
If that's true, then it should be fairly simple to defect from this prisoner's dilemma- just publish articles saying, "I didn't have to take months off to grind LC, I completed it through light prep and you can too!" In the realm of blog self-help, simple advice, framed with this sort of counter-common wisdom contrarianism, can be as popular as the ones that follow trends. Often even more popular.
But you don't really see articles like that. You do see some pro-LC articles from interviewers' points of view, but none saying, "It's actually easy! Here's three simple tips," despite the potential for search traffic capture.
"Trust me, not other people" says random person on the internet, providing no evidence to support their claim.
> Having done LeetCode, I’m not even sure how a senior could justify spending 2 months doing all of the problems full-time.
So not only are they lying, but if they aren't lying they are incompetent. Got it.
I know because I’ve talked to dozens if not hundreds of people who have tried to get into FAANG with that level of study. It definitely takes more for the average person. Some people get lucky and spend maybe two weeks studying for a couple hours a day. But they’re lucky and shouldn’t be considered the norm.
Also - LC and the whole process is very fungible. You can say they did well if you happen to like the candidate for some other reason and you can knock them down if you don’t like them either. I’ve seen it go both ways where terrible candidates get offers and amazing ones get rejected. Ultimately - LC is still only part of the interview. If you are really handsome and charming - you might get an offer even if you’re not very good at LC.
I'm at the new company and I can confirm that's what he is still doing.
I've studied less than 200 hours in my life and now make ~320k and expect to get ~450k when I switch jobs later this year (both remote)– I have only a high school diploma. Chalk me up as another victim of big tech... I guess I should've been more "skeptical".
Hope that adds some perspective to things. (I'm not trying to justify the extent of some responses, just let you know my take.)
My FB interview panel was the biggest clowncar of unwarrantedly self important people.
Anyway, pretty orthogonal to your comment, but kind of hilarious seeing what comp can do to people's ego, and perception of self
I made it rich through hustle and major contributions to a startup from the early days. Most big tech employees are a cog in the machine, along for the ride
What surprises me most is the lack of flexibility in the process. If a candidate shows up with a broad portfolio I’d rather talk about that then doing some random coding problem. Yet our HR manager insists on the fixed program. This is worse when the candidate is interviewing for a senior role where I don’t really care. Then I am mostly interested in their past experiences and knowledge on how to build things that don’t fall apart after six months.
Again it is definitely process over people here… not sure if it is better in other places.
I would also say that these exercises are most effective when they are quite simple. They let you test ‘can this person write a function’. The complicated ones often filter more for people who have studied those type of problems. Harder problems != better coder. At least not for the projects I work on which are more integrating existing services than investing new novel highly efficient code.
The first thing you start to realize when interviewing is that every company has their own unique process for interviewing. The second thing you realize is that you're not going to ace every process every time, it's a roulette wheel you're spinning to see if this specific process and this specific day and this specific set of interviewers and this specific mood you're in are able to align in a way that they feel confident giving you an offer (leetcode or no leetcode, doesn't really play in to this factor).
The nice thing about leetcode tests as a candidate is that you can study for them, go through a few rounds of it with different companies, and get better at it and know how to improve for the next interview. When companies drop the leetcode tests you end up getting judged on the arbitrary criteria and testing that they devised in its place. If you come out of that interview not doing well, you can't really use that as practice for the next one -- because the next company you interview at may have a process/test that doesn't overlap at all with that previous interview. Now you don't have to practice leetcode and spend an hour doing something that's not directly applicable to your day to day job, but instead you're subjected more to the whims of randomness and whether you were prepared to satisfy the process they came up with instead -- which may not be shared by other companies.
Leetcode isn't great, but it's also not that bad. Some companies (i.e. Google, Facebook) you will have to get very in depth with practicing and knowing data structures and algorithms to do well in the interviews. A lot of other companies you can pass the leetcode with a lot less work, just need to have a basic refresher on graphs, trees, linked lists, etc. Other companies yet, they won't ask you leetcode at all (but that doesn't mean the job/company is good in other areas either, it's always a tradeoff).
I try not to be a part of the problem when I'm the interviewer, giving a problem that would be described as a Leetcode easy, with an optimal implementation that is below easy. But I want to see if the candidate can understand the problem, the big picture, talk about tradeoffs in the problem, properly analyze performance, properly test their code, etc. Most candidates struggle with this, many can't even code a working solution, and this is the talent pool for a "top-tier" software company.
> Deal with ambiguity, Reviewing code, understanding what it does, finding gaps, Testing, Code structure, Cleanliness, Learning new concepts
Yeah, no.
A lot of these are culture. I'm fairly confident I can teach someone smart and competent to write clean code, add tests, and properly modularise the project.
It's called training (progression from "junior" to "senior"), I think more companies need to invest in it.
What you can't teach someone, is how to be (1) smart, (2) understand how computers work, and (3) be passionate about tech. That's what interviews are supposed to test, and leetcode (and some deep discussions, e.g. "how does a hashtable work" then leading deeper into the details of CPU, memory, instruction scheduling, optimisation, ...) does that.
The best jobs I had to date, I met the person leading the company/project/team, we had a chat, talked what tech we like, dislike, how we'd structure a product, what are the preferences to the process around everything. And that's the key thing - it was always a discussion, no Q&A. The key is that the candidate is not the only one who needs to know his stuff - so does the lead.
As a side effect, all of those jobs were way above the market. Again, personal experience, but higher up you go - less BS like "we need leetcode to hire" you get. Unless you're Facebook and you have a genuine problem of too many qualified engineers constantly applying, you should aim to only disqualify truly hopeless cases.
The company can't hide behind process and expect great hires. Early in my career, in a small city I was working in (in return, in the dev community you know about what other devs are doing), our company denied so many devs that within a year or two were among the top performers, just because of the leaderships insistence of a take home tests, Q&A interviews and gotcha style questions...
So please - do continue using leetcode, it makes filtering your company out so much easier and I don't need to go through bullshit stages to know that the leadership has no balls to make the hard calls when it comes to hiring & firing.
1. An interview proces exists to fill a position. It doesn't exist to fairly assess an individual candidate. Candidates would like that. That's not the point. If there are 10 candidates and the employer fills the role successfully, they've achieved their goal even if someone great was filtered out;
2. FizzBuzz came about because many people talked a great game but couldn't code a flor loop. Giving a simple coding problem is an excellent negative filter. Doing great at the problem means nothing; and
3. Interviewers make the mistake of thinking FizzBuzz is too easy so they give harder problems. This is a mistake that defeats the entire purpose of the filter. Stop doing this.
These points remain constant in every such engineering hiring or interviewing thread.
You'd be amazed how this one small change makes the discussion quite different.
Also is the input always integers or is there some “junk” mixed in?
A surprising number of people have a lot of trouble with the reading loop/termination condition.
That's really not how it works in Big Tech. The company is ravenous for anyone and everyone in the world who clears "the bar." Requisitions and headcount quotas are a way of apportioning bar-clearing candidates among teams/EMs, but the company never reaches some state of having filled the open positions and being done with hiring. And as an individual engineer, you're expected to help interview for sister teams (sometimes quite distantly related) so you never do either.
Even when hiring for my own team I have never seen a discussion like "okay we've seen 7 candidates for this role, let's pick the best one." It is always just take it or leave it for each candidate as they come. The goal is to get as many people as possible in the door. Making the interview easier would fit our goals quite well, it's just a social taboo, so instead we do things like cast a wider net and spend more hours interviewing.
Ultimately the proof is in the pudding, I've had loads of candidates that could barely code and Leetcode-style problems are a great filter against that.
Otherwise you risk just getting PM-style bullshitters as engineers, who talk persuasively about projects that other people actually implemented.
The more I learn about software development the more I try to _not_ have leet code style parts in my code - in the very rare circumstances would I see something like that and say - yes there is _no_ other library out there that has a battle tested algo to solve this particular problem, _and I have to code my own_.
Worse people who excel at Leet Code could start to bring that sort of thing into your codebases, optimising small parts of your code to perfection, and then leaving the whole thing a mess or just plain reject to work on solving business issues and concentrate on polishing their small bit of algorithm.
Of corse there are positions where that sort of mindset is welcome and sought after. Especially in very big companies, but for the most developers out there leet code is _just_ for the interview part and they would (should) never use that kind of problem solving in their day-to-day work.
When I have to interview somebody, and there's leet code involved:
a) they are _really_ comfortable with those types of challenges - that tells me they have spent a lot of time preparing - either for this interview or just generally, either way that wouldn't _really_ tell me much about their problem solving skills
b) they feel uncomfortable and fail to solve anything due to stress or anxiety - again no really knowledge gained, as real-world work environments tend to try to minimise those, at least in the places where I work in.
c) they feel uncomfortable but get the hang of it - now I _might_ have a glimpse of their problem solving skills, but I've put a human being in a very uncomfortable position just to _test_ them. There _has_ to be a better way.
The way I like to conduct interviews where possible is to ask people to walk you through some of the code they've written and ask various questions about decisions - much more relaxed and I still get the sense of how they organise their stuff and how they work.
If that's not possible - a take home task or something. Or even "hire fast fire fast" approach works too.
The problem is that a take-home task can be impossible for some people already in a full-time job with kids, etc. and so has its own bias. And the "hire fast fire fast" approach doesn't really exist here in Scandinavia, even though there is a probation period it's still frowned upon to use it for anything but extreme circumstances, and if done en masse would likely raise issues with the trade unions.
This sounds incredibly specific. Most places requiring at most LC easy don't really need any of this, and I'd be worried about the interviewer looking for key words and specific answers over actually testing whether the candidate grasps things or can learn what is necessary.
That way, some of the pressure is off of coding with someone looking over your shoulder, and you still have time allocated off already.
> ...
> Or even "hire fast fire fast" approach works too.
Comment "c" shows a high level of care/concern for the candidate. "hire fast fire fast" does not.
What if the candidate left an unsatisfying but steady job to join your company? And they get fired in the first few weeks. Now they are unemployed. This is much more uncomfortable than an awkward interview question.
The coding round is supposed to test that.. you can code.
For the record I’m also not a fan of the Leet Code style rounds, even though I actually find completing them (outside of an interview) quite fun.
The point of leetcode is not to show what you can do, it is to show what you can't do.
To keep up with your analogy, being able to design a simple website doesn't make you able to set-up an enterprise-level infrastructure, but if someone isn't able to design a simple website, I don't want to hire him for my enterprise-level infrastructure.
As for "outside the box" thinking, it only works if you know where the box is, otherwise you are just being clueless.
And by the way, because it is an argument I see way too often, calling the "sort" function of your favorite library instead of doing the exercise "as intended" is not "outside the box" thinking, it is literally the most obvious thing to do. What could count as "outside the box" would realizing that you can solve the problem more efficiently by not sorting anything at all, which requires you to know your sorting algorithms to show that it is indeed more efficient.
They aren't suggesting to not do programming tests, they're saying make the tests more aligned to the role and domain being hired for.
I use a pretty similar approach and find it works very well.
What does the code do? Does it work? How would you get it working? How do you test it? What is the complexity? etc.
I'm a great engineer, I just suck at leetcode questions because...shocker! They have absolutely nothing to do with my day-to-day. It's similar to puzzles; I hate puzzles and doing puzzles/escape rooms/etc, but I'm a pretty smart guy.
Leetcode is merely a gatekeeping methodology that proves almost nothing and weeds out a lot of amazing engineers who aren't skilled at grinding leetcode or hate brain teaser shit.
This is biased towards people who code for free in their free time. I'd call this terrible advice for most companies, since it filters out the vast majority of qualified candidates.
I have some open source contributions on my GH account, but none of them are representative of how I code since they are all bug fixes and/or small enhancements which are shoehorned into an existing codebase, since my goal is to add a feature with the smallest number of code changes (in order to increase the likelihood of a PR getting accepted).
Because of this perceived "truth", I had the same worry when we started to implement a coding problem. Rather than guess, we decided to measure it: for the first six months, we used a wide filter (50% pass rate, actually like 65-80% of people who didn't cheat).
What we found was that there were zero candidates in the bottom 66% who passed the rest of the interviews. The plagiarism detector also had no false positives (based on manual review). So at least on this sample, we found that we could screen out about 80% of applicants without having _any_ false negatives.
I'm sure there are some bad employers misusing coding tests, just like with any tool, but I have to imagine many others have done similar experiments and found their tests to be effective.
If the bar is "it looks alright and the person knows the language they're using," it's probably not generating a whole lot of false negatives. If the bar is "the candidate comes writes the optimal solution to a complex algorithmic problem in 45 minutes," then that's highly noisy and tends to filter for people who have done a very similar problem recently.
Unfortunately, too many interviewers use the latter bar for passing or failing candidates.
The hard part was all the exploration I had to do around the problem to get to the point where I understood the constraints well enough to solve it. I had to rewrite my attempted solution a number of times as my understanding grew. In my opinion, this represents the real thing we should be trying to test - a candidate's ability to unearth the true definition of the problem. When it comes to writing real world algorithms, whether you can solve it in 30 minutes or 3 days is (mostly) irrelevant, because it makes up such a small part of the overall engineering time.
You could squint and make a case that this is what LeetCode challenges are doing, but I'd only agree if we removed the requirement/pressure to have working code passing all the tests within the time allocation; and to be honest, most of them just hand you all the constraints on a platter.
I had to derive and then write out all the edges rules by hand, which was many hundreds of lines.
P. S. I hate coding interviews.
But, yes, this is more work on the recruiting side.
As a side note, I totally get it why large organizations would use Leetcode though. It does help filter out false positives if you're willing and able to bear the cost of passing on many good candidates.
"What is a binary tree" will filter out most of the bullshitters.
None of this stuff is rocket science. We have a responsibility not to be lazy when interviewing people.
Not really silver-tongued candidates? Well, what's the problem? Unless you are looking explicitly for silver-tongued candidates, you should ignore this "trait".
I think an extra hour to talk will give me more information than watching them balance a binary tree.
For many people the stress of the leetcode session is just awful, I don’t think it’s a nice thing to inflict on someone if you’re ultimately going to disregard the outcome anyway!
I don't want to know if you can do specific things, if you can't you'll learn, but I do want to know if I'm gonna find it easy to get along with you, if you seem like an interesting person, and if I can stand being in a small room with you for 7 hours a day.
I suspect this is just another kind of bias, but I've had good results.
My favorite way to judge candidates now is by asking a “clean code” question. This doesn’t refer to Uncle’s Bob Clean Code, but to code that is simple, maintainable, and extensible. I give candidates a simple and slightly ambiguous problem statement, usually revolving around “write a library that does X”. I expect candidates to ask questions and clarify the ambiguities, then proceed to define the APIs and finally write the code. The implementation is straightforward, with no tricks or logical puzzles. Only use simple structures such as lists, hashmaps, and loops. Then I ask one or two follow-up questions for more requirements, such that they need to modify or extend their code. Depending on how this is organized this might be trivial or very complicated.
I feel this format is the closest to on-the-job work and gives me a good feeling of what it would be like to work with these people. Also has a lot of freedom and allows one to peek inside the candidate’s mindset. How do they deal with ambiguity? How do they approach API design? how do they handle incorrect values? Do they care about corner cases? It is also mostly devoid of what developers hate most e.g. trick questions and obscure algorithms.
This is the current process that I think is fair and holistic:
1. meeting with the candidate, our manager, and some devs talking about their past exp., our company, our team, and their wants
2. Take home coding task based on our day to day work: This is linear with direct instructions for inputs and outputs; there is an optional part at the end for testing more tricky concepts. They are instructed to write clean and clear, no stress if they don’t finish, take their time with a week to do it (it’s a few hours work).
3. Interview with them walking through their code on their machine and describing their thought process, field questions from them if any are left.
Then we decide by a team discussion afterwards.
Gives them their space to think, reduced pressure for candidates who are socially pressured.
Thoughts?
I personally detest leet code as a recruiting tool.
If the candidates are anything like me then any optional or bonus features will be considered mandatory. I have no way of knowing what percentage of other candidates do the optional work and so I have no way of accurately assessing the risk of not doing the optional work myself. I will ignore your suggested timebox if the optional work will take longer and then I'll be a little pissed off at you for how long your take home assignment took me.
1. Load a data file here
2. Tell me some facts about the data
3. Here's another dataset, can we use both to figure something out.
4. One of the executions for this order is missing, how can we find which one.
5. Here is a data feed, can you write a process to ingest the data and calculate something in real time.
I by far preferred this system to the alternative which was to ask trivia questions and see if the candidate memorised the docs. There is of course some value in asking basics, or to elaborate etc. But on the spot algo questions are usually only useful in filtering people who either like leetcode problems, or have grinded them for the last 6 months.
However, when asking around about why people who use it do so, I found out it does have one irrefutable advantage: it stops people who can't code at all.
From an engineer's point of view, LeetCode is a complete waste of everyone's time because it measures things that aren't factors in successful engineering (as TFA says).
Bu from the non-technical manager's point of view it's awesome because it gives a single, simple score for "how good is this engineer compared to the other ones?" and people who can't code at all can't complete it.
The non-technical manager's worry when interviewing is that they hire a really expensive employee who can't do the job. But because they don't understand the tech, and the tech is complicated and even expert engineers spend lots of time fighting it to no apparent end, it's really hard to understand if an engineer is incompetent and bullshitting them, or actually good but the problem is hard. Having a nice, easy metric that stops the complete bullshitters from getting in solves a problem for them.
What we need, obviously, is a professional association for software dev, that can then properly test us and verify that we can do the things we say we can do. But the industry has a lot of growing yet to do to get to a point where this is even possible.
People will always study to the test. So it is essential that when you interview you test for what you ate looking for. This is why using 3x leetcode interviews is a bit silly.
Testing if someone can code is 100% reasonable. If a company wants to waive their coding test for me, I tell them they shouldn't and that they should NEVER assume someone can code.
Yes, that means your company needs to have questions, and interview design, that actually looks for what your company truly wants and desires. Amazingly, this CAN be done. Interview design is hard, but very possible,
But asking a EASY leetcode question is 100% reasonable.
I am okay with disappointing people, but it can be unnerving when that disappointment means I miss out on a good opportunity.
That said, I still don't like doing leet code interviews and I'm pretty bad at them, but that's the logic that imagine goes on in an employers mind (hence why "they're missing out on some types of candidates" logic likely won't sway anyone reading these comments I suspect).
But this exactly what they’ll do on the job. Actually, searching for help and distilling what you’ve found into a clean solution is a skill in itself.
The point is that code challenges are a pretty hard to fake test and the loss of some types of people is worth it for the employer (like me, who sucks at them).
I think companies should offer a choice to interviewers if they prefer to give code samples , an at home problem solving or an in-person exercise. This addresses careful thinkers, adapts for anxiety during an interview.
I do appreciate when companies ask relevant questions that they have come across rather than mundane Sudoku questions.
I have interviewed with a few companies, and Stripe's interview style stands out. Coding questions are relevant day to day style questions.
I would say Google, Amazon and Facebook set this trend and have spoiled it for all.
Unfortunately, some companies cannot think on their feet to set a different approach. Maybe it's in your best interest to avoid these places.
Leet Code is only cargo culted because many candidates let it happen.
this provides a few things; it gives us an ability at how the interviewee problem solves. next we can see how they respond too obvious fixes (would they be someone you'd want to send a PR too?). finally, it tests their knowledge of the language and APIs, hopefully much better than Leet Code can. I would also like to see if the user can spot obvious bugs in the setup code (say, package.json, pyproject.toml, etc)
I am going to make an example PR for: - frontend (React/NextJS, TypeScript, CSS) - backend (Django, Python) - DevOps (potentially some Pulumi code for deploying to a Kubernetes cluster?)
What I’ve seen are time trials, which don’t show you how well a candidate will adapt to a codebase, wont show you how they will do tickets for your sprint. Only reinforces a flawed idea of the employer about how they wont “hit the ground running” despite having that job opening for 8 months.
What you described might not be a time trial, its what ive seen though.
I don’t happen to believe that and thus believe it biases in favor of candidates who can devote considerable quantities of free time to preparation.
It invites a conversation, in depth, about software construction, quality, and decision making from the point of view of real work. It also tells me if a company wants to simply filter. If the organization is unwilling to invest in a candidate interview, as I do to be interviewed - I in turn learn a lot, and decline to pursue accordingly.
In fact, I have so much stuff out there, in the public realm (I’ve been doing open-source software for decades), that employers could easily evaluate me technically, without ever contacting me, and all they’d need to find out, is whether or not I’d be a decent team fit.
I suspect that the main reason they ignore my portfolio, is that they have already decided that they aren’t going to hire me, and don’t want to waste their time, reviewing my work.
It also helps me filter out companies that are either too lazy, or too strict in their procedures, or both, i.e. there is no value in asking the same questions, regardless of candidate’s resume.
As an example, a month or so ago I went through a couple rounds of interviews with this company. I told them forthright that I wasn’t doing any code assessments, and if they wanted to, they could take a look at my GitHub account. They seem willing to consider. Third round comes in and they ask me to write some sorting algorithm, to which I refuse.
Ironically enough, one of my repos does have an implementation of an advanced data structure, so they could as well just take a look at it.
The problem wasn’t that I was incapable of solving the problem, it was the narrow view of possible solutions. The interviewer was looking for the CS101 solution.
My biggest gripe with leetcode is they tend to filter diversity of thought.
If possible, i'll let them code some small functions and ask them how they gonna do the unit test.
To me, refactoring skills is a must, as most of engineering work is on refactoring.
- A degree (In which you've proven you can understand these algos and spent 4 years studying)
I'm not going to redo all that in 1 week before your stupid puzzle!
- Experience (That has to be worth something it's not like everyone is lying about it)- You may have open source contributions
But no, some companies will not even start to look at that or not look at all, before they ask you this stupid puzzle.
Personally I now filter those companies out, I mean 20 years of experience, contributions in major open source projects, if you can't recognize that? why would I interview?
Were I work now we give code assignments, while they take longer to do you can actually see structure which I agree with the author is the top quality I'm looking for. They are also less stressful for the candidate.
Unfortunately this means next to nothing anymore. I have a bachelor's degree in CS and Math, and I found it very useful. However, I host a fairly large community and provide tutorials on coding projects. I've had several people working on a masters thesis in CS reach out to me because they're following one of my tutorials for the thesis. They then ask a very basic question that indicates they don't know how a package manager works, or how to look up documentation on a library. I think these two tasks are some of the most basic programming tasks available, and if you can make it through 5-6 years of college in CS and still not have the most basic understanding of this, then a degree means absolutely nothing anymore.
Some more anecdata, I've had several friends who graduated with me and can hardly code. It's unfortunate, but I think degrees are just an expensive piece of useless paper that tells you absolutely nothing about the individuals abilities.
So if you willing to spend your free time mindlessly practicing, you will be a good ant at the company. Which is very desired since most of business programming is boring and repetitive and does not require creativity.
Also, validating the solution is simple. Does not need too much effort and creativity from the person conducting the interview.
75% of fresh grads are below mediocre, to put it very mildly. 50% of candidates with a seemingly OK employment record or portfolio are too.
leetcode filters them out right away. that's the purpose it serves. it's not there to get you good candidates, it's there to make sure that you only spend time interviewing potentially good candidates.
I would agree that it would be ideal to use coding challenges suited for the job you're hiring for, but that would take a lot more time and effort to make and review
Effort spent on hiring process is reflected in quality of employees.
potential top talent might get turned away yeah - if they can't leetcode and have nothing impressive on their resume, but that's acceptable
I have been on the receiving end of applying to an agency and being told I didn't make the grade technically. I was disappointed because I know I am a good engineer but I didn't expect them to magically know this. I can also see how my approach to the technical tests might have made me look less than what they were looking for, which is fine.
I am also not sure of any good alternatives because someone will always object to any alternative which they cannot achieve for some reason. A "take home" project is good for real life work but some people cannot (or will not) invest the time even if they are paid for it; discussions can be great for helping nervous people but that is not how work usually is, there are challenges, pressures etc. and the able people object that it is not fair that people are getting in too easily.
When I was on the market, a couple of companies actually gave me a variety of options, which I appreciated. I don't want to spend hours on a take-home and I also don't want to do leetcode, but an open question/answer plus some code review and live debugging was an acceptable combination for me.
Providing the options definitely has the potential to take up developer time, but I think the tradeoffs are worthwhile for both the interviewee and the hiring team.
The exception is my current position (only started last week): "oh yeah, we looked at your GitHub already and it's actually similar to the take-home anyway, so little point in that". Instead, they prepared an "alternative" interview where they posed some scenarios with "what would you do? How would you handle this?", which was intended to test both some technical skills, but also social/attitude things. I wrote down some answers, which took me about 30 minutes, and then we discussed them, taking a further 30-45 minutes.
The questions were a bit clunky because they were looking for someone ASAP and there was only 2 days between the first and second interview, but I felt that was a much better approach for the company as well, because they got a lot more information this way: they could already verify basic coding skills themselves, and this way they got a new chunk of information they wouldn't have had otherwise.
You named the exact problem with the industry.
No one is going to complain if FAANG does this with top tier, life changing salaries. No one will object to learning and memorizing DS&A at a job where DS&A is used heavily.
What people are upset about is your average no-name company hiring individuals based on things they won't use during the job, of which the knowledge is still incredibly varied[0], and they still complain about not being able to find anyone and play the "woe is me" card.
[0]: Dare I say it, DS&A is such a big topic not everyone learns the same things. Thinking in terms of a tree is different from thinking in terms of a linked list, graph, tree, heap, stack, queue, you name it. Most LC medium/hard require time you won't get, information you might not have. This knowledge isn't as universal among skilled graduates as people like to believe. And we all know the moment candidates are able to just memorize questions about linked lists, hiring will jump to the next topic.
Thoughtfully creating an interview process and the procedures/questions is a skill that has to be learned... and when people haven't or don't have the opportunity to learn that skill, it makes sense to turn to resources like books or articles, the most popular of which are often based on FAANG practices.
I also know from my own experience structuring and performing interviews that there can also be a lot of pressure from the top to eliminate candidates following the belief that "the last one standing" is the best, rather than actually trying to evaluate the strengths and weaknesses of every candidate.
That way tends to lead toward interviews of 5-7 rounds that act as sieves.
This is all just my limited personal experience though and I'd love to hear from other people who've done interviewing at/for smaller companies!
That sounds excellent!
This would allow the company to determine what the applicant believes is their strongest suit.
Then, when it comes time to sit down as a team, and review all the "top shelf" applicants, people can decide, based on a number of criteria.
If an applicant avoided technical challenges, but spoke well, then some managers might like that, but others, might not be comfortable. Maybe they might devise a technical challenge, customized to the applicant, and using real-world problems.
The main deal, is that the vetting has been done. The chaff has been filtered out, so more attention can be paid to the wheat.
At my old corporation, headcount was something I had to fight like crazy to get (I was a manager). We seldom hired, so it was well worth it to spend a great deal of time on each candidate, as they would be responsible for important work, and would have a great effect on the corporate bottom line.
That sounds like a lot of small startups, to me. BigCorp (MAANG, et al) hires thousands of engineers per year. They need to have a cookie cutter system. Smaller companies do it, simply because they want to be like the Big Boys.
Also, and this is neither here, nor there, but binary tree tests are a great "young-pass filter."
What's happening is companies are putting the burden of the risk on candidates more and more. Because they can. If candidates would put their foot down and stop accepting this, most of these shenanigans would stop. The junior market shows what happens when people are desperate for jobs and willing to bend over for any whim corporate has that might help their hiring process (even when most of it is completely unproven).
This is probably fine in an environment where the candidate has lots of other options, but think about this scenario: a person applying to multiple companies, possibly rejecting some offers, possibly relocating or otherwise changing their life, accept that one offer, and then be let go in their first weeks. Changing jobs can be emotionally difficult and being let go even more. If you have to restart your job search, because you were let go during the probation period, all the other roles you have applied to might have been filled. On top of this, contrary to when you were looking for a job last time, now you're actually unemployed and potentially under pressure to find something new.
So, in essence I don't think this is good for candidates.
But as things stand, nothing is preventing companies from doing the above anyway. If they think you're a bad fit, they will use the probationary period to cut ties with you. This is perfectly viable today. Your example assumes current filtering methods do in fact increase the ratio of true : false positives, and taking some of them out would decrease that ratio. This is not something that has been proven, and I'd even argue it's something that can't be reasonably proven within the next few years. This is even worse when considering a few interview rounds can only filter for the most obvious dummies, but can't decisively tell you the performance of that individual a few weeks down the line.
What your example does show is how much power employers have over employees. It just isn't healthy for individuals to have to carry this amount of risk while corporates continue to reap the benefits.
Similar to algorithms itself, interviewing is essentially searching for people that the company wants.
How a company interviews candidates define its effectiveness (hire the right person, less false positives, less false negatives) and cost (how much does the company spend on the interview process per hire).
Interviewing with LeetCode is acceptable effective: candidates.filter(leetCode) gives you a much smaller set of people good at algorithm brain teasers, and this set of people have acceptable approximation with the set of ideal candidates.
In other word, it's a lazy but effective enough. The majority of companies will only switch to alternatives when the cost is lower, or substantially more effective. It's broken from the candidates perspective, but not the companies'. Most companies will stick to "if it ain't broke don't fix it" unless we offer them 10x solutions - which is yet to be seen.
But I can also see it the other way around, we can undermine the effectiveness or cost for all companies: if we can develop better courses and bootcamps, letting more people hack LeetCode problems quickly. And then companies will naturally go for harder problems. In the end, the problems will be ridiculously hard that the companies can only filter people who memorizes LeetCode, and those set of people have virtually no correlation of good hires (good problem solving skills). And of course, it's also a profitable business to teach people this.
> Most companies will stick to "if it ain't broke don't fix it" unless we offer them 10x solutions
It should also work if people undermine 1x solution to 0.1x solution. If there are a lot of bad hires at the company level, which they can't finish ordinary tasks other than LeetCode problems and keep screwing things - the team leads and managers will start to complain and eventually propagate to the top level.
> I don’t think it’s an all or nothing situation. You should use questions that provide data per whether the candidate will perform in the job they’re interviewing for. If that job is extremely algorithmic driven, e.g. in academia, or involves OS-level optimization, sure, maybe leetcode exercises are relevant
Without the ability to get hired by just "being good at leetcode," does that make it harder for people to break into the industry?
- Check their English
- Confirm that they are not an impostor
The former is an especially good predictor, because it tells me whether that person can read documentation.
I suppose for native English speakers a reading comprehension test would do.
The only thing Leet Code ever tests did for me is give false negatives.
Part 1 is a design doc where a problem statement has been outlined with goals and notes from the development team. Your job is to respond to their questions and propose a high level architecture to solve the problem. Part 2 is the coding portion, you're dropped into a codebase that relates to the previous portion and are given a todo list of tasks to complete. It's basically feature implementation, ranging from trivial to somewhat involved.
I really like this approach. As someone who has interviewed a lot of candidates using Leetcode style questions, I would love if my org moved towards this format. Unfortunately, it's pretty hard getting FAANG companies to drastically change hiring practices, but if smaller companies start adopting it maybe it will get some traction.
I agree. A couple of years ago I was asked by two companies to solve leet code problems even before there was a screener meet-and-greet interview. They were quickly crossed off my list.
Though, I don't agree leetcode is a good interview practice.
This is worse than LeetCode in my opinion. Because all it is, is a shallow copy of LeetCode. You've constructed a puzzle by laying out a picture and cutting out particular pieces. It's "find the differences" between what you've given them and the image in your mind.
> If I’m hiring a landscaper, I’m not gonna ask them to tell me about the classification of ficus in Fiji, or the specific reproduction period of Douglas Fir in the West Coast. I’m gonna ask them to trim a tree and see if the result suits me.
And the landscaper will walk. They will not work for free. They'll give you references, they'll show you pictures of work they've done before, but they won't do work for you.
I didn't make this one up. That's how one of my friend got interviewed for his current job as a landscaper, he actually worked with the company for a day.
in my opinion
I agree it's maybe a little less respectful of a candidate's time, but as long as it's not too big a task I don't think it's unreasonable either.
When I was a junior developer I used to deal with a). Now that I have more years of experience I usually deal with b).
I’ve seen so many people over the years do terrible on these types of test that went on to be amazing contributors. We only found this out because we essentially ignored the outcome of these tests, which makes you wonder why you’re doing these tests at all!
That doesn't mean that someone would be unable to program it. Inverting a binary tree tests if you know how to traverse a tree. I may not traverse trees all day at work, but I can easily do a tree traversal if I needed to and I expect that to be true of most people who can actually program and not just talk the talk.
If you really really care about me traversing a graph, leave me alone with the task for a while, let me take my time, give me access to the internet even. Why do you care that I can write it on the spot? If anything that just proves that I memorised it just before the interview, not that I actually had to think much about it
- interviews are inherently more stressful than even a very busy day at work, - they cover topics unrelated to what you'd do as part of your job so if you're good at the job you might still fail the interview - people with time (==money) to prepare for interviews will come out ahead of those who don't have that luxury, despite the fact they may be far better prepared for the actual job.
So you get a bunch of false positives, a bunch of false negatives, and on top of that you're discriminating against people who are in a worse financial situation or have interview anxiety. I can hardly think of a worse outcome for a seemingly sensible hiring method.
There are a couple of things at play here:
1. I'm regularly complimented on how sharp my mind is, but I can't reliably recruit that sharpness on-demand. If I get any kind of brain fog during a timed problem (with no opportunity for a break), it's game over.
2. Coding in an unfamiliar environment, like Coderpad.
The problems are hard enough to make them easy to fail if you can't spot a good approach immediately, but easy enough that a "good" answer gives very little signal relative to the time being dedicated to the problem. I've done interview processes where 50% of the total process is given over to these kinds of problems, and the process concluded with me feeling I didn't get any real opportunity to demonstrate my strengths.
Have you ever seen corporate codebases? Leetcode emphasizes the old way of thinking is/was prone to do what you are told, dont think, just do the task in the timebox allocated for the sprint, always reinvent the wheel, and each axel, multiple times, for each wheel, in the same codebase.
This jira waterfall code now, dont think, and this might be fine for a unicycle, or even a bicycle, bad for trucks and trains.
Hint: With factor t - all tech debt - Everything will become a truck or train.
they rather keep a set of leetcode, iq and personality test to remove you from the list of candidates
root cause is bootcamps over saturation of devs in job market, especially in web
Now, IQ tests are of dubious legality, at least in the US, but algorithmic coding questions basically get you an IQ test crossed with a programming skill check: win-win.
All the ire about how you don't actually invert binary trees or whatnot during your real job are rather missing the point.
Yeah, you know how Search serves 4 Billion people or people created Chrome or gmail in their 20% free time?
Because they could leet code and not use Stack Overflow as a crutch.
Sure, not all companies need leet code. But someone who can leet code has demonstrated skills that has proven to be correlated with creating Trillion $$$ companies.
Now go back to developing your CRUD app used by 20 internal users (because they are forced to) and let companies who are successful continue to use their successful methods
Most of the work @ Google, especially on an established codebase like Chromium (my experience), is about slow incremental engineering in very small bits and pieces doing mostly really mundane administrative things. And when there's 'core algorithm' type stuff to do, there's plenty of time and space to stop, consider, read the literature, and move on from there. Nobody is going to put a gun to your head and put you on a clock and then score your results like in an interview.
Most of the intractable difficult problems at Google are more "how to get there from here" and organizational; how can I pile up this series of code reviews over months to get to this final destination where this system is cleaned up or more efficient or this feature implemented/implementable.
Google's use of algorithm testing in the coding interview is simply a result of the fact that they have hundreds of thousands of applicants and need a way to filter in some repeatable and measurable fashion.
And it's worth pointing out that the interview process @ Google goes through a whole series of metrics & calibration towards that effort. It's not just "could solve this problem", it's "solve this problem according to interviewer X's satisfaction, but we've calibrated interviewer X's scores at level N, so adjust according to that" and so on. There's an attempt to be scientific about it.
Most other companies applying "leetcode" are not doing that, they often simply have a highly reductionist mental model of what "software engineering" is, which IMHO doesn't accord with the reality of the profession.
Are you lucky to work at a company that gets thousands of resumes from seemingly qualified people a day? Probably not.
But suffice to say, I think algorithmic interviews are a decent filtering tool for recruitment, and I haven't heard of anything better (though some other methods may be comparable for overall utility, but just measure different things).
Most of us aren't doing intense mathematical reasoning stuff at work. Sometimes we have to, but most of the time the actual amount of novel algorithm stuff being done pales in comparison to "synthesize this knowledge from 10 different sources and evaluate the best way to integrate that into a reasonable solution."
I don't think coding tests are a good substitute for that, and an IQ test would not give you a clear answer there either.
That people are guessing that it wouldn't work is irrelevant, when we have evidence that it does.
If it gets you the 6 figure salary, who cares about the corrosive bad practice remaining prevalent?
I'm sure interviewing can be improved, but I think it's worth remembering that we are one of the few industries that actually tries to do skills-based interviewing. When people say "get rid of leetcode" or what not, are they really saying that the alternative that the rest of the world uses (resume screen plus vibes check) is preferable?
This seems so obvious. If you pick a leetcode question, there’s always the risk that your candidate has memorized the answer to that particular question. But if you pick an actual bug/PR from your codebase, that problem disappears completely, and you get to see how they would perform on the actual job you’re hiring for.
Can anybody think of any negatives here? The only thing that comes to mind is that it might be seen as the employer trying to get free labor if they use a bug report that hasn’t been resolved yet.
Give the project a cost and time budget (e.g., "You've got six hours to try to resolve this issue that our [already trained and familiar with the codebase] engineers think will take ~2 hours to resolve, and we'll pay $100 an hour for the effort whether or not you succeed")
> Especially not with someone looking over their shoulder deciding whether to hire them.
That would help in this case, since presumably the person looking over their shoulder is familiar with the codebase (or at least as much is relevant to the question), and can answer questions.
I think the signal-to-noise ratio on an exercise like that is going to be way better than with leetcode questions.
Please keep using Leet Code in interviews so I can continue to hire extremely talented developers with little competition from out of state companies that like to pay 60% more than local prevailing wages. Thanks.
How hard would this be to do?
Leetcode interviews are not perfect, but they're vastly superior to the previous system of throwing away resumes which did not come from the right pedigree.
This is great suggestion. While the “look at their github” one is a bad suggestion. Github polishing is theatre more suited for theatre majors instead of people actually working with integrity before coming to your company. Its very similar to the issue with the leetcode interviews as its geared towards people with time to optimize that instead of a day to day job.
People good at their jobs because they do their job: nothing on github
People in the business of performance theatre because they dont have a job to be good at: plenty on github. It can be legit code they wrote, that was not the point at all.
I don't like the idea that every developer has to have code on github. If they want to code for work and nothing more, then that's fine and shouldn't disqualify them from any jobs. We shouldn't expect people to spend years of employment building up a portfolio for the next time they're looking for a job.
However, I don't see how looking at the code people write isn't informative. You can see many things, from small-scale code style decisions to how they structure an application just from looking through their github profile.
Writing code isn't a performance, it's literally what you want to pay them for.
Github presence is just a non signal. Thats the only point.
We agree that if you have a different way to see how theyll actually structure code for you, then its useful
But hey, maybe HR will be happy I have a GitHub account.
Even better if they have both, worked on open-source projects or have created useful open-source software used by other companies and are already working in their other job(s) or have personal real-world projects they can point to; which those are clear advantages and a simple quick filter to use.
No need to ask about frivolous leetcode questions around re-implementing sorting algorithms or wasting more time asking the candidate to write proofs for those algorithms where realistically you're going to just import it from a library or look up the solution on StackOverflow.
Unless you're Google, a FAAMNG company, university or general research related position or if the position isn't for a typical CRUD application development, then there is little to no justification for wasting everyone's time on pointless leet-code puzzles and this applies to the majority of companies.
I have 30+ years software dev and almost nothing on github. There are valid reasons why a person who writes lots of code, including on weekends/spare time, would not be on github.
For my personal projects I prefer bitbucket. For professional work, it is proprietary and thus cannot be shared (esp not in an interview!!).
There are lots of suggestions on how to better evaluate a candidate, but they are either not true or involve needing the person to dedicate an enormous amount of time for the interview, which most people would not agree it. Coding exercises are a "least-worst" scenario in terms of evaluation versus time-spent interviewing and companies know that.
The beauty of LC type interviews is that it requires no validation by your existing employer or no public record or demonstration of work. In the absence of LC, I’m afraid we have to settle for some of that.
Having said that, big tech interviews heavily bias against certain groups of people, especially older candidates and those with families. On the flip side, if you're young and have virtually no experience, you can still get a cushy big tech job simply by studying sets of questions. In that way, it's quite unique that "anyone" can get this great job simply by grinding exam style questions. No other high paying industry is like that.
So it either means:
1. HN's influence is even less than we thought-- even MANGA engineers /10x silicon valley types dont hang out here
2. Everyone agrees its a good idea, but no one cares. Like everyone agrees we should care about the environment etc
Also if you have been hazed you wont vote to stop the hazing
Just because you see them, doesn’t mean they’re correct. They’re just a breeding ground for holy wars and discussions. On every post like that you can find tons of “I don’t like them, we need something better and no I don’t know what”. But if you dig into comments you usually find why those type of interviews are done.
People often downvote thoughtful discussions they disagree with. It’s tiresome to see your text fade with downvotes so often people don’t bother.
If you hang out on Hacker News you might also think every engineer thinks crypto is a scam and no engineers want to return to the office. Neither situation is the case but if you disagree with the majority on those topics you will get downvoted to oblivion, your comments won’t be visible after a point, so why bother?
I personally don’t care about the endless leetcode debate but it’s a bummer there’s so much exciting technological advances in crypto that can’t be discussed on this site without an army of “crypto=scam” bros emerging from the woodworks.
Safety critical systems already have legally defined coding standards. No really.
The former notion is just not worth defending, but this thread will continue to grow, regardless
And I love it, and use it to my advantage. It's so much easier to prepare for a round of interviews, than it is to actually be good at your job. So this flaw makes it much easier to pass interviews, if you know its there.
...and believe me, I've used it :)
Does it suck? Yes.
Is it basically the only way to make real money in tech aside from toiling away with startup after startup. Also yes, from a person who spent five years thinking I was getting somewhere working for startups.
There’s probably other factors I cannot think of too.
For example, if they want to get rid of old candidates, it's easier to do it by asking them to implement a BST algorithm which a freshly college graduate could do easier.
I had to do a coding test for the job I'm doing now but it was a "take home" test and was directly related to the work I would be doing.
FAANG jobs are in high demand due to salary, so now we have 5+ round interviews and leetcode as a low effort filter.
Algorithms should be not memorized but derived on the go from well known mathematical models.
This is what good schools like MIT used to teach.
Needless to say I stopped the interviewer when they started asking Leet code questions and have refused to do any of Leet code interviews since.
Life and fun code and fun design is way to short to waste it on ineffective BS.
As far as hours of practice it really depends on if you grasp the concepts of types of questions. I got hired at a faang with 2 hard, 13 medium, and 20 easy questions done, but I'm for sure an outlier.
I also did these courses:
https://www.udemy.com/course/js-algorithms-and-data-structur...
https://www.udemy.com/course/coding-interview-bootcamp-algor...
1) pick questions that are actually somewhat aligned with a problem that would come up for the role. Usually implementing a data structure of sorts is going to be way more predictive and relevant than a dynamic programming problem.
2) Ensure the question requires a fair amount and complexity of code to complete.
3) The question should just be a backdrop. Consider also how quickly and proficiently they can code. How intelligent they come across in conversation. Things they call out as side notes, testing, quality etc.
Many interviewers seem to have forgotten the purpose of the interview is to be predictive to on the job success, not to invent some separate funnel and gauge how well the candidate did on that funnel.
In practice, at scale, you will likely have enough correlation between success on a contrived interview system and general competency, but you're going to get a lot of false negatives/positives using that as a yard stick.
My experience has been that leetcode "theory" is very weakly correlated with competency for most roles, and quality and speed of coding much more highly correlated. One of my best hires was a guy who couldn't implement a tree traversal in the interview
> Another major issue: you’re skewing the data with somebody’s ability to prepare for the interview
We tell candidates they can look things up on the condition they tell us when they are doing so (basically, "think out loud and walk us through the process -- knowing where to find answers is a valuable skill!") And in most cases they're permitted to use pseudocode if they want to, e.g., if the situation demands any kind of obscure syntax or boilerplate, they just have to note it.
Exercise 1
All candidates are shown some (poorly written) code and asked to pretend they're performing a code review for the author, who we describe as a novice programmer who is new to the language & framework. The code we use is a composite of real code pulled from many places in our system (basically, what the code would look like if all the mistakes we encounter were collected into one snippet). The functionality it implements is exactly the kind of functionality the candidate will be expected to implement on a daily basis.
We ask them to identify antipatterns, suggest edits to make the code more idiomatic, discover bugs, point out security or performance flaws, improve names, etc, and reassure them by telling them that no one spots all of the issues.
We're causal in demeanor and try really hard to remove stress from the situation, making jokes, etc. We help them if they get stuck.
Exercise 2
We share a 90% working piece of code that is missing a single method. Without getting too detailed, something like "This will setup a form based on this model, but the way it is written right now does not provide a mechanism for allowing the options of the select box to depend upon which user is signed in. What would you change to enable that?" They don't even have to write the code (though they often do), they just need to understand conceptually why it doesn't work and then talk through a solution.
Exercise 3
A very simple test of their ORM knowledge. They need to utilize a technique that they'll have used dozens of times if they are being honest about their experience but that they probably wouldn't learn in the most basic of tutorials.
..And so on.
For candidates applying for senior roles we have an additional live-coding exercise, but most of the same rules apply -- they can look up docs, we help them if they get stuck, etc. We give them a starting skeleton app and they have more than enough time to solve the problem. They can use their own editor, copy/paste sample code they find on stackoverflow or in docs, etc -- basically everything they do when they are actually coding.
The problem is a very realistic one -- a simplified version of a feature that had at one time been on our roadmap but which we eventually abandoned. We encourage them to add comments to indicate what they'd do if they had more time, and when they're done, we discuss the overall approach and ask questions about their decisions.
I've found the above approach to work far, far better than any "whiteboard coding" or "leetcode"-style unrealistic (for the places I've worked and the roles I hire for) interview problems. We rarely regret hires and people stick around for a (shockingly) long time.
I really wish other tech decision makers would adopt this style, for their own sake and for the sake of those seeking jobs.
None of them asked any leet code questions (I was actually looking forward to the silly puzzle questions MS was notorious for at the time because I love those puzzles, even if I think they're bullshit in an interview. Alas it turned out all those questions were basically for PM positions :( ).
The only question I got that seemed particularly bullshitty was at Google, where it was one of those questions where basically you're expected to work out "the trick", it seemed to me to be very gotcha like. But that was just one question among many, across many people.
I've also interviewed many people over the years, and no one has asked any of those stupid questions. They are completely and utterly useless - I see a few comments here saying we're testing for conformance and that has never been involved in any of it, because again it doesn't provide any knowledge of technical skill. As an interviewer you're also aware that the person on the other side of the table is often extremely stressed or nervous. So we understand that you might make mistakes, or stumble on answers, etc - failing to account for such issues simply means potentially discounting good candidates.
As far a whiteboard coding goes, for myself, and I believe many of my co-interviewers a lot of what is actually being looked for is your thinking and problem solving - seriously, I cannot emphasize enough how you should talk through all your reasoning as you write. That allows us to know whether a logic error is a failure to understand/do the correct thing, or just a standard typo-style mistake that everyone does from time to time (again recall we know you're stressed). Also by and large we aren't looking for /perfect/ code (ok, some do but in reality it's worthless metric - I only got this from the gotcha interviewer at G).
Personally my interviewing I often don't care about the language, I'm interested in the solution, and generally accept pseudo code, or your preferred language.
Just a few general tips as an interviewer:
* When asked a coding question, repeat back what you're being asked, you want to confirm it (I've had people try to solve the wrong problem before), and have (where reasonable) some follow up probe/clarification questions.
* Follow on from above coding question. If you're answering on a whiteboard, remember that the interviewers know that the nature of the format means you might make simple/silly/"stupid" mistakes. Listen for any feedback they give you while answering.
* Additional follow on. Another cannot be emphasized enough point. Write test cases for the problem you're solving. Do it before you start the solution. It demonstrates that you understand the need for them, and provides another opportunity to ensure there's agreement on the problem being solved. It also lets you clarify things like the expected API - not part of the actual problem, but something needed for any implementation. Try to make your test cases cover "normal" and edge cases.
* Be aware that if you are nervous, stressed, or worried, the interviewers are aware of that, and know that that can cause errors you wouldn't normally make
* Try to have a reasonable awareness of the job that you're being interviewed for, some of the relevant things the company does/how it does [software dev, engineering, product management, etc], if at all possible. Either so you can ask questions that indicate you have some understanding, or so you can tie in what the company does as it relates to a particular question (if appropriate, don't just shoe horn things in)
* Be polite - this is a "be subservient" thing, this is just if you act like an asshole the interviewer won't like you, and that will impact what they report. I believe it's consistent across FAANGs that immediately post interview every interview send an email that is basically "Yes/No. Reason: .."
* Don't be sexist, racist, homo-/transphobic, or just generally a bigot - I am aware of one woman interviewer having a candidate assume she was an admin, and treated her as such. Another case where a woman was interviewing someone for a position reporting to her, where a candidate asked who his manager would be, found out it was her. Then told her to her face that he didn't think he could work for a woman. That indicates not just incredible sexism, but also just a complete lack of judgement and common sense. The latter alone would warrant a no hire.
Why would I ever want to hire a developer without seeing them perform? And since being able to program a small piece of code to specification is such a basic, important part of development, why would it be bad for me to verify if you can do it?
If your friends are so good developers, why would they have a problem reasoning around a relatively simple, toy problem? Is it possible that your evaluation of your friends' prowess is biased?
Why do you think dealing with problems under pressure is not a valuable skill?
Why do you think leetcode questions are supposed to tell about quality of code that the candidate will produce? Is it possible that you just don't understand what leetcode is for?
It all seems to me like students complaining that the exam was hard. IT DOES NOT MATTER if the exam was hard. What matters is if you were better than other students. (And even that does not matter, because in the long run it only matters if you have learned something useful.)
So what is the point here? I think people just complain too much rather than focus on figuring out how to succeed.
Leetcode questions are supposed to tell me:
- Can the candidate understand the question? Can they think about the problem analytically? (Somehow there are a lot of people that can have nice conversation but they fail when they are supposed to apply hygiene to their thinking.)
- Can they follow instruction? (I explain the rules of the task and am interested in seeing if the person is able to follow basic instruction)
- Can they program? (I met a lot of people over the years who are able to fake their way through the process EXCEPT for when they have to actually write some code. For example they learned standard library by rote but do not have ability to use those functions when needed.)
- Can they plan? Are they organised? (A lot of people just do stuff at random that might work for very small change but will utterly fail for any larger task. Good developer inevitably have some kind of plan and organisation.)
- Can they work with somebody else on the problem? (Some people don't know how to work with others even when offered help.)
- Do they understand what the program they wrote is doing? (MOST people do not know if their program works or not or what it does. They need to run the program to be able to tell. All best developers I ever worked with can tell what the program will do before they run it. Any person that can't do this is destined to be creating huge number of bugs as they mindlessly retry code until it works in the process leaving every bug that did not stop it from working in their test environment.)
- Are they intelligent (enough)? (Leetcode is sort of intelligence test. You typically need to be at least at some intelligence level to solve the problem.)
The problem with leetcode is all those interviewers that do not understand how to use it as a tool to learn things about the interviewee. And that frequently is because they want to get information that you can't easily from leetcode.
So what you can't learn from leetcode question?
- Will they write nice code? You can't learn this because writing nice code is ability to adhere to the body of code you are already working with. Everybody's programming style is different and even best style might still be incomprehensible to a person that is not used to it.
- Knowledge. Do not ask stupid questions like how to transform a binary tree in a certain way because they only thing you are testing for is whether the candidate is lucky to know the answer to your problem.
- Can they solve complex problems? Do not give complex problems on interview. It is just too noisy and luck-driven. Perfect question is just complex enough to be novel and present some (but not too much) challenge to the candidate but not complex enough to run the risk of running out of time for a reasonable candidate.
This is a great example of what the top comment in this thread describes.
It is super easy to get this wrong. A problem seems much easier when you know the solution. Also, as interviewer you don't want to make mistake of comparing the candidate's knowledge to your experiences -- the candidate might be completely fine but just happened to have different experience from yours and did not meet the same problems as you.
I have a small set of problems which I honed over the years. Some of them are problems which I got when I applied, which makes it easier for me to understand how it is when you are on the other side. Every single problem I have solved in every way I can imagine so that when I interview the candidate I can focus on the other stuff that I care about. I have developed understanding of where the candidates get stuck and for what reasons and how to best provide hints so that I can keep the session productive. When the candidate is stuck for a long time I tend to view this as my failure (nothing is happening == I am not learning anything) unless the candidate is really bad.
What I am trying to say is that preparing good problems for coding interview is a hard task and badly prepared problems are probably why so many leetcode interviews are frustrating and inefficient.
As an interviewee, I would not want to work with you.
You lack full conviction in your beliefs - you literally had to create a throw away account bc you knew you were going to get downvoted.
Actually, this is by design. See, the best outcome is when people who would not be able to work together productively find it before signing the contract.
You may not see it this way, but I make a favour to every single interviewee like you by not wasting your time (or mine) on a fruitless endeavour.
You don't like doing leetcode? I am completely fine about it. We live in a free world and fortunately for you there is no shortage of places that hire people who SAY they can program.
I just want to warn you. Your coworkers will also be the ones that passed similar sieve. Your future boss might be one of them. I have worked for one or two places which do not check for candidates ability to program and these tend to be miserable places. Not saying all of them, but still. My first boss was a "Senior Dev" who literally did not know how to write a loop, and that was over 20 years ago. Since then I refused working for couple of places based on their lacking hiring process and I have never regretted my decision. I am not ashamed of my programming skills and I am happy to prove to any reasonable interviewer on demand and comfortable in knowing that I will be working with other people who can do the same.
The article addresses this as well. Stage fright does not make someone “dumb”. Slow thinkers aren’t “low IQ”. And reversing a tree likely doesn’t make someone apt for a job.