My Google Interview and Lessons Learned
medium.com
medium.com
I wonder if it's what is expected from college graduation (we saw all these topics there after all) or if I'm late to the game but it's quite a joy nonetheless.
Once that experience is there, then yes, I agree that its usually not difficult to learn a new language.
So I think his choice to stick with what he knows and focus on learning algorithms was a good one. He could learn Java or Go or Ruby prior to the interview and then find out that he was placed on a project developing in Python, assuming he took the job. Languages are generally easy to learn and teach; best practices, algorithms, design patterns, etc. are what's hard.
But fact is: JavaScript the opposite of a small little niche.
Not because you can do everything with JS (which you probably can't) but because a few things you can do with it are considered rather valuable at this moment.
Switching to a different language isn't that big of a deal for a advanced programmer.
In contrast, I run into a lot of frontend developers that came from the opposite direction: HTML, then CSS, then Javascript. Their relationship to different languages and how it can be useful to their skillset is completely different from mine. If they are uninterested in learning any other language, it's likely because:
* They have no experience to say it will be useful to them, since they are planning to continue to develop in Javascript for the foreseeable future. * The other "languages" they know (HTML & CSS) are NOT helpful in their JS skillset. So by extension, they have experience teaching them that learning other "languages" isn't helpful.
I'd be skeptical too if someone that didn't code in my language of choice was saying that I should expend effort when my experience says otherwise: it sounds too much like an ivory tower someone speaking pompously.
Now, in my case, I DO know other languages and I know how they can benefit me. (Even language experiences I hated, such as my 5 years as a Java dev, were certainly instructional and useful in my current practices). But that's BECAUSE of my experiences, not DESPITE them. So I can see how someone with a different experience would respond differently. (Heck, I tend to look down on all strict-typing languages because of my Java experience, despite hearing from others that Java is not a great example to learn from).
That said, I also try to use a lot of unit tests, so there HAVE been more than a few pre-prod issues having to do with types. I just view the time spent on these as still less than what a strictly-typed language would require. Fixing the 1 in a 100 situation that is quickly exposed in a test is less effort than being verbose 100 times.
I will admit that there are some test cases that typing would make much easier - but not enough to yet sway me. I'll also say that strong typing (ala Python) is far less painful to me than static typing (ala Java).
I'll try to keep an open mind, but until I start seeing production bugs that make it worth more development pain, it's unlikely to occur.
* I'll also note that I think my web experience makes me prefer coercion, because everything has to keep switch to/from strings. Though I'm sure the strict-typing crowd will see that as evidence that typing has all the more need to be enforced :)
Also you can encode your logic in types - The Curry-Howard Correspondence (https://en.wikipedia.org/wiki/Curry–Howard_correspondence) says this is always possible in sufficiently advanced type-systems. While this goal hasn't been realized in mainstream programming languages, we have been moving towards it for a long time.
So when you say that you only have logical errors, not type errors and can't recall any type issues, do keep in mind that those are exactly the kind of things type-systems aim to solve.
But I can't blame you since Java and similar languages provide the only mainstream experience of static types.
Probably he just gave another "usual explanation" from his handbook. That's the problem when you have a recruiter as a proxy between you and your interviewer, specially when you get the negative answer. When they get the "No" answer, you are not profitable anymore. You are now a liability. A time-consuming problem they have to deal with. With that couldn't-be-more-generic-feedback, it seems to be your case.
Would be better to reach your interviewers directly and get feedback from them.
They're much happier with a recruiter giving a liability-free, if vague answer.
I suppose that if I'd made notes of each interviewer's name, I could've taken a guess at their Google e-mail addresses and tried to contact them directly, but that's definitely not something they would've made easy for me.
Please respond by the time you say you will, more or less.
It is amazing how many companies seem to be "unable" to come through on this very modest expectation.
But when they ghost you even after an internal referral? From someone you worked with previously?
That's when you really have to wonder what is going through these people's heads.
The real problems is that most companies just don't seem to care about candidate experience, period.
(Good) recruiters at Google strive to get their candidates answers as soon as possible, but the most they can do, at times, is hound the person that is holding up the process.
The problem is that they continually bait candidates with promised turnaround times that very seldom have anything to do with reality.
A more recent interview with Google got me a "no" in about 4 business days. Whatever else I could say about the process, at least they stuck to their promised window.
Nowadays, I think it may be a breakdown of the hiring or communication process. If there is a recruiter (outside) involved, the recruiter will likely not get communications about the ongoing hiring process since they involve candidates that the outside recruiter does not handle. If it is an inside recruiter, the inside recruiter might not even get communications if there are other inside recruiters competing to fill a position (silos, darwinism, bonus pools).
It would be nice if the hiring software platforms automatically sent a workflow-based notification based on where you were in the pipeline (e.g. 'did not pass go, did not collect $200'). However, I think that transparency into hiring processes advantages the candidates over the hiring company. The hiring company's advantage is that it (usually) has the power and controls information asymmetrically. There are most likely exceptions for exceptional candidates (think Google/Facebook AI team candidates) in which they don't play the hiring game but are simply trying to smooth the process.
This is why having an internal advocate is essential for getting into a company's hiring pipeline and knowing where you are in that pipeline (did the pipeline break for you, were you discharged into an outflow pipe after the on-sites etc).
Hiring is optimized for the employer's yield of quality employees, not for the non-accepted ("rejected") employees. Even though there are legal issues involved with specific reasons for non-hiring (e.g. worst case - discrimination lawsuits), it still benefits the company to be cautiously turtle slow with even black/white binary responses (no, yes - you are hired).
Since some of the most egregious companies (e.g. Google) have some of the most talented software engineers, you can imagine it is more a function of the culture (e.g. false positives are bad - it is acceptable to have false negatives) than the software/communication platforms underlying the hiring process.
size_t strlen(const char* str) { [return something] }
Then at least I know that you've ever programmed in this language before, which sets you apart, strangely enough, from 95% of the applicants. I won't even care if you write the return type as int instead of size_t, as long as you're obviously aware that every function declaration must have a return type (or whatever the requirements of your language might be).From there we can start talking about graph traversal or whatever, to determine what you know about complexity analysis.
It's really not about "production-ready code" but fluency. When you speak your native language you don't constantly bumble and make errors and leave out important words. It should be the same when you write code in your favorite programming language, and whether you can or cannot do so becomes readily apparent in technical interviews.
I have heard that what they are looking for is your problem solving skills and your ability understand the problem space and the tradeoffs.
But then I've also heard that if you are not proficient in a statically typed language that will hurt your candidacy. I am not sure if this true. I would that is someone has good CS skills and good problem solving ability that they could pick up any language statically typed or not.
Curious what someone more in the know regarding Google/FB/AWS has to say on the matter.
Is that still true then?
Did you get the job?
At best, it sets you apart from 95% of interviewees. I rarely get the chance to prove I can actually program. Even then, I think that is a gross exaggeration.
Practicing law is a different story. Although a significant percentage of law school has very little relevance to the day to day practice of law it would be an exaggeration to claim that law school doesn't do anything to prepare you for practice as I claimed for the bar exam.
Can't believe Google is still doing this crap. 5 whiteboarding exercises, seriously? How dumb is that. One OK, two why not. But maybe part of the interview could be spend talking about, you know, architecture, past experience, workflow, etc.
Seriously, we could get this done in three steps:
1. Phone screen including Fizzbuzz-level programming challenge.
2. IQ Test
3. Personality/Culture-fit interview.
You can get around this by conducting a study that finds IQ is better correlated to performance on a particular role than any other nondiscriminatory measure, but good luck with that, and good luck proving that when you get sued by someone. It's just too risky, despite not being illegal.
There is a popular myth that it is illegal because of a case where it was found to be illegal in the specific manner in which it was used.
https://www.hiresuccess.com/blog/is-employment-testing-legal
It must be perfectly fine if it's meant to draw figures and overall ideas about the solution. That's what whiteboards are for. Sometimes a picture's worth a thousand words, and drawing diagrams or illustrations is frequently indispensable for actually solving a complex problem (as opposed to having a picture in the head, or described in writing).
But I'd say it's borderline offensive to ask a person to write any realistic code (i.e. not very-high-level pseudocode that's more of a human-readable notes than something for a machine) on a whiteboard.
Never been to Google, so no idea what they ask for.
I don't think they necessarily care if it compiles, or if you forgot whether it was Set.has() or Set.contains(), but for some reason they do not allow pseudocode.
Google and similar companies aren't in the business of hiring anyone who can just learn anything. Given enough time anyone can develop skills to be a programmer. However, google is in the business of hiring people who are intellectually superior. People who can do things that can't necessarily be taught.
You complain about 5 whiteboard problems because most likely you won't be able to solve 5 whiteboard problems. This does not mean you're a bad programmer. However, the guy who can solve those problems without an issue has a higher probability of having higher intelligence and better programming skills than you.
You solved the problem if you give them the O(n^2) answer, but they're looking for the more complicated O(n) answer, because then they'll get to present you with the 2nd and 3rd variations on the question, rather than spending time refining the first.
If I wanted to put a negative spin on it: Google is filtering for people with lots of free time on their hands and spend that free time on intellectual pursuits. This makes them more likely to spend their free time staying at work rather than going home and doing something else.
That being said, everyone knows you need to have a solid understanding of data structures and algorithms to be seriously considered, but I don't think Google is necessarily looking for software prodigies.
Whilst explaining verbally to others your every single step of your thought processes while you are doing fine-grained analysis the problem (something which one almost never has to do in real engineering environments), and under incredibly unrealistic time pressure ("these people will either love me or hate me, depending on what I say in the next 5 seconds.") And typically to solve "problems" that bear little or no resemblance to the kind of problems that you'd actually be tasked with solving on a day-to-day basis at most of these roles. But which instead seem to solve other, ulterior purposes -- in particular, to shore up the interviewer's own insecurities:
"Gosh, I wish I knew how to find good people for this job. And heaven forbid if the candidate should ask me to explain our business model... But if we ask a bunch of Google-style questions at the whiteboard... I guess that means we must be in same league as Google."
In Google's case, for example -- to establish their "brand."
Fine-grained analysis? Again, you're not expected to be a master, but it's not asking a lot for you to break down a seemingly complex problem into something workable (e.g. The maze solver example above could be approached with choosing a right turn whenever you approach an intersection...does that seem very fine-grained to you?).
Incredibly unrealistic time pressure? Again, in most interviews I've had/conducted, you're not expected to just know the answer. If you do, that's great, but you make it seem like they're waiting to pounce on you the moment you struggle. I've never seen that in interviews for larger companies.
Google does to do that for many candidates, but if you're a recent school grad, you probably don't have as much past experience to talk about, so the interviewer will instead tend to focus on coding questions.
Basically, the longer your work history is, the more questions you'll get about what you have done versus demonstrating what you can do.
There are exceptions, of course: Google Zero, Google X, but I maintain for SWE and SRE, it's all about the whiteboarding.
Practice does help for these whiteboarding style questions.
I completed a bunch of https://www.hackerrank.com/ problems prior to my last set of technical interviews and it definitely helped keep me sharp. My day to day CRUD work is rarely helpful in that regard.
ps: hackerrank is neat.
"Talk about the three main parts of TCP/IP"
"Talk about what you would do in a new BIND configuration file"
etc