I have friends working at Lyft, and I've heard good things from them, so to clarify, this review only reflects my personal interview experience at Lyft. I was referred by a friend who works there. It took roughly a week for the recruiter to contact me. I had the initial phone screen (a quick, infinite, multi-stream processing coding question) and was invited on-site right after.
On-site is when the experience went from an 8 to a 3. The day was originally scheduled with 5 tech interviews (2 coding, 2 architecture designs, and one closing) and one lunch interview. The first two interviews were conducted with engineers (both nice and polite, but lacking interviewing experience). The first interview question was to code the functionalities of an LRU cache. While discussing the process, a solution was proposed with a runtime of O(lgN) for maintenance—having a heap to keep track of the LRU items and a hash for each item and MRU time. When the solution was agreed upon by both parties, the interviewer asked to implement the get() function. Before white-boarding the code, he asked for the runtime for get(). Given the solution that was proposed previously, get() would have a runtime of O(1) (hash table lookup). For the next 15 minutes, the interviewer tried to steer the mindset, repeatedly asking, "Is there any other possible runtime for get()?" My response was, "No, unless you have a different solution in mind." The communication was the first struggle of the first interview. The second struggle occurred after 15 minutes of discussion leading nowhere: the interviewer simply paused and asked to code the get() function. Given the established solution, the get() implementation goes:
def get(url) if hash(url) hash(url) end end
Then, with 5-8 minutes remaining, he finally said, "Is there a more optimal solution?" That's when the solution was changed from hash & heap to hash & pointer & array, which would give a runtime of O(N) for general maintenance. In this case, the get() function includes multiple steps:
In this scenario, get() has a runtime of O(N) instead of O(1).
That concluded the first interview. The second interview was a good experience. Even though the interviewer was a junior engineer (he was a last-minute substitute for the originally scheduled interviewer), he was quick, straightforward, and explicit on the coding question (which he conducted on coderpad.io). He also took extra time at the end to answer my questions (during lunchtime), even though he didn't have to. I was impressed with his maturity and attentiveness as a young interviewer. His coding question was to write a compressor for text documents, given the inputs and outputs of a decompressor.
Then, the 30-minute lunch interview—nothing. The interviewer was busy eating with his two giant plates of food, as opposed to having useful conversations. I would have preferred to eat by myself. The general protocol for a lunch interview is to converse with the interviewee and introduce them to the company and culture. No, none of that occurred.
The third interview was conducted with a fairly experienced engineer/HM. That was the most enjoyable interview session I had that day. The question was on architecture design. We spent 20 minutes talking about work experience (in the same specific field of engineering, so there was plenty of conversation) and another 25 on numerous cases of architecture design. The design question was about designing a promo code-based system (with identical promo codes, randomly generated promo codes, and promo codes with conditions).
When the fourth interviewer was supposed to show up, he didn't. The recruiter did, ending the interviews early. It was an easy-to-spot sign. She asked if I had any questions. I said no, replying that if the interview is cut short, it's generally not a good sign. She tried to explain that it wasn't the case, but I left early as well and went to grab coffee with my friend working there.
It wasn't a pleasant experience for me, with the combination of inexperienced interviewers, abruptly cut-short interviews (understandable, but definitely baffling), and a lack of enthusiasm from the employees (lunch chat)—none granted sufficient respect to interviewees. I speak as someone who also conducts interviews with software engineers on a weekly basis. Regardless of their level, background, or position, interviewers should always own the responsibility for providing the time for interviewees who took their time for the interviews.
Compressor and decompressor
The following metrics were computed from 35 interview experiences for the Lyft Software Engineer role in San Francisco, California.
Lyft's interview process for their Software Engineer roles in San Francisco, California is very selective, failing most engineers who go through it.
Candidates reported having very good feelings for Lyft's Software Engineer interview process in San Francisco, California.