> When did an entire industry of people get pre-judged as lying?
That's the kind of thing that happens when people lie. Everybody who's ever hired engineers knows from experience that a simple Fizzbuzz test is still, unfortunately, a very usable candidate filter.
A lot of candidates with years of real work experience simply cannot write code. How else can we find this out?
I agree but I don't think it's fair to put it all on the incompetence of devs/engineers... in many cases it's mismanagement and the real problem is devs/engineers don't know how to talk to management to get to them see why $badpractice is bad. So because the devs don't have MBA's, and the MBA's don't talk well to technicals there is a huge culture gap in the average fortune 1000 workplace. I've seen the inside of companies where the cost cutting was so excessive the infrastructure was near crumbling... just due to sheer mismanagement. You want to know how many stories I've heard about a sysadmin requesting horizontal and structured cabling done by professionals and been denied? How many stories about IT departments not even having an actual budget and only getting approve/deny requests? So half of the infrastructure around companies is just cobbled together by some underpayed one man miracle show who if he is super lucky gets a full time t1 assist.
At the end of the day, the buck should stop somewhere... and it does. With management.
In the meantime, I think it's time for sysadmins/engineers/devs to start getting MBA's and going for CIO/CTO positions and start to push a shift.
"in many cases it's mismanagement and the real problem is devs/engineers don't know how to talk to management to get to them see why $badpractice is bad."
I would say that's still management incompetence. They're paying all this money for experts in the field, and they still want to disregard their opinions.
In my experiences, non-technical managers tend not to trust software engineers. This is partly due to a lack of true professional credential for software developers and a lack of their own technical chops to call out any bullshit.
To put it simply, they don't feel comfortable saying: "Well... you're the Doctor".
>They're paying all this money for experts in the field, and they still want to disregard their opinions.
Nope - they've gotten burned by being talked down to like the cliche mechanic telling a girl her SUV's hammenframas needs to be replaced, and it's $1600.
If you as a software developer cannot speak coherent English sentences (with a small handful of management jargon) to management without devolving into technical shorthand, you are a failure.
Not management.
You.
You have to explain what is going on in a manner your audience can understand.
You should not expect managers to be technical (they might be (and good for you if they are)) - they're accomplishing a different task from you and need solid, understandable, actionable data to take to their management and customers.
At my job we have so many libraries in different parts of the code trying to do the same thing that I don’t even try to memorize anymore. I just look it up.
What’s the order of arguments on this one? Does it modify the data passed in or create a new one? How does it handle nulls?
It’s cheaper to look it up than to debug. So that’s what I do.
A few years ago I was approached about a new opportunity, and through the course of the interviews I was given a generic fizzbuzz-like coding challenge and I completely bombed it. I got flustered, I got stuck on something trivial, and I ended up running out of time with not much to show for it.
It was in a language that I had been using for 5+ years at that point, using a framework that I had just finished architecting a whole application for, had multiple open-source projects in, and the challenge itself was something that I genuinely felt should have been extremely easy, but I miserably bombed it.
I'm almost positive to them I looked like a giant fraud, and to be honest I felt like one too, but after some thinking I really feel that it was just a bad day combined with being uncomfortable without my editor/tools that I use in my day-to-day job that ended with me getting stuck and failing horribly.
I don't know a perfect solution, but when I was later in a position to hire new devs, I avoided coding challenges because of that experience. I feel that you can get MUCH more insight into a developer by just having them talk about what they have done, go into details about problems that they solved, or how they would approach problem X without any writing of code anywhere except maybe some drawings on a whiteboard if necessary.
Coding Challenges to me test 50% "knowing the syntax and not making mistakes" and 50% "knowing how to solve the problem". We have tools and compilers and linters and syntax highlighting and good editors to solve the former in most cases, it's the latter that I'm looking for in a good developer, so why would I use a test that evaluates both of them equally?
It was like waking up and not knowing your own name, it was such a strange feeling to watch myself fuck up so badly, and be utterly incapable of stopping during the interview.
And I wasn't even particularly nervous about getting or not getting the offer either! They approached me, and I wasn't fully sure if I would even like the job yet!
I'm really glad that you and the parent posted these comments. As someone with pretty bad anxiety, this kind of thing prevents me from even going for interviews. And, unfortunately, after browsing this thread it seems that this possibility isn't even on most peoples' minds.
FizzBuzz-style filters not only don't prove that someone can code, they don't disprove it either. I'm not sure what the answer is.
Some of the most important skills programmers should have--in my opinion, more important than writing code--are reading code, debugging, adjusting to the project management strategy of the company, and interacting in functional ways with the team.
I agree, and yet i've never seen an interview that asks questions about a block of realistic code (not some bullshit minified, uncommented function).
Partly because it's not exactly easy to get enough context and understanding about a codebase in an interview to be able to accurately debug something, but also because again it comes back to what you are familiar with. 6 years ago I would be damn good at debugging and optimizing MySQL queries, today I'd probably struggle to get a moderately complicated one to work without a lot of looking things up and trial/error (I mostly work in postgresql now!).
That's why I like to ask about their past experience. Tell me your war stories, tell me what you did to figure out that bug that was causing the elusive crash, tell me about your struggles getting webpack setup, talk about how you initially planned to do X but then after issue Y decided to pivot to Z because it was simpler/easier/faster/whatever, explain how you accidentally put a quadratic-complex function into the hot-path of your application that one time and when you found out it was a problem.
Just talking about stuff like that can often show where a developer is in their career, what they are good at, how they go about solving problems, etc... And it's almost impossible to cheat/fake it.
FizzBuzz? I find it hard to believe that FizzBuzz is being used as an actual screen, because realistically you'd have too many people passing.
If anything, the interviews I've been on have been four or five 45-minute whiteboard sessions, usually about data structures and algorithms or object oriented design.
Nowadays that also seems preceded by a homework assignment and a 3rd party coding quiz.
Worked for me. Not sure what outside page you are referring to. Although there was a weird problem when I tried to logout. It didn't really seem to work right but eventually I got redirected to the login page again after clicking around a bit.
I understand your suspicion, however, I find it odd that the author couldn't code AND recorded a video discussing his code. It seems like he'd hide it away if he couldn't code.
Could just be age discrimination. I've worked with more than a few people who are very suspicious of people over 40 who are "still just coders," saying that it shows the candidate lacks ambition or they must not be that good since they never advanced to a more senior role like very-senior-principle engineer or management.
This is such a weird industry. Most current devs will be still coders when they are over 40. Only a few can make it to management or high level lead engineer roles. There are not that many openings for that kind of role. I used to work as mechanical engineer and there it was totally normal to have engineers who were 60 years old.
Number 2: No One Believes Anyone Can Actually Code
It's surprising to see the number of people who interview for lead technical roles that cannot code, or whose work is exceptionally sloppy. Incompetence is more commonplace than the author believes, even at the highest level.
This was the one that really stood out to me. MOOCs, bootcamps etc are wildly popular now and vary massively in quality. It's very easy for candidates to look good on paper but not actually know the technical side as well as they should. More importantly, software engineering is one of the few jobs where you can get a (somewhat) quantitative measure on prospective performance so it's natural to take advantage of that.
I'm not saying that All Coding Tests Are Good, but they do provide a modicum of certainty in a very uncertain environment.
Seriously. I've sat on the hiring side. I've seen impressive resumes. I've had reasonable discussions with people. And then I give them a very, very trivial coding exercise (a take home, they're free to Google, do it on their own computer, in their own IDE, in their professed preferred language), in a time frame that while constrained is still plenty...and the result is -terrible-.
I can try and come up with reasons why that might be the case, why a simple OO modeling problem + a couple of trivial algorithmic problems (like, take an ascii string, return me a dict mapping characters to character counts) would trip someone up...but that isn't sufficient justification for me to want to continue to an onsite.
And that's the people who get past the verbal screen. Plenty drop out at that point. "I see you spent two years as a Senior DBA. Can you tell me what the acryonym ACID stands for?" "No, I'm not familiar with that" "Okay. Well, the 'C' stands for consistency. Can you tell me what one means when we talk about data being consistent in the database?" "It means when you write something it stays written (or some other made up twaddle)" "I see."
That said, I agree that coding tests that are completely unrelated to the job, and are geared toward college grads rather than long term developers (i.e., "Implement a (data structure)" or "Remember/discover an algorithm that was a PhD thesis 30 years ago to solve a contrived problem in a theoretically optimal way" rather than "Solve a real problem of a kind similar to what we'd expect you to do here") are dumb.
It's weird, I've heard plenty of stories about this kind of thing but when I sat on the hiring side and interviewed for intermediate roles (couldn't even afford senior) I didn't come across anybody who was stumped and simply couldn't code.
There were people who were bad at (possibly some because they were under pressure), it but nobody who couldn't do it at all.
I've given coding interviews for 20 years, and I'd estimate 9/10 candidates have been competent whiteboard coders. I don't have any explanation for the extreme discrepancy between my experience, and the "hardly anyone can fizzbuzz" folks. Of course this colors how I treat people. I'm much more inclined to interview seniors conversationally and judge competence by the way they talk about work they have done. I have a hard time imagining people investing the time to become conversationally fluent in a domain, as some kind of long con.
Beyond fizzbuzz, whiteboard coding is rough. Better to put someone in front of an actual computer. Space is constrained, hard to make corrections, some people (such as myself) have crappy handwriting...
It's such a weird hiring market. 1. There are a lot of imposters out there applying for programming jobs who can't program, and 2. There are a lot of very talented programmers out there who are being rejected by overly picky companies. Both can be true, and I'd argue that both are true. I don't know what the solution is. Current interviewing methods don't seem to be solving the problem.
I'd suggest a widely-accepted professional certification could help a lot, like doctors and lawyers have with the medical board exam or the bar exam. Easier said than done, but what we have today, where the candidate pool is overflowing with impostors with great resumes is not working.
One problem with viewing the certification thing as a solution is people can then question - how do you know if you got the person who graduated at the top of their class versus someone who barely graduated? How are lawyers/doctors vetted beyond their certifications?
Make the bar for passing high enough such that even a person who scores the lowest passing score has demonstrated that he/she can at least code. A standard exam doesn't solve all problems with hiring, but it could at least help solve the very first "can this person even code at all?" screen that weeds out the total phonies.
Oftentimes this is the "CS degree from a good school" stick. But we don't have an easy way to check those claims, nor to evaluate what constitutes a 'good school'.
Maybe because they are plentiful? I'm not familiar with infosec but if the bar for getting certified is "I can take a class and pay $XX to get this certificate" then of course they're worthless.
> I'd suggest a widely-accepted professional certification could help a lot, like doctors and lawyers have with the medical board exam or the bar exam.
"i passed the bar exam!" and nothing else doesn't get you a legal job you want.
and your medical boards, if i recall correctly, just mean you're qualified to go be a slave, er, uh, resident, some place for a few years.
That might solve half of the problem. But then we need certifications for employers - something that says, "Yes, I have a real job opening; I'm not just wasting your time." It needs to have real penalties if an employer violates it, too.
I'm not sure this is working, since employers not only search for general software developers but maybe also developers with domain-specific knowledge. It would be very time consuming develop a certification for every domain.
Hey, I said it was needed. I never said it would work, or that it was workable. But if you're going to certify workers, so that they don't waste the employer's time with interviews that are going nowhere, well, we need something to do the same in the other direction...
Maybe just luck? I interviewed someone for a senior position last week and that candidate didn't know what an array was. That was probably the worst case I've seen but by no means the first time I've seen someone struggle with the very basics.
I remember interviewing a candidate that didnt even know what a binary tree was (context was big-O complexity of algorithms). That interview was really bad. Left the candidate in tears (which was not intended, but I think of their realization they werent going to get the job), and me annoyed at the waste of my time (should have been caught in phone screen instead of on site).
Was it necessary to know on the top of your head without Googling what a binary tree is for the position the candidate applied for?
I've been a developer for 12 years and I've never had the use for that. Computer science is a VERY large field and being good at everything is impossible.
Asking the right questions at interviews are crucial for finding the right people.
If a candidate for a programming job knows binary trees but doesn't listen to other peoples views I would say he's less worth to us than a listener that easily learns new concepts but is currently not familiar with binary trees.
BTW, leaving a candidate in tears is not professional recruiting. Please let someone with more people skills accompany you to your interviews, you might leave people with scars that takes years to heal.
I came across it when studying computer science 20 years ago, yes. Heard about it after that but never directly needed the knowledge.
I'm sure it's used under the hood in a lot of code I write and have written but so is XOR, manual memory management and a bunch of other lower level implementations that I don't need to spend time on when developing on a higher abstraction level.
Not sure why you would expect all programmers to know about binary trees specifically.
Binary trees are the simplest kind of nontrivial tree, and trees are used extensively in programming. Most computer problems are solved using trees of one kind or another.
If you've never needed to know it, what is its value for finding a good candidate? A lot of these questions are basically testing whether you did a CS degree. If you're self taught, you might be just as good a coder, but have never had reason to learn what a binary tree is or how to implement quicksort, or whatever similar puzzle.
It's a nice way to filter out people who can code and basically do the job, but didn't have the financial resources to get a CS education, and weren't lucky enough when researching to see that his is an interview question. Although at least they'll know for next time.
Why on earth did you think that was a good, relevant question to ask? Did you ask about how to implement merge sort? I learned about it in college in the early 90s. Haven't implemented it directly since.
I'll bet, even with this feedback, you'll continue to ask that question, just because.
Most programmers never need to interact with binary trees directly, and I would hazard a guess that if I asked ~10 of my compatriots about big-O notation, maybe 2 of them would understand what I was talking about.
It's because a lot of those senior people only sit in meetings all day and now they're looking for a new role and they're used to delegating tasks to others and have forgotten (or never knew) a great deal of information. I feel for them in some ways because these jobs are mostly political, not technical in nature. It's not what they wanted, either.
I once got knocked out of the running by a whiteboard-coding interview question that went something like "How would you find all triples from a list of a million integers, where the first two numbers add up to the third?" I said, "Hmmm that sounds like an O(N^3) problem." Interviewer: "Can you think of any way to do it in smaller big-O?" Me: "Not off the top of my head, no."
For some reason that company insisted on only doing interviews at 7:00 AM, and my brain doesn't come fully online until after 9:00 anyway. I felt annoyed later when the answer came to me that afternoon, too late: put the list in a hashtable, add all pairs of numbers for O(N^2) complexity, and check if each answer occurs in the hashtable.
Much later after that, I realized that all the other red flags I'd picked up on while interviewing there added up to an impression that their corporate culture was seriously f'ed up, and that I probably dodged a bullet by getting passed over quickly in the process.
Or you could do top 100 questions on leetcode or hackerrank and you would have solved the question in a minute. It's kinda sad that you could remember the top 100 solutions and clear interviews in almost all big tech companies.
its kinda sad you think professionals should memorize useless tricks that dont generalize to the profession in order to be considered for a job.
The skill takes a long time to practice, and quickly evaporates once you stop doing it. Yet none of our work is anything like that. a more real world situation is reading documentation or SO for the function concat_ws that will turn an array column to a concatenated string.
however, the system that is, and one that you seem to think is ok, is one that discriminates people on many levels. Its a skill you do not get good at by working, so you must practice this in your free time. Now you just discriminated against men and women with families, people from less fortunate backgrounds, and others who otherwise do not have the time in the day to dedicate to a skill that is only useful to coding interviews.
as far as a comment above, I was a DBA for 10 years and can do pretty complicated queries off the top of my head, know how to optimize my indexes, worked with both structured and unstructured data in the multi tb size, ect ect, but I have no recollection on what ACID stands for. I dont really care. Sure, you may hire someone who memorizes useless crap, but then they have no idea why the IO has gone through the roof when inserting IDs out of order on a clustered index.
I don't read anything about OP's post as saying they think people should memorize or that this practice is okay, as evidenced by their final sentence that it's sad that you could do so and pass many technical interviews.
Exactly, I as well have been doing technical work for my whole life, and sitting here right now, I could more easily explain to you how to optimize the planner cache, and what hints are required to get a given result than I could explain to you which joins do what.
I just look up joins when I need them, and it's straight forward, but ask me in an interview and I sound like an idiot.
I didn't take the parent's post the same way. The situation is more that if you do leetcode or hackerrank then you pass the interview. So once again the interview process has failed; instead of identifying good candidates you identify candidates that do hackerrank in their free time.
thanks for the clarification, i read it as "its sad they cant do it, whats wrong with them?" kinda way, but what you said is probably what he/she meant
I recently interviewed at a big tech company (phone interview). I spent quite some time practicing on leetcode (completed at least 150 problems). During the interview, it took me a few minutes of thinking before completing the assignments with what I think was the expected solution. We discussed the complexity and a few possible variations. The interview sounded satisfied and I really had the feeling that I had nailed these assignments.
I wasn't rejected but I've been asked to retake a phone interview. Apparently, the interviewer had very good feelings about me, but found that I was "out of practice" as far as coding goes.
I wonder if my age is an issue (40+) or if they have a really high level of expectation. Are most other candidates super fast at solving these kinds of problems. I'm a bit disappointed because I'm not sure that I've got much room for improvement at that stage.
As someone that does lots of coding phone interviews I can say that yes, time is a factor. But it's relative, ie I'm comparing you to the time it took other candidates to solve the same problem. After all, we have to evaluate you, over the phone, in the course of less than an hour. If 2 candidates arrive to the optimal solution, the one that did it much faster is the better candidate.
It sounds to me like you did pretty well so don't give up.
> the one that did it much faster is the better candidate.
From my perspective that is only about 3% of what I expect from a software engineer. Writing readable, easy to maintain code that is well tested, collaborating with product and other developers for how a feature should work, influencing technical designs, giving good feedback are things I value much higher than how quickly someone can write a snippet of code that works.
> If 2 candidates arrive to the optimal solution, the one that did it much faster is the better candidate.
This is _a_ metric but I wouldn't bet too much on it. I know lots of people that come to optimal solutions to "algorithm type" _much_ faster than I do. I'm pretty slow at that type of stuff. But... its just such a small part of what makes someone a good programmer. Building out a medium to large application requires balancing a lot of trade offs and figuring out how to keep things simple. I know seasoned, quality algorithm solvers who honestly just repeatedly churn out garbage applications. And they can tank the productivity of an entire team of developers in their wake. I don't know how you test for that, but I can promise phone screening for problem solution time isn't it.
I really wonder how age is taken into account. If it were really an issue, they could have rejected my application from the start and not bother with an interview.
Maybe the interviewer was biased and led to think I was "out of practice" because he knew I was on the older side. But I'll give them the benefice of the doubt. I believe it's a competitive position and I simply wasn't in the right percentile to qualify.
Now, would my former self 20 years ago be more competitive for this kind of interviews? slightly faster perhaps, but I don't feel I'm at a disadvantage compared to younger candidates.
I would say that if you know the answers to 100 top coding questions (and understand them, a good interviewer will poke you to determine that) then you are a pretty good coder and you should be hired. Seems working as intended :)
For many tech companies where they get a lot more candidate applications than they have positions for, the goal of the interview process isn't to avoid losing good candidates, it's to not hire bad candidates.
Like I said, a good interviewer ensures you understand the solutions of those problems (the problem might even be formulated in a different form than the exact form you learned) not just typing out text verbatim. If you do understand the solutions of top 100 coding questions, I think you have a good start. Part of solving the problem in an interview will also be being able to code, so it's also testing your coding ability in a given programming language.
True that software engineering is more than that, but those other things largely depend on in-house company processes, tools and policies so you would learn them afterwards.
I'm as critical of how we interview in this industry as anybody, but I've never found this particular criticism compelling or charitable. It's implicit that you know the correct first answer is to seek prior art. Making that explicit is fine but a bit pedantic. The follow-up question is: "ok great, now say that you can't find any satisfying prior art for this on Google, how would you reason through your own solution?".
They aren't looking for people who don't know to start by doing some research, they're looking for people who won't be completely stuck when that research doesn't turn up the answer.
Maybe but I once had an interview in which I was asked how to find how similar two text strings were (for search). I answered that I would use one of the algorithms from Apache commons text or within Lucerne which implement one or several of the appropriate distance algorithms. He told me he had written his own. I asked why he would do that when these algorithms were written by people who did intense research and the implementations in these libraries have been tested by more eyes than his could ever be. He said “what if I want it to run in Ruby?”...I was interviewing but this is a guy I would not hire. He was wasting time for his own amusement. Never assume people know to do the research on existing solutions. Many developers would rather work on their own toy solutions while avoiding the actual unsolved problems in their domain
Sure, your mileage may vary and there are definitely bad apples, but my claim is that the vast majority of interviewers aren't looking for people who like reinventing wheels, but are rather trying to suss out the extent to which you can reason through a problem. So I think that's the charitable assumption to make.
Are you serious? For any algorithmic question, if googling does not turn up a great answer, you would need to be a genius if you could come up with one on the spot.
We had a CS class at UNH, a state university, where we learned how to express the complexity of an algorithm and then how to refactor algorithms to be less complex, when possible. Although we do not do this type of work for most of our jobs, it is not a stretch to think that half of people with a CS degree might have at one point known how to do this on the spot.
My job often entails reasoning through a solution to a specific problem which is dissimilar enough from the general formulation of some problem that there isn't an obvious way to Google for an exact answer. It may take a genius to devise the best algorithm to solve some general problem, but it does not take a genius to reason through a decent solution to a specific problem using general knowledge and experience.
> ok great, now say that you can't find any satisfying prior art for this on Google, how would you reason through your own solution?
So then I try and give them a O(n^3) solution (or something).
Of course this isn't accepted as there's a better O(n^2) solution, which can always be found by googling, and I fail the interview.
The "turtle and the hare" problem of finding a loop in a single linked list in O(n) time and O(1) memory is the perfect example. It's easy if you know the answer (or can google) but basically impossible if you don't.
What did the interviewer do when I said I couldn't do better than a hashmap? He laughed and said "not many can".
I’m not familiar with this one but have been thinking about it for a few minutes and think I have an answer (granted I think it will depend on language and OS whether it would work)
The gist of it is: walk the list and after each step, multiply the previous node’s pointer by negative one.
If the current node’s pointer is negative you’ve found a loop (because you colored it by inverting the pointer in a previous step).
Clean up by starting at the beginning and multiplying all pointers by negative one until you reach the last one you inverted. Then return your answer (true).
If you reach a null pointer there is no loop because you’ve gotten to the end of the list. Clean up by going through again and multiplying all the nodes by negative one. Then return your answer (false).
Your worst case running time is 2n (if there is no loop) which reduces to O(n) and you use O(1) memory because you’re coloring the list by using the already existing pointers in the list.
That's reasonable, but at the same time, unless it's a top-secret clearance job, don't threaten me with doing web development on an air-gapped machine. We both know it's absurd, just don't do it.
Except they don't just want a solution, they want a solution with certain performance characteristics. And they want it to be the solution with the best performance.
Which means what they're really saying is not "we want problem solvers". What they're really saying is "the bare minimum for entry level work here is being able to, in 30 minutes and on the spot, out-perform top-tier theoretical CS researchers".
Which in turn really boils down to "be a recent CS graduate who memorized this algorithm in advance so as to 'derive' it later on command".
They were probably looking for the answer of, "Lets talk through it and figure out a better answer". Coders are often under a mistaken impression that interviewers care about your answer. They don't. They care about how you approach it, how you think through it, what you do when challenged, etc.
So from their perspective, they asked you to try harder on a problem, and you just said, "No." And they dropped you for it.
FWIW, I had similar questions in some interviews where we hashed through similar problems, and together collaborated down to a "No" answer... but we spent 15 minutes exploring the problem and seeing how well a couple coders can work through it before saying no. And I got the offer despite an otherwise rusty performance.
> They care about how you approach it, how you think through it, what you do when challenged, etc.
I was asked to sketch the proof for the irrationality of sqrt(2) in a quant programming interview. I kind of froze, and explained that though I had learned it, I could not recall.
He prompted me with "Well, what does it mean to be irrational?", and with that little hint I did the rest. Though ultimately I did not end up working there, it was very satisfying to have answered it.
A friend of mine didn't understand how he could have done better than me in a "write a quick sort" interview (we were still students) when I knew the algo and he never heard of it (and obviously struggled more).
Well, in one case (me), all the information the interviewer had was "this guy happens to know how to implement a quick sort by heart. K.".
In the other case (my friend), he got "this guy is able to understand and implement an algo he never saw before in a reasonable time", which is much more impressive
Errr in the set of numbers that complete the rationals wrt to standard metric? I guess you have to show it’s not rational so you probably did a proof of upper/lower converging bounds always having nonzero difference for 1/n increments or something? I would definitely not get this in a pressure interview situation.
Assume sqrt(2) is rational and has the reduced form (x/y). Thus we are assuming that x and y are integers and that gcd(x,y) is 1. You square it and get x^2/y^2 which are somehow simultaneously coprime integers and also reducible to 2/1...
I think here they just meant, show that no rational number is the square root of 2. Not rational = not expressible as a ratio. You assume that sqrt(2) = p/q for some integers p and q, then derive a contradiction.
> We now show that the equation (1) p^2=2 is not satisfied by any rational p. If there were such a p, we could write p=m/n where m and n are integers that are not both even. Let us assume this is done. Then (1) implies (2) m^2=2n^2. This shows m^2 is even. Hence m is even (if m were odd, m^2 would be odd), and so m^2 is divisible by 4. It follows that the right side of (2) is divisible by 4, so that n^2 is even, which implies that n is even.
> The assumption that (1) holds leads to the conclusion that both m and n are even, contrary to our choice of m and n. Hence (1) is impossible for rational p.
> Coders are often under a mistaken impression that interviewers care about your answer. They don't. They care about how you approach it, how you think through it, what you do when challenged, etc.
This isn't always true. Some interviews are really about solving the problems as fast as possible. And lots of interviewers are looking for exactly the answer they have on hand, and will think you're doing it wrong if you come up with a different, but equally valid (or better!) solution.
In which case, I don't think that's a place I'd like to work. Most often the solution an engineer comes up with is _not_ ideal and will be improved either because they come up with a better one later before they commit it or because they go through code review and someone else sees a better way. If you don't leave room for people to improve their solutions you'll just end up with the first, crappy one that comes to mind.
> Coders are often under a mistaken impression that interviewers care about your answer. They don't.
Huge asterisk that as long as you arrive to the correct solution with minimal help. I've had plenty of algo/ds interviews and it seems like needing help to see the trick in the question pretty much means you're out.
Then I'd argue they need to make that more clear. The typical interview setting does not suggest it's an "exploratory" environment, it usually feels more like taking an exam.
At my last company, we would sit a candidate down at a pairing station. We'd offer them about 5 problems to choose from, and together we'd pair program on the problem for 2 hours. Using the internet, the IDE, anything they want was totally fair game. No system is perfect, but this was by far the best one I've ever experienced.
> Coders are often under a mistaken impression that interviewers care about your answer. They don't. They care about how you approach it, how you think through it, what you do when challenged, etc.
In many of the places that do claim this, even if you solve the problem "correctly" you still get more brownie points than someone who got a less efficient answer or didn't get an answer. Meaning that they /do/ actually care. I do get that some places are smarter with regards to this than others but it's depressingly common in my experience. "You didn't get the O(n) solution that has weird edge cases and was published as a paper in the 70s? Too bad, because some other person did, because they remember the solution from some programming interview book!"
That actually sounds like a very reasonable senario to not do so well in.
The problem that I have with those problems is, they always assume it's easy to answer after seeing the solution. But if you're working on them for the first time, it's a terrible environment. The minute that they stop asking you, as the canidate, are on a timeline to finish. (Also, to finish as well)
The answer to that item would be: (with scala)
> datasource.window(3,1).filter((a,b,c)=> a+b == c)
I mean if you knock it out of the park and know the internals of window.. then asking the bar raiser question is appropriate as a curiousity.
There are other problems as well: Those are the ones where they have an expected answer, response, and reiterate. I've seen that with tree problems. That's where they would low-key ask for the recursive version and then get you to say stackoverflow exception.
My personal opinion on what a senior dev interview should be is: open with a fizzbuzz-level 'bozo filter' coding question, then step away from the whiteboard and spend the rest of the interview speaking to each other like normal, functional adults.
I actually implemented fizzbuzz in Scala recently.. It's a lot easier to do it in a language that has good pattern matching. Doing that in c++/Java is pretty annoying
Had the same thing happen to me. Simple problem: find out if two strings are anagrams of each other.
My immediate solution: Sort the two strings and then compare them:
(defn anagrams? [x y] (= (sort x) (sort y)))
or some such. I was fortunate in that they didn't make me implement the sort (because it's been a long time for me) :)
"Ok, what's the efficiency of that solution?"
"Well, assuming the library sort functions I'm using are sane, I'll take a guess and say O(n log n)"
"Can you come up with a more efficient solution."
Off the top of my head, on the spot, I couldn't. Later, during the plane ride home, the obvious occurred to me: Don't sort the strings, just scan through each string once and build a hash table, keeping track of the number of occurrences of each letter in each string. Then compare the occurrences for each string. Not as elegant to express in code, but faster.
As it turns out, they later declined to hire me, giving me an excuse that made it clear they weren't really serious about hiring anyone for the position (as is the case at least half the time, it seems).
And thus ended my latest round of failed interviews. I cancelled the last one I had scheduled (probably another fake) and decided to take a break for a while (I mean, I do have a job right now, so it isn't urgent).
on a tangent, one way could be assign a number code to each alphabet. Add the numbers that occur in the strings. IF the sum matches, they are anagrams.
To get decent anagram lengths and complexity, implement the numbers as a dict of repetitions of primes, and implement the multiplication by summing the repetitions. ;-)
In which case you can just compare the dicts without performing the multiplication (which happens to be the costliest part for arbitrary-precision integers).
You would have to make sure the sum of any combination of all characters was unique. For example, if the code was the character number, a=1, b=2, etc, both "abc" and "bbb" would have the same sum.
So I think something silly like:
character_code = len(string)*len(alphabet)^character_index
should work.
You need not to sort the strings. Create a vector with indices he ascii codes, incrementing for the first string and decrementing the count for the second, and keep a count of the number of chars, if you get a negative number exit false, else if the count of chars is zero then each one is an anagram of the other. (n+m+128) operations n and m are the length of both strings and 128 for creating the vector
>For some reason that company insisted on only doing interviews at 7:00 AM, and my brain doesn't come fully online until after 9:00 anyway.
Reminds me of my final round at Amazon, which they always do in Seattle. I woke before 4 AM west coast time having flown out the night before from the East, and 12 hours later was still coding on a white board. After writing (to my surprise) a correct merge sort, they asked my to write a program to do basic math with, IIRC, binary numbers. I was like, um. I'm out.
This doesn't change the crux of your story--which is that Senior DBAs who aren't familiar with ACID are probably not good hires--but that said, "consistency" is actually a somewhat ill-defined guarantee [1].
And if you throw in distributed databases, there is yet another understanding of "consistency" (vis-a-vis the CAP theorem), which really means "linearizability".
Sorry, didn't mean to be super-pedantic but consistency as a concept may seem simple to the uninitiated but is easy to get tripped up on, especially for folks who are aware there is a deeper layer of understanding associated with the concept, but can't articulate it right off the bat.
All this is to say filtering people truly is a hard thing. The extremes are easy to tell apart, but people who hover around the average are much less differentiated.
It filters out certain groups of people, but you will also lose out on good hires that don't focus on your given question. ACID has had almost no impact on my career. Only evaluating lies of ACID from certain db vendors is the only time I think I can remember it coming up meaningfully.
Yeah, I would have been okay with pretty much anything close, and would have given massive bonus points if they could give me a couple of relevant definitions. I wasn't looking for textbook, just for a reasonable discussion.
And I have similar anecdotes related to candidates who claimed years of distributed systems architecture experience, and were yet unfamiliar with CAP (and when explained, could not tell me even at a high level whether, in the event of a partition, their system was CP or AP, let alone the specifics of how that actually exhibited itself).
I did DB work forever never hearing ACID. I initially heard of it certainly from slashdot or hackernews, and it only ever ended up coming up due to not DB work, but DB analysis of tools.
Once you start working on a particular database, and are working on all of the specific details of that db, how often does ACID come into things, really? It just doesn't.
I’ll be honest, I don’t know a lot about databases, but Atomiticy comes up a fair bit in the web apps I write, as does Consistency in terms of designing data models that can’t go wrong, or trying to encode domain structure into data models to use the Consistency guarantees that Postgres gives us. Isolation is pretty important in general, and easy to reason about from a web app perspective, with requests being isolated from each other at the database level, I rely on that all the time, and Durability doesn’t come up a load, but that’s because I haven’t had to do any sort of disaster recovery.
I don’t think it’s essential to know this, but I’d be surprised if a web dev interviewed with us and didn’t know at least the basic version I’ve given above.
I've done tons of disaster recovery, and no one ever called it ACID. It's never come up. The only time the type of discussion specific to the terms of ACID comes up is with other database administrators.
Just my experience, perhaps I live in another world.
> The only time the type of discussion specific to the terms of ACID comes up is with other database administrators
I think this is partially what I'm referring to. I use these terms in conversation with others when designing systems because they are useful in describing very specific properties of databases.
Hence the followup question about consistency. I purposely gave a useless and very inaccurate answer as an example (and one I am paraphrasing from an actual candidate).
If you legitimately did the work without picking up -any- of the terminology, -and- respond confidently to questions you should know you don't know the answer to (rather than admitting ignorance and asking for follow-up questions, or declaring assumptions, i.e., "Well, I would assume it has to do with the behavior that if a constraint is violated or something similar in a transaction, the transaction will be rolled back instead of committing"), I don't want you. Because it means you both did not have formal training in, AND didn't seek out information or knowledge in the domain you were expected to be -senior level- in.
And while atomicity and durability are just characteristics of a relational DB (and so adminning one doesn't really require you to understand them), isolation and consistency both have definite relevance, because the isolation level is configurable, and that affects the consistency guarantees of the system. I expect someone saying they were a -senior level DBA- to be able to talk intelligently about those behaviors, and yes, to understand the words, because just reading the docs would have introduced the words.
The responding confidently about things you don't know is obviously a huge red flag for anyone regardless of position.
Otherwise, I think we simply disagree in some respect, although I think it's over emphasized due to the topic. I think both perspectives have a level of truth to them, and have their flaws. It really depends on the candidate, and what they really know. Perhaps my particular circumstances are sufficiently odd enough that they aren't useful in a broader context. Who knows.
It's possibly OK (very strange but OK) to not know what ACID stands for. It's def. not ok to not know about Atomicity, Consistency, Isolation, Durability and more importantly why you need them if you are a DBA.
"That guy didn't have 20 years of experience with db2... He had 2 years of experience, 10 times."
One of my mentors said that about an interview he conducted a while back. I found a lot of truth in that line. I run my tech interviews by starting very green and let the candidate dictate how fast I ramp it up. I've gotten pushback from managers before that you can't start with basic questions, but I've equally gotten positive feedback from candidates (even one's who've been failed the interview). In the end, programmers want to see an algorithm that allows them to judge an interviewee. I don't believe one exists.
This is a brilliant approach because everyone has more context, meaning answers can be more pointed and exact. When the questions start small and build incrementally the next topic of conversation becomes much more natural. The candidate knows that they can use a technique because it's already been discussed and the interviewer is has more control over the flow because there are fewer tangential topics.
I don't claim to have solved the problem of interviews, but I do think I and the candidate get more out of it when we leave it a bit more free-form. I'll cover architecture of our system, API design stuff, debugging, testing, security, problems we're currently having, etc. I'm looking for passion so if the candidate starts riffing on any area, I'll let the conversation flow into that area and go as deep as we can. I usually play dumb as we talk, asking the candidate to explain why and ask what does that mean if they throw an acronym or design pattern into the conversation. A plus of that Socratic method is that if we get into an area that I don't know much about, the candidate doesn't know the difference :)
Do you really think that text-book question about ACID determines whether the applicant is a good DBA? I know something about databases but I couldn't remember all the letters.
Hence the follow-up (which I'd ask regardless, as we work our way to more and more hands on stuff). It's okay if someone has never heard of the acronym before. And an answer of "Uh, I remember the C is consistency...and the D is durabilty. But otherwise no" is as good, to me, as remembering the entire thing; it shows you've run across it before, that you've at least read up or received some sort of training with DBs.
I mean, look at this thread; would it be better to start with "Here are some example tables, please write the SQL that will return me (etc)" and turn it into a coding exercise? Because I honestly don't care that much about that from anyone espousing a senior level of knowledge.
Yeah. In all honesty, I would prefer _more_ of our interviews be straightforward coding problems that are reflective of the job the interviewee is going to be doing. Not whiteboarding. Not pseudocoding. Not puzzle problems. Just: write some code, let's see how well you google when you get stumped, let's see how clean your code is, let's see how quickly you implement it relative to other people, let's see how well you document it, let's see how well you collaborate with the interviewer.
I feel like this is a myth, what do you estimate the figure is? I think under 10%, maybe under 5%. I have significant experience interviewing senior, junior, and mid-range candidates. 99% of my candidates can code, as in iterate over collections, write case statements, and call functions. I've only had one junior candidate who couldn't code at all. Sloppiness is rampant, but sloppy code that gets things done is what my company wants (not me personally).
It's not a myth. I see it when recruiting for my teams. My sample size is too small to give a proportion, but it's enough that not having tests would be a total waste of my and their time since I'd have to fire them on day 1.
I don't mean this the way it sounds, but if you can't tell if someone is an imposter by talking shop with them in your chosen profession, you probably shouldn't be doing the interviewing.
I think unless you're prideful enough to believe you can identify someone's level of productivity from a short conversation, it's probably better to see the proof. Again, why would I settle for a conversation when I can ask for first-hand proof? It's like a judge dismissing concrete evidence and just basing their verdict on the circumstantial. Sure, it's likely to be right most of the time, but what about when it isn't?
>I think unless you're prideful enough to believe you can identify someone's level of productivity
None of the techniques discussed in this article are even attempting to judge productivity, they are attempts to judge coding ability. It's good that you bring up productivity though; that's what we are really after, isn't it?
>from a short conversation
I'd argue 30 minutes to an hour is not a short conversation. Do you think an imposter could fool you about tech (assuming you are an active programmer) for 30 minutes to an hour?
>it's probably better to see the proof
You're not proving anything except the fact that the candidate has memorized a merge sort algorithm (or whatever trivia you are testing for). What you really want to know is, can they ship?
I think you should at least consider the idea that not only are these tests and homework assignments (past fizz buzz) a poor indicator of ability, they active repel any candidate good enough to be in even reasonable demand. I mean you have a lot of people on not only this thread, but many other threads saying the same thing.
Time for a little reflection, what does your company offer that even a mediocre developer can't get in 20 other places in your city? I mean if I could get "market rates," and a "fine cubicle," and "standard PTO" in 20 places, tell me again why I would bother with this rigamarole?
I have no idea where the idea that having someone come on site for 6+ hours wasting a dozen peoples time became the norm as opposed to talking to someone for 1 or 2 hours and truly speaking with them to understand what they know.
You're completely right, if you can't talk shop and not know when someone is bullshitting you shouldn't be the one interviewing.
How would this even fly in other industries? Are you telling me that someone can bluff their way discussing the intricacies of surgery to other surgeons without looking like a moron? Or discussing particle physics with a researcher and stand on equal footing? I honestly want to hear a conversation where a liar with no programming skills is able to convince a Senior level Software Engineer that they are on equal skill sets.
The best interview experience I had, where I eventually worked for the company, was having an hour conversation with the Engineering Manager who I would be working under then being ask basic programming Qs based on our conversation we had. Everyone in the company was interviewed the same way. IMO the resulting team was very professional and skilled on various levels from various backgrounds. I actually felt like a human at that job and not a person hired because of x thing.
I'll never forget I had an interview where they asked me a question about finding anagrams. At that moment in my life, I've never heard of an anagram or knew what it was. The Interviewer then explaining what it was to me made me feel very humiliated. I completely bombed every question because I had the audacity to not know about this thing where the interviewers knew about thing therefore I should know thing as well. I immediately understood how cultural biases can effect candidates getting jobs. I can only imagine how worst it is for people not from traditional backgrounds in this industry.
IMO if you're testing for algorithm memorization you're doing it wrong. I prefer to give someone a really simple exercise and then challenge them with added complexity to see how they adjust (since this is what most real work looks like anyway).
You're sometimes right, but sometimes really wrong.
I had a candidate for a 3d graphics job, who showed me incredibly impressive things he'd programmed like very realistic water simulations, etc. He talked us through them, was incredibly articulate and clearly knew his stuff.
He completely bombed the coding exercise. It was something like: given 2 hours alone at a computer, with a threejs scene already setup, make it display a few cubes at different heights, colors, etc. Full access to internet, google, etc.
He couldn't get one cube to show up. That's maybe a two line piece of code when given the entire environment already set up, and you can find it by googling Threejs tutorial and copying like the first example.
>You're sometimes right, but sometimes really wrong.
Ya.
As far as graphics, the only time I was ever fooled was by a front end guy in 2005. He brought really nice looking color printouts of his front ends; beautiful stuff. I was really wowed by it; so much I didn't ask him basic programming problems or follow up questions about his prior work, and that was my fault. I allowed myself to be fooled.
His biggest issue was he was lazy. He had grown accustomed to government contracts where you do a lot of prototyping, but nothing ever went live (at least the contracts he had). We had a very aggressive 3 year schedule to build a sophisticated product and he just couldn't or wouldn't keep up. I had to double my workload and he ended up only doing about 5% when he should have done a third and he required a lot of prodding and hand holding. We still managed to ship on time though, but it was really hard on the other 2 people on the team for 3 years.
Your interpretation does theoretically fit with the facts. But so do a few other (in my mind more plausible) stories, like:
1. He knows how to do extremely specialized things in an existing environment, but can't do things outside of that environment.
2. He was presenting work that he had only a partial hand in creating.
3. He is amazing at e.g. C++, but cannot learn even rudimentary new things in Javascript.
...
Some of these stories make him a terrible programmer. Some of them make him an OK programmer for other positions, but weren't relevant for us. None of the stories make him a particularly great programmer.
"Perhaps he really was a very talented developer but your coding exercise was too stressful for him"
Yes, it's possible. A lot of things are possible. But I'm sorry - if someone can't copy-paste a 3 line program from the internet and get it to work, in their own field, for 2 hours, then... I don't know how I could ever design a test on which they won't fail. Including the actual job.
> 99% of my candidates can code, as in iterate over collections, write case statements, and call functions.
Honestly, that's way too trivial to call "can code". I usually ask something less trivial, yet still extremely easy like "a function to check if a string is a palindrome" (I explain what a palindrome is) or "check if a substring exists in a given string".
You wouldn't believe how many people "with 10 years experience" just lose all motor function in their hands and mouth, even without any time pressure.
The function to check palindrome will be composed of those building blocks, that's my meaning. Use those basic skills and composing them to solve a problem, such as palindrome, that's coding in the small to me.
Coding in the large is project management and could be tested by a take home, but I'd rather tease it out by asking in person questions about organization, prioritization, and technology choice.
Problem is: It's hard to judge the difference between someone who doesn't know what they are doing and someone who does but loses it under the extreme pressure of an interview wherein their entire future with the company is being determined by their performance on a 30 minute exercise.
Throughout my career, I've been in professional situations where I was under a lot of pressure: Having to explain failures to executives, near-impossibly tight deadlines, production outages. At least I haven't had to testify in front of Congress yet. Absolutely NOTHING I've encountered in my professional day-to-day has the extreme level of pressure of a typical silicon valley job interview.
I understand and truly symphatize with stress the candidate is in, but someone who claims to be a "senior developer with 10 years experience" should be able to write that palindrome function in 30 whole minutes in any kind of stress scenario.
Because if I hire that person, they'll be in charge of critical production systems and will face much harder problems in much more stressful situations and if they can't handle the palindrome question, I have very little confidence they can handle the actual job.
People are strange. I can totally picture someone who is an experienced senior, a hero under the pressure of a critical production outage, yet whose brain goes into a crash loop when sitting across from someone who has the power to deny them their dream job.
Not claiming to be that hero, but I have personally had those moments where I came out of the interview, and as the disorienting fog of pressure lifted during my drive home I said to myself, "WTF happened to my brain in there? I know that stuff cold!"
EDIT: I think I read this one from a commenter here, but it's so true: We're interviewing people to be music composers, but judging them by their ability to be performance artists.
Fair enough. I certainly don't claim to know the best interview method ever; simply that, in my experience, starting with trivial coding questions has a higher benefit/risk ratio then other approaches.
I don't agree. They should be able to write that as a solution to resolve an issue. It should be very well understood why they're writing it. Additionally, if you want to keep going under that justification: you should also accept quick alternatives that aren't the naive approach.
While I agree in the abstract ...honestly, it's not that hard to write at least pseudocode for problems like that regardless of the "stress" of an interview
Is it reasonable to ask things like that? Maybe, maybe not.
But as stressful as an interview is, it's still a basic problem (I can English describe it to you in 30 seconds...coding (in C/C++) would take me another 5-8 minutes (and, probably, be pretty damn inefficient ... but it's still a simple problem)
It's way more expensive to hire a bad fit than to pass on a good fit. Also, I think I'd prefer the person who doesn't crack under pressure. Flopping an interview is more likely an indicator of lack of preparation than nerves, although nerves are such an easy scapegoat.
Not sure with the amount of sloppy code I have been maintaining for the last couple of jobs.The people appear to be able to do "clever" stuff, but have an inability to keep things simple or follow best practices.
How often do you need to write palindrome functions for your job?
Checking substring in a string is a 1 liner in languages like python.
I was at a final interview with FAANG. One question asked was to load a csv. I used pandas, it's a 1 liner. You could see the wretched face of the interviewer since he was expecting a
with open() as f:
do_some_shit
and kept pushing me to write this on the board. I looked at him and said "Why? Why write your own method in a vanilla language? Give me a good reason."
> How often do you need to write palindrome functions for your job?
That's like answering "how often do you need math?" to the question "what is 2+3?". It is an utterly, completely, stunningly trivial question that even a CS101 student on their first semester should be able to answer.
> used pandas, it's a 1 liner. You could see the wretched face of the interviewer since he was expecting a with open() as f: do_some_shit
I would be perfectly fine with the pandas answer, but my point is "csv parsing" wouldn't be my first question, I'd start with something much easier and if you managed that, I'd gladly accept pandas as a valid and then asked you to elaborate further (what does this pandas function do, how would you implement it yourself etc).
I don't consider palindromes equivalent to math. Unless you mean how to index lists? That would be a valid question since there's different ways in python.
So what is the interviewer supposed to do to find out if you can code? They want to give you a simple, straightforward task to see how you code. Of course, every simple, straightforward task is going to have an existing tool to do the job, but they aren't looking for a solution to parsing CSV, they are looking to see you code.
They can't ask you a complicated problem, because they don't have the time (nor do you) to solve a real problem that requires coding.
You are totally missing the point of what they are trying to ask you if you insist on using pandas for parsing CSV. Understanding the point of what you are being asked to do is critical to being a professional software developer.
Let's be honest: most commercial programming jobs don't. And the person with a thorough working knowledge of the standard libraries is in a better position to do it anyway.
I think that is the point. If your business relies on importing csvs that cannot be imported with pandas then explain that, explain the edge cases where pandas has failed, and I will understand. If your business relies on having the best fucking palindrome product then that becomes super relevant.
They can definitely ask a complicated problem. On-sites are 4 hours long these days.
You sound like somebody who would derail all of the technical discussions and pat himself on the back for it because he was "technically correct" while still missing the point altogether.
I hear the opposite. They are stressing a technical opinion here, but for the sake of rationality and efficiency. These are usually not the same people that are overly concerned with "correctness" when communicating with others.
But it is only 'rational and efficient' if you are being obtuse... they aren't asking you to code a CSV parser because they actually need a CSV parser, they are asking because they want to see you code. The 'rational' thing to do is satisfy THAT requirement, which is the real one, not try to bypass the purpose by insisting on using a CSV library.
The ability to understand the underlying need behind a request is important to being a good employee. If a candidate fails completely to understand the purpose of a question during an interview, and in fact continues to argue against you as you explain it, they aren't a good candidate at all.
> The ability to understand the underlying need behind a request is important to being a good employee. If a candidate fails completely to understand the purpose of a question during an interview, and in fact continues to argue against you as you explain it, they aren't a good candidate at all.
I agree with everything you've said, but that still makes it a bad and equally obtuse question. If they don't actually need a CSV parser, they don't need to know that you can parse CSVs, either (if you can - which is the other point - you might be a pretty good programmer if you can quickly parse a CSV, but there are tons of excellent programmers who can't).
I recently couldn't use a built-in CSV parser and had to roll my own because one of our clients couldn't be arsed to send us consistently formatted CSV files so we had to include a bunch of edge cases in there to still correctly format the damn things. (sometimes pipe-delimited, other times comma delimited, sometimes fields surrounded by quotes, other times no quotes except one column (that has a LASTNAME, FIRSTNAME" in it), yet still other times has quotes in the data itself, fields usually have no commas, but sometimes this one field will have it in the middle of it, typos in header names, not including the end of file checksum that others include, etc). The built-in CSV reader you had to specify if the fields had surrounding quotes or not for the entire document, it didn't detect it on its own, for example.
And that was when I found out parsing something that should be as stupid simple as CSV file can actually be pretty complicated.
I'll argue that a one-liner IS code. That's what I put into production systems.
I understood the "purpose" of the question and I self-selected myself out of a role I would've been bored, micromanaged at, and probably not challenged at.
The question on the interview isn't about the business, it is about showing your ability to design an algorithm. I is an exercise, not a purpose driven task.
They want to give you a simple, straightforward task to see how you code.
Overgeneralized at best, LOLworthy at worst. Does this include palindrome questions for Ruby that require the use of linked lists? Because I had that from a CTO of a couple-hundred person company not two months ago.
That seems like a fairly arrogant response on your part - it's obvious that an interview is meant to gauge your technical capabilities/knowledge. Even if something is trivialized, the ability to solve certain types of problems can translate to other problem domains where you have to use the same core skills to solve other problems - parsing a file does not seem like an other worldly type of skill (it could even be an unstructured/loosely structured text file for example).
I think to some degree, a suspension of disbelief is reasonable for an interview, and it's not worthwhile to get tunnel vision on a particular problem asked. It's ok to point out that something is trivial with a particular widely used library or whatever, but if it is asked to implement something via first principles or whatever, it is a perfectly reasonable expectation to just do it for interview purposes as a simple mental exercise.
I respect your view but disagree. I use pandas everyday for my job. I use spark. I use keras. I use scikit. I use all these APIs everyday for my job. I can't think of the last time I loaded a file using vanilla python. If it's a requirement for the job (which it wasn't, they showed me pandas code later) then I completely understand and would not be qualified nor would I want the job.
There's a few things going on here. First, there's a frustration from the interviewer who is obviously looking for the cookie-cutter answer to move things along. Second, there's a culture misalignment because they are looking for cookie cutters to do the job while I am not that. Third, they, along with OP, are obviously not a palindrome company nor a load-everything-to-lists company yet this is what they're testing. So again, culture misalignment.
At the end of the day, you are right, I self-selected myself out because I would not be happy at a place like such who are looking for cookie-cutter employees.
Your refusal exposed you as someone with a hubris that's hard to work with. Who doubles down and refuses to budge.
That you couldn't yield on such a trivial, manufactured matter would make me wonder how you respond in a team environment on real matters in the face of adversity.
When I see someone doing something wrong or poorly I speak up and I speak out. Loading csv using vanilla python is in that boat. Present a good reason why it should be done in vanilla. Otherwise, I won't maintain your code as-is and will refactor it.
CSV is really fucking hard to parse. There's tons of edge cases. "I'd just use a well-known, well-tested library" is a very valid answer.
One of my go-to questions is "sort this array", and if the candidate types `Arrays.sort(input)` they get bonus points, because it shows they have useful knowledge of the language they'll be writing in.
Here's how their scenario would actually play out:
> I took my sunglasses off, looked him dead in the eye,
> and said "Why? Why write your own method in
> a vanilla language? Give me a good reason."
Interviewer: "To see how you might approach it."
It's a synthetic interview question. Why does it suddenly need to be a production-ready CSV parser?
We don't have enough information to say whether these are bad interview questions, and it's really not the point.
Maybe the interviewer just wanted to see if you'd use good fd hygiene (`with open('file.txt') as f:`) and that you can stub out some toy parser code and speak of it intelligently. And that you wouldn't throw a fit when asked to write some code that a library like `npm install fizzbuzz` can already solve.
That's a bit unfair. I agree that Array.sort is the best answer, but array sorting is such a classic interview puzzle that most candidates will expect that that's what you want. So instead of the bonus answer, they'll slog away trying to remember the algorithms that they learnt at uni years ago (or codecademy last month).
Why write your own method? Because it is sometimes better to write 10 lines of your own code rather than pull an entire library for some trivial task.
Creating a dependency to a library is not benign. Even if the library is easily available and mature doesn't mean that everyone has it, or that it will never change. Remember how "leftpad" broke npm?
Having that smug attitude towards the recruiter, assuming he is an experienced developers himself, should rise a red flag. Yes, sometimes projects have constraints (like "no pandas") that may seem stupid, and sometimes they are. But it is first important to understand the context.
So instead of asking "give me a good reason?" to the recruiter, give the reasons yourself. Invent a scenario where you actually need to rewrite that csv parser, bonus points if it is related to the company's business, and finally, write the damn code the recruiter wants you to write.
I don't agree with this reasoning. Perhaps the details are important. The task required loading, filtering, and aggregating a csv. Sure, if all do is "load" a csv perhaps you don't need to import a huge library. But if you want to do anything with that data I'm sure the library becomes very useful :)
At least you were given a programming problem. I would have played along a little bit and at least discussed how the layers work. Instead of pandas, use the csv module so he could see a loop iterating over header and data rows as tuples. If he pushed further, outline how you might code the csv reader yourself if it didn't exist. Move the discussion into the difficulties of correctly handling a file format like csv and real-world issues like malformed inputs, validation, and error-handling.
In my case about a decade ago, I became obstinate when given one of those silly math-trivia-puzzle problems like how many ping pong balls will fill an elevator or how long is a string. This was for a relatively senior track FAANG interview, where my background at the time was in HPC, distributed systems, and provisioning systems that were precursors to today's IaaS bread and butter. In my case, the interviewer was adamant that I derive some figures that depended on basic geometry and knowing the diameter of the earth and ratios of landmass to ocean surface. But, he wanted me to first SWAG these figures, after I told him I wasn't a geospatial geek and didn't memorize such facts.
I decided to be difficult. If I were somehow faced with such a task, I would first consult reference materials and even see if I could find the actual answer he wanted, since it sounded only one step removed from what you could find in the CIA World Fact Book or similar. Only if that failed, would I dig up source facts and try to derive an answer. I would focus on getting the answer, not on entertaining myself with a Martin Gardner puzzle at my employer's expense and risk. I would never have to make seat of the pants estimates and act on them rather than doing due diligence. I'd either have done homework, or if there was really no time (like some system availability crisis, if we pretend I was an ops person), I'd choose a pre-planned contingency action to make time.
They didn't go forward with an offer, and I felt a bit of relief at that.
I got this CSV question at some nameless large company in the bay area.
I asked "Do you want me to do the simple thing, and use a library, or write code to do this?"
They preferred the latter. So I did.
As happy as it might make you to be snarky for the often silly questions you are asked, people are, if they are smart about it, looking to see your thought processes.
I recently got a question that I didn't know how to answer, so I started thinking through it aloud. I think they liked it, because they engaged with me during the process. Redirected my thought processes.
Again, good companies will do that. Look for every question, no matter how silly, as a way to show how you deal with situations, even ones you may not like. These are the moments for you to shine.
And after you get home, tell your SO/friends/etc. how wacky they are.
Ah. Did I not mention that these CSV files I wanted you to parse... they're generated by an old mainframe system we can't modify the sourcecode to. It does have a few idiosyncracies - for fields like addresses which can contain commas, it uses a special escape sequence where the field just consists of three asterisks, then the value for that field is the content of the next line. Oh, and it uses just CR characters for linebreaks. In EBCDIC.
So presumably the mainframe has code that can parse these non standard files? Just take that code and build "on the mainframe" a tool that converts their non standard csv to something more usable.
And the post interview notes said bad performance on the isPalindrome() question since I didn't write out my own functions (interviewer did not mention to).
Personally, if you gave me this answer I would accept it and then asked you how those functions work and how you would implement them. Still trivial, but it would tell me whether you are familiar with the basics or you just memorized some stdlib functions.
To be fair, if you wanted to do a performant implementation, this is probably a more expensive implementation. The expected response is generally for you to iterate over the string and construct a count map of how many times a character appears in a string, and then iterate over the keys of that object and have at most one odd number in the values of the count map.
The interviewer probably should have probed you about performance though if their intention was to judge you on that (they're both O(n) time complexity, but split, reverse, and join are generally more intensive).
Err I always thought that the expected performant response is to have two indexes 0 and length-1 and bring them to the middle checking that the values are equal :)
I'm very confused by this answer. Have I missed a joke? Wouldn't the expected response be to iterate over half the string comparing the characters to the other half (in reverse order)? The criteria you provide seems to suggest aabbc is a palindrome.
Maybe it's just me, but needing an entire IDE or a debugger to write a function that checks if a string is the same backwards seems entirely too much to me. It's a pen&paper question really.
It's not just you. I use Visual Studio when I'm occasionally looking at C#, IntelliJ on the odd occasion that I'm doing Java, and otherwise it's emacs and I can't remember the last time I used a debugger for Go, Elixir, C, C++, JS, Python, Ruby, etc. Basically, unless the language's standard library is massive and over-abstracted, no IDE is necessary. There's no way I'll ever remember org.apache.some.deep.package.HttpClientBuilderFactory and its 6 constructor arguments, but "import requests; requests.get(...)" is pretty easy to write without an IDE.
We set our in-house recruiter up with a coderpad question that screens candidates with a simple question:
"Write a function that counts the number of vowels in a string"
Candidates are allowed to run it multiple times and just have to produce a correct result within 10 minutes. It's not a trick question -- the test case in place makes sure you pay attention to case.
What's your process like after that screening measure? Because to me, that's honestly trivial, and a lot nicer than dealing with an extended (8+ hours) homework problem as an introduction to a company's hiring process.
A ~4 hour on-site (or google hangout) technical interview and discussion. The first 30-45 minutes is usually us selling you on the company, followed by 2-3 hours of technical stuff. We do throw a few more coding questions at you (ones that are technically trivial, but made more difficult with interview jitters etc), but go beyond that and ask how would you design an API, how would you think about the technical requirements about business problem etc. After that, Q&A, and more selling you on the company.
That sounds like a nice process. I don't know anything about your company, but I'm thankful that you keep it sane and reasonable for prospective developers.
That's surprising - ill have to give that a go later this evening as I have been thinking about going back to development form a consultant non coding role.
Took me less than 10 seconds to come up with an approach that would work oh just though of a more efficient one but that would use a regex :-)
The Count and Contains methods are not on string, they're both extension methods on IEnumerable<T>, which string gets for free by implementing IEnumerable<char>.
I applied for an analytics position that unexpectedly had me take a Python coding test like this (I know a bit of PHP and Java but no Python) and I was able to google everything I needed to pass the test in the time limit. Apparently I got one of the higher scores too. Got the job. It has not required me to write a single line of Python, lol.
Googling stuff to copy is one of the most important skills for programmers. I was appalled when a middle aged senior programmer at my first internship told me this, thinking he was lazy and unethical... (people are paying you after all!)... how naive I was!
I feel like sometimes it's out of the applicants hands if they come by way of a recruiter / head hunter. Sometimes non-junior devs who aren't quite to senior developer status yet have no control over the recruiters mistaking your pay at previous jobs and the pay you could make next time for the level of job you should be applying for / able to handle.
I've run into this issue in different specific ways earlier in my career and no matter what I'd say about skill level / lack of knowing required technologies / being willing to take lower pay in order to justify aiming for another role it didn't matter in the face of the possibility that the recruiter could obtain a larger % for themselves off of that senior / higher-than-in-my-range job's salary.
Maybe this isn't as applicable for senior dev role applicants as it is for some lower level dev roles but at the point an applicant is actually physically there in front of the interviewers I'm sure one of the last things they are going to want to admit is that they wished they were interviewing for a lower paying / easier job even if it's 110% in the favor of both parties.
I'm a senior engineer and have worked with recruiters many times before, and I've pretty much come to the conclusion that they're a big waste of time unless you want to do the 6-month contracting thing to avoid resume gaps or you just like moving around the country and renting rooms.
I've tried working with them before, have gone on job interviews through them, and then generally found that the jobs that hire through recruiters pay peanuts, and I end up finding a permanent job paying much more and taking that instead. I think if a company only works through 3rd-party recruiters, that means the company has no idea how to hire people, and doesn't want to pay much either (because they're paying the recruiter a huge commission).
It's not in their favor to find you an ideal, direct hire / non-contract gig. There is no chance for future money from a client if they find you your perfect fit / long term career type job.
Not to mention most of the one's I worked with early in their career not only had no idea about any of the technologies they were checking to see if I was fluent in but they also acted like they DID know everything about programming and beyond that they tried to flaunt this fact and treat me like I was trying to overstate my skills to sneak my way into a job out of my pay range.
Such a frustrating ecosystem in order to find a career job.
In ten years I can count on 1 hand how many times I've gotten a reply from a non-recruiter job I applied for (applied on my own without a staffing agency submitting / representing me).
It's really crazy how that works.
Another thing I dealt with was people who hired me saying (TO MY FACE):
In this situation I'm making $35.00/hr as a Regular Developer (non-junior / non-senior dev, just a middle of the road contract developer):
CEO of company in front of everyone: "scoggs we are paying way more for you than we are for our senior developers so we are expecting top notch work from you."
Me (used to it by now, unfazed but I hate this situation): "Sir with all respect I'm only getting less than 1/2 of what you pay my staffing agency for my contract/"
CEO: "well they don't really do anything / didn't really do anything but introduce us and get you a phone and in person interview with us."
Me: "But you guys didn't have to pull programmers, HR, and design / copy writing people off of their normal work to create interview materal, submit interview material, review resumes, vet candidates, plan phone interviews and schedule them, set aside time for phone interviews, review phone interview candidates among 'hiring team', review candidates references, plan in person interviews and schedule them, execute in person interviews and have meetings with 'hiring team' to pick who to hire', make offers to people you want to hire, or hire them. All you had to do was tell the staffing agency what skills your were looking for and what kind of company you were. I'm not an employee of your company. I don't have insurance, I don't get paid for sick days, I don't get paid for holidays, and I have no job security."
Of course I didn't say all of this, I said something along the lines of "They take care of the majority of the process" but in my head I feel like I'm always having to live up to the expectations of the people paying the total bill. The same way they think the staffing agency doesn't do any real work and isn't worth the cost / price of doing business -- most of these people feel the same way about developers. They don't understand what we do, they just expect us to solve anything and everything to do with computers / programming / technology and this is ALWAYS the way it is regardless if the final product / project outcome is directly tied to the company suddenly turning a profit based on the success of this project / programming endeavor.
These companies want to underpay contract developers, pile stress on their shoulders, guilt them for the situation they have little to no control over, and then stick them with the majority of the blame if things don't go 200% well (because they are expecting work that's 2x as good as the amount of money I'm being paid).
I've found it impossible to truly and personally (mentally) live up to the majority of expectations laid upon my shoulders by non-technical CEO's / Presidents / Bosses of companies I've worked for.
This is the majority of what I deal with right outside of NYC in Northern New Jersey. There is the rare company that truly respects the programmers they hire (usua...
I lived in northern NJ for a couple of years. You need to get out of that place; it's a terrible place for software engineers. The cost of living is ridiculous but the pay for engineers is mediocre at best. Move to Silicon Valley: the cost of living is only slightly more, but the pay is far higher, and the weather's a lot better too. And $35/hr 1099 is ridiculously low in that area, those are poverty wages.
Anyway, you make it sound like you can't get a job there without a recruiter. There's still plenty of companies hiring directly, I even interviewed at a few when I was there such as Alcatel at Bell Labs and some wifi company in Manhattan. My current gig is with a large company (in the DC area) that hired me directly. Stop wasting time with recruiters and just look for companies that do their own recruiting; there's no shortage out there that I've seen. I've had 8 jobs now that were not contracts and not through recruiters: 3 large corporations, 3 small companies, 1 mid-size, and one a state university research division. Am I apparently special that I'm able to find these jobs?
Well, this may be a location and tech-dependent problem, but specifically hiring .NET positions in Jacksonville, FL I would say maybe 10% of the hundreds of people I've interviewed can code. Recent graduates, 10 years of experience, everything in-between. It makes no difference.
I think it depends on how you're filtering the people who get to your interviews. If it's purely based on a resume screen, you can get a lot of people who can't code.
Personally, my first-line screen is a short answer (3-5 sentences) to a programming-related question. [1] For me, about 90% of applicants who pass that can also code. I like that better than a resume screen, as plenty of people who haven't officially been programmers are decent coders.
You must have a very efficient filtering process. I'd say probably about half of all CS graduates and a greater percentage of people in "coder" positions will struggle to code at an extremely basic level.
It's absolutely not a myth. It does depend on how you're getting your candidates, but assuming you cast a net a bit wider than "only people you know personally", then you run into these cases.
Our standard fizzbuzz question was something like: print the multiplication table. This is a loop inside a loop. I think every programmer should be able to do this given 10-20 minutes. Around 30%-40% couldn't. Like literally, didn't know how to do this in languages they supposedly work in. I'm sorry, I make lots of allowances for stress, I calm candidates, I tell them syntax doesn't matter, do it in pseoudo-code for all I care. But if after 10 minutes you can't print a multiplication table on the screen, I'm going to pass.
I understand that's a problem, but if I have an entire github of highly starred and heavily developed projects with reasonable commit histories... don't make me do your do damned homework or implement a toy BST. I have better things to do with my personal time than toy problems because you can't be bothered to open my github.
The worst part is that usually these toy problems are justified with "but you can post this to your Github for others to see!"
I'm not going to speak to the homework type of problem (because honestly I think you should be paid for that sort of thing), but I always ask people programming questions in on-site interviews, not strictly because I want them to prove they can program (although that's one useful side-effect), but because I want to observe the candidate's problem-solving process. I can't deduce anything like that from your Github or a homework problem.
And that is entirely fine. I'm all for group white boarding exercises, or pair programming. I think there's a lot of value to be had in making sure the other person can communicate in a technical setting effectively, and explain why they make choices.
Likewise, if someone wants me to walk them through a project I have with explanations of what choices I made and why, I'm happy to do that. But please don't waste my time asking me to implement DFS, or write another twitter API client.
If the GH code is there, works, and is up to coding standards, why do you care about how the sausage was made? I'd look to see if the code is well-designed, organized, original, tested, etc. It's generally easy to see if the author of code knows how to decompose a problem into pieces. So..saying "we're looking for thought-process not the actual code" feels a bit disingenuous tbh.
Now: If you care about being able to collaborate on a tough problem with somebody, work on a problem neither of you has seen before together :)
> If the GH code is there, works, and is up to coding standards, why do you care about how the sausage was made?
Perhaps because, like many developers on modern teams which eschew the older role distinction, the incumbent in the position being hired for will need to act in the role of a classic system analyst in defining specific requirements give a fuzzy business problem as well as the role of a grunt coder.
Also, the presence, functionality, and quality of code on GH does not establish it's provenance.
> position being hired for will need to act in the role of a classic system analyst
Sure but that's a different skill from solving DS/algos, so don't conflate the two. Some people know their DS/algos super well but need to solve them solo, some people need to google around a bit for inspiration or take a walk if they get stuck.
Instead, separate it out. Give a specific "system analyst"-style question that's distinct from coding. A question you don't already know the answer to or that could be taken in a thousand different directions that you've definitely never thought of before.
I want to know how resourceful the candidate is, how quickly they make mental leaps and whether they'll play nicely with others in the team under the context of the work we're trying to get done. If the choices are a) find out first-hand by (gasp) asking for a demonstration of skill while I watch or b) try to decipher these things by shaking a tuning rod at their GH repository--then I guess we'll have to agree to disagree :)
Sure - my point is that asking them to solve a problem on their own that you already know the answer to isn't a realistic environment of "playing nicely" either and is only going to show you how they deal under pressure, not how well they collaborate with somebody who genuinely wants to find the answer and can build off of.
If you need proof they can "actually code" and use DS/algos etc, use their GH if it exists. And if you want to see that they can work on a team to define and deliver a messy problem with other people, do that with them on a messy problem you've never solved before. (It could eventually be a DS/algo problem; my point is it's a group effort and neither of you knows the solution; you're looking explicitly for how the interaction goes, not if "the candidate" got the "right" answer.)
So I'm supposed to spend my time researching your GH instead of just letting you spend 5 minutes proving it? There isn't enough time in a day to research every candidate's code they wrote on their own time (and personally I'd rather not be judged by mine). And, if people lie on their resumes already, what makes me trust their GH? It's like saying here's an essay I wrote, you don't need to talk to me in person, I"ll just stay home and you can decide whether you want to hire me.
Yes. It's a lot of work on both sides to interview and be interviewed.
If you don't take a candidate's prior art into consideration, you're wasting everyone's time. You're also eliminating candidates who may excel in ways that aren't solving riddle-problems out-loud in front of new people when their livelihood is on the line.
Start with the GH and if you have doubts fall back to portions of old model.
> So I'm supposed to spend my time researching your GH instead of just letting you spend 5 minutes proving it?
I've never seen a worthwhile programming q take only 5 mins to answer. And the candidate is supposed to waste an hour of her time proving to you what you could see in 5 minutes on GH?
> There isn't enough time in a day to research every candidate's code they wrote on their own time
Yet there is enough time to spend with whiteboarding problems that prove the same things the candidate has already proved on their GH?
> (and personally I'd rather not be judged by mine).
Sure - only use the candidate's GH if they prominently put it on their profile and/or own an "intended to be used/seen" public repo.
> And, if people lie on their resumes already, what makes me trust their GH?
Not a replacement for conversation! It's a way of indicating they can code without solving an arbitrary riddle in a high-pressure situation. If you're not convinced they wrote or understand the code you're looking at, ask them about it or ask them how they might change it slightly.
This is fair, it's just not realistic for a lot of places. In the places where I've worked and interviewed people, this was not my main responsibility. Typically I'd get a resume that morning and have to prioritize looking at it along with whatever else I had going on that day.
Alas, I really do care about the thought process. If a person arrives at a great decision for bad reasons, I may not want to hire them. More importantly, though, I'm interested in when candidates pick not-optimal choices for good reasons. So much of software development is about tradeoffs. Seeing and hearing how they tackle those tells me much more about how they'll do than the specific code in question.
As an aside, the reason not to work on novel-to-you problems with job-seekers is that it's very hard to fairly compare candidates after. I strongly prefer pairing on the same problem with all the candidates in a batch. Otherwise it's hard to tell if a bad result is due to a bad problem or an unacceptable candidate.
> Alas, I really do care about the thought process.
Sure - but you're not likely to really see the "real" thought process you're hiring for by asking a stranger a riddle you already know the ansewr to in a high-pressure situation.
Real problem-solving and thinking is done in a huge number of ways that sometimes isn't conducive to strangers, pressure, or whiteboarding.
> I'm interested in when candidates pick not-optimal choices for good reasons
Right - which is why starting with something they've written on GH (which is something they've thought about and are probably passionate about) is a great jumping-off point for such a convo.
> As an aside, the reason not to work on novel-to-you problems with job-seekers is that it's very hard to fairly compare candidates after.
I see your good-intention here, but it's nearly impossible to compare two candidates without all kinds of biases (implicit and explicit) coming into play.
> I strongly prefer pairing on the same problem with all the candidates in a batch. Otherwise it's hard to tell if a bad result is due to a bad problem or an unacceptable candidate.
I think this may be another way of trying to compare candidates to eachother (which is perilous).
Good candidates can do well with bad questions, and bad candidates can rarely do better than okay with good questions. There are lots of good/proven questions you haven't solved - ask your colleagues.
If someone has a good GitHub profile I won't ask the candidate to do much or any coding exercises, because it's much better to just discuss the code they already wrote. I'll put it up on the screen and get them to talk me through it. I'll ask about anything that looks unusual, but also about anything that looks particularly elegant. Even if they wrote it a while ago they should still be able to talk about it.
> but if I have an entire github of highly starred and heavily developed projects with reasonable commit histories... don't make me do your do damned homework or implement a toy BST.
Unfortunately, the current common argument from the hiring side is that GitHub profiles are not sufficient proof of skill since code can be copied (not fair) and GitHub projects bias toward people with extra free time (reasonable, but not enough to discount GitHubs completely IMO)
Right. Don't "require" a GH, but use it if it's there!
Yes, some of the code may not be original, but unless the repo is a fork you can pretty easily see if the code is organized in a coherent way that shows the committer knew how to decompose a problem well. If they solved /every/ piece of the problem themselves, it may be a sign of a different problem (and also copy/pasting without citing source is also telling!)
On the one hand, I agree entirely. An interview should not make people jump through hoops if they can answer their questions via existing material.
On the other hand, fakers have caught on to the "GitHub is my resume" thing. I have had applicants who have basically fraudulent Github projects, or who have taken group projects on which they did basically nothing and claimed them as their own. So a Github page now requires an expert to evaluate it.
Surely getting them to talk you through the code would solve that problem.
If its is their own code it shouldn't be a problem.
If it isn't their code and they can still talk you through it, even better - they have managed to understand code that someone else wrote which is probably an even more valuable skill.
You realize that your third second contradicts your first, right?
And no, having somebody who's an energetic fraud on the team is poisonous. Having somebody who's so good at it that they're hard to catch is worse, not better.
If people are genuinely a fraud they won't be able to talk about the code in a sensible manner.
I didn't write the monstrosity that I am working on just now, but I could explain how it works and I know where to look to fix bugs. I don't know why some crappy design decisions were made. Does that make me a worse programmer than if I had written it myself? Is harder to understand someone else's code than stuff you have written yourself. There are far more jobs working on existing code bases than on new new projects.
(My guess is that you have never worked with anyone who has claimed ownership of someone else's code, have you?)
At a former job, I had a set of simple, if contrived examples, that I asked. Programs were short, less than 20 lines; candidates were instructed that the source would compile unless indicated otherwise, in which case they were given the entire compiler output. I would ask fairly simple questions that would expose a lot about the candidates knowledge. Such as:
In C++, what does this print? And if they answered correctly, I'd ask them to explain how/why. This question wasn't a deal breaker, but did immediately given an insight into their depth of knowledge of the language.
That is because over last few years it became extremely prevalent industry to make everything about "teams": projects are responsibility of teams, failures are attributed to teams, etc. It used to be that code won arguments. Now it is not ruffling feathers that wins arguments. If I'm not hiring the entire team, how do I know who in that team actually can code based on the result?
What does it all mean? It means exactly what it meant in a high school/college group assignments - one or two people carried the group project but everyone took credit.
I have seen hundreds of resumes where people claimed that they have done XYZ where through some side channels I know they just happened to be on that team but their contribution was limited to tweaking spelling.
I see coding tests as one of the two ways to evaluate that someone can code[1]. I trust it.
[1] The other way is that I know this person and I'm already aware what they can do.
> Number 1: It Takes Longer than Ever to Get Hired
Last twice I've looked for a developer job, I got offered a position and was hired within 2 weeks.
> No one believes that anyone can actually code.
Quite rightly, most devs can't code.
> Extensive homework is now normal.
Not been my experience, I've done some homework assignments but none were ever more than 1 hours work (and then even the standard of the tests were so low they were really 15 mins work..)
> You’ll never really know why you weren’t hired.
This bothers me too.
> Outsourced hiring “services” are very much in vogue
I hate this. Almost all recruiting I see is done via recruiters who are at best case flakey and worst case self serving liars who will try to pressure you into going to interviews you don't want to go and to take job offers you don't want to take. Sometimes flat out lying to you about the role only for you to find out at the interview. I had one interview that I went to expecting it to be C#, the interview was all Javascript (which I don't do at all). Or the recruiter will tell you that you have to decide right now this minute, when you don't.
I had one job offer where the recruiter said you've been offered the job but you have to tell them now if you are accepting it. It was funny how after telling the recruiter that I want to think about it over the weekend and if that's not an option than I would like to decline the offer, well now all of a sudden the company were completely willing to let me think over it for a couple of days...
I found my current gig by using a recruiter I was referred to by a respected coworker, and it's by far the best job I've ever had (out of 5 or so). Super small sample size I know, but if you can find a recruiter that you can trust/isn't just pimping you out for a payday and nothing else, you can skip a ton of bullshit.
There's a huge variation in recruiter quality and it's pretty easy to tell the good ones from the bad. Just spend a couple of weeks taking calls and emails and following leads and you learn quick.
Yeah, I kind of liked having an advocate on my behalf. The guy who found me my current job was kind to me, didn't lie to companies about my experience, and kept in touch with the companies he sent me to, so I wouldn't have to.
He even gave me interview tips/advice on a per-company basis and helped me rewrite my resumé for each company he wanted me to interview with. Honestly, it was fantastic.
>Last twice I've looked for a developer job, I got offered a position and was hired within 2 weeks.
His resume is the problem. Two immediate things: (1) His most recent job lists junior level work and (2) He is claiming 3 concurrent jobs over the last two years.
This shouldn't matter, chiefly because he has other work listed, so stopping at the first job post and forming an opinion makes the reader the problem. But also because people can sometimes take an easier job if they have life issues.
Secondly, these are consultancy gigs + 1 full time gig (or maybe it's part time) that could have a low hours/week commitment. He wouldn't be the first dev ever to moonlight.
Even if it were junior level work (trusting auth to be done correctly with junior engineers? LOL), he probably completed it faster than a junior engineer would.
His resume doesn't say he did auth. He used an open source library and made unspecified modifications to it. That's definitely something a junior level Dev could do.
"Or maybe it's part time". Exactly. A resume should give answers, not raise questions.
Expecting people to be charitable while reading resumes is unrealistic. A resume has to quickly demonstrate the applicants qualifications other wise it's trashed.
At times, I have tried to press a contact from a job lead on what I could have done better in my interview. They will not give you even a single bit of feedback--a seemingly innocuous yes or no question is met with dissembling or equivocation, always.
What bothers me most is that employers don't seem to be showing equal commitment to the interviewing process. They will ask you to do hours worth of homework for them, but then can't be arsed to discuss it with you for five minutes. They will ask for your salary history, but clam up if you ask them what they pay other developers in the same position. They will take your application as a senior developer, then ask if you'd consider being an entry-level tester. They spend hours grilling you to prove your worth, then spend zero minutes trying to sell you on their company.
It should be obligatory to give some feedback if the interview process is longer than one hour.
To simply give feedback is not a big deal to HR, and since they're making you do hours of homework it should be legally required to answer if you ask for feedback.
> They will ask you to do hours worth of homework for them, but then can't be arsed to discuss it with you for five minutes.
This has been my experience with homework assignment interviews (Though I still prefer them to whiteboards).
In no cases, has any interviewer reviewed my homework before the interview. So the homework critique/qa sessions end up being more like a presentation or walkthrough of your solution, like a presentation for a meet-up, even though they are often described as more of a code review/interrogation about your choices.
Which I don't mind honestly. If you know that going in, and are prepared - its an opportunity to impress, if you can be polished.
Talk at them about your solution for the allotted time or until they make you stop :P
And on top of all this, many will then turn around and claim to regulators that there is a labor shortage! When it's obvious their behavior is only sustainable when they have a glut of applicants.
> Last twice I've looked for a developer job, I got offered a position and was hired within 2 weeks.
Region matters too. I don't doubt in Silicon Valley it's trivial to pull this off, but in Chicago I've seen most companies have a 2 month+ hiring process, if they ever hire anyone at all. I've even heard from recruiters that this is common for those companies. And then there's a lot, lot less companies out here to choose from, especially if your tech stack experience doesn't match. I've literally had company HR chastise me for not learning their specific language, even though I don't list it on my LinkedIn and the message was unsolicited.
Requiters are lovely. These kind people are looking day and night to send me some leads that I mostly ignore. They are basically doing free work for me.
I am like the flower of lotus - waiting. When there is anything interesting I can jump ships using requiter network to help with the interview. After my first job, I never had the need to search personally.
Agreed on most of your points. On recruiters though, I'm on board with finding like 90% of them sleazy, pushy, no knowledge of the industry, don't care about the company or the candidate, just want to complete a placement and make a buck. But I've had mixed at best results trying to find a job without one by applying directly to companies.
For my last job search, I emailed applications to like a dozen companies in my area from the last HN Hiring thread, and heard back from like 2 I think, none of which went anywhere. Maybe they're too slow, didn't like me for some reason, found someone better, etc, I don't know. When I started talking to recruiters, the interviews started coming pretty fast, and I had multiple on-sites and offers in a couple of weeks. It's like, sleazy though they can be, there's a distinct lack of movement in the process without the energy of recruiters.
So I come down more on work with them, but don't trust them too much, know their tricks and watch your back.
And speaking of the author's points - a week-long coding test? A month to complete the "homework project"? Who's doing that? Nope, I'm passing on those companies. A couple of hours is no problem, but pay me if you expect multiple weeks worth of work.
Every time I see another iteration of this kind of article, it screams out to me that we need some kind of worker's cartel that can enforce an embargo on companies that don't meet some minimal standard.
Part of the problem is that companies keep getting more applicants than they can handle, no matter how hostile their interview process becomes.
Every time I see another iteration of this kind of article, it screams out to me that we need some kind of worker's cartel that can enforce an embargo on companies that don't meet some minimal standard.
Like... a union? A combination of aggressive union busting, anti-union ideology of many in tech, and aggressive offshoring/H1B hiring acts to keep that in check. The moment you try to raise the issue you’re either fired, or some “genius” who reads Ayn Rand like the Bible tells you to pull yourself up by your bootstraps.
I agree, but the problem is that unions notoriously favor the older, entrenched generations of a profession over the newcomers. Talk to people from NYC (a place with still much union influence) and you see a stark difference between the old folks and the younger folks in how they view workers' unions.
Software development is already so heavily dependent on enthusiastic young people that I don't see how a union could get enough traction without completely reinventing the idea of a union in people's minds.
Union membership rates are highest among workers aged 45-64. It may be a self-fulfilling prophecy to say that unions are for the older generation, but I think there would be either non-participation or real resistance from the younger generations of programmers, if only for the perception people have about them.
Number 1: I think this is due to specializing in Ruby on Rails which is falling out of favor? Or your city location? I know in my location the average job hunt is 2 weeks.
Number 2: As someone that interviews people alot, this is cuz MANY people who apply CANNOT code, no matter what their resume says. We have had people leave and never come back during our console app on site test (read in a text file and print out its contents with some minor formatting). This is resumes with 10 years plus experience in the language supposedly. And the computer has whatever IDE they prefer and full internet access!
Number 3: I agree that CS type questions are pointless unless you are doing stuff like that on the job. We have stopped using those.
Number 4: We now require an onsite 2 hour code project (designed to fit in that time frame)
Number 5: True
Number 6: We use headhunters to weed people out but that is about it. For one position the head hunter roughly run 15 people applying for each 1 possible person to pass to us for the next step. Again, most fail a mind boggling simple phone interview process for people who claim 10 plus years experience in coding. Not knowing what the static keyword means in C# when they say they are skilled in C# for instance.
Number 7: Don't have an opinion on this
Number 8: Again this seems to be your physical location. At ours there is roughly 3 open positions for each matching person.
Number 9: Our company does not discriminate on age and are desperate for qualified people with experience. Many times a candidate regardless of age is stuck in one tech (winforms, MVC, Ruby on Rails (:P)) and we more discrimate on someone who is not showing growth in their tech skillset. For example, are you learning the basics of a cloud stack such as AWS/Google/Azure?
At the end of the interview, I would recommend asking "are there any concerns or issues you would have with hiring me for this position?" and LISTEN to their feedback. I am sure there are some bad companies but for the most part it feels like you are not interviewing well for whatever reason. Maybe you are coming off as defensive or hostile when questioned? I would also reach back to the company and ask why they did not choose you. Most companies are way to busy to tell each person why they were passed over, but if you show an interest they will usually respond.
> At the end of the interview, I would recommend asking "are there any concerns or issues you would have with hiring me for this position?" and LISTEN to their feedback.
At the end of each interviewer. Asking the HR person at the end of it all is a waste of time for 2 reasons:
1. they won’t know yet
2. they won’t tell you
but the tech interviewer almost certainly isn’t trained to keep his mouth shut and also generally isn’t expecting this question. caught off guard, you can usually get a close to honest response. you do have to interpret a little because people generally don’t want to hurt other people’s feelings right to their face. apply modern day party invite response rules:
My SO is a HR manager, many times as a screen for tech roles. It's interesting hearing it from the other side. She's a brick wall with regards to sensitive job information that lie past her scope of knowledge. She just won't release it.
She says the same thing as you however: if you want the good stuff, you have to attack the social vulnerabilities of tech people. They generally aren't trained to know what to say or not to say past the obvious. With carefully constructed questions, you can often get the information you're after.
> Many times a candidate regardless of age is stuck in one tech
Because companies themselves don't understand that the full stack developer, from kernel work to UI is a real thing, ie. you can easily transfer competence from one tech to the other.
If you come into the interview and say "I am a kernal developer but I want to work on mobile" and you show us a working mobile app you developed on your own, we would consider it. If you come in and say "I am a kernal developer and I want you to take a chance and pay for me to get up to speed on mobile development" that is a harder sell. If you ran a business, would you choose that person or the person who comes in with actual mobile experience and hits the ground running. I sense a lot of hostility in this thread from people who have never been on the other side of the desk. Put yourself in the shoes of someone who interviews a ton of people, and where hiring the wrong person is much worse then not hiring the right person.
Also if your trying to make that drastic a switch, are you willing to take a paycut? Just because someone has 15 years kernal experience does not mean they deserve the same pay for mobile (or visa versa).
You are greatly over-estimating kernel developer's pay. Unless you're an open-source rock-star (ie. Linus & a few other), kernel development does not pay bazillions. A local shop was looking for Android kernel dev for CAN$75k (USD$60k). Any entry level mobile dev can easily make that much in USD. Even an Amazon SDIII isn't paying that much (~CAD$110k in the Vancouver area). I've been talking with other larger hardware manufacturer and their offers are roughly of the same order (in high living cost area).
sounds like a naive candidate to me. surprising (but not shocking) for someone with so much experience.
if he’s 50 yo, assuming same career since graduation, his first mistake is applying for senior roles. senior is 5-7 years experience. he should be applying for staff roles at minimum and up to principal.
i guess you’re not supposed to slam posts here but this article is more of the same old same ole.
i would like to see an article from the hiring manager POV.
In my experience, getting hired for those "post-senior" roles is even more ridiculous than for senior roles. You often run into biased, judgmental, and insecure directors and vice presidents who seem to be terrified that you know more than them. I say this as a 37-year-old with nearly 20 years of experience. Sometimes, people don't want to believe that you know what you're doing.
yes, it is very, very challenging. please keep in mind it’s not that you have to have technical chops, which you certainly won’t even be entertained if you don’t, you also have to be a very good culture fit.
"The general thing that I saw from everyone that I talked to is that no one actually believes that anyone can code. At every stage in the interview process, you’re going to need to prove that your resume isn’t a lie and that you can actually do what you say you can. I find this ludicrous because it is like interviewing an attorney and then saying to him “Please prove that you can cite a Supreme Court precedent”. When did an entire industry of people get pre-judged as lying? Don’t we exist in a country where the default assumption is innocence not guilt?"
This is, IMHO, due to the fact that for years new grads would apply to jobs, and the new job required: 7 years programming in X? YES, 4 years writing scripts in Y? ABSOLUTELY, etc, etc. These new grads all had the attitude of "I will learn that on the job, no one has 7 years in X". And now we have a world of companies that don't think anyone can code. Don't know where they got that idea.
> I find this ludicrous because it is like interviewing an attorney and then saying to him “Please prove that you can cite a Supreme Court precedent”.
They don't need to do that for lawyers because the bar exam handles that (and, for those with traditional legal education, the highly-standardized law school curriculum.) The programming “profession” has neither of those features.
I've been involved in hiring senior engineers for a while now, and here's a few counterpoints:
1) Ruby is hard to get a job in, so you are off to a rough start.
2) A lot of people with lots of experience actually can't code for crap. Do you know how many python developers I see that don't know the difference between a tuple and list? Like, how could you be a real dev if you never even wondered why sometimes you use [] and sometimes you use ()?
3) These tests and interviews aren't intended for you to get some certain score. Usually we make them way hard to find out what you do to handle that.
4) That said, you should know how to write code that isn't super slow and with a data model that isn't insane. You should also know how to articulate that, since as a Senior dev, you WILL be mentoring junior devs, and communication is not optional.
5) Every company's process is different because every company is different. Heck, my process is often different per applicant.
I think the main point from a candidate perspective is that long, unusual or difficult interview processes are fine as long as we have already decided we really want to work for you (that is you are Trello or SpaceX or some amazing startup we love)
otherwise, just as you are faced with picking a rose from a faceless mass of candidates so are we faced with picking a decent place to work from a faceless mass of mission statements and "100%code coverage" blog posts (if we can find any)
And 2) yes I can believe it - that's what fizzbuzz and its ilk are for. The number of companies offering hackerrank/codility tests and justifying it as we only hire the very best has left the lake woebegone test way behind.
There has to be some
middle ground - where someone can pass a basic capability test to weed out the crap without demanding several hours of coding. I mean I spent two evenings recently polishing up a "Oyster card system for TFL" as a hurdle for a government department I have been angling to get in for a year. A no-name corporations wanting CRUD development can take a running jump if it thinks my evenings come cheap.
(amazingly at the turn of the century I used to use "has listed Python on CV" as a marker of "worth an interview" - it was rare enough and indicated an interest outside of corporate mainstream. Maybe Erlang today??)
Edit:
So my compromise suggestion is for companies to say "We have an OSS project (or even recommend one of the bigger ones). Take any of these 5 bugs and supply a pull-request"
At least then the evenings work is not totally wasted and you get to see an important skill - how fast can they come up to speed on an unfamiliar codebase?
We actually only do 2 interviews total, and for some roles a Hackerrank quiz.
The only times we use coding tests, we use Hackerrank to administer them. That way you have a distinct time limit (we give an hour, which is honestly way too long) so you don't spend all weekend one something that doesn't matter.
I definitely agree about the difficulty of picking a place to work. We reserve half of our final interview (and part of our initial interview) to be a Q&A for the candidate to interview us.
I think that Hackerrank etc are optimising for the wrong question. 98% of the time as a hiring manager I am not looking for a AAA coder - I am looking for an A level coder who fits the team and has other soft skills that matter.
At a certain point "can code" stops being "can write perfromant algorithms" and starts being "can work without direction, can be placed in front of users without fear, can defend their decisions, is not an asshat."
Ten minutes on a shared screen and we can find out if you pass fizzbuzz, can make a rational stab at an algorithm question. After that it's mostly cultural fit.
You cannot automate a test for "is not an asshat" so we get more and more people proving they can get 99% on programming tests when programming tests are 5% of the job.
Hackerrank is terrible as well. The questions are worded in a way that takes ages to think about unless you are a mathematician. The time limit is pointless.It doesn't tell you why things are failing. For the type of problems it gives you a debugger would be really useful but you are coding in a web browser.
The trouble with using bugs is that most of the work for fixing them is in isolating just what's going on and where the problem is, and there's no telling how long that will take until you do it. A bug on a new codebase could be anywhere from a few minutes to a few months.
In particular, if you don't know the codebase, you're going to be guessing on places to look. If you're lucky and guess right, you may spot it right away. If you guess wrong, you could spend a lot of time diving around irrelevant details. There is some skill in guessing well and not spending too much time on things that don't give any progress, but there's still a lot of luck too. Because of all that, it doesn't seem like a good idea to assign a bug that you haven't already essentially fixed.
Maybe it'd work to just timebox the task, i.e. 'work on one bug for an hour', along with 'document everything you find and learn' (and add it to the public issue). I'm a habitual documenter and I could imagine something like those 'papertrails' being a useful way to evaluate someone's thought processes (and written communication skills).
> 4) That said, you should know how to write code that isn't super slow and with a data model that isn't insane. You should also know how to articulate that, since as a Senior dev, you WILL be mentoring junior devs, and communication is not optional.
I agree, but this should be a clear point. You shouldn't be overengineering something unless you really have to.
> 1) Ruby is hard to get a job in, so you are off to a rough start.
Huh? Enterprise level companies are desperate for Ruby engineers to maintain large Rails apps and there still is a good amount of startups doing new work with it.
My experience is that that's not true. A good part of my business is knowing the startup scene in general and Boston specifically; locally, I'm aware of...well, one company founded in the last five years that used Erlang or Elixir when the alternative was Ruby. (I'm only aware of three overall that use Erlang or Elixir at all. And that's kind of a shame because I really like Elixir.)
What substantive evidence do you have of this shift?
I'm a "Ruby engineer" but tend to avoid Rails teams because most of those large Rails apps are a giant pile of technical debt. They're looking to hire senior talent to clean up the mess but aren't willing to make the organizational commitments needed to make that effort succeed.
No thanks.
Edit: My 'favorite' experience was the few months of consulting work I did with a team building Rails apps to deal with medical records and the app that I came into had tons of dead code paths that leaked HIPAA-regulated data all over the place.
None of the API routes were 100% functional, so I spent my first few weeks cleaning that up and making it bulletproof. Then I fixed their broken homebrewed SAML IdP. None of that work that I did was appreciated as they only wanted (but wouldn't say that they wanted) new frontend features to show off to the client to inflate the quality of their work.
More importantly, they were using Rails4, but implemented everything by watching a Rails2-era Railscast and would get frustrated with me for not doing the same, a.k.a "the rails way" (I was, just modern Rails and not their broken bullshit). And that was the CTO...
> They're looking to hire senior talent to clean up the mess but aren't willing to make the organizational commitments needed to make that effort succeed.
Very well said and it happens in lots of areas where companies seem to wish for "big outcomes but all for free".
You will see this in security all the time.
"We have to make sure this thing is bullet proof."
"Ok it's going to take a month to harden and audit our the network and infrastructure and add monitoring and we'll be in good shape."
"Uhh ... no we didn't quite mean it like that ... can't you like install a plugin in half an hour that does the same thing?"
> They're looking to hire senior talent to clean up the mess but aren't willing to make the organizational commitments needed to make that effort succeed.
Well yeah, churn and burn is my company's motto. At least we pay well.
I'm in the midst of maintaining/fixing one of those and I find it a great opportunity if you A) want to learn outside your comfort zone, B) enjoy figuring out problems that aren't just technical (talking to people, design, organization), C) want to get out of a coding-grind lifestyle.
Our organizational structure isn't immutable, it just moves slowly. After about a year, my team's effort resulted in measurable improvements for both revenue and end-user experience.
If you're senior dev level and want more of a challenge that's not just throwing more code at the wall, these sorts of scenarios are something to seek out.
Sometimes. I'm actually fully on board with what you said, but the situations I found and was describing are usually environments where they just expect someone to put their head down and code.
When I say "not willing to make organizational commitments..." I specifically mean they don't give you access to people -- stakeholders don't want to be bothered by the devs. It's far too common.
What you're describing though is a great situation -- I love those engagements.
That sounds really fun. I've done greenfield Rails projects and I've learned that what I really like and find rewarding is this kind of slow reorganization of something that already exists. It's like remodeling a house--maybe it was well built initially (and maybe not!), but you get to spend a lot of time inside of someone else's mind. You know, when they had good days and things just clicked, when shit was on fire and they just had to make it work. The results of seeing meaningful improvements to something like that is just fantastic, to the point where you're now excited to add on to the codebase.
It's weird how prevalent the idea that communication _is_ optional in this industry. Headphones-on, heads-down engineering teams are to be avoided (by me).
Point number 2 doesn't really land for me. I can see how a dev of 10 years might never have needed to think about tuples, depending on what code she was responsible for. Some folks aren't really curious about deep internals, they care more about the bigger picture. Scalability, system maintainability, ease of deployment, monitoring, ease of iteration, etc. If pressed, they can dig in and understand the internals, but that might not be what they are interested in/ care about.
> Point number 2 doesn't really land for me. I can see how a dev of 10 years might never have needed to think about tuples, depending on what code she was responsible for.
i'm sorry but i don't agree there. in this specific case, tuples and lists are really different and there's specific reasoning for using one or the other. it's a core feature for the language. it would be like saying someone that is a Java dev and doesn't know the difference between an ArrayList or a LinkedList.
i understand not knowing nuances of the language (in python, understanding how __slots__ work and how to make usage of it), but not knowing a core feature?
Perhaps I come from a different land, but in my field, knowing a specific language intimately is not as important as knowing the wider scope of software engineering and distributed system design.
I'm not a developer who is down in the weeds optimizing specific algorithms though, and I can see how a mastery of language-specific data structures and how they are represented in memory might be required for such a person.
> I'm not a developer who is down in the weeds optimizing specific algorithms though, and I can see how a mastery of language-specific data structures and how they are represented in memory might be required for such a person.
I say this after having done an M.Sc. in Distributed Systems focused on performance analysis. In a lot of cases that I've encountered, mastery of data structures and choosing languages and runtimes appropriately can completely eliminate the need for a distributed system, or significantly reduce the complexity (an efficient 3-node system is much less complex to manage than a 100-node inefficient system).
A recent example that comes to mind is a pair of similar systems, one written in Java and one written in Go. There was an approximately 80x larger memory footprint for the Java system while having similar functionality. Plus the Java system took about 2 minutes to start up (yay Spring), vs. sub-second startup for the Go binary.
I fully appreciate the high level design of systems, and these days that's what I spend a lot of my time doing, but when shit hits the fan and the implementation of the system doesn't perform the way I'd expect it to, it's time to roll up my sleeves and get down in the weeds to help solve whatever is keeping the system from reaching its full potential. Maybe that means there was a flaw in the design, but often it's just a shoddy implementation (with Pareto 80/20 fixes to make it better)
Absolutely! But you if you're interviewing, and you haven't been in the weeds lately, I think it's unreasonable to get passed up for a job because you don't know the nuances of some language specific feature.
Some folks are curious and have learned about deep internals, but after 10 years of actually producing production code and never using them, expecting them to pull it out in a 35 minute "technical" interview is the problem.
If your company hires based on a technical interview that everyone says is not representative of the work that is done, you are not hiring right.
"1) Ruby is hard to get a job in, so you are off to a rough start."
I get there is demand to maintain Ruby/Rails apps today... but how many are hiring for new RoR projects?
Seems there was a bout of "RoR and ActiveRecord Don't Scale" articles a few years ago... then suddenly the new cool frameworks became Angular and React.
Despite explicitly telling people I don't want to work in Ruby again I still get people e-mailing me about Ruby jobs. I think I need to switch places with somebody.
Thank you for writing this post. It was informative. A few comments from a fellow software developer who is approaching 50...
I don't think the coding test isn't there because people think you're lying, it's there because we have no industry wide, respected entrance exam. Actuarial interviews don't (to my knowledge) contain a whiteboard vector calculus exam, but this isn't because people just sort of believe actuaries, it's because you have to pass a rigorous exam on these topics to become an actuary. I sometimes wish we had something like this in our field (not necessarily a legal requirement, just something that is widely recognized as legit). I'd be happy to put the time in and really study for a proper exam, but I'm not as interested in doing this over and over for companies that may administer and conduct these exams frivolously and in secret.
Also - I actually do agree that it's bad if someone can't write fizz buzz, but every interview exam I've taken has been vastly more difficult than fizz buzz. It's "find all subsets of a set of integers that is divisible by the sum of a different subset of integers". At a whiteboard, in 45 minutes. These aren't impossible problems, but they're much tougher than fizzbuzz.
I am saddened, angry, and relieved to hear of your problems with homework. The response you got back makes me realize that the two times I've done a homework assignment were probably pretty typical. I won't do this anymore, and I do accept that this will limit my career options. It does anger me, though, when the companies who do this complain about a shortage of engineers.
True story: I did an on line exam and take home homework assignment, waited over a month (crickets chirping) to hear back, pinged the recruiter politely now and then, and finally got a one liner "we've decided not to continue at this time.' A few weeks later, an article with came out with a picture of the CEO of this company standing next to President Obama, who nodded gravely as the CEO talked about the desperate shortage of software developers.
> ...who nodded gravely as the CEO talked about the desperate shortage of software developers.
This comment is exactly why reading about "interview gymnastics" like this really pisses me off.
Its also why I wonder how many big tech companies are somehow able to hire so many people... With processes like these, you'd think that they either have a "secret backdoor" or never managed to actually hire more than a dozen or so.
Google has a completely broken interview process, to the point where they pretty much brag about how ridiculous their false negative rate is, but they make up for it on volume. When people will throw themselves at you two or three times in hope of getting that lucky set of algorithm wankery questions that they can answer, then you will keep interviewing like that.
How do you define broken? It definitely sounds like it's working for Google so going by the "is the process working for the employer" definition it isn't broken.
I'm not so certain that Google's process is more broken than anyone else's. The thing the giant companies have going for them is that they tend to be more consistent, so at least you can get a good sense of what they'll ask, how to prepare, and how they're measuring you.
With small companies, it often comes down to "were you charming enough?" They won't admit it, but it's a clear subconscious bias.
I use a coding test not only to see if someone can write basic code, but also to assess general intelligence and see/hear their problem solving process. A resume definitely doesn't tell you all you need to know and experience does not necessarily mean effectiveness.
I actually do understand why people administer these tests in our field. There's so little to guide you otherwise.
The problem is that it's kind of awful, and I personally really do believe that it's driving people away from the field.
Here's my take (I've posted this on HN a few times). Many people find in person, at the whiteboard exams quite stressful. This is fairly common, many people describe exams to be among the more stressful events in their lives.
Over time, I believe that institutions that conduct exams evolved a bill or rights between institution and applicant. Exams are used, but they are administered consistently and fairly, the topic and subject matter will not be a huge surprise (questions are kept secret of course, but their nature should be predictable). People who pass or fail will receive an answer, and often get a score and feedback to know how they did. The people who grade the exams are provided training to ensure they evaluate people fairly, consistently, and without bias, and are expert in their field.
Now, I know that universities, medical boards, bar exam reviewers, don't always live up to this, but it is the intended goal. I believe that our field, software, subjects people to exams repeatedly, but without any of the bill or rights I descried above.
For example, how do you grade? Are you qualified to assess general intelligence? Can you understand that someone might not be eager to submit to your general assessment of their intelligence?
Now, if you want to say nobody is entitled to a job, I certainly agree. But the industry seems to think it's entitled to workers, and they just seem utterly blind to how off putting their practices are. And in an industry with concerns about gender, racial, and age discrimination, double secret assessments of people's general intelligence by interviewers of unknown qualifications is about the worst thing you can do.
This is fairly common, many people describe exams to be among the more stressful events in their lives.
Interviews are always exams, whether it's writing code on a whiteboard or trying to figure out what the interviewer wants to hear about where you see yourself in 5 years.
In a way, yes. But by blurring this distinction, you make it impossible to distinguish between an hour at the whiteboard solving a data structures problem, and an hour answering questions like "tell me about a time you overcame a challenge and what you learned".
Because people outside our field experience interviews in the second way more often, I think they don't fully understand what goes on in google style interviews. This is why I would call what we go through "Exam-style interviews", drawing a distinction between the two - even though I agree with you that they have elements in common.
I've seen plenty of "coders" with 15+ years experience maintaining and changing other peoples code that couldn't write code from scratch to save their lives. You see it mostly from people who've spent a lot of time someplace huge and old and corporate.
I agree. On the other hand, we engineers need to look at ourselves in the mirror. After all, we engineers conduct the technical interview.
I was involved in hundreds of tech interviews in the past several years. So many times in discussing a candidate's performance, I found some of the interviewers' questions and comments were unrealistic, even preposterous. In one case, an interviewer gave a hard dynamic programming question. We were a tech company and had very good engineers. Our products and our technologies, however, rarely need dynamic programming skills of this difficult level. I couldn't bear it. So I asked, "who think he can solve this problem on the whiteboard in 40 minutes right now?" Dead silence.
> ... because we have no industry wide, respected entrance exam.
This. In fact there needs to be one exam, with subsections and subscores per subsection, along with an overall score.
Being able to solve an algorithmic challenge on a whiteboard does not mean that you can:
a) write readable and maintainable code
b) effectively communicate requirements to whoever is actually running your code in production
c) know about application-level security vulnerabilities like SQL injections and know not to mindlessly insert them into your code
d) instrument your code for metrics and logging in ways that are more or less standard and expected for production monitoring
e) engage in effective review of others' code
f) use typical API handling techniques which are production-ready, e.g. exponential backoff and circuit breakers.
All of which are testable in a certifiable way.
Simple truth of the matter is, the vast majority of companies that hire 10 developers who studied efficient algorithms for their interviews, are better served by hiring 9 engineers who are aware of how production and organizational realities affect their work, plus one "performance hacker" who may or may not have a master's degree in CS, whose job is to find the worst real-world production bottlenecks and replace the implementations with algorithmically more efficient implementations (plus stricter performance tests so that the more efficient code doesn't get ripped out later).
That's an interesting conclusion and it makes pretty sense to me. I've heard that most projects fail due to organizational failures rather than development performance failures. It's probably better to invest in process/quality-aware developers than in rockstar programmers. But I've never read studies about that.
The SAT has a writing section - there is no reason you can't write code on a standardized test.
The idea is to assign low points to people who write a long function, and high points to people who write many small, self-documenting functions. Such an exam could also ask questions like "what is the cyclometric complexity of the following code?", which while not an indicator that the test taker will always write low-complexity code in a professional environment, at least indicates that the test taker is aware of maintainability metrics like cyclometric complexity - much more than can be said of programmers who mindlessly turn in 400 line functions with deeply nested conditionals.
You might not test this. Keep in mind, the bar exam, medical boards, actuarial exams, and other entrance exams aren't intended to establish competence in all areas of professional practice.
I think that the google style data structures and algorithms exams are a good case in point. Think of these like the actuarial exam for linear algebra, vector calc, and numerical analysis. These exams don't of course test everything important about being an actuary. But they do establish competence in something that can be tested. As a result, actuaries don't (to my knowledge) have to do 5 hours of whiteboard exams doing LU matrix decomposition or finding a steepest descent vector. Whereas software developers have to find all matching subtrees in a binary tree over and over (and over).
What I like about the actuarial exams is that while they are rigorous, and it helps immensely to have majored in math or something closely related, you are free to decide how to prepare for these tests. Although I like the idea of a widely recognized entrance exam, I really don't like the idea of something like the law schools putting themselves (and 200k in debt) in between an individual and the right to take the exam.
I like the idea of a proper and respected exam of some kind to test you on a variety of skills that are actually valuable in general and in specific.
I've attempted to gather data from colleagues around me but the data is limited. Posting online doesn't get much attention either. But I am trying to gather enough data to see if it would even be possible to create such an exam.
If a bunch of developers took a few minutes of their time to answer questions regarding what kinds of things should go into an exam and why (or heck, even a better teaching curriculum than what we have now) I think we could easily come up with something pretty awesome.
But, again, gathering that kind of attention and asking developers to provide you with insight is hard.
I'd love to tackle it if others were willing to help.
I find the coding thing interesting as well, in part because there is coding and there is coding.
I suspect it is the difference between "coding ability" and "coding fluency." In the former a candidate can apply known patterns of a give language to a problem and with just a few searches on StackOverflow get it working. A person who has code fluency can create the algorithm in the language of your choice, pretty much on the spot.
In the music world you meet people who can play a song on the keyboard that is note perfect, but they can't transpose it into a different key. Its the difference between playing the keyboard and using the keyboard to express a musical concept.
Can you speak a language if all you have done is memorize an extensive phrase book? Yes, are you fluent? No.
The number of candidates who really understand the nature of coding and so they can quickly adapt to any idiomatic language is still quite small in my experience.
> A person who has code fluency can create the algorithm in the language of your choice, pretty much on the spot.
I've professionally used each for a year or more C#, Python, Javascript, Objective-C, Java, PHP, Visual Basic, and ActionScript over the years. But if you asked me to write a function in anything but the first three languages, I will almost undoubtedly stumble a bit in producing them (hell, I still have to look up syntax for Python periodically).
That doesn't mean I couldn't pick them back up in a future job very quickly again (each job I worked for I was usually contributing to their code base in a few days, never longer than a week), it just means I don't have them fresh in my head and I can't store absolutely everything in my head forever.
But you'd still probably think I was incompetent. I've certainly given that impression before when I had an onsite scheduled by a recruiter and given less than 24 hours notice for an Objective-C job, a language I hadn't touched or thought about in over a year, and was handed a laptop by a Junior Programmer and was told "Code up an app for me." while another interviewer sat quietly across the table from me and stared at me the whole time while I refreshed on a years worth of XCode changes and forgotten syntax in real time.
After that wonderful performance they didn't give much weight to the two employees in their department that worked under me at a previous startup I was Lead Programmer for and vouched for my skills.
I think what you described here is all too frequent and, frankly, infuriating. Obviously not the right way to hire people, but more profoundly, I think it reflects poorly on the collegiate nature of our profession.
> I've professionally used each for a year or more C#, Python, Javascript, Objective-C, Java, PHP, Visual Basic, and ActionScript over the years. But if you asked me to write a function in anything but the first three languages, I will almost undoubtedly stumble a bit in producing them (hell, I still have to look up syntax for Python periodically).
It is for exactly this reason that if I'm interviewing you and want to know if you can code or not I will ask you to write up an algorithm rather than a program. I might say, "Show me the algorithm for locating a node in a binary tree, now do the same for a hash table. Now how would you insert into each of those?" And then, as many programming languages do, I try to tie one of your hands behind your back, "Ok so the language you're going to use doesn't have pointers" or "memory allocation" etc.
But I only interview that way because I see computer programming languages as an impediment to expressing what you really want the computer to do. And people who can code, first and foremost understand exactly what needs to be true for the code to work, then when they run into limitations of the language figure out ways to express those same concepts given the limitations.
If you were being mean you could add limitation after limitation until you were down to a minimally touring complete system. And if they can still make it do what you're asking, then they really deeply understand how to get computers to do what ever they want them to do.
I agree with every criticism that "coding tests" should not be about whether or not your syntax is accurate or you have the standard library memorized. I explained to a colleague at Google once that having total mastery of English grammar doesn't make you a writer.
I wouldn't think you incompetent if you didn't have the syntax at your fingertips.
But here is the rub, if the interviewer doesn't know how to code they can't reliably test for that ability in others. When I hear or read stories like yours I wonder about who the company has put in charge of interviewing these candidates and what biases are they bringing to the situation.
Been coding professionally since '99 - C/C++/C# until 2012, then Rails/React/Angular over the past 6 years. I guesstimate I've been on some 50 interviews.
If anything I feel that things have gotten better, although this may be a difference between my former enterprise Windows-stack life vs. open source tech life. The main differences I see are:
- Take homes are more prevalent... but I recall only one which has taken more than a half day, and that was fair as I was relatively new to Rails at the time. I actually like doing these for jobs I'm interested in as they give me an opportunity to flex my skills.
- There's about a 50% chance that you get a CTCI type interview vs. a more pragmatic, what-you-experience-on-the-job type domain modeling, write out in code in Rails (or whatever framework being used) type of pairing. When I'm on the hiring side I focus on the latter and feel it's quite effective. When I was starting out you almost always got the CTCI type.
I typically red-flag potential employers who don't sufficiently validate the skillset of potential hires. I've worked with plenty of people who were terrible, it's one of the reasons I transitioned to Rails.
From my experience Rails devs tend to care more about the quality of their work/impact of their changes on teammates, read dev blogs/books, go to meetups, care about testing/documentation, ways to source good candidates and working with good people.
Basically they just care more about doing good work. I must underscore though that my impressions are tempered by the fact that I primarily worked in enterprisey Windows-stack jobs, but that's also more typical - you're not going to find many modern startups going w/ .NET or Java. The tools themselves aren't really the problem, it's the implied culture.
Why is this? Probably because of the goals of each. .NET and Java were an outpouring of efforts from the 90s to harness issues of scale on enterprise systems. It's a pre vs. post information age phenomena, open source folks are going to be more of a hobbyist mindset.
I read a book called "The Passionate Programmer" in 2009 that turned me on to what was happening in the open source community at the time. It was the first I had heard of Rails, Ycombinator/Hacker News, alot of things really.
During the last few years doing Windows-stack work I was a top performer at the company I was working with, had gotten two relatively recent promotions, turned down an op going into management, and was so unhappy that I considered leaving software altogether. Transitioning to open source stack work 'lifted the cloud' - so to speak - and reinvigorated my love of programming.
I guess I don't understand why companies do this process.
When I was hiring Senior engineers for Computer Vision and 3D rendering jobs my process was thus:
1. Post job and simultaneously search for engineers we thought were a good fit technically
2. Reach out to people I thought were qualified based on their specific previous work that was related to the job I was hiring for
3. Review submitted applications for relevant experience
4. If we thought it was a technical fit, we would do a <30 minute team phone call with some basic work history questions, description of role/salary and work logistics (remote, dev environment etc...)
5. If we were satisfied with that, send them a <10 hour total, paid, production project at an agreed upon hourly rate. If the candidate didn't have the required IDE etc...it would basically be pair programming
6. Review code, speed and communication
7. Send a hire/no hire decision immediately
From first contact through Steps 4-7 it would ideally take less than a week, depending on the candidate's schedule.
We were only burned on this process twice.
Once the guy kept trying to negotiate salary up over two weeks so that he could get a higher price somewhere else.
The second time, the guy did well with initial production, but over time he ended up using local college interns to write his code, who got other jobs and his commit speed fell off of a cliff.
Since we are a remote team, trust was paramount, and we trusted quickly by default. Nobody ever had complaints about the hiring process and we had a higher than average success rate for hiring fantastic developers and getting quality code into production quickly.
We never asked current salary because it wasn't relevant. I knew what I could pay and that's what was offered. If they asked for more and were worth it, then I would try and find money to make it happen, but generally it wasn't an option.
> The second time, the guy did well with initial production, but over time he ended up using local college interns to write his code, who got other jobs and his commit speed fell off of a cliff.
Sounds like you should have moved him to management.
>We never asked current salary because it wasn't relevant. I knew what I could pay and that's what was offered. If they asked for more and were worth it, then I would try and find money to make it happen, but generally it wasn't an option.
> As a hiring manager, I’ve given homework assignments to weed out candidates from the pack but I always kept it reasonable, just a few hours in length.
"Just" a few hours has always, always been an underestimation when I've tried these. I've been burned a handful of times now; both from my time and from my belief that it would amount to something. I'm reminded of one instance where follow up emails kept coming after submission: "Add in this now." "Okay, now this." "Handle this." I consider myself an average engineer. I'm not interested in increasing my sample size to try and average out variance any longer.
I'm looking outside to one of the first sunny, warm days we've had here in months. I can't think of anything more I'd rather not do than some arbitrary company hiring project. I simply pass on these now and politely pull out from consideration.
>I can't think of anything more I'd rather not do than some arbitrary company hiring project. I simply pass on these now and politely pull out from consideration.
Yep. If you're gonna throw crap at me like that NOW ...it's only going to get worse LATER
This article is weird. His resume looks impressive and it looks like he has done some solid work but from the article he sounds like he feels entitled because of it. Also I find it annoying how little he mentions about the kind of companies hes applying to or even what country he's in (apart from one reference to a company in California so I guess we can assume he's in the USA).
> If an HR person says to me “Oh and we administer a coding test” then my first response is “I’ve taken a bunch of those, which one do you use?”.
If I was hiring and a candidate said that to me on the phone I probably wouldn't invite them for an in-person interview.
Is it just our industry where you have to prove you aren't a complete impostor every time? Basically we treat every applicant like they are Frank Abagnale [0].
A senior role should be focused on more overall system and performance aspects of the software, using good practices.
What does writing out a solution for fizzbuzz (or equivalent) prove during an interview? If they do it easily do you suspect they memorized it (our base assumption seems to be they are an impostor right)? If they fail, do they fail the interview?
In the real world if you had a database call in some recursive loop that would be bad for performance. The number of times I jump to using recursion in a solution is near zero.
> Is it just our industry where you have to prove you aren't a complete impostor every time? Basically we treat every applicant like they are Frank Abagnale [0].
The problem is that a large majority of candidates lie on their resumes. This means that hiring managers have to work harder to qualify a good candidate -- which often ends up turning into a process that hurts and annoys those that are actually qualified.
I've definitely seen candidates stretch the truth. Like Jenkins babysitters who list every technology the Jenkins server uses in builds as a skill. So they list Chef as bold item on their resume, but can't explain what a Chef server is, or how a file resource differs from a cookbook_file resource.
I've definitely seen people stretching the truth to various degrees. I do it too, because you're in for unnecessary difficulty getting past the recruiter screen if you don't do _some_ spinning.
The key is to only stretch it to the extent that you can explain your background in detail to the hiring manager and be able to openly admit where you don't know much if those areas come up. Generally speaking a hiring manager you actually want to work for understands that experience is heavily dependent on what your last role needed, and skills can be picked up as long as you have enough of the bare minimum covered.
Having a plan to write a postmortem once a job is landed might actually be useful, since it forces seekers to track their data, analyze the results of what they did, and carefully consider what they could have done better.
see: https://luckypatcher.pro/https://kodi.software/https://showbox.software/
We do a fizzbuzz-like question, but one we created ourselves so it's not easily google-able or memorizable.
Anyone with basic coding chops should be able to solve it; it would be equivalent to a CS101 quiz.
It is still shocking how many people fail it. Yes, we have to test for it. My wife is in digital marketing, her -boss-, who insists on being involved in every decision, and will override her knowledgeable subordinates based on her own feelings, knows nothing about digital marketing (and is the reason my wife is looking to change jobs), but nevertheless managed to impress people above her (who also know nothing about digital marketing, but to be fair, don't have marketing related titles or roles) with her resume. Imposters in jobs are super common; it's just that in development we have easy ways to check for basic understanding. Unfortunately we try to scale those up to look for expert level understanding, and that fails (because we're really bad at testing for expert level understanding in areas we actually care about. That 'implement a red black tree' is probably appropriate if your company builds a data structure library as part of their core product, and probably inappropriate for almost anything else).
I wonder what would happen if you asked those that failed the fizzbuzz question what they DID know and wanted to demonstrate. The idea that there are flat out imposters who cannot code that have held coding jobs for more than a few months is ridiculous. Right out of college with no experience, I understand.
Have you considered that:
1. People have imposter syndrome, all the time. They're stressed out about being able to code, when running up against code interviews having nothing to do with the actual job they're doing.
2. People have anxiety, and they know how tough code interviews can be. They crammed and crammed and crammed, and 10 years of coding is now all this big amorphous blob in their heads. They're ready for some big systems questions.
3. People have bad days. The environment might suck. Their dog just died. You're a very adversarial interviewer, and they only work well and creatively when someone isn't going to come in and bully them about the response (or maybe they just imagine this)
Of course, you have no way of knowing this as an interviewer. But FFS, we need a way to inject some fucking empathy into this process. I'd say 99% of the time people aren't in interviews demonstrating what they know or can do, they're being asked to demonstrate what somebody else thinks INDICATES they have things that they know or can do.
I know the response to this is going to be, well yeah, but its Fizzbuzz! And I'd like to ask those people if there's ever been a point in your life that you wouldn't be able to write Fizzbuzz. To dramatize for effect, if someone came up to you and said they have access to your bank account, and for them to not take every bit of money you've made over the past year, including the money for your daughter's braces or something important, and in order to get it back you needed to make as concise and clean as possible an implementation of his variation on Fizzbuzz, you will not be thinking just of Fizzbuzz. Your brain is going to be churning at 1000 miles a minute, and you'll be trying to pull out every trick you know (out of hundreds) to get it as concise as possible, while thinking to yourself this is my future on the line.
Thats how I feel in interviews at least. I've always passed Fizzbuzz tests, but I've crashed and burned in interviews due to any of the above popping up on interview day. If we all could have a bit more humanity and understanding hiring would go a lot better.
Yeah, you can have a bad day. I get it. We all fail interviews; I certainly have. Some I feel we really weren't a match (they were looking for a kind of developer that I wasn't, and don't want, to be), others I felt were unfair (for instance, interviewing with Microsoft years back, I had a C/C++ interviewer asking me questions that I had been told I was allowed to write in Java, and then disbelieving me when I told him (String).length is constant time so it didn't affect the Big O complexity that I had 'for (int i=0;i<(String).length;i++)', and clearly mentally checking out at that point). Obviously I don't feel any were because I wasn't, legitimately, good enough, but I also recognize I am very biased. But the thing is I also am in a place where I don't need an interview to justify my confidence at this point. I know I can deliver value. But I also know I will never convince the Googles of the world that I can, because I am neither a researcher of note, nor am I going to jump through the hoops of prepping for weeks on end for an interview; I have a wife, hobbies, and other, better ways to spend my time (even typing comments on HN! :P)
We first give people a take home. It's at their own convenience, we tell them it will be an hour and a half, coding, simple questions, to do it at a time they're comfortable. We don't stay on the phone, we tell them to use whatever resources they want (except, obviously, please don't try and google for the answers directly, or get help from others; it's simple enough that those who have tried to cheat have ended up with it being hilariously obvious, like leaving source comments that said it was by someone else, or variables for 'cat' when we never asked for anything related to cats, or being caught out during the whiteboard).
The interview is mostly a conversation. It starts with conversation. We talk about the position, the company. We ask about what the candidate is looking for, their resume, that sort of thing. Only after thirty minutes or so do we get to anything technical. We ask a few questions, and they're intended to be placeholders for conversation; plenty of right answers, we mostly want to see that the person is knowledgeable enough to discuss things. Even when we get to questions that have a right answer, it's mostly to gauge knowledge, and for the more complicated, even if a person gets it wrong, we'll tell them what the right answer is, and then ask them for a rational as to why. If they can figure out the rational, that's just as good as having known in the first place. Then we have a whiteboard question. It, too, is not hard. We tell the candidate "If you think there's a library function that will help, but you just don't remember it, you'd need to Google it, that sort of thing, talk it out with us, we'll give it to you". We try to help suggest things to get candidates unstuck. Etc.
Really, it's -not- a particularly antagonistic process. We really, really do want people to succeed (because, frankly, we want the position filled so we can stop interviewing and go back to work). So, yeah, if the interviewer doesn't manage the trivial coding tasks...we're going to pass. We -aren't- saying "this person is a bad developer", we -are- saying "this person could not demonstrate that they passed the bar of our interview process".
But there have also been some who have flat out said, even on the take home "I can't do this". Or those who have admitted when faced with the whiteboard question that they don't know how; that the take home had been done by someone else. Etc. Given those situations, yeah, our candidates are being given a take home, and a whiteboard.
I think it is a very reasonable test. There are other industries that regulate themselves in other ways. For example, a huge training process and then jail time for lying about it, for doctors or lawyers. Or other ways to eliminate the risk like hiring as contractors for specific jobs, or comission based payment.
For a senior role:
1. Someone who can't write and debug a for-loop and an if-statement isn't going to be able to provide training and support to junior level hires. At all.
2. Making high-level changes and performance improvement both require good process discipline, and the ability to write a lot of code to actually accomplish it.
I think there are high value software management tactics that can be implemented without knowing how to code, for example, change control, or enforcing limits on work in progress via. kanban, but for a role that has either "software" or "developer" I think fizzbuzz is a very low bar.
I personally like binary search as in interview question. The basic principle is simple, but there are enough edge cases and variations to make it interesting.
The "No One Believes Anyone Can Actually Code" point is right on the money by my anecdotal experience. Just a few weeks ago I was asked to implement FizzBuzz in an interview for the first time in my 15 years of engineering! This was despite having a large amount of verifiable open source Haskell projects.
I usually ask a trivial problem like this. Not really to see if they can code (I have had one or two people fail here though), but more to serve as a conversation topic. Why did you do this? How would you do that? etc...
But I don't want to talk about FizzBuzz! It's boring! There's a "right" answer, and not a lot/any real choice or nuance.
Ask me about your current problems, problems the person filling the position would need to have opinions about. If nothing else, maybe I could crack a tough issue for you that would have material value.
I've given FizzBuzz, and I've done FizzBuzz. It's hard to do it/get it and not feel like there's some degree of insult involved.
It's a low-pass filter to weed out programmers who can't even do FizzBuzz, because despite their lack of coding prowess their résumé will still look similar to yours.
> and not feel like there's some degree of insult involved.
I can't talk to you about my team's current problems, and neither should anyone else. If I do and you offer up a solution I'm in real trouble ... because that's a lawsuit waiting to happen.
Try to remember, this is the country where a range check function resulted in a lawsuit:
private static void rangeCheck(int arrayLen, int fromIndex, int toIndex {
if (fromIndex > toIndex)
throw new IllegalArgumentException("fromIndex(" + fromIndex +
") > toIndex(" + toIndex+")");
if (fromIndex < 0)
throw new ArrayIndexOutOfBoundsException(fromIndex);
if (toIndex > arrayLen)
throw new ArrayIndexOutOfBoundsException(toIndex);
}
Even something as boring as FizzBuzz can foster an interesting, if short, conversation. I've had candidates bring up everything from unit testing strategies to the implications of branch prediction. It can also help less confident candidates to start with a softball.
Anyway, it is just the first question and we are usually past it in five minutes. Then we discuss, in general terms, the types of problems we are solving and the related computer science topics.
It certainly isn't meant to insult. I hope I haven't insulted anyone and, if I have, they've never made it known to me. I will say that it'd be a huge red flag to me if a candidate acted like this was beneath them. The reality is that, while we will be solving some cool and hard problems, there will be lots of problems that are beneath us, too.
That last bit is what pisses me off the most. Some companies make it a point that they only hire people with open source projects, yet when interview time comes they don't bother to talk about these projects.
You literally have a data point with way more than the typical 4~8 hours a throwaway homework would take, and don't use it as an a) talking point, b) nice way to sidestep wasting more time?
The common thing I see is there is an implicit bias from interviewer, who always wants to hire someone like himself/herself. I also hear comments from the candidate that - as an interviewee if I interview the interviewer, he might fail too. If the interviewer stays unbiased, we may see better results.
Absolutely true, but it isn't something that can be fixed.
The interviewer interviewing the interviewee is hilariously true. No interviewer could answer questions about my domain expertise. Just like I could never answer questions about theirs.
But they are in control and I am not, so there's no fighting it, just indifferent resignation to the situation, and attempting to sort through it.
It's definitely not my experience in the DC area. There's certainly a lot of pickiness, but I had no trouble getting multiple offers here recently, the main problem was that some of them didn't want to pay much. I ended up going with a company that's on a hiring spree and beat my asking price by a good bit.
I just can't wrap my head around how prevalent this sort of thing seems to be - even as we hear, every day, that there aren't enough programmers to be found, anywhere, even when you expand the search to include the whole world.
765 comments
[ 3.0 ms ] story [ 378 ms ] threadThat's the kind of thing that happens when people lie. Everybody who's ever hired engineers knows from experience that a simple Fizzbuzz test is still, unfortunately, a very usable candidate filter.
A lot of candidates with years of real work experience simply cannot write code. How else can we find this out?
So true, sadly.
It's thinking, puzzling, chewing over problems, solving political infighting between customers, management, and the frameworks in use
At the end of the day, the buck should stop somewhere... and it does. With management.
In the meantime, I think it's time for sysadmins/engineers/devs to start getting MBA's and going for CIO/CTO positions and start to push a shift.
I would say that's still management incompetence. They're paying all this money for experts in the field, and they still want to disregard their opinions.
To put it simply, they don't feel comfortable saying: "Well... you're the Doctor".
Nope - they've gotten burned by being talked down to like the cliche mechanic telling a girl her SUV's hammenframas needs to be replaced, and it's $1600.
If you as a software developer cannot speak coherent English sentences (with a small handful of management jargon) to management without devolving into technical shorthand, you are a failure.
Not management.
You.
You have to explain what is going on in a manner your audience can understand.
You should not expect managers to be technical (they might be (and good for you if they are)) - they're accomplishing a different task from you and need solid, understandable, actionable data to take to their management and customers.
"does it work? no."
>googling...
>copy code block
"does it work? kinda..."
>googling...
What’s the order of arguments on this one? Does it modify the data passed in or create a new one? How does it handle nulls?
It’s cheaper to look it up than to debug. So that’s what I do.
It was in a language that I had been using for 5+ years at that point, using a framework that I had just finished architecting a whole application for, had multiple open-source projects in, and the challenge itself was something that I genuinely felt should have been extremely easy, but I miserably bombed it.
I'm almost positive to them I looked like a giant fraud, and to be honest I felt like one too, but after some thinking I really feel that it was just a bad day combined with being uncomfortable without my editor/tools that I use in my day-to-day job that ended with me getting stuck and failing horribly.
I don't know a perfect solution, but when I was later in a position to hire new devs, I avoided coding challenges because of that experience. I feel that you can get MUCH more insight into a developer by just having them talk about what they have done, go into details about problems that they solved, or how they would approach problem X without any writing of code anywhere except maybe some drawings on a whiteboard if necessary.
Coding Challenges to me test 50% "knowing the syntax and not making mistakes" and 50% "knowing how to solve the problem". We have tools and compilers and linters and syntax highlighting and good editors to solve the former in most cases, it's the latter that I'm looking for in a good developer, so why would I use a test that evaluates both of them equally?
I’ve been in that situation myself.
And I wasn't even particularly nervous about getting or not getting the offer either! They approached me, and I wasn't fully sure if I would even like the job yet!
FizzBuzz-style filters not only don't prove that someone can code, they don't disprove it either. I'm not sure what the answer is.
I have social anxiety. It doesn’t interfere with my work in any way but I’m wondering if you could accommodate me in the interview by doing x y z.
It’s worth a try, right? I’ve thought about doing that.
Partly because it's not exactly easy to get enough context and understanding about a codebase in an interview to be able to accurately debug something, but also because again it comes back to what you are familiar with. 6 years ago I would be damn good at debugging and optimizing MySQL queries, today I'd probably struggle to get a moderately complicated one to work without a lot of looking things up and trial/error (I mostly work in postgresql now!).
That's why I like to ask about their past experience. Tell me your war stories, tell me what you did to figure out that bug that was causing the elusive crash, tell me about your struggles getting webpack setup, talk about how you initially planned to do X but then after issue Y decided to pivot to Z because it was simpler/easier/faster/whatever, explain how you accidentally put a quadratic-complex function into the hot-path of your application that one time and when you found out it was a problem.
Just talking about stuff like that can often show where a developer is in their career, what they are good at, how they go about solving problems, etc... And it's almost impossible to cheat/fake it.
If anything, the interviews I've been on have been four or five 45-minute whiteboard sessions, usually about data structures and algorithms or object oriented design.
Nowadays that also seems preceded by a homework assignment and a 3rd party coding quiz.
FizzBuzz would be refreshing.
The industry expect people to lie... "Do you have 5 years experience in <3-years-old-tech> ?"... "Yes, sure".
JobHound Sign Up Works, but the login link takes out of outside the page.
Not everyone makes principal, and you shouldn't go into management if you aren't suited for it.
Oh but if you don't do either of those things by 40 then you suck and don't deserve to get hired.
Speaking of sucking, I should probably figure out what I'm gonna do once I'm unemployable. hm.
It's surprising to see the number of people who interview for lead technical roles that cannot code, or whose work is exceptionally sloppy. Incompetence is more commonplace than the author believes, even at the highest level.
Unless you meant “lead software engineering role” in which case yes, you are right.
I'm not saying that All Coding Tests Are Good, but they do provide a modicum of certainty in a very uncertain environment.
I can try and come up with reasons why that might be the case, why a simple OO modeling problem + a couple of trivial algorithmic problems (like, take an ascii string, return me a dict mapping characters to character counts) would trip someone up...but that isn't sufficient justification for me to want to continue to an onsite.
And that's the people who get past the verbal screen. Plenty drop out at that point. "I see you spent two years as a Senior DBA. Can you tell me what the acryonym ACID stands for?" "No, I'm not familiar with that" "Okay. Well, the 'C' stands for consistency. Can you tell me what one means when we talk about data being consistent in the database?" "It means when you write something it stays written (or some other made up twaddle)" "I see."
That said, I agree that coding tests that are completely unrelated to the job, and are geared toward college grads rather than long term developers (i.e., "Implement a (data structure)" or "Remember/discover an algorithm that was a PhD thesis 30 years ago to solve a contrived problem in a theoretically optimal way" rather than "Solve a real problem of a kind similar to what we'd expect you to do here") are dumb.
There were people who were bad at (possibly some because they were under pressure), it but nobody who couldn't do it at all.
I wasn't giving out a trivial question either.
I'd suggest a widely-accepted professional certification could help a lot, like doctors and lawyers have with the medical board exam or the bar exam. Easier said than done, but what we have today, where the candidate pool is overflowing with impostors with great resumes is not working.
(I've had that happen several places)
"i passed the bar exam!" and nothing else doesn't get you a legal job you want.
and your medical boards, if i recall correctly, just mean you're qualified to go be a slave, er, uh, resident, some place for a few years.
Find me good certifications that are actually meaningful and relevant to my career, and I’ll do the study work and get them.
I have yet to find any.
Go long enough interviewing hundreds, you'll see a few no matter what. Have a crappy enough filter in front and you'll see them right away.
Asking the right questions at interviews are crucial for finding the right people. If a candidate for a programming job knows binary trees but doesn't listen to other peoples views I would say he's less worth to us than a listener that easily learns new concepts but is currently not familiar with binary trees.
BTW, leaving a candidate in tears is not professional recruiting. Please let someone with more people skills accompany you to your interviews, you might leave people with scars that takes years to heal.
I'm sure it's used under the hood in a lot of code I write and have written but so is XOR, manual memory management and a bunch of other lower level implementations that I don't need to spend time on when developing on a higher abstraction level.
Not sure why you would expect all programmers to know about binary trees specifically.
I'll bet, even with this feedback, you'll continue to ask that question, just because.
For some reason that company insisted on only doing interviews at 7:00 AM, and my brain doesn't come fully online until after 9:00 anyway. I felt annoyed later when the answer came to me that afternoon, too late: put the list in a hashtable, add all pairs of numbers for O(N^2) complexity, and check if each answer occurs in the hashtable.
Much later after that, I realized that all the other red flags I'd picked up on while interviewing there added up to an impression that their corporate culture was seriously f'ed up, and that I probably dodged a bullet by getting passed over quickly in the process.
The skill takes a long time to practice, and quickly evaporates once you stop doing it. Yet none of our work is anything like that. a more real world situation is reading documentation or SO for the function concat_ws that will turn an array column to a concatenated string.
however, the system that is, and one that you seem to think is ok, is one that discriminates people on many levels. Its a skill you do not get good at by working, so you must practice this in your free time. Now you just discriminated against men and women with families, people from less fortunate backgrounds, and others who otherwise do not have the time in the day to dedicate to a skill that is only useful to coding interviews.
as far as a comment above, I was a DBA for 10 years and can do pretty complicated queries off the top of my head, know how to optimize my indexes, worked with both structured and unstructured data in the multi tb size, ect ect, but I have no recollection on what ACID stands for. I dont really care. Sure, you may hire someone who memorizes useless crap, but then they have no idea why the IO has gone through the roof when inserting IDs out of order on a clustered index.
I just look up joins when I need them, and it's straight forward, but ask me in an interview and I sound like an idiot.
I wasn't rejected but I've been asked to retake a phone interview. Apparently, the interviewer had very good feelings about me, but found that I was "out of practice" as far as coding goes.
I wonder if my age is an issue (40+) or if they have a really high level of expectation. Are most other candidates super fast at solving these kinds of problems. I'm a bit disappointed because I'm not sure that I've got much room for improvement at that stage.
They want 23 year olds who just did their finals. You know, real stallions.
You know, real pegacorns.
It sounds to me like you did pretty well so don't give up.
From my perspective that is only about 3% of what I expect from a software engineer. Writing readable, easy to maintain code that is well tested, collaborating with product and other developers for how a feature should work, influencing technical designs, giving good feedback are things I value much higher than how quickly someone can write a snippet of code that works.
How did you arrive at that conclusion? Is it based on data or does it "feel" right based on an easily-measured metric?
This is _a_ metric but I wouldn't bet too much on it. I know lots of people that come to optimal solutions to "algorithm type" _much_ faster than I do. I'm pretty slow at that type of stuff. But... its just such a small part of what makes someone a good programmer. Building out a medium to large application requires balancing a lot of trade offs and figuring out how to keep things simple. I know seasoned, quality algorithm solvers who honestly just repeatedly churn out garbage applications. And they can tank the productivity of an entire team of developers in their wake. I don't know how you test for that, but I can promise phone screening for problem solution time isn't it.
Translated: "the one that did it much faster is a more recent graduate and exploitable for 100-hour weeks at below-par pay, hire that one".
Congratulations, now you know how to hire at a tech company!
The answer to that is almost always yes.
Maybe the interviewer was biased and led to think I was "out of practice" because he knew I was on the older side. But I'll give them the benefice of the doubt. I believe it's a competitive position and I simply wasn't in the right percentile to qualify.
Now, would my former self 20 years ago be more competitive for this kind of interviews? slightly faster perhaps, but I don't feel I'm at a disadvantage compared to younger candidates.
For many tech companies where they get a lot more candidate applications than they have positions for, the goal of the interview process isn't to avoid losing good candidates, it's to not hire bad candidates.
So much more goes into software engineering than "Can solve tiny example problems in an examination system"
True that software engineering is more than that, but those other things largely depend on in-house company processes, tools and policies so you would learn them afterwards.
It annoys me that the good answer if you actually encounter the problem during the job is never accepted during an interview.
They aren't looking for people who don't know to start by doing some research, they're looking for people who won't be completely stuck when that research doesn't turn up the answer.
So then I try and give them a O(n^3) solution (or something).
Of course this isn't accepted as there's a better O(n^2) solution, which can always be found by googling, and I fail the interview.
The "turtle and the hare" problem of finding a loop in a single linked list in O(n) time and O(1) memory is the perfect example. It's easy if you know the answer (or can google) but basically impossible if you don't.
What did the interviewer do when I said I couldn't do better than a hashmap? He laughed and said "not many can".
The gist of it is: walk the list and after each step, multiply the previous node’s pointer by negative one.
If the current node’s pointer is negative you’ve found a loop (because you colored it by inverting the pointer in a previous step).
Clean up by starting at the beginning and multiplying all pointers by negative one until you reach the last one you inverted. Then return your answer (true).
If you reach a null pointer there is no loop because you’ve gotten to the end of the list. Clean up by going through again and multiplying all the nodes by negative one. Then return your answer (false).
Your worst case running time is 2n (if there is no loop) which reduces to O(n) and you use O(1) memory because you’re coloring the list by using the already existing pointers in the list.
Which means what they're really saying is not "we want problem solvers". What they're really saying is "the bare minimum for entry level work here is being able to, in 30 minutes and on the spot, out-perform top-tier theoretical CS researchers".
Which in turn really boils down to "be a recent CS graduate who memorized this algorithm in advance so as to 'derive' it later on command".
They were probably looking for the answer of, "Lets talk through it and figure out a better answer". Coders are often under a mistaken impression that interviewers care about your answer. They don't. They care about how you approach it, how you think through it, what you do when challenged, etc.
So from their perspective, they asked you to try harder on a problem, and you just said, "No." And they dropped you for it.
FWIW, I had similar questions in some interviews where we hashed through similar problems, and together collaborated down to a "No" answer... but we spent 15 minutes exploring the problem and seeing how well a couple coders can work through it before saying no. And I got the offer despite an otherwise rusty performance.
I was asked to sketch the proof for the irrationality of sqrt(2) in a quant programming interview. I kind of froze, and explained that though I had learned it, I could not recall.
He prompted me with "Well, what does it mean to be irrational?", and with that little hint I did the rest. Though ultimately I did not end up working there, it was very satisfying to have answered it.
Well, in one case (me), all the information the interviewer had was "this guy happens to know how to implement a quick sort by heart. K.".
In the other case (my friend), he got "this guy is able to understand and implement an algo he never saw before in a reasonable time", which is much more impressive
Assume sqrt(2) is rational and has the reduced form (x/y). Thus we are assuming that x and y are integers and that gcd(x,y) is 1. You square it and get x^2/y^2 which are somehow simultaneously coprime integers and also reducible to 2/1...
> We now show that the equation (1) p^2=2 is not satisfied by any rational p. If there were such a p, we could write p=m/n where m and n are integers that are not both even. Let us assume this is done. Then (1) implies (2) m^2=2n^2. This shows m^2 is even. Hence m is even (if m were odd, m^2 would be odd), and so m^2 is divisible by 4. It follows that the right side of (2) is divisible by 4, so that n^2 is even, which implies that n is even. > The assumption that (1) holds leads to the conclusion that both m and n are even, contrary to our choice of m and n. Hence (1) is impossible for rational p.
This isn't always true. Some interviews are really about solving the problems as fast as possible. And lots of interviewers are looking for exactly the answer they have on hand, and will think you're doing it wrong if you come up with a different, but equally valid (or better!) solution.
Huge asterisk that as long as you arrive to the correct solution with minimal help. I've had plenty of algo/ds interviews and it seems like needing help to see the trick in the question pretty much means you're out.
At my last company, we would sit a candidate down at a pairing station. We'd offer them about 5 problems to choose from, and together we'd pair program on the problem for 2 hours. Using the internet, the IDE, anything they want was totally fair game. No system is perfect, but this was by far the best one I've ever experienced.
In many of the places that do claim this, even if you solve the problem "correctly" you still get more brownie points than someone who got a less efficient answer or didn't get an answer. Meaning that they /do/ actually care. I do get that some places are smarter with regards to this than others but it's depressingly common in my experience. "You didn't get the O(n) solution that has weird edge cases and was published as a paper in the 70s? Too bad, because some other person did, because they remember the solution from some programming interview book!"
The problem that I have with those problems is, they always assume it's easy to answer after seeing the solution. But if you're working on them for the first time, it's a terrible environment. The minute that they stop asking you, as the canidate, are on a timeline to finish. (Also, to finish as well)
The answer to that item would be: (with scala)
> datasource.window(3,1).filter((a,b,c)=> a+b == c)
I mean if you knock it out of the park and know the internals of window.. then asking the bar raiser question is appropriate as a curiousity.
There are other problems as well: Those are the ones where they have an expected answer, response, and reiterate. I've seen that with tree problems. That's where they would low-key ask for the recursive version and then get you to say stackoverflow exception.
My immediate solution: Sort the two strings and then compare them:
or some such. I was fortunate in that they didn't make me implement the sort (because it's been a long time for me) :)"Ok, what's the efficiency of that solution?"
"Well, assuming the library sort functions I'm using are sane, I'll take a guess and say O(n log n)"
"Can you come up with a more efficient solution."
Off the top of my head, on the spot, I couldn't. Later, during the plane ride home, the obvious occurred to me: Don't sort the strings, just scan through each string once and build a hash table, keeping track of the number of occurrences of each letter in each string. Then compare the occurrences for each string. Not as elegant to express in code, but faster.
As it turns out, they later declined to hire me, giving me an excuse that made it clear they weren't really serious about hiring anyone for the position (as is the case at least half the time, it seems).
And thus ended my latest round of failed interviews. I cancelled the last one I had scheduled (probably another fake) and decided to take a break for a while (I mean, I do have a job right now, so it isn't urgent).
You’re right.
ac = 1 + 3 = 4 bb = 2 + 2 = 4
So I think something silly like: character_code = len(string)*len(alphabet)^character_index should work.
Still, consider the word ‘abe’ with a = 2, b = 3, c = 5, d = 7 and e = 11.
abe would then be 2^1 * 3^1 * 5^0 * 7^0 * 11^1. ‘abba’ would be 2^2 * 3^2. Each anagram would have a distinct value.
See also Gödel numbering and FRACTRAN.
Reminds me of my final round at Amazon, which they always do in Seattle. I woke before 4 AM west coast time having flown out the night before from the East, and 12 hours later was still coding on a white board. After writing (to my surprise) a correct merge sort, they asked my to write a program to do basic math with, IIRC, binary numbers. I was like, um. I'm out.
And if you throw in distributed databases, there is yet another understanding of "consistency" (vis-a-vis the CAP theorem), which really means "linearizability".
Sorry, didn't mean to be super-pedantic but consistency as a concept may seem simple to the uninitiated but is easy to get tripped up on, especially for folks who are aware there is a deeper layer of understanding associated with the concept, but can't articulate it right off the bat.
All this is to say filtering people truly is a hard thing. The extremes are easy to tell apart, but people who hover around the average are much less differentiated.
[1] https://en.wikipedia.org/wiki/Consistency_(database_systems)...
And I have similar anecdotes related to candidates who claimed years of distributed systems architecture experience, and were yet unfamiliar with CAP (and when explained, could not tell me even at a high level whether, in the event of a partition, their system was CP or AP, let alone the specifics of how that actually exhibited itself).
Once you start working on a particular database, and are working on all of the specific details of that db, how often does ACID come into things, really? It just doesn't.
I don’t think it’s essential to know this, but I’d be surprised if a web dev interviewed with us and didn’t know at least the basic version I’ve given above.
Just my experience, perhaps I live in another world.
I think this is partially what I'm referring to. I use these terms in conversation with others when designing systems because they are useful in describing very specific properties of databases.
If you legitimately did the work without picking up -any- of the terminology, -and- respond confidently to questions you should know you don't know the answer to (rather than admitting ignorance and asking for follow-up questions, or declaring assumptions, i.e., "Well, I would assume it has to do with the behavior that if a constraint is violated or something similar in a transaction, the transaction will be rolled back instead of committing"), I don't want you. Because it means you both did not have formal training in, AND didn't seek out information or knowledge in the domain you were expected to be -senior level- in.
And while atomicity and durability are just characteristics of a relational DB (and so adminning one doesn't really require you to understand them), isolation and consistency both have definite relevance, because the isolation level is configurable, and that affects the consistency guarantees of the system. I expect someone saying they were a -senior level DBA- to be able to talk intelligently about those behaviors, and yes, to understand the words, because just reading the docs would have introduced the words.
Otherwise, I think we simply disagree in some respect, although I think it's over emphasized due to the topic. I think both perspectives have a level of truth to them, and have their flaws. It really depends on the candidate, and what they really know. Perhaps my particular circumstances are sufficiently odd enough that they aren't useful in a broader context. Who knows.
One of my mentors said that about an interview he conducted a while back. I found a lot of truth in that line. I run my tech interviews by starting very green and let the candidate dictate how fast I ramp it up. I've gotten pushback from managers before that you can't start with basic questions, but I've equally gotten positive feedback from candidates (even one's who've been failed the interview). In the end, programmers want to see an algorithm that allows them to judge an interviewee. I don't believe one exists.
I mean, look at this thread; would it be better to start with "Here are some example tables, please write the SQL that will return me (etc)" and turn it into a coding exercise? Because I honestly don't care that much about that from anyone espousing a senior level of knowledge.
None of the techniques discussed in this article are even attempting to judge productivity, they are attempts to judge coding ability. It's good that you bring up productivity though; that's what we are really after, isn't it?
>from a short conversation
I'd argue 30 minutes to an hour is not a short conversation. Do you think an imposter could fool you about tech (assuming you are an active programmer) for 30 minutes to an hour?
>it's probably better to see the proof
You're not proving anything except the fact that the candidate has memorized a merge sort algorithm (or whatever trivia you are testing for). What you really want to know is, can they ship?
I think you should at least consider the idea that not only are these tests and homework assignments (past fizz buzz) a poor indicator of ability, they active repel any candidate good enough to be in even reasonable demand. I mean you have a lot of people on not only this thread, but many other threads saying the same thing.
Time for a little reflection, what does your company offer that even a mediocre developer can't get in 20 other places in your city? I mean if I could get "market rates," and a "fine cubicle," and "standard PTO" in 20 places, tell me again why I would bother with this rigamarole?
I have no idea where the idea that having someone come on site for 6+ hours wasting a dozen peoples time became the norm as opposed to talking to someone for 1 or 2 hours and truly speaking with them to understand what they know.
You're completely right, if you can't talk shop and not know when someone is bullshitting you shouldn't be the one interviewing.
How would this even fly in other industries? Are you telling me that someone can bluff their way discussing the intricacies of surgery to other surgeons without looking like a moron? Or discussing particle physics with a researcher and stand on equal footing? I honestly want to hear a conversation where a liar with no programming skills is able to convince a Senior level Software Engineer that they are on equal skill sets.
The best interview experience I had, where I eventually worked for the company, was having an hour conversation with the Engineering Manager who I would be working under then being ask basic programming Qs based on our conversation we had. Everyone in the company was interviewed the same way. IMO the resulting team was very professional and skilled on various levels from various backgrounds. I actually felt like a human at that job and not a person hired because of x thing.
I'll never forget I had an interview where they asked me a question about finding anagrams. At that moment in my life, I've never heard of an anagram or knew what it was. The Interviewer then explaining what it was to me made me feel very humiliated. I completely bombed every question because I had the audacity to not know about this thing where the interviewers knew about thing therefore I should know thing as well. I immediately understood how cultural biases can effect candidates getting jobs. I can only imagine how worst it is for people not from traditional backgrounds in this industry.
I had a candidate for a 3d graphics job, who showed me incredibly impressive things he'd programmed like very realistic water simulations, etc. He talked us through them, was incredibly articulate and clearly knew his stuff.
He completely bombed the coding exercise. It was something like: given 2 hours alone at a computer, with a threejs scene already setup, make it display a few cubes at different heights, colors, etc. Full access to internet, google, etc.
He couldn't get one cube to show up. That's maybe a two line piece of code when given the entire environment already set up, and you can find it by googling Threejs tutorial and copying like the first example.
Ya.
As far as graphics, the only time I was ever fooled was by a front end guy in 2005. He brought really nice looking color printouts of his front ends; beautiful stuff. I was really wowed by it; so much I didn't ask him basic programming problems or follow up questions about his prior work, and that was my fault. I allowed myself to be fooled.
His biggest issue was he was lazy. He had grown accustomed to government contracts where you do a lot of prototyping, but nothing ever went live (at least the contracts he had). We had a very aggressive 3 year schedule to build a sophisticated product and he just couldn't or wouldn't keep up. I had to double my workload and he ended up only doing about 5% when he should have done a third and he required a lot of prodding and hand holding. We still managed to ship on time though, but it was really hard on the other 2 people on the team for 3 years.
I'll never make that mistake again.
Perhaps he really was a very talented developer but your coding exercise was too stressful for him. Shame you missed out on hiring him.
This is not a story to show why we should do coding exercises. It is a story to show why they sometimes don't test the right thing.
1. He knows how to do extremely specialized things in an existing environment, but can't do things outside of that environment.
2. He was presenting work that he had only a partial hand in creating.
3. He is amazing at e.g. C++, but cannot learn even rudimentary new things in Javascript.
...
Some of these stories make him a terrible programmer. Some of them make him an OK programmer for other positions, but weren't relevant for us. None of the stories make him a particularly great programmer.
"Perhaps he really was a very talented developer but your coding exercise was too stressful for him"
Yes, it's possible. A lot of things are possible. But I'm sorry - if someone can't copy-paste a 3 line program from the internet and get it to work, in their own field, for 2 hours, then... I don't know how I could ever design a test on which they won't fail. Including the actual job.
Honestly, that's way too trivial to call "can code". I usually ask something less trivial, yet still extremely easy like "a function to check if a string is a palindrome" (I explain what a palindrome is) or "check if a substring exists in a given string".
You wouldn't believe how many people "with 10 years experience" just lose all motor function in their hands and mouth, even without any time pressure.
Coding in the large is project management and could be tested by a take home, but I'd rather tease it out by asking in person questions about organization, prioritization, and technology choice.
Throughout my career, I've been in professional situations where I was under a lot of pressure: Having to explain failures to executives, near-impossibly tight deadlines, production outages. At least I haven't had to testify in front of Congress yet. Absolutely NOTHING I've encountered in my professional day-to-day has the extreme level of pressure of a typical silicon valley job interview.
Because if I hire that person, they'll be in charge of critical production systems and will face much harder problems in much more stressful situations and if they can't handle the palindrome question, I have very little confidence they can handle the actual job.
Not claiming to be that hero, but I have personally had those moments where I came out of the interview, and as the disorienting fog of pressure lifted during my drive home I said to myself, "WTF happened to my brain in there? I know that stuff cold!"
EDIT: I think I read this one from a commenter here, but it's so true: We're interviewing people to be music composers, but judging them by their ability to be performance artists.
(i.e. bring out groovy, using bash, etc)
Is it reasonable to ask things like that? Maybe, maybe not.
But as stressful as an interview is, it's still a basic problem (I can English describe it to you in 30 seconds...coding (in C/C++) would take me another 5-8 minutes (and, probably, be pretty damn inefficient ... but it's still a simple problem)
Checking substring in a string is a 1 liner in languages like python.
I was at a final interview with FAANG. One question asked was to load a csv. I used pandas, it's a 1 liner. You could see the wretched face of the interviewer since he was expecting a
with open() as f: do_some_shit
and kept pushing me to write this on the board. I looked at him and said "Why? Why write your own method in a vanilla language? Give me a good reason."
That's like answering "how often do you need math?" to the question "what is 2+3?". It is an utterly, completely, stunningly trivial question that even a CS101 student on their first semester should be able to answer.
> used pandas, it's a 1 liner. You could see the wretched face of the interviewer since he was expecting a with open() as f: do_some_shit
I would be perfectly fine with the pandas answer, but my point is "csv parsing" wouldn't be my first question, I'd start with something much easier and if you managed that, I'd gladly accept pandas as a valid and then asked you to elaborate further (what does this pandas function do, how would you implement it yourself etc).
What are the downsides to using pandas? Is that worth brining in that large of a library for a matter like that.
They can't ask you a complicated problem, because they don't have the time (nor do you) to solve a real problem that requires coding.
You are totally missing the point of what they are trying to ask you if you insist on using pandas for parsing CSV. Understanding the point of what you are being asked to do is critical to being a professional software developer.
I’ll take someone who gives an idiomatic answer over someone who reinvents the wheel anyday. Who is likely to be more productive on the job?
They can definitely ask a complicated problem. On-sites are 4 hours long these days.
The ability to understand the underlying need behind a request is important to being a good employee. If a candidate fails completely to understand the purpose of a question during an interview, and in fact continues to argue against you as you explain it, they aren't a good candidate at all.
I agree with everything you've said, but that still makes it a bad and equally obtuse question. If they don't actually need a CSV parser, they don't need to know that you can parse CSVs, either (if you can - which is the other point - you might be a pretty good programmer if you can quickly parse a CSV, but there are tons of excellent programmers who can't).
And that was when I found out parsing something that should be as stupid simple as CSV file can actually be pretty complicated.
I understood the "purpose" of the question and I self-selected myself out of a role I would've been bored, micromanaged at, and probably not challenged at.
Overgeneralized at best, LOLworthy at worst. Does this include palindrome questions for Ruby that require the use of linked lists? Because I had that from a CTO of a couple-hundred person company not two months ago.
I think to some degree, a suspension of disbelief is reasonable for an interview, and it's not worthwhile to get tunnel vision on a particular problem asked. It's ok to point out that something is trivial with a particular widely used library or whatever, but if it is asked to implement something via first principles or whatever, it is a perfectly reasonable expectation to just do it for interview purposes as a simple mental exercise.
There's a few things going on here. First, there's a frustration from the interviewer who is obviously looking for the cookie-cutter answer to move things along. Second, there's a culture misalignment because they are looking for cookie cutters to do the job while I am not that. Third, they, along with OP, are obviously not a palindrome company nor a load-everything-to-lists company yet this is what they're testing. So again, culture misalignment.
At the end of the day, you are right, I self-selected myself out because I would not be happy at a place like such who are looking for cookie-cutter employees.
That you couldn't yield on such a trivial, manufactured matter would make me wonder how you respond in a team environment on real matters in the face of adversity.
One of my go-to questions is "sort this array", and if the candidate types `Arrays.sort(input)` they get bonus points, because it shows they have useful knowledge of the language they'll be writing in.
It's a synthetic interview question. Why does it suddenly need to be a production-ready CSV parser?
We don't have enough information to say whether these are bad interview questions, and it's really not the point.
Maybe the interviewer just wanted to see if you'd use good fd hygiene (`with open('file.txt') as f:`) and that you can stub out some toy parser code and speak of it intelligently. And that you wouldn't throw a fit when asked to write some code that a library like `npm install fizzbuzz` can already solve.
Creating a dependency to a library is not benign. Even if the library is easily available and mature doesn't mean that everyone has it, or that it will never change. Remember how "leftpad" broke npm?
Having that smug attitude towards the recruiter, assuming he is an experienced developers himself, should rise a red flag. Yes, sometimes projects have constraints (like "no pandas") that may seem stupid, and sometimes they are. But it is first important to understand the context.
So instead of asking "give me a good reason?" to the recruiter, give the reasons yourself. Invent a scenario where you actually need to rewrite that csv parser, bonus points if it is related to the company's business, and finally, write the damn code the recruiter wants you to write.
In my case about a decade ago, I became obstinate when given one of those silly math-trivia-puzzle problems like how many ping pong balls will fill an elevator or how long is a string. This was for a relatively senior track FAANG interview, where my background at the time was in HPC, distributed systems, and provisioning systems that were precursors to today's IaaS bread and butter. In my case, the interviewer was adamant that I derive some figures that depended on basic geometry and knowing the diameter of the earth and ratios of landmass to ocean surface. But, he wanted me to first SWAG these figures, after I told him I wasn't a geospatial geek and didn't memorize such facts.
I decided to be difficult. If I were somehow faced with such a task, I would first consult reference materials and even see if I could find the actual answer he wanted, since it sounded only one step removed from what you could find in the CIA World Fact Book or similar. Only if that failed, would I dig up source facts and try to derive an answer. I would focus on getting the answer, not on entertaining myself with a Martin Gardner puzzle at my employer's expense and risk. I would never have to make seat of the pants estimates and act on them rather than doing due diligence. I'd either have done homework, or if there was really no time (like some system availability crisis, if we pretend I was an ops person), I'd choose a pre-planned contingency action to make time.
They didn't go forward with an offer, and I felt a bit of relief at that.
I asked "Do you want me to do the simple thing, and use a library, or write code to do this?"
They preferred the latter. So I did.
As happy as it might make you to be snarky for the often silly questions you are asked, people are, if they are smart about it, looking to see your thought processes.
I recently got a question that I didn't know how to answer, so I started thinking through it aloud. I think they liked it, because they engaged with me during the process. Redirected my thought processes.
Again, good companies will do that. Look for every question, no matter how silly, as a way to show how you deal with situations, even ones you may not like. These are the moments for you to shine.
And after you get home, tell your SO/friends/etc. how wacky they are.
Can your pandas library handle that?
Your response is to flip the table and leave? If so, then good riddance.
const isPalindrome(str) { return str === str.split('').reverse().join(''); }
And the post interview notes said bad performance on the isPalindrome() question since I didn't write out my own functions (interviewer did not mention to).
The interviewer probably should have probed you about performance though if their intention was to judge you on that (they're both O(n) time complexity, but split, reverse, and join are generally more intensive).
Id say that close to 0 out off 10 engineers at work including me would get a working program without debugger or print statements.
Just tried in c and got me 2 compiles to get it right. Without the output I would just present a nonworking program.
"Write a function that counts the number of vowels in a string"
Candidates are allowed to run it multiple times and just have to produce a correct result within 10 minutes. It's not a trick question -- the test case in place makes sure you pay attention to case.
Success rate for mid to senior devs? Only 60%.
Took me less than 10 seconds to come up with an approach that would work oh just though of a more efficient one but that would use a regex :-)
"Write a function that reverses the words in a (string) sentence"
i.e. (x) => x.split(' ').reverse().join(' ');
The fastest way to reverse a string is in JS is:
I've run into this issue in different specific ways earlier in my career and no matter what I'd say about skill level / lack of knowing required technologies / being willing to take lower pay in order to justify aiming for another role it didn't matter in the face of the possibility that the recruiter could obtain a larger % for themselves off of that senior / higher-than-in-my-range job's salary.
Maybe this isn't as applicable for senior dev role applicants as it is for some lower level dev roles but at the point an applicant is actually physically there in front of the interviewers I'm sure one of the last things they are going to want to admit is that they wished they were interviewing for a lower paying / easier job even if it's 110% in the favor of both parties.
I've tried working with them before, have gone on job interviews through them, and then generally found that the jobs that hire through recruiters pay peanuts, and I end up finding a permanent job paying much more and taking that instead. I think if a company only works through 3rd-party recruiters, that means the company has no idea how to hire people, and doesn't want to pay much either (because they're paying the recruiter a huge commission).
Not to mention most of the one's I worked with early in their career not only had no idea about any of the technologies they were checking to see if I was fluent in but they also acted like they DID know everything about programming and beyond that they tried to flaunt this fact and treat me like I was trying to overstate my skills to sneak my way into a job out of my pay range.
Such a frustrating ecosystem in order to find a career job.
In ten years I can count on 1 hand how many times I've gotten a reply from a non-recruiter job I applied for (applied on my own without a staffing agency submitting / representing me).
It's really crazy how that works.
Another thing I dealt with was people who hired me saying (TO MY FACE):
In this situation I'm making $35.00/hr as a Regular Developer (non-junior / non-senior dev, just a middle of the road contract developer):
CEO of company in front of everyone: "scoggs we are paying way more for you than we are for our senior developers so we are expecting top notch work from you."
Me (used to it by now, unfazed but I hate this situation): "Sir with all respect I'm only getting less than 1/2 of what you pay my staffing agency for my contract/"
CEO: "well they don't really do anything / didn't really do anything but introduce us and get you a phone and in person interview with us."
Me: "But you guys didn't have to pull programmers, HR, and design / copy writing people off of their normal work to create interview materal, submit interview material, review resumes, vet candidates, plan phone interviews and schedule them, set aside time for phone interviews, review phone interview candidates among 'hiring team', review candidates references, plan in person interviews and schedule them, execute in person interviews and have meetings with 'hiring team' to pick who to hire', make offers to people you want to hire, or hire them. All you had to do was tell the staffing agency what skills your were looking for and what kind of company you were. I'm not an employee of your company. I don't have insurance, I don't get paid for sick days, I don't get paid for holidays, and I have no job security."
Of course I didn't say all of this, I said something along the lines of "They take care of the majority of the process" but in my head I feel like I'm always having to live up to the expectations of the people paying the total bill. The same way they think the staffing agency doesn't do any real work and isn't worth the cost / price of doing business -- most of these people feel the same way about developers. They don't understand what we do, they just expect us to solve anything and everything to do with computers / programming / technology and this is ALWAYS the way it is regardless if the final product / project outcome is directly tied to the company suddenly turning a profit based on the success of this project / programming endeavor.
These companies want to underpay contract developers, pile stress on their shoulders, guilt them for the situation they have little to no control over, and then stick them with the majority of the blame if things don't go 200% well (because they are expecting work that's 2x as good as the amount of money I'm being paid).
I've found it impossible to truly and personally (mentally) live up to the majority of expectations laid upon my shoulders by non-technical CEO's / Presidents / Bosses of companies I've worked for.
This is the majority of what I deal with right outside of NYC in Northern New Jersey. There is the rare company that truly respects the programmers they hire (usua...
Anyway, you make it sound like you can't get a job there without a recruiter. There's still plenty of companies hiring directly, I even interviewed at a few when I was there such as Alcatel at Bell Labs and some wifi company in Manhattan. My current gig is with a large company (in the DC area) that hired me directly. Stop wasting time with recruiters and just look for companies that do their own recruiting; there's no shortage out there that I've seen. I've had 8 jobs now that were not contracts and not through recruiters: 3 large corporations, 3 small companies, 1 mid-size, and one a state university research division. Am I apparently special that I'm able to find these jobs?
Personally, my first-line screen is a short answer (3-5 sentences) to a programming-related question. [1] For me, about 90% of applicants who pass that can also code. I like that better than a resume screen, as plenty of people who haven't officially been programmers are decent coders.
[1] Examples here under the "Join Us" section. https://web.archive.org/web/20151005181908/http://www.codefo...
Our standard fizzbuzz question was something like: print the multiplication table. This is a loop inside a loop. I think every programmer should be able to do this given 10-20 minutes. Around 30%-40% couldn't. Like literally, didn't know how to do this in languages they supposedly work in. I'm sorry, I make lots of allowances for stress, I calm candidates, I tell them syntax doesn't matter, do it in pseoudo-code for all I care. But if after 10 minutes you can't print a multiplication table on the screen, I'm going to pass.
The worst part is that usually these toy problems are justified with "but you can post this to your Github for others to see!"
Likewise, if someone wants me to walk them through a project I have with explanations of what choices I made and why, I'm happy to do that. But please don't waste my time asking me to implement DFS, or write another twitter API client.
Now: If you care about being able to collaborate on a tough problem with somebody, work on a problem neither of you has seen before together :)
Perhaps because, like many developers on modern teams which eschew the older role distinction, the incumbent in the position being hired for will need to act in the role of a classic system analyst in defining specific requirements give a fuzzy business problem as well as the role of a grunt coder.
Also, the presence, functionality, and quality of code on GH does not establish it's provenance.
Sure but that's a different skill from solving DS/algos, so don't conflate the two. Some people know their DS/algos super well but need to solve them solo, some people need to google around a bit for inspiration or take a walk if they get stuck.
Instead, separate it out. Give a specific "system analyst"-style question that's distinct from coding. A question you don't already know the answer to or that could be taken in a thousand different directions that you've definitely never thought of before.
If you need proof they can "actually code" and use DS/algos etc, use their GH if it exists. And if you want to see that they can work on a team to define and deliver a messy problem with other people, do that with them on a messy problem you've never solved before. (It could eventually be a DS/algo problem; my point is it's a group effort and neither of you knows the solution; you're looking explicitly for how the interaction goes, not if "the candidate" got the "right" answer.)
If you don't take a candidate's prior art into consideration, you're wasting everyone's time. You're also eliminating candidates who may excel in ways that aren't solving riddle-problems out-loud in front of new people when their livelihood is on the line.
Start with the GH and if you have doubts fall back to portions of old model.
> So I'm supposed to spend my time researching your GH instead of just letting you spend 5 minutes proving it?
I've never seen a worthwhile programming q take only 5 mins to answer. And the candidate is supposed to waste an hour of her time proving to you what you could see in 5 minutes on GH?
> There isn't enough time in a day to research every candidate's code they wrote on their own time
Yet there is enough time to spend with whiteboarding problems that prove the same things the candidate has already proved on their GH?
> (and personally I'd rather not be judged by mine).
Sure - only use the candidate's GH if they prominently put it on their profile and/or own an "intended to be used/seen" public repo.
> And, if people lie on their resumes already, what makes me trust their GH?
Not a replacement for conversation! It's a way of indicating they can code without solving an arbitrary riddle in a high-pressure situation. If you're not convinced they wrote or understand the code you're looking at, ask them about it or ask them how they might change it slightly.
As an aside, the reason not to work on novel-to-you problems with job-seekers is that it's very hard to fairly compare candidates after. I strongly prefer pairing on the same problem with all the candidates in a batch. Otherwise it's hard to tell if a bad result is due to a bad problem or an unacceptable candidate.
Sure - but you're not likely to really see the "real" thought process you're hiring for by asking a stranger a riddle you already know the ansewr to in a high-pressure situation.
Real problem-solving and thinking is done in a huge number of ways that sometimes isn't conducive to strangers, pressure, or whiteboarding.
> I'm interested in when candidates pick not-optimal choices for good reasons
Right - which is why starting with something they've written on GH (which is something they've thought about and are probably passionate about) is a great jumping-off point for such a convo.
> As an aside, the reason not to work on novel-to-you problems with job-seekers is that it's very hard to fairly compare candidates after.
I see your good-intention here, but it's nearly impossible to compare two candidates without all kinds of biases (implicit and explicit) coming into play.
> I strongly prefer pairing on the same problem with all the candidates in a batch. Otherwise it's hard to tell if a bad result is due to a bad problem or an unacceptable candidate.
I think this may be another way of trying to compare candidates to eachother (which is perilous).
Good candidates can do well with bad questions, and bad candidates can rarely do better than okay with good questions. There are lots of good/proven questions you haven't solved - ask your colleagues.
Unfortunately, the current common argument from the hiring side is that GitHub profiles are not sufficient proof of skill since code can be copied (not fair) and GitHub projects bias toward people with extra free time (reasonable, but not enough to discount GitHubs completely IMO)
Yes, some of the code may not be original, but unless the repo is a fork you can pretty easily see if the code is organized in a coherent way that shows the committer knew how to decompose a problem well. If they solved /every/ piece of the problem themselves, it may be a sign of a different problem (and also copy/pasting without citing source is also telling!)
On the other hand, fakers have caught on to the "GitHub is my resume" thing. I have had applicants who have basically fraudulent Github projects, or who have taken group projects on which they did basically nothing and claimed them as their own. So a Github page now requires an expert to evaluate it.
If its is their own code it shouldn't be a problem.
If it isn't their code and they can still talk you through it, even better - they have managed to understand code that someone else wrote which is probably an even more valuable skill.
And no, having somebody who's an energetic fraud on the team is poisonous. Having somebody who's so good at it that they're hard to catch is worse, not better.
I didn't write the monstrosity that I am working on just now, but I could explain how it works and I know where to look to fix bugs. I don't know why some crappy design decisions were made. Does that make me a worse programmer than if I had written it myself? Is harder to understand someone else's code than stuff you have written yourself. There are far more jobs working on existing code bases than on new new projects.
(My guess is that you have never worked with anyone who has claimed ownership of someone else's code, have you?)
Then misconstruing poor performance as coding ability.
if (~false == true) std::cout << "true"; else std::cout << "false";
In C++, what does this print? And if they answered correctly, I'd ask them to explain how/why. This question wasn't a deal breaker, but did immediately given an insight into their depth of knowledge of the language.
What does it all mean? It means exactly what it meant in a high school/college group assignments - one or two people carried the group project but everyone took credit.
I have seen hundreds of resumes where people claimed that they have done XYZ where through some side channels I know they just happened to be on that team but their contribution was limited to tweaking spelling.
I see coding tests as one of the two ways to evaluate that someone can code[1]. I trust it.
[1] The other way is that I know this person and I'm already aware what they can do.
Last twice I've looked for a developer job, I got offered a position and was hired within 2 weeks.
> No one believes that anyone can actually code.
Quite rightly, most devs can't code.
> Extensive homework is now normal. Not been my experience, I've done some homework assignments but none were ever more than 1 hours work (and then even the standard of the tests were so low they were really 15 mins work..)
> You’ll never really know why you weren’t hired.
This bothers me too.
> Outsourced hiring “services” are very much in vogue
I hate this. Almost all recruiting I see is done via recruiters who are at best case flakey and worst case self serving liars who will try to pressure you into going to interviews you don't want to go and to take job offers you don't want to take. Sometimes flat out lying to you about the role only for you to find out at the interview. I had one interview that I went to expecting it to be C#, the interview was all Javascript (which I don't do at all). Or the recruiter will tell you that you have to decide right now this minute, when you don't.
I had one job offer where the recruiter said you've been offered the job but you have to tell them now if you are accepting it. It was funny how after telling the recruiter that I want to think about it over the weekend and if that's not an option than I would like to decline the offer, well now all of a sudden the company were completely willing to let me think over it for a couple of days...
I hate recruiters.
He even gave me interview tips/advice on a per-company basis and helped me rewrite my resumé for each company he wanted me to interview with. Honestly, it was fantastic.
His resume is the problem. Two immediate things: (1) His most recent job lists junior level work and (2) He is claiming 3 concurrent jobs over the last two years.
This shouldn't matter, chiefly because he has other work listed, so stopping at the first job post and forming an opinion makes the reader the problem. But also because people can sometimes take an easier job if they have life issues.
Secondly, these are consultancy gigs + 1 full time gig (or maybe it's part time) that could have a low hours/week commitment. He wouldn't be the first dev ever to moonlight.
Even if it were junior level work (trusting auth to be done correctly with junior engineers? LOL), he probably completed it faster than a junior engineer would.
His resume doesn't say he did auth. He used an open source library and made unspecified modifications to it. That's definitely something a junior level Dev could do.
"Or maybe it's part time". Exactly. A resume should give answers, not raise questions.
Expecting people to be charitable while reading resumes is unrealistic. A resume has to quickly demonstrate the applicants qualifications other wise it's trashed.
What bothers me most is that employers don't seem to be showing equal commitment to the interviewing process. They will ask you to do hours worth of homework for them, but then can't be arsed to discuss it with you for five minutes. They will ask for your salary history, but clam up if you ask them what they pay other developers in the same position. They will take your application as a senior developer, then ask if you'd consider being an entry-level tester. They spend hours grilling you to prove your worth, then spend zero minutes trying to sell you on their company.
To simply give feedback is not a big deal to HR, and since they're making you do hours of homework it should be legally required to answer if you ask for feedback.
This has been my experience with homework assignment interviews (Though I still prefer them to whiteboards).
In no cases, has any interviewer reviewed my homework before the interview. So the homework critique/qa sessions end up being more like a presentation or walkthrough of your solution, like a presentation for a meet-up, even though they are often described as more of a code review/interrogation about your choices.
Which I don't mind honestly. If you know that going in, and are prepared - its an opportunity to impress, if you can be polished.
Talk at them about your solution for the allotted time or until they make you stop :P
They don't care. Never have, never will.
It's a one-way street, any "give" that there is, is out of self interest and necessity.
Region matters too. I don't doubt in Silicon Valley it's trivial to pull this off, but in Chicago I've seen most companies have a 2 month+ hiring process, if they ever hire anyone at all. I've even heard from recruiters that this is common for those companies. And then there's a lot, lot less companies out here to choose from, especially if your tech stack experience doesn't match. I've literally had company HR chastise me for not learning their specific language, even though I don't list it on my LinkedIn and the message was unsolicited.
I am like the flower of lotus - waiting. When there is anything interesting I can jump ships using requiter network to help with the interview. After my first job, I never had the need to search personally.
For my last job search, I emailed applications to like a dozen companies in my area from the last HN Hiring thread, and heard back from like 2 I think, none of which went anywhere. Maybe they're too slow, didn't like me for some reason, found someone better, etc, I don't know. When I started talking to recruiters, the interviews started coming pretty fast, and I had multiple on-sites and offers in a couple of weeks. It's like, sleazy though they can be, there's a distinct lack of movement in the process without the energy of recruiters.
So I come down more on work with them, but don't trust them too much, know their tricks and watch your back.
And speaking of the author's points - a week-long coding test? A month to complete the "homework project"? Who's doing that? Nope, I'm passing on those companies. A couple of hours is no problem, but pay me if you expect multiple weeks worth of work.
Part of the problem is that companies keep getting more applicants than they can handle, no matter how hostile their interview process becomes.
Like... a union? A combination of aggressive union busting, anti-union ideology of many in tech, and aggressive offshoring/H1B hiring acts to keep that in check. The moment you try to raise the issue you’re either fired, or some “genius” who reads Ayn Rand like the Bible tells you to pull yourself up by your bootstraps.
Software development is already so heavily dependent on enthusiastic young people that I don't see how a union could get enough traction without completely reinventing the idea of a union in people's minds.
There's nothing specific about a union that does this. The union is an extension of the will of it's members.
Add to the hurdles:
* Salary negotiation
* Contract review/negotiation
* Reference check
* Background check
* Getting a work visa
There's still lots of work to do once you complete the onsite interview!
Number 2: As someone that interviews people alot, this is cuz MANY people who apply CANNOT code, no matter what their resume says. We have had people leave and never come back during our console app on site test (read in a text file and print out its contents with some minor formatting). This is resumes with 10 years plus experience in the language supposedly. And the computer has whatever IDE they prefer and full internet access!
Number 3: I agree that CS type questions are pointless unless you are doing stuff like that on the job. We have stopped using those.
Number 4: We now require an onsite 2 hour code project (designed to fit in that time frame)
Number 5: True
Number 6: We use headhunters to weed people out but that is about it. For one position the head hunter roughly run 15 people applying for each 1 possible person to pass to us for the next step. Again, most fail a mind boggling simple phone interview process for people who claim 10 plus years experience in coding. Not knowing what the static keyword means in C# when they say they are skilled in C# for instance.
Number 7: Don't have an opinion on this
Number 8: Again this seems to be your physical location. At ours there is roughly 3 open positions for each matching person.
Number 9: Our company does not discriminate on age and are desperate for qualified people with experience. Many times a candidate regardless of age is stuck in one tech (winforms, MVC, Ruby on Rails (:P)) and we more discrimate on someone who is not showing growth in their tech skillset. For example, are you learning the basics of a cloud stack such as AWS/Google/Azure?
At the end of the interview, I would recommend asking "are there any concerns or issues you would have with hiring me for this position?" and LISTEN to their feedback. I am sure there are some bad companies but for the most part it feels like you are not interviewing well for whatever reason. Maybe you are coming off as defensive or hostile when questioned? I would also reach back to the company and ask why they did not choose you. Most companies are way to busy to tell each person why they were passed over, but if you show an interest they will usually respond.
Anyway good post and good luck to you!
At the end of each interviewer. Asking the HR person at the end of it all is a waste of time for 2 reasons:
1. they won’t know yet
2. they won’t tell you
but the tech interviewer almost certainly isn’t trained to keep his mouth shut and also generally isn’t expecting this question. caught off guard, you can usually get a close to honest response. you do have to interpret a little because people generally don’t want to hurt other people’s feelings right to their face. apply modern day party invite response rules:
She says the same thing as you however: if you want the good stuff, you have to attack the social vulnerabilities of tech people. They generally aren't trained to know what to say or not to say past the obvious. With carefully constructed questions, you can often get the information you're after.
Because companies themselves don't understand that the full stack developer, from kernel work to UI is a real thing, ie. you can easily transfer competence from one tech to the other.
if he’s 50 yo, assuming same career since graduation, his first mistake is applying for senior roles. senior is 5-7 years experience. he should be applying for staff roles at minimum and up to principal.
i guess you’re not supposed to slam posts here but this article is more of the same old same ole.
i would like to see an article from the hiring manager POV.
"The general thing that I saw from everyone that I talked to is that no one actually believes that anyone can code. At every stage in the interview process, you’re going to need to prove that your resume isn’t a lie and that you can actually do what you say you can. I find this ludicrous because it is like interviewing an attorney and then saying to him “Please prove that you can cite a Supreme Court precedent”. When did an entire industry of people get pre-judged as lying? Don’t we exist in a country where the default assumption is innocence not guilt?"
This is, IMHO, due to the fact that for years new grads would apply to jobs, and the new job required: 7 years programming in X? YES, 4 years writing scripts in Y? ABSOLUTELY, etc, etc. These new grads all had the attitude of "I will learn that on the job, no one has 7 years in X". And now we have a world of companies that don't think anyone can code. Don't know where they got that idea.
They don't need to do that for lawyers because the bar exam handles that (and, for those with traditional legal education, the highly-standardized law school curriculum.) The programming “profession” has neither of those features.
To be fair, there are a lot of job listings where X hasn't even been around for 7 years.
1) Ruby is hard to get a job in, so you are off to a rough start.
2) A lot of people with lots of experience actually can't code for crap. Do you know how many python developers I see that don't know the difference between a tuple and list? Like, how could you be a real dev if you never even wondered why sometimes you use [] and sometimes you use ()?
3) These tests and interviews aren't intended for you to get some certain score. Usually we make them way hard to find out what you do to handle that.
4) That said, you should know how to write code that isn't super slow and with a data model that isn't insane. You should also know how to articulate that, since as a Senior dev, you WILL be mentoring junior devs, and communication is not optional.
5) Every company's process is different because every company is different. Heck, my process is often different per applicant.
otherwise, just as you are faced with picking a rose from a faceless mass of candidates so are we faced with picking a decent place to work from a faceless mass of mission statements and "100%code coverage" blog posts (if we can find any)
And 2) yes I can believe it - that's what fizzbuzz and its ilk are for. The number of companies offering hackerrank/codility tests and justifying it as we only hire the very best has left the lake woebegone test way behind.
There has to be some middle ground - where someone can pass a basic capability test to weed out the crap without demanding several hours of coding. I mean I spent two evenings recently polishing up a "Oyster card system for TFL" as a hurdle for a government department I have been angling to get in for a year. A no-name corporations wanting CRUD development can take a running jump if it thinks my evenings come cheap.
(amazingly at the turn of the century I used to use "has listed Python on CV" as a marker of "worth an interview" - it was rare enough and indicated an interest outside of corporate mainstream. Maybe Erlang today??)
Edit:
So my compromise suggestion is for companies to say "We have an OSS project (or even recommend one of the bigger ones). Take any of these 5 bugs and supply a pull-request"
At least then the evenings work is not totally wasted and you get to see an important skill - how fast can they come up to speed on an unfamiliar codebase?
The only times we use coding tests, we use Hackerrank to administer them. That way you have a distinct time limit (we give an hour, which is honestly way too long) so you don't spend all weekend one something that doesn't matter.
I definitely agree about the difficulty of picking a place to work. We reserve half of our final interview (and part of our initial interview) to be a Q&A for the candidate to interview us.
At a certain point "can code" stops being "can write perfromant algorithms" and starts being "can work without direction, can be placed in front of users without fear, can defend their decisions, is not an asshat."
Ten minutes on a shared screen and we can find out if you pass fizzbuzz, can make a rational stab at an algorithm question. After that it's mostly cultural fit.
You cannot automate a test for "is not an asshat" so we get more and more people proving they can get 99% on programming tests when programming tests are 5% of the job.
In particular, if you don't know the codebase, you're going to be guessing on places to look. If you're lucky and guess right, you may spot it right away. If you guess wrong, you could spend a lot of time diving around irrelevant details. There is some skill in guessing well and not spending too much time on things that don't give any progress, but there's still a lot of luck too. Because of all that, it doesn't seem like a good idea to assign a bug that you haven't already essentially fixed.
I agree, but this should be a clear point. You shouldn't be overengineering something unless you really have to.
Huh? Enterprise level companies are desperate for Ruby engineers to maintain large Rails apps and there still is a good amount of startups doing new work with it.
What substantive evidence do you have of this shift?
No thanks.
Edit: My 'favorite' experience was the few months of consulting work I did with a team building Rails apps to deal with medical records and the app that I came into had tons of dead code paths that leaked HIPAA-regulated data all over the place.
None of the API routes were 100% functional, so I spent my first few weeks cleaning that up and making it bulletproof. Then I fixed their broken homebrewed SAML IdP. None of that work that I did was appreciated as they only wanted (but wouldn't say that they wanted) new frontend features to show off to the client to inflate the quality of their work.
More importantly, they were using Rails4, but implemented everything by watching a Rails2-era Railscast and would get frustrated with me for not doing the same, a.k.a "the rails way" (I was, just modern Rails and not their broken bullshit). And that was the CTO...
Very well said and it happens in lots of areas where companies seem to wish for "big outcomes but all for free".
You will see this in security all the time.
"We have to make sure this thing is bullet proof."
"Ok it's going to take a month to harden and audit our the network and infrastructure and add monitoring and we'll be in good shape."
"Uhh ... no we didn't quite mean it like that ... can't you like install a plugin in half an hour that does the same thing?"
(made up conversation but you get the point)
Well yeah, churn and burn is my company's motto. At least we pay well.
Our organizational structure isn't immutable, it just moves slowly. After about a year, my team's effort resulted in measurable improvements for both revenue and end-user experience.
If you're senior dev level and want more of a challenge that's not just throwing more code at the wall, these sorts of scenarios are something to seek out.
When I say "not willing to make organizational commitments..." I specifically mean they don't give you access to people -- stakeholders don't want to be bothered by the devs. It's far too common.
What you're describing though is a great situation -- I love those engagements.
It's weird how prevalent the idea that communication _is_ optional in this industry. Headphones-on, heads-down engineering teams are to be avoided (by me).
Why do you say this?
i'm sorry but i don't agree there. in this specific case, tuples and lists are really different and there's specific reasoning for using one or the other. it's a core feature for the language. it would be like saying someone that is a Java dev and doesn't know the difference between an ArrayList or a LinkedList.
i understand not knowing nuances of the language (in python, understanding how __slots__ work and how to make usage of it), but not knowing a core feature?
I'm not a developer who is down in the weeds optimizing specific algorithms though, and I can see how a mastery of language-specific data structures and how they are represented in memory might be required for such a person.
I say this after having done an M.Sc. in Distributed Systems focused on performance analysis. In a lot of cases that I've encountered, mastery of data structures and choosing languages and runtimes appropriately can completely eliminate the need for a distributed system, or significantly reduce the complexity (an efficient 3-node system is much less complex to manage than a 100-node inefficient system).
A recent example that comes to mind is a pair of similar systems, one written in Java and one written in Go. There was an approximately 80x larger memory footprint for the Java system while having similar functionality. Plus the Java system took about 2 minutes to start up (yay Spring), vs. sub-second startup for the Go binary.
I fully appreciate the high level design of systems, and these days that's what I spend a lot of my time doing, but when shit hits the fan and the implementation of the system doesn't perform the way I'd expect it to, it's time to roll up my sleeves and get down in the weeds to help solve whatever is keeping the system from reaching its full potential. Maybe that means there was a flaw in the design, but often it's just a shoddy implementation (with Pareto 80/20 fixes to make it better)
If your company hires based on a technical interview that everyone says is not representative of the work that is done, you are not hiring right.
I get there is demand to maintain Ruby/Rails apps today... but how many are hiring for new RoR projects?
Seems there was a bout of "RoR and ActiveRecord Don't Scale" articles a few years ago... then suddenly the new cool frameworks became Angular and React.
I don't think the coding test isn't there because people think you're lying, it's there because we have no industry wide, respected entrance exam. Actuarial interviews don't (to my knowledge) contain a whiteboard vector calculus exam, but this isn't because people just sort of believe actuaries, it's because you have to pass a rigorous exam on these topics to become an actuary. I sometimes wish we had something like this in our field (not necessarily a legal requirement, just something that is widely recognized as legit). I'd be happy to put the time in and really study for a proper exam, but I'm not as interested in doing this over and over for companies that may administer and conduct these exams frivolously and in secret.
Also - I actually do agree that it's bad if someone can't write fizz buzz, but every interview exam I've taken has been vastly more difficult than fizz buzz. It's "find all subsets of a set of integers that is divisible by the sum of a different subset of integers". At a whiteboard, in 45 minutes. These aren't impossible problems, but they're much tougher than fizzbuzz.
I am saddened, angry, and relieved to hear of your problems with homework. The response you got back makes me realize that the two times I've done a homework assignment were probably pretty typical. I won't do this anymore, and I do accept that this will limit my career options. It does anger me, though, when the companies who do this complain about a shortage of engineers.
True story: I did an on line exam and take home homework assignment, waited over a month (crickets chirping) to hear back, pinged the recruiter politely now and then, and finally got a one liner "we've decided not to continue at this time.' A few weeks later, an article with came out with a picture of the CEO of this company standing next to President Obama, who nodded gravely as the CEO talked about the desperate shortage of software developers.
This comment is exactly why reading about "interview gymnastics" like this really pisses me off.
Its also why I wonder how many big tech companies are somehow able to hire so many people... With processes like these, you'd think that they either have a "secret backdoor" or never managed to actually hire more than a dozen or so.
Google has a completely broken interview process, to the point where they pretty much brag about how ridiculous their false negative rate is, but they make up for it on volume. When people will throw themselves at you two or three times in hope of getting that lucky set of algorithm wankery questions that they can answer, then you will keep interviewing like that.
If true, hiring based on luck seems broken to me. Like the joke of the hiring manager throwing away half the resumes and not hiring "unlucky" people.
With small companies, it often comes down to "were you charming enough?" They won't admit it, but it's a clear subconscious bias.
So you think the person with 30 years experience might be, whats the word... oh right. Lying. You think they are lying.
Quit trying to dress it up. Coding tests are exactly you saying you don't believe the experience written on the resume.
The problem is that it's kind of awful, and I personally really do believe that it's driving people away from the field.
Here's my take (I've posted this on HN a few times). Many people find in person, at the whiteboard exams quite stressful. This is fairly common, many people describe exams to be among the more stressful events in their lives.
Over time, I believe that institutions that conduct exams evolved a bill or rights between institution and applicant. Exams are used, but they are administered consistently and fairly, the topic and subject matter will not be a huge surprise (questions are kept secret of course, but their nature should be predictable). People who pass or fail will receive an answer, and often get a score and feedback to know how they did. The people who grade the exams are provided training to ensure they evaluate people fairly, consistently, and without bias, and are expert in their field.
Now, I know that universities, medical boards, bar exam reviewers, don't always live up to this, but it is the intended goal. I believe that our field, software, subjects people to exams repeatedly, but without any of the bill or rights I descried above.
For example, how do you grade? Are you qualified to assess general intelligence? Can you understand that someone might not be eager to submit to your general assessment of their intelligence?
Now, if you want to say nobody is entitled to a job, I certainly agree. But the industry seems to think it's entitled to workers, and they just seem utterly blind to how off putting their practices are. And in an industry with concerns about gender, racial, and age discrimination, double secret assessments of people's general intelligence by interviewers of unknown qualifications is about the worst thing you can do.
Interviews are always exams, whether it's writing code on a whiteboard or trying to figure out what the interviewer wants to hear about where you see yourself in 5 years.
Because people outside our field experience interviews in the second way more often, I think they don't fully understand what goes on in google style interviews. This is why I would call what we go through "Exam-style interviews", drawing a distinction between the two - even though I agree with you that they have elements in common.
In the same sense that verifying previous employment is saying you don't believe the resume.
I was involved in hundreds of tech interviews in the past several years. So many times in discussing a candidate's performance, I found some of the interviewers' questions and comments were unrealistic, even preposterous. In one case, an interviewer gave a hard dynamic programming question. We were a tech company and had very good engineers. Our products and our technologies, however, rarely need dynamic programming skills of this difficult level. I couldn't bear it. So I asked, "who think he can solve this problem on the whiteboard in 40 minutes right now?" Dead silence.
This. In fact there needs to be one exam, with subsections and subscores per subsection, along with an overall score.
Being able to solve an algorithmic challenge on a whiteboard does not mean that you can:
a) write readable and maintainable code
b) effectively communicate requirements to whoever is actually running your code in production
c) know about application-level security vulnerabilities like SQL injections and know not to mindlessly insert them into your code
d) instrument your code for metrics and logging in ways that are more or less standard and expected for production monitoring
e) engage in effective review of others' code
f) use typical API handling techniques which are production-ready, e.g. exponential backoff and circuit breakers.
All of which are testable in a certifiable way.
Simple truth of the matter is, the vast majority of companies that hire 10 developers who studied efficient algorithms for their interviews, are better served by hiring 9 engineers who are aware of how production and organizational realities affect their work, plus one "performance hacker" who may or may not have a master's degree in CS, whose job is to find the worst real-world production bottlenecks and replace the implementations with algorithmically more efficient implementations (plus stricter performance tests so that the more efficient code doesn't get ripped out later).
The idea is to assign low points to people who write a long function, and high points to people who write many small, self-documenting functions. Such an exam could also ask questions like "what is the cyclometric complexity of the following code?", which while not an indicator that the test taker will always write low-complexity code in a professional environment, at least indicates that the test taker is aware of maintainability metrics like cyclometric complexity - much more than can be said of programmers who mindlessly turn in 400 line functions with deeply nested conditionals.
I think that the google style data structures and algorithms exams are a good case in point. Think of these like the actuarial exam for linear algebra, vector calc, and numerical analysis. These exams don't of course test everything important about being an actuary. But they do establish competence in something that can be tested. As a result, actuaries don't (to my knowledge) have to do 5 hours of whiteboard exams doing LU matrix decomposition or finding a steepest descent vector. Whereas software developers have to find all matching subtrees in a binary tree over and over (and over).
What I like about the actuarial exams is that while they are rigorous, and it helps immensely to have majored in math or something closely related, you are free to decide how to prepare for these tests. Although I like the idea of a widely recognized entrance exam, I really don't like the idea of something like the law schools putting themselves (and 200k in debt) in between an individual and the right to take the exam.
I've attempted to gather data from colleagues around me but the data is limited. Posting online doesn't get much attention either. But I am trying to gather enough data to see if it would even be possible to create such an exam.
If a bunch of developers took a few minutes of their time to answer questions regarding what kinds of things should go into an exam and why (or heck, even a better teaching curriculum than what we have now) I think we could easily come up with something pretty awesome.
But, again, gathering that kind of attention and asking developers to provide you with insight is hard.
I'd love to tackle it if others were willing to help.
I suspect it is the difference between "coding ability" and "coding fluency." In the former a candidate can apply known patterns of a give language to a problem and with just a few searches on StackOverflow get it working. A person who has code fluency can create the algorithm in the language of your choice, pretty much on the spot.
In the music world you meet people who can play a song on the keyboard that is note perfect, but they can't transpose it into a different key. Its the difference between playing the keyboard and using the keyboard to express a musical concept.
Can you speak a language if all you have done is memorize an extensive phrase book? Yes, are you fluent? No.
The number of candidates who really understand the nature of coding and so they can quickly adapt to any idiomatic language is still quite small in my experience.
I've professionally used each for a year or more C#, Python, Javascript, Objective-C, Java, PHP, Visual Basic, and ActionScript over the years. But if you asked me to write a function in anything but the first three languages, I will almost undoubtedly stumble a bit in producing them (hell, I still have to look up syntax for Python periodically).
That doesn't mean I couldn't pick them back up in a future job very quickly again (each job I worked for I was usually contributing to their code base in a few days, never longer than a week), it just means I don't have them fresh in my head and I can't store absolutely everything in my head forever.
But you'd still probably think I was incompetent. I've certainly given that impression before when I had an onsite scheduled by a recruiter and given less than 24 hours notice for an Objective-C job, a language I hadn't touched or thought about in over a year, and was handed a laptop by a Junior Programmer and was told "Code up an app for me." while another interviewer sat quietly across the table from me and stared at me the whole time while I refreshed on a years worth of XCode changes and forgotten syntax in real time.
After that wonderful performance they didn't give much weight to the two employees in their department that worked under me at a previous startup I was Lead Programmer for and vouched for my skills.
It is for exactly this reason that if I'm interviewing you and want to know if you can code or not I will ask you to write up an algorithm rather than a program. I might say, "Show me the algorithm for locating a node in a binary tree, now do the same for a hash table. Now how would you insert into each of those?" And then, as many programming languages do, I try to tie one of your hands behind your back, "Ok so the language you're going to use doesn't have pointers" or "memory allocation" etc.
But I only interview that way because I see computer programming languages as an impediment to expressing what you really want the computer to do. And people who can code, first and foremost understand exactly what needs to be true for the code to work, then when they run into limitations of the language figure out ways to express those same concepts given the limitations.
If you were being mean you could add limitation after limitation until you were down to a minimally touring complete system. And if they can still make it do what you're asking, then they really deeply understand how to get computers to do what ever they want them to do.
I agree with every criticism that "coding tests" should not be about whether or not your syntax is accurate or you have the standard library memorized. I explained to a colleague at Google once that having total mastery of English grammar doesn't make you a writer.
I wouldn't think you incompetent if you didn't have the syntax at your fingertips.
But here is the rub, if the interviewer doesn't know how to code they can't reliably test for that ability in others. When I hear or read stories like yours I wonder about who the company has put in charge of interviewing these candidates and what biases are they bringing to the situation.
If anything I feel that things have gotten better, although this may be a difference between my former enterprise Windows-stack life vs. open source tech life. The main differences I see are:
- Take homes are more prevalent... but I recall only one which has taken more than a half day, and that was fair as I was relatively new to Rails at the time. I actually like doing these for jobs I'm interested in as they give me an opportunity to flex my skills.
- There's about a 50% chance that you get a CTCI type interview vs. a more pragmatic, what-you-experience-on-the-job type domain modeling, write out in code in Rails (or whatever framework being used) type of pairing. When I'm on the hiring side I focus on the latter and feel it's quite effective. When I was starting out you almost always got the CTCI type.
I typically red-flag potential employers who don't sufficiently validate the skillset of potential hires. I've worked with plenty of people who were terrible, it's one of the reasons I transitioned to Rails.
I'm beginning to take this to heart.
I sometimes ask if the rest of the team have taken this test (I was once told I was the first, and I'm the replacement)
If so, what are your thoughts on why that may be?
Basically they just care more about doing good work. I must underscore though that my impressions are tempered by the fact that I primarily worked in enterprisey Windows-stack jobs, but that's also more typical - you're not going to find many modern startups going w/ .NET or Java. The tools themselves aren't really the problem, it's the implied culture.
Why is this? Probably because of the goals of each. .NET and Java were an outpouring of efforts from the 90s to harness issues of scale on enterprise systems. It's a pre vs. post information age phenomena, open source folks are going to be more of a hobbyist mindset.
During the last few years doing Windows-stack work I was a top performer at the company I was working with, had gotten two relatively recent promotions, turned down an op going into management, and was so unhappy that I considered leaving software altogether. Transitioning to open source stack work 'lifted the cloud' - so to speak - and reinvigorated my love of programming.
When I was hiring Senior engineers for Computer Vision and 3D rendering jobs my process was thus:
1. Post job and simultaneously search for engineers we thought were a good fit technically
2. Reach out to people I thought were qualified based on their specific previous work that was related to the job I was hiring for
3. Review submitted applications for relevant experience
4. If we thought it was a technical fit, we would do a <30 minute team phone call with some basic work history questions, description of role/salary and work logistics (remote, dev environment etc...)
5. If we were satisfied with that, send them a <10 hour total, paid, production project at an agreed upon hourly rate. If the candidate didn't have the required IDE etc...it would basically be pair programming
6. Review code, speed and communication
7. Send a hire/no hire decision immediately
From first contact through Steps 4-7 it would ideally take less than a week, depending on the candidate's schedule.
We were only burned on this process twice.
Once the guy kept trying to negotiate salary up over two weeks so that he could get a higher price somewhere else.
The second time, the guy did well with initial production, but over time he ended up using local college interns to write his code, who got other jobs and his commit speed fell off of a cliff.
Since we are a remote team, trust was paramount, and we trusted quickly by default. Nobody ever had complaints about the hiring process and we had a higher than average success rate for hiring fantastic developers and getting quality code into production quickly.
We never asked current salary because it wasn't relevant. I knew what I could pay and that's what was offered. If they asked for more and were worth it, then I would try and find money to make it happen, but generally it wasn't an option.
I would do it the same in the future.
Sounds like you should have moved him to management.
Thank you!
Some honesty and forthrightness for a change.
(It's something I put in a blog post (https://antipaucity.com/2013/03/25/what-to-offer-to-be-the-b...) 5+ years ago ...yet have only seen done once in my career)
"Just" a few hours has always, always been an underestimation when I've tried these. I've been burned a handful of times now; both from my time and from my belief that it would amount to something. I'm reminded of one instance where follow up emails kept coming after submission: "Add in this now." "Okay, now this." "Handle this." I consider myself an average engineer. I'm not interested in increasing my sample size to try and average out variance any longer.
I'm looking outside to one of the first sunny, warm days we've had here in months. I can't think of anything more I'd rather not do than some arbitrary company hiring project. I simply pass on these now and politely pull out from consideration.
Yep. If you're gonna throw crap at me like that NOW ...it's only going to get worse LATER
> If an HR person says to me “Oh and we administer a coding test” then my first response is “I’ve taken a bunch of those, which one do you use?”.
If I was hiring and a candidate said that to me on the phone I probably wouldn't invite them for an in-person interview.
Is it just our industry where you have to prove you aren't a complete impostor every time? Basically we treat every applicant like they are Frank Abagnale [0].
A senior role should be focused on more overall system and performance aspects of the software, using good practices.
What does writing out a solution for fizzbuzz (or equivalent) prove during an interview? If they do it easily do you suspect they memorized it (our base assumption seems to be they are an impostor right)? If they fail, do they fail the interview?
In the real world if you had a database call in some recursive loop that would be bad for performance. The number of times I jump to using recursion in a solution is near zero.
[0] https://en.wikipedia.org/wiki/Frank_Abagnale
The problem is that a large majority of candidates lie on their resumes. This means that hiring managers have to work harder to qualify a good candidate -- which often ends up turning into a process that hurts and annoys those that are actually qualified.
The key is to only stretch it to the extent that you can explain your background in detail to the hiring manager and be able to openly admit where you don't know much if those areas come up. Generally speaking a hiring manager you actually want to work for understands that experience is heavily dependent on what your last role needed, and skills can be picked up as long as you have enough of the bare minimum covered.
Anyone with basic coding chops should be able to solve it; it would be equivalent to a CS101 quiz.
It is still shocking how many people fail it. Yes, we have to test for it. My wife is in digital marketing, her -boss-, who insists on being involved in every decision, and will override her knowledgeable subordinates based on her own feelings, knows nothing about digital marketing (and is the reason my wife is looking to change jobs), but nevertheless managed to impress people above her (who also know nothing about digital marketing, but to be fair, don't have marketing related titles or roles) with her resume. Imposters in jobs are super common; it's just that in development we have easy ways to check for basic understanding. Unfortunately we try to scale those up to look for expert level understanding, and that fails (because we're really bad at testing for expert level understanding in areas we actually care about. That 'implement a red black tree' is probably appropriate if your company builds a data structure library as part of their core product, and probably inappropriate for almost anything else).
Have you considered that:
1. People have imposter syndrome, all the time. They're stressed out about being able to code, when running up against code interviews having nothing to do with the actual job they're doing. 2. People have anxiety, and they know how tough code interviews can be. They crammed and crammed and crammed, and 10 years of coding is now all this big amorphous blob in their heads. They're ready for some big systems questions. 3. People have bad days. The environment might suck. Their dog just died. You're a very adversarial interviewer, and they only work well and creatively when someone isn't going to come in and bully them about the response (or maybe they just imagine this)
Of course, you have no way of knowing this as an interviewer. But FFS, we need a way to inject some fucking empathy into this process. I'd say 99% of the time people aren't in interviews demonstrating what they know or can do, they're being asked to demonstrate what somebody else thinks INDICATES they have things that they know or can do.
I know the response to this is going to be, well yeah, but its Fizzbuzz! And I'd like to ask those people if there's ever been a point in your life that you wouldn't be able to write Fizzbuzz. To dramatize for effect, if someone came up to you and said they have access to your bank account, and for them to not take every bit of money you've made over the past year, including the money for your daughter's braces or something important, and in order to get it back you needed to make as concise and clean as possible an implementation of his variation on Fizzbuzz, you will not be thinking just of Fizzbuzz. Your brain is going to be churning at 1000 miles a minute, and you'll be trying to pull out every trick you know (out of hundreds) to get it as concise as possible, while thinking to yourself this is my future on the line.
Thats how I feel in interviews at least. I've always passed Fizzbuzz tests, but I've crashed and burned in interviews due to any of the above popping up on interview day. If we all could have a bit more humanity and understanding hiring would go a lot better.
You just negated your entire point there.
Yeah, you can have a bad day. I get it. We all fail interviews; I certainly have. Some I feel we really weren't a match (they were looking for a kind of developer that I wasn't, and don't want, to be), others I felt were unfair (for instance, interviewing with Microsoft years back, I had a C/C++ interviewer asking me questions that I had been told I was allowed to write in Java, and then disbelieving me when I told him (String).length is constant time so it didn't affect the Big O complexity that I had 'for (int i=0;i<(String).length;i++)', and clearly mentally checking out at that point). Obviously I don't feel any were because I wasn't, legitimately, good enough, but I also recognize I am very biased. But the thing is I also am in a place where I don't need an interview to justify my confidence at this point. I know I can deliver value. But I also know I will never convince the Googles of the world that I can, because I am neither a researcher of note, nor am I going to jump through the hoops of prepping for weeks on end for an interview; I have a wife, hobbies, and other, better ways to spend my time (even typing comments on HN! :P)
We first give people a take home. It's at their own convenience, we tell them it will be an hour and a half, coding, simple questions, to do it at a time they're comfortable. We don't stay on the phone, we tell them to use whatever resources they want (except, obviously, please don't try and google for the answers directly, or get help from others; it's simple enough that those who have tried to cheat have ended up with it being hilariously obvious, like leaving source comments that said it was by someone else, or variables for 'cat' when we never asked for anything related to cats, or being caught out during the whiteboard).
The interview is mostly a conversation. It starts with conversation. We talk about the position, the company. We ask about what the candidate is looking for, their resume, that sort of thing. Only after thirty minutes or so do we get to anything technical. We ask a few questions, and they're intended to be placeholders for conversation; plenty of right answers, we mostly want to see that the person is knowledgeable enough to discuss things. Even when we get to questions that have a right answer, it's mostly to gauge knowledge, and for the more complicated, even if a person gets it wrong, we'll tell them what the right answer is, and then ask them for a rational as to why. If they can figure out the rational, that's just as good as having known in the first place. Then we have a whiteboard question. It, too, is not hard. We tell the candidate "If you think there's a library function that will help, but you just don't remember it, you'd need to Google it, that sort of thing, talk it out with us, we'll give it to you". We try to help suggest things to get candidates unstuck. Etc.
Really, it's -not- a particularly antagonistic process. We really, really do want people to succeed (because, frankly, we want the position filled so we can stop interviewing and go back to work). So, yeah, if the interviewer doesn't manage the trivial coding tasks...we're going to pass. We -aren't- saying "this person is a bad developer", we -are- saying "this person could not demonstrate that they passed the bar of our interview process".
But there have also been some who have flat out said, even on the take home "I can't do this". Or those who have admitted when faced with the whiteboard question that they don't know how; that the take home had been done by someone else. Etc. Given those situations, yeah, our candidates are being given a take home, and a whiteboard.
For a senior role:
1. Someone who can't write and debug a for-loop and an if-statement isn't going to be able to provide training and support to junior level hires. At all.
2. Making high-level changes and performance improvement both require good process discipline, and the ability to write a lot of code to actually accomplish it.
I think there are high value software management tactics that can be implemented without knowing how to code, for example, change control, or enforcing limits on work in progress via. kanban, but for a role that has either "software" or "developer" I think fizzbuzz is a very low bar.
I personally like binary search as in interview question. The basic principle is simple, but there are enough edge cases and variations to make it interesting.
https://youtu.be/vsMydMDi3rI
So true. Do not tell them!
Ask me about your current problems, problems the person filling the position would need to have opinions about. If nothing else, maybe I could crack a tough issue for you that would have material value.
I've given FizzBuzz, and I've done FizzBuzz. It's hard to do it/get it and not feel like there's some degree of insult involved.
Exactly! And people still get it wrong.
It's a low-pass filter to weed out programmers who can't even do FizzBuzz, because despite their lack of coding prowess their résumé will still look similar to yours.
> and not feel like there's some degree of insult involved.
That's just reading far too much in to it.
Try to remember, this is the country where a range check function resulted in a lawsuit:
Anyway, it is just the first question and we are usually past it in five minutes. Then we discuss, in general terms, the types of problems we are solving and the related computer science topics.
It certainly isn't meant to insult. I hope I haven't insulted anyone and, if I have, they've never made it known to me. I will say that it'd be a huge red flag to me if a candidate acted like this was beneath them. The reality is that, while we will be solving some cool and hard problems, there will be lots of problems that are beneath us, too.
You literally have a data point with way more than the typical 4~8 hours a throwaway homework would take, and don't use it as an a) talking point, b) nice way to sidestep wasting more time?
Argh.
The interviewer interviewing the interviewee is hilariously true. No interviewer could answer questions about my domain expertise. Just like I could never answer questions about theirs.
But they are in control and I am not, so there's no fighting it, just indifferent resignation to the situation, and attempting to sort through it.
Is this true for other people ?