Hacker News new | ask | show | jobs
by csneeky 3361 days ago
I think it is very telling about the state of interviews in the tech world when:

1. I can NOT off the cuff answer those all correctly (at least not without a little Googling).

2. I can, largely off the cuff, implement an IO monad in Scala using higher-kinded types and compose instances of them in a hand rolled non-blocking server.

4 comments

Rant Follows:

The state of interviews in tech is, for the most part, abysmal. You either end up with language trivia which tells you nothing about somebody's ability to reason about good solutions to problems or you end up with some contrived white-board problems that simply show you the candidate spent a decent amount of time on leetcode/careercup/etc and nothing about their coding style, design choices, etc.

I've found that the best compromise is a two layered approach. Offer a straightforward collaborative coding question or hackerrank test to weed out anyone that's clearly incapable of writing code. Then have them complete a short project that you discuss with them at the onsite interview. Make sure the project requires a nice number of data structures, etc. You can really grill them about design choices, tradeoffs, what-ifs, etc. In my experience, it becomes immediately obvious if they know what they're talking about. Sure, it's extra work for a candidate. But in my experience anyone that actually wants to work there seems to prefer it over fast-paced whiteboarding.

I remember two interview experiences at "big 4" tech companies where I was given two fairly involved algorithmic problems and only 30 minutes where I proceeded to write as fast as I could and finish with only minutes to spare, despite knowing exactly what to do. Then I was grilled about SFINAE in C++. The whole experience left a very sour taste in my mouth, despite the nice comp they offered.

I help out with interviews at my employer and unfortunately we get a lot of applicants who just can't code. I'm tired of hedging around the topic, so I'll come out and say it bluntly. We get people who say they are developers and are outright lying. We're not looking for computer scientists, or engineers, or anything of the sort. We're looking for people who can program and won't lie about their skills right to our face.

When you have your 10th interview with someone applying for a senior front-end job and they can't tell you how many columns are in Bootstrap, when Bootstrap is on their resume and they made a point to bring it up in the interview, it makes you question humanity. Unfortunately this is why you end up with questions like "What is the difference between `unapply` and `apply`?" or "How many columns are there in the Bootstrap grid?"

And unfortunately, especially in my geographic area, the majority of work is done as an employee or a consultant under an NDA. Nobody is bringing a GitHub profile with a solid green commit graph, nobody is coming with 45k rep on SO, and nobody is coming with years of blogging content we can look at. That's not necessarily a problem, especially if you've ever been in the same room as someone who is very proud of how many SO points they have, but it certainly complicates interviewing.

So when you have a combination of (A) people who lie through their teeth to get a job they are in no way qualified for; and (B) people with no public technical profile to speak of, you end up with interviews full of trivia to make sure they have a pulse and contrived whiteboard coding to make sure they can understand the fundamentals. This is doubly hard if you're trying to respect people's time and limit interviews to a brief phone screen + a 60-minute onsite interview. Some of the suggestions I've seen here about take-home projects, consulting work, coming into the office for 2 paid weeks, or a 3-day long interview bonanza, are insulting.

You are not kidding! I hire front-end devs and candidates constantly and utterly lie about their HTML/CSS/JavaScript experience (I've had more than one them tell me when we spot it, "Well, it's just HTML and CSS"). We can weed out some via interview questions but for others it's not until we get to our a hands-on coding test (where we watch what they do in real time) that we can spot it. It's extremely frustrating and such a waste of time for us. They are allowed to look things up in our hands-on tests, as we're trying to replicate real-world enviornment, but it still lets us see overall if they can actually implement what we just talked about in our interview (otherwise the questions we asked are useless), and more importantly, if they told the truth about what they just said. The truth has become very important to me in evaluating candidates -- I'd much rather have people say "I don't know" than pretend they know something, and esp. in our fast-paced work environment, we just don't have time for people pretending to know something they don't. How I see it is if you're wiling to lie in an interview then I don't want to work with you. So the two have come together for me, and at least we have this red flag now that I simply will not hire people who lie in any capacity (and a great green flag when people are honest about what they do/don't know).
I'll take the take-home project. Though I communicate fine otherwise, I stutter miserably when an interviewer is staring at me while I'm trying to whiteboard.

Be a little flexible; not everyone finds the same things "insulting".

I've done take-home projects as well, and I don't have a problem with them, but I do understand why someone who may be looking for a 9-5 may not want to spend their evening(s) or weekend doing a packet of stuff for an interview. I don't want to exclude those people from being able to apply and be successful.
What is the difference between having people complete a project that's especially crafted to include "a nice number of data structures" that the candidate should be prepared to be grilled about -- and then just asking the question up front?

It seems to me that you'd at least have to forego most of the grilling bit - explaining why I made the design choice of using a list instead of a set (or the other way around), and what the tradeoffs and what-ifs are is just a roundabout way of asking "what is the difference between a set and list?" -- and if that's what you really want to know, skip the project and just ask that.

These questions don't seem all that unreasonable to me in and of themselves. I've barely used Scala and could answer a few of them. Several of them are prominent questions I immediately had the first time I read Scala code (e.g., the difference between classes and objects). I was able to guess at a few others from my Haskell knowledge. I have no doubt I'd encounter all the questions if I actually used Scala non-trivially.

With that said, I'm not sure if these questions are actually useful:

(1) They're pretty basic. Any good programmer could get up to speed with all these aspects of Scala in a week, possibly less. So you're not gaining anything by filtering candidates based on whether they already know this. In fact, you're wasting valuable interview time asking very low-value questions.

(2) If you really do need a Scala expert, these questions can't identify such a person.

I can do both, but I also think that most of those questions are fairly relevant. I'd probably spend some time asking the applicant to translate between a map/flatMap to a for-comprehension block, and walk through their "monadic intuition".

But remember, Scala can be written in many ways. Some of us write Scala like Haskell-lite, and others write it like Java with less cruft.

You're kidding right? How much of your job is implementing hand rolled IO monads? I think it's very telling that you would hire someone who can understand IO monads but not understand the difference between traits and abstract classes.

How are code review with people like that? Where they implement their own logging system rather than using built in tools. That must be truly enlightening. Must be fun to maintain too. Especially when they do not understand or can even use the built in functionality of a language.

I think it's very telling that you think THIS of all things is the issue with interviews.

If curious I would have gotten the question with Try and Either wrong (because I forget), and I don't really use Scala Streams so I don't know without looking at the API doc. The others would have been fine for me but all of that is besides the point...

It was also not my point at all that an engineer that knows how to build a construct like an IO monad in Scala, but doesn't understand traits/abstract classes (which would be funny and hard to find I imagine) would be preferable to anyone else...

And furthermore, I agree that we live in a world where teams and projects get hosed by architect astronauts. But that isn't the point either...

The point, my angry friend, is nothing more than the observation that I, with my skill set, would do exactly what I said: Be unable to answer all those correctly in an interview, and in the process I would not have been asked anything that would flesh out many of the other skills I have. Skills relevant to the language in question and, arguably, more empowering to an organization than those listed.