The initial interview itself was pretty straight forward, but it seemed like every answer I gave was "wrong" because the interviewer was looking for key phrases instead of understanding of the concepts. We talked about hashing, and when he asked if I knew what hashing was I said sure, its a one-way function to create a unique identifier. He asked me to elaborate, so I sorta... talked more? I remember feeling confused because I'm not sure what else he wanted me to say. Eventually he ended the question, said he was looking for me to say hashing is for "fingerprinting"
We moved on, he asked me for an example of a hash function. I said md5 or sha. He pressed further, asked about collisions and eventually cut off the line of questioning telling me he was looking for an example like the modulus function. Questioning lead further to reaching into linked-lists and the like.
Having never sat through this kind of interview I was left with a really salty taste for the process. If any they were looking for was me to rattle off some pre-determined key words then what good is the interview for? I incorrectly assumed he was gauging my familiarity with the subject rather than repeating my 2nd year university coarse which introduced shit like data structures and algorithms.
His smugness in the way he concluded each topic was just a giant turn off of ever seeking further work with companies like Amazon (giant & highly competitive software conglomerates). I feel like everyone is trying to one up or appear to be king shit in some way, it left a bad taste. (For the record, I did a couple interviews of this style before totally writing the experience off. Others were better, but this experience always stuck with me)
One time an interviewer asked me "how would you go about counting the ridges of a US quarter?"
I rattled off some ideas about counting the ridges in an arc and then multiplying to get total ridges but the interviewer kept prodding and eventually ended the question and said he was looking for me to say "google it" (I didn't realize it was a known, fixed number).
I just rolled my eyes and laughed and said "Huh, good one, but how would you go about counting the ridges of a foreign coin assuming it's freshly minted and the number of ridges is unknown?" The interviewer shifted uncomfortably and just said "yeah, I'd probably do something like what you said - count the ridges in an arc and multiply..."
(i.e. "if you are going to give me bogus lateral thinking puzzles to test my competence I'm going to fire them back to see how you handle them")
Dunno if that was representative of Google or big companies in general but it turned me off forever.
I recently interviewed at both Apple and Amazon. None of the interviewers or recruiters at either company tried to sell me on the job and I left both interviews not wanting to work there. My theory is that Apple and Amazon don't spend time trying to sell the company because they already have more than enough willing applicants for each position. Is the same true for other large tech companies?
I did about 20+ technical interviews at Google/Facebook over the last 2 years.
Overall, the interviewers were competent. Sometimes you could tell that they didn't really enjoy interviewing people but it was ok. I only had one interviewer I'd consider bad (gave confused advice to lead me to his solution), but maybe it was just a personality mismatch.
I had better experience with more senior interviewers too, and I found Facebook better than Google (although similar), on every respects (choice of questions, team matching process, more interesting projects...).
My main complaint is that I've found the whole process random. Right now I'm in the team matching phase at Google, but not sure it'll go through (and it's not the best time).
I've had great interviews with a company, and then I've had one where the person was looking for me to say 'base64" (which I wasn't actually aware of at the time!) even though I was explaining the same exact concept from the same company. The whole process is capricious.
This is also one indication that the person is an inexperienced interviewer and their whole line of questioning is focused on tripping up the candidate into making mistakes. A good interviewer thinks along with you, helps you and is fairly satisfied if you articulate a concept "well enough".
Well this is the typical behavior towards those who cannot interview properly and has to introduce pedantic point scoring to bring people down. It would take an experience of resentment, denial or some sort of impactful rejection from the interviewer to be at the point to certainly enjoy this ego trip as an interviewer at somewhere like Amazon.
Now it seems everyone and the whole tech industry thinks they're Amazon, Microsoft or Google by asking about implementing efficient algorithms, libraries or the like yet they continue to use the slowest languages, spinning up multiple VMs or clusters at higher runtime costs and choosing Electron for software development. Unless they are also contributing to writing a production grade compiler or systems software, companies who ask these data structures and algorithms questions are doing it simply 'because of reasons'.
One thing that shocked me in discussions is that apparently interviewing incoming candidates at FAANGs has now become a mandatory performance review objective.
This is going to produce a lot of interviewers who really don't know what they are doing and don't care.
I don't know what idiot came up with this brain-damaged scheme to totally sabotage interviewing and what moron actually propagated it between companies, but I hope they die a horrible, slow, painful death.
unsurprisingly, he didn’t seem enthusiastic, couldn’t manage to say “yes” when i asked if he liked google, and didn’t know python.
That data structures and algorithm book and course is the root of so much distasteful smugness in the tech world, it's really bizarre.
[Edit]: It's almost like it was the first course we found very difficult so we should that imprint of challenge on everyone else.
I had a similar experience at Apple where my experience lined up well with the position. I felt like the interviewers were hostile - repeatedly asking weirdly pointed questions about hashing too!
To be honest, I don't think money is a good reason enough to tolerate that kind environment, I'd rather work in a smaller company paying less and build a small business on the side to increase your passive revenue streams.
Maybe things will change with faang going remote because of COVID (given one perk of small companies was their flexibility) but it looks like your salary at big companies will also scale according to your location, so I'm not too hopeful.
If you're not throwing the keyword you're a 12-year-old fanboy of in the question, you can go eat a carrot for all I care.
Google and Facebook seem to be a bit more of a consistent experience, but interviews are done generically and not by the team that would hire you.
I failed my Google interview as well but at least it went better simply because the interviewer wasn't a no show.
To be fair, it also sounds like you were conflating popular hash functions like md5 with the general concept of a hashing data structure and underlying function. Knowing that modulus operation is one approach and knowing common approaches for dealing with collisions are part of that. See: https://www.geeksforgeeks.org/hashing-data-structure/
Yes, expecting them to know that is reasonable. Expecting them to regurgitate that factoid unprompted is bullshit.
Don't inquire on a topic and expect a canidate speaking in generalities and off the cuff to overlap with your toy facts.
I'm fighting the urge to rant in the comments here on how to competently conduct a useful technical interview; but I'm more and more convinced it's a competitive advantage.
In the interview, they asked me, "What's the difference between fold left and fold right?" I said "Um, one of them starts on the left side of the data structure, one of them starts on the right. I never remember which is which." They said essentially: "okay. The answer I was looking for was that fold right is not stack safe." I protested weakly, and they dug in, so I graciously let it go.
But it's patently not true. A naive implementation of fold right in Scala isn't stack safe, but the actual implementation is stack safe. It's been stack safe since like 2010. So rather than interrogating my knowledge of functional programming, they're just asking me bullshit language trivia, and dinging me when I don't come up with their arbitrary wrong answer.
I wanted to work there before that, but the interview made me a little ambivalent, and then they just ghosted me. So I guess I dodged a bullet. But man, that was frustrating.
I’ve come to rationalize this as a risk-avoidance tactic, and I think the negative effects of reputations damage to the company are mostly unaccounted for.
At a high level foldLeft and foldRight represent abstraction leakage. The Domain and Codomain for both functions are exactly the same. If there is no performance difference or side effects to consider then there is almost no point in having two fold functions as a plain fold has the exact same inputs and outputs as foldLeft or foldRight.
Typically for side effects you don't want to put it in a fold as you're integrating way too much IO with your functional computations. Rather functional languages tend to have something along the lines of "foreach" for using side effects on the content in a functor. That being said it's strange that scala has a foldLeft and a foldRight with identical performance characteristics. Maybe it's a legacy thing. I dunno, not a scala guy.
Just bringing that up. I still agree with you that the interview question sucked and that the interviewer was wrong. Personally I wouldn't have ever figured out that was what the interviewer was looking for even when I do possess the requisite knowledge.
This is not true.
> def List[A].foldLeft[B](z: B)(op: (B, A) => B): B
> def List[A].foldRight[B](z: B)(op: (A, B) => B): B
Notice the signature of the fold op: the arguments types are swapped. This is because fold left and right on a list [a, b], say, is the difference between:
(z op a) op b
and
a op (b op z)
(If this isn't compelling enough, consider [a, b, c].) Not all functions are associative. For example, consider a cryptographic hash function.
They created a puzzle where you needed to ask for more information. Intentionally or not, they were discovering if they could communicate with you. That the communication failed doesn't mean your somehow less then them. It means you just have a different background.
Now to the problem, the problem people don't set good goals. It probably doesn't make sense to hire a carbon copy of yourself.
I've done dozens of interviews and after all of it, I realized there are only four qualities we quantify as useful: caring, ability to listen, ability to learn.
If we care as a developer, we write better code, learn things and listen to our team, customers.
If it sounds crazy, it is because you're not a BS artist yourself, so it is hard to put yourself in that mindset. I have friends who fall into this category, and they would be the first to admit they bullshited their way into FANG
It's a pretty small problem, but it's still one that needs some thought to get. Also doesn't weed out people who don't know technical details of a red-black binary tree (for example) without necessarily getting rid of people who could quickly pick up what a red-black binary tree is.
x, y = y, x
Legit solution (I think): x = x + y
y = x - y
x = x - y
Actually, using bitwise xor would be even easier: x = x ^ y
y = x ^ y
x = x ^ yWhen I started practicing leetcode, I underestimate the amount of work to be ready (they say that you should solve 100 problems, I think it's much higher, but obviously some guys are smarter than others...).
That being said, I'm 50-75% of myself during an interview. I managed to fail at questions that I did several times before.
The experience is also different from one interviewer to the next. You can have a guy who asks an easy question, provides help, and still give very positive feedback because he was happy with the way you communicate and explain your algorithm. Then you can have an interviewer (usually more junior ones) who asks a "trick" question that there's no way of solving if you havent' seen it before.
Easy, manholes covers are round for the same reason JavaScript is the most popular language.
Answer: once round manholes became ubiquitous it became extremely difficult to make anything other than round manholes covers.
More frequently than one would expect, the candidate will deny having seen the question before, zip through the solution, and then completely stall-out when they are asked to revise their solution to accommodate a very small alteration is made to the problem parameters.
A post titled "The Technical Interview Is an Ego Trip" was submitted to tech forum Hacker News.
Here are the comments on that submission:
Here are the unedited/uncurated results:
---
"The interview process is really more of an ego trip for the interviewer, and the interviewee is just the means of satisfying that need."
"The most common reason I see people getting technical interviews is to satisfy the ego of the interviewer."
"I have been on both sides of the table and I can honestly say that the interview process is mostly about the ego of the interviewer. And that is a shame."
"I have done many interviews, and can say that, with a few exceptions, the vast majority of them are ego trips."
"The technical interview is a big ego trip for the interviewer."
"I am not sure how many times I have heard a manager say that he likes the technical interview process because it gives him a chance to meet technical people."
"While the 'ego trip' comment might be a bit of an overstatement, interviewing is a skill and a process that, like any other, should be improved over time."
"I have never really gotten the feeling that a technical interview is done for the benefit of the candidate."
"Once you realize that you're not actually interviewing for a job, you'll find the process a lot less stressful."
"I don't think the 'ego trip' term is a fair description. First of all, I am not interviewing for my ego."
---
Edit, love the irony that both responses are about GPT. Point proven?
We have 3 tests we give depending on the role (game dev, backend, or SRE). The tests replicate typical work the engineer would be doing, such as adding functionality to a 2D game, developing out a web service for a given API, or debugging and optimizing a linux server. We provide a development environment remotely, or the engineer can use their own. They code/work on their own, without needing to share their screen, though we're on the line if they have questions or just want to chat. The interview itself takes about an hour and we schedule in buffer time before/after to setup and to debrief.
We've designed the problems to be (a) relative, (b) scalable and (c) fun. By scalable, I mean that the problem should have a simple, naive solution that most engineers who work in that space should be able to solve quickly and easily, while also having enough space for more advanced engineers to extend the problem and show off a bit.
So far we've gotten good feedback from this approach, even for candidates who haven't passed. I know 90 minutes is a long time, we but feel that with this test, we get a good, realistic work sample, and we can forgo a lot of the other less effective interviews.
(plug: we're still hiring [1])
A fallback for shorter question is to ask for a something with many possible answers, as typically somebody more experienced will have many answers besides the most popular ones. (server A can't ping server B, what can be the reasons?)
A lot of folks tend to go the "optimization" route, by having a problem with multiple ways of extracting more performance, typically by better algorithms or data structures. These are ok, but not great. Most candidates will reasonably start with a simple naive solution that works and then try to optimize, but time may not allow for that and the optimization may require significant rewriting of the solution. So unless you either start out with the optimized solution or you have a lot of time, you're unlikely to ever see those solutions.
I tend to prefer scaling via scope.
For example, for our game engineering test, we start with a half-finished 2D "game" (think something like pacman). We then have a list of functionality that can be added with increasing difficulty. This allows us to measure "seniority" by both (a) how far down the list they get and (b) the quality of the individual solutions.
Another example is starting with a single threaded solution and then extending into a multi-threaded or multi-process solution.
At this stage of the studio, we are orienting to a more "senior" team, but that basically means senior+. We're not particular about titles as it's still a small, flat team. As the team grows, we'll gain the mentoring capacity for more junior talent, but for now, we're focused on an experienced team.
It was six individual one-to-one interviews, back to back. The first five were an ego trip for me. I was able to do everything perfectly it seems: read code, write code, talk about code. Then the sixth was this synthetic problem involving nested boxes. I figured out it was a tree problem and started writing code to build the tree. I had an approach in mind and asked the interviewer if he thought that was a good approach (given that there was only enough time for one attempt). He said no, he didn't think it would work. That completely threw me off. Later I realised me approach would have worked anyway.
I didn't get an offer, but what in the ever-loving fuck was the point of putting me through 5 technical interviews only to fail the sixth? It really felt like they were looking for that ego boost but didn't get it from me. It's hard not to sound arrogant in this situation, but I've been humbled in the past. This time I was just confused.
Same thing, they came back and said no and I really have a hard time imagining why other than the interviewer not being familiar with Rust - but - hey, don't tell me it's fine to use then!
That to say, rejection feedback is almost always useless.
What did you do when he said no?
I wouldn't mind getting asked nasty questions about red-black trees or Krushkal vs Prim or something if I knew the person sitting across from me had taken a "pass this test under these same conditions or you're fired" type scenario. It wouldn't make these interviews a good idea, but it's the reek of hypocrisy about them that puts it over the top for me.
I still contend these interviews - in any form - are a hazing exercise designed to convince you that your own expertise doesn't really matter. You may think of yourself as a accomplished professional developer but to BigCo you are a Smart Person (?) Grade N to be slotted into an arbitrary role. What better way to convey this message than put you through an interview that you would have been best equipped to pass straight out of university or grad school? I suspect my peak "pass the tech interview" would have been straight out of the core courses mid-PhD and my ability to do this has since gone down every year.
The only equivalent I know of this is a PhD oral comprehensive exam. I get your point regarding the hypocrisy of it all, but I don't think I would be into it, even if my interviewer had a PhD and had done something similar.
Well, here's the thing about that, though... somebody does eventually pass these interviews. It may be a tough blow to your own ego to realize that you actually weren't the best candidate out there, or that somebody more qualified than you would be willing to accept a position that you yourself are just qualified enough for, but probing the competence of the candidate is entirely the point of a job interview. This is doubly important for a technical position where a false positive is orders of magnitude more damaging than a false negative.
Maybe you could try to apply the supposed Hacker News rule of not assuming the person you are responding to is a complete idiot? I'm startled to think that you assume that I wouldn't understand that interviews are typically competitive processes where some people get hired in the end and (at sufficiently desirable jobs) most people don't.
Instead, you could maybe think through whether "competence" == "ability to pass typical BigCo coding interviews" and my actual point? Really, basically any of my points? I have met, and worked with, people in all 4 quadrants of that particular pair of qualities.
The attitude of the algorithm geniuses is that software engineering is easy and anyone can learn it, which might be true, but my point is that I already did learn it and I spent five years becoming an expert in it. That should be valuable to your business whether you look down upon it or not.
Well, final technical interview wasn't done by him and was instead 100% SQL and database theory instead. I did decently, I got about 85% of the questions right off the top of my head. Pretty decent result for zero preparation. Well, guess what another SQL-head did better. Was a total disaster because I was unemployed at the time and staring down financial ruin.
Pick a question that tests the skills you're looking for, but not too closely related to the problems you encounter every day, as that will introduce really strong bias. Pick a question that can be answered in 10 or 20 minutes on a white board. The question should seem really easy, so prepare a follow up question (or two) that adds difficulty for the candidate that needs the challenge.
But here's the most important part: use the same question in at least 10 interviews. Test your questions by using them on many candidates. Don't introduce uncertainty by playing a different role in every interview. You'll get much better results.
45 minutes - do code review of this extremely buggy code like you'd review a coworker's code
45 minutes - presentation on a technical topic to one or more members
45 minutes - behavioral. Let's talk about failures, conflicts in your career. Who are your role models? What do they do well? Leadership abilities, career progression
45 minutes - troubleshooting. Here's a docker container. Make this thing work.
Rate all these on a scale of 1 to 10. Sum up the scores. Keep calibrating across all your candidates.
While I agree with the author's 'golden rule', I believe the complex data structure questions are just a way to filter interviewing candidates in a highly competitive job market. It's akin to the highly competitive Indian Joint Entrance Examination (JEE) where hundreds of thousands of students solve complex problems in Math, Physics, and Chemistry to get into premiere institutions with few thousand seats, most of whom do not pursue a career in sciences.
I just rejected one company because they had 4 pages of NDA and were small company.
What’s the area of an equilateral triangle ? Volume of a sphere? Sorry. Haven’t needed to use that in eons. I usually just google it.
I feel this way because I've seen hiring for non-technical roles, e.g., project management, etc. They basically end up being friends hiring friends, with minimal domain expertise.
While the intention here is good you are unlikely to get an accurate answer from the candidate using this method because the candidate “should” tell you what you want to hear rather than what they would do in reality. You basically want to find out how the developer delivers criticism. Do they bruise egos or are they tactful or do they simply stay silent.
A better approach is allowing a candidate to demonstrate how they offer criticism. Give them a codebase to read and make sense of and ask them to explain it to you. Ask them to to point out parts that could be better designed. You can gather a lot of information this way. 1. Can the candidate read a foreign codebase and make sense of it. 2. Can the candidate pick up business logic from the code. 3. Does the candidate offer criticism that is likely to make another developer defensive or are they more guarded with their communication and offer higher level design alternatives.
Here's the core of the article right here. The "regurgitate LeetCode-style problems" interview fails to be relevant to the day to day of pretty much any SWE job (unless, maybe, you're applying to work for LeetCode, and one of the duties is to create solutions to problems in under 40 minutes, without outside resources).
Take the author's golden rule and layer on a structured interview process, and now you've got an interview process that will be more predictive of whether a candidate is a good hire than any "throw a random engineer in a room with the candidate and have them answer random algorithm problems" type interview. Even better, since you have an actual process, you can tweak it to be even more predictive of a good hire.
Why don't companies understand this?
One of the best interviews I had, and I'm biased here since i hit out of the park, was one where the interviewer literally gave me a laptop and told me to code a simple iOS app. I was applying as a senior iOS developer with many years experience, so it was totally fair to ask it. Having written several apps on the side, I got straight to work and knew exactly how to set up data structures, algorithms, and trade-offs. Even with my experience, I was not able to finish the complete app in the time allotted, but I was able to breeze through all the elements of of what go into designing an app from scratch.
I had a few more interviews and later they offered me a job, but I ended up working elsewhere. Interestingly, the place I did take a job at had more traditional tech interviews, which I actually found too easy compared to larger tech companies, however there was more long-term growth available there and the pay was much better.
The guy in charge of those before me was the kind that use aha question with no relevance whatsoever. Pure ego trip. If that guy had interviewe me I would have said "I don't know" a few times and eventually get up and leave.
For my candidates, I tried a few things. Now I've got it down to explain to me your last project. I ask questions until I've understood every little detail of the project. Then we code a few simple "exercises" with increasing "difficulty". The candidate is allowed google, documentation, questions, anything. Then we read code. A piece of code with a "bug" or a feature to add.
The key is to make them talk about concept from impérative, fonctionnal and object paradigm and interact like a junior and senior dev would in a dev team.
I found that junior candidates react pretty well to these. Some of them thank me for having had the opportunity to learn about new things like functionnal programming. It's pretty cool and I feel that make them want to join us most of the time.
Some people want to work on super challenging problems with technically brilliant coworkers. Some people treat a poor performance not as a humiliation, but as an opportunity to understand how much they do not yet know.
What if you want to attract candidates like that? Ask them tough questions, don't tailor the questions to their strengths, and have the interviewers show off how smart they are (even if they're not, it's easy to appear smart when you have all the answers). Pay good money and have high prestige so that you get plenty of quality applicants for every role, because you're going to miss out on many of the good ones, but you will attract some of the brightest and most driven people.
So when I did technical interviews; I had a demo domain controller vm. I printed out 5 steps they need to do. dcpromo, slave domain.local to the dc, install wsus. pretty boring stuff that much candidates know how to do. My trick, there's lots of tiny details like did you get the server's name instead of SERVER-1897237534
Oh and I'll be talking about video games, tv and movies distracting you as much as possible during the testing. I just sit there asking them question after question about hobbies. Really really distracting.
That job is not called software engineer, that job is called junior code monkey and pays $25k/yr.