The time spent on practising white board test may not be worthy
nanxiao.me
nanxiao.me
I just gave up on getting hired at any tech company that uses whiteboard interviewing. It seems like, just as in college where there's always that one kid who aces every test and wrecks the curve for everyone else, in any candidate pool there is always one demigod of algorithms (and it isn't you, you're merely great) that spends every waking hour of his/her life on hackerrank and topcoder.
Whatever, I spend my time on side projects, learning new things, family, and the occasional bit of fun and relaxation. And I still manage to stay employed (so far).
I know the allure of a big paycheck is too much for most people, but why are ok with going through these ridiculous circus acts just for the "privileged" of working for Big N?
Cause having a lot of money changes your life and it's not worth giving that up for a bit of pride.
Also working for "Big N" could give you access to very interesting projects, either while you work there or after you leave, since brands do matter and your CV will be more attractive to other companies.
Either you accept that it's the industry standard and the gateway to a big paycheck and a prestigious CV, or you don't participate.
Maybe. The people I know who leave the big companies almost always do so because the work ends up becoming somewhat wrote -- there is a lot of boring infrastructure to be maintained at big tech company du jour.
This is often the case, but not always. When you know things about the input data you may be able to get better performance than the generic sorts built into a language. Or, when you know more about sorting algorithms you may be better able to choose among the available sorts/sort options provided by a language or library.
I don't understand the attitude of people willfully choosing not to understand their craft better. Yes we can all be mediocre by just using libraries that other people made, but
1. Someone has to make the libraries 2. The average quality of software is not very good, its very often slow (which is astounding given how fast the hardware is) and buggy, often with disastrous consequences, so we should all be striving to do better than average.
Intuition isn't understanding and ignorance isn't expedience. I think your choice of the word craft really homes in on what we are supposed to be doing. Building things well with craft. There is a place for duct tape and wire, but the craft of software matters.
In most cases(in my experience), i can always lookup details of some algorithm when i need it. Admittedly, my job doesn't require me to design algorithms, but implement some not so readily available ones sometimes.
But also I'm not sure how common it is to have interview questions such as "delete a node from a balanced tree" where they actually expect you to get that right vs just see if you get the basic idea. I've never run into it. Perhaps many people on hackernews work in silicon valley and that is more common there.
Time is hard. I don't like to deal with localizing time, formatting time, or converting time. Instead I use a library [0] to solve that problem for me. Because while I may need to localize time - localizing time is not the problem I am trying to solve. It's just a roadblock in the process of solving my actual problem.
Present a candidate with a simple system with three levels of middleware API and have them plumb a newly exposed low-level value up through all three levels to the high-level API. This is unfortunately 75% of professional software development.
I have done some optimizations in the past, and I think what the author is getting at, is that it's not too late to learn about the specific niche algorithm you're dealing with when you have it in front of you.
My favorite rule about optimization is one I learned from a former colleague. First you measure, then you find where you should look, then you optimize. Without measurements you're maybe doing more harm than good. And if you look up different solutions when you know what you're trying to optimize it's usually not that hard to find a better replacement. But you don't need to have the exact solution in your head for this.
What you do need is the rough cursory knowledge of algorithms that grants you the ability to see more quickly where you're losing precious cycles. E.g. knowing the tradeoffs between linked lists and vectors.
I've seen way to many tools that could be sped up by a factor of 30-100 in an afternoon, that I really have to agree with you that a lot of people don't know their craft. I just don't think rote memorization of algorithms Q&A is solving any of this. Take home exams IMHO are a much better measure. I can ask people why they chose a certain data structure, why they didn't do it another way (if I have an idea of what could be better). That gives me much more of an insight in how people think. Not how well they memorize things.
But for a lot of people they will actually by reminding themselves of important fundamentals of computer science, which might be quite a good thing.
1) Most of us are incredibly underpaid
2) A common question is when asking how candidates prepared that resulted in offers is "How many problems did you do on leetcode?" I'd never heard of leetcode but it seems if you want an offer from FANG, Uber, Lyft, etc then you put your time in practicing programming problems.
To go from 100k to 200k seems like it would take years unless you jump to one of the FANG companies
1) By what metric? Also, who's we? I am a full-stack engineer and feel properly compensated if not over-payed given my expectations.
2) Leetcode has been extremely helpful. Not just in interviewing, but also in understanding how to have more granular control of space/performance. However, it is not the whole picture and I would point people to the famous coding university github: https://github.com/jwasham/coding-interview-university and further push people to follow research and coders they admire such as Peter Norvig: http://norvig.com/
- How well can you converse about a technical topic
- How adaptable are you to design constraints
- Do you understand the fundamentals of threading, databases, data structures, ect?
- Can you "think in code?"
- How well do you really understand the language that you spent XX years of your career working in
The best way to improve your skills is by doing: specifically, choose a hobby project that involves an area that you want to learn. Reading a book will only get you about 10-15% of the way there. Books are useful to choose a technology to learn, but not to learn the specific technology.
Getting back to whiteboarding: I've used it to:
- Reject candidates who forget basic fundamentals of a language that they claim XX years in. (Seriously, if you can't construct an "if" statement or use a common collection class in a language you claim XX years in, then you don't belong on my team.)
- Reject candidates who can't learn an unfamiliar API. This is critical, because we need to discuss new APIs in design discussions; and because "old & working" code isn't always worth refactoring to use some shiny new API.
- Reject candidates who don't know how to use a database. (Frameworks / ORMs are not a replacement for knowing how a database works and how to program with one.)
- Reject candidates who don't know fundamentals of threading
There was no discussion to show any thought process. It was about knowing the expected solution to 100%.
About optimization there is DTrace talks at http://dtrace.org/blogs/bmc/2018/02/03/talks/ and related HN discussion at https://news.ycombinator.com/item?id=16303595
I do remember Randal Schwartz talking at Floss Weekly https://twit.tv/floss sometime that in his work he tries to listen developers and ask right questions to see where bottlenecks are. Is there some expensive database query, does something need to be cached, etc.
Some companies are clearly academic, think of the Google's of this world. Other companies are more crafty/creative, think e.g. of typical web-dev shops. Games development is an interesting one.
As software developers we like to stick things in clearly defined boxes and treat software development as one big box. But I think it isn't.
I believe that the frustration most people have with interviewing is that the wrong style of interviewing is applied for a certain role. E.g. a company that is clearly on the crafts/creative side is hiring like they're Google (because they read about how Google does it on the Internet).
My experience is that in most situations whiteboard interviews don't contribute a single thing. A good conversation about making software usually does a lot more. But I guess for inexperienced interviewers, a whiteboard is an easy tool to hide behind.
Companies interested getting placed on it should raise PRs on https://github.com/poteto/hiring-without-whiteboards
I might suggest this is the best way to study for whiteboard tests in the first place. Practicing for them might only help if you have other people pick the questions and watch you.
The last interview I had, I completely bombed the whiteboard test, but not for technical reasons. I probably wouldn't have been able to practice my way out of it. Luckily, the company also had a live coding test which I aced, and they hired me, so it didn't matter.
As a manager and hiring interviewer, I have to say that I find whiteboard tests moderately useful, even though I agree with pretty much all the criticisms here so far.
The point of it is to try to see how the candidate thinks on their feet, watch them talk their way through a problem without StackOverflow at their fingertips. It almost never matters if the whiteboard code has bugs, the question is more about the process, not the result.
I'm learning a second language myself and I feel your pain. I would never want to interview in a second language. However, in the US workforce, English proficiency is critical and such soft skills can often mean promotion into management, increased responsibility, and technical leadership positions.
Then there the second part where the author considers algorithmic knowledge as useless (or not so much useless at best) because the tools available to a programmer already implement any relevant algorithm.
There's some ironic parallel between this way of thinking and algorithmic proficiency, actually. Many algorithms work by leveraging data structures whose understanding of internal working isn't needed. For example, one way to efficiently merge N sorted list into one big sorted list is to use a priority queue. Do you need to know how a priority queue is implemented to find this solution? Not at all. You just need to know the interface it offers, and the complexity of each method. Finding the k-th smallest element in a list can be done using a heap. Do you need to know how a heap is implemented to find this solution? Not at all. You just need to know what a heap does.
Really, studying algorithms is like studying the C++ standard library, except that instead of knowing about classes and methods as your toolbox, you know data structures (and common patterns) as your toolbox. Of course any curious mind will then go deeper and actually read about how those things are implemented, building an even better understanding of the foundations, and solving even deeper problems with it.
While being an interesting parallel, this doesn't really answers the author's questioning about: what's the point? Which brings us to what the author forgot to address in his article: white board test. The title of article sets the scene with someone wanting to find a job in one of those big tech company hiring people who can pass the whiteboard tests, but then who somehow... forget about it and decides to abandon this endeavor? Well, fair enough, but to be perfectly honest, while Google & Cie engineers certainly aren't spinning up algorithms on a daily basis like mad computer scientists, the engineering level there is still quite high. So there's definitely some basis in wanting to pass the whiteboard interview, mostly working with intelligent people.
Many times people can solve problems, but can't verbalise them enough to make a white board test be an accurate indication of how they think.
It's not about practicing to solve any specific problem - that kind of "practice" is counterproductive as the poster realised.
To be honest, this is a fair question. For someone whose entire career has been spent coding on a single machine, with data that fits in memory, reusing pre-written O(NlogN) or faster algorithms, often with a single thread, I can see why they would ask this question.
The answer is: for what we do, there is no off the shelf solution. Our datasets almost never fit on a single machine, to the point where we make jokes about five terabytes of data being so small we forgot how to count that low. Our algorithms are almost all novel: one of my favorite interview questions starts off as a trivial string manipulation problem but then branches out into easy-to-express, easy-to-understand variations that actually require some very sophisticated algorithms to solve. When it comes to pre-built software, even our internal turnkey database solutions are so sophisticated they require a solid understanding of distributed systems and operating systems to avoid common pitfalls.
Honestly, not every person is up to the task of working in this environment. Our workforce skews towards people with degrees in CS from high-ranking universities not because we're snobby but because there are few places that teach this particular combination of skillsets. You can probably go your entire career without working for us or on the sorts of problems we try to solve, and you can just as well prepare for interviews by focusing on practical matters and not deeper algorithms and data structures knowledge. And that's fine, I'm sure there are plenty of positions out there for you.
But if you do, don't come complaining to me that our interview process is too hard or the prep process is too impractical or that we're being unfair because none of the stuff we test for is practical in the real world. You can have an easy time prepping for my interview or a job at my company, but not both.
EDIT: There is something to be said for companies that cargo cult this interview process. True, if someone can pass this interview process they’re probably pretty decent, but you have to be honest with yourself what sort of problems you’ll be solving. OP, meanwhile, expressed an feeling of blanket pointlessness without saying what kind of job he’s looking for. I hope I’ve made clear this is counterproductive for companies like Facebook, Google, Microsoft, etc.
How would you sort this list? "Use the standard library and move on with my life."
But I want you to show me... "Use the standard library and move on with my life."
But what data structure would you use? "This one, because A, B, and C. It is already provided, debugged, and tested, by my standard library."
How is that data structure implemented? "Doesn't matter. It works and the time I spend not worrying about it I can spend shipping software."
--
It actually worked. I think they respected the pragmatism. I actually went on to help migrate them away from a HORRIBLY BUGGY home-grown container/string library, over to, you guessed it--the library that comes with the language.
I'm kind of sick and tired of companies writing their own frameworks and languages when they can't really maintain them, long term. Google, Facebook, Apple, Microsoft can, because they have a different culture and primarily because they have a different focus as well as enough profits to support it. Random Java big-shop can't. Their framework will be nice and shiny the first year and 15 years later you'll be wondering why you're working with the atrocious Struts-1 inspired undocumented internal framework.
This actually touches on an interesting point. My notorious interview company is Google. I'm not familiar enough with the Hangouts Android client to tell you anything about it, but for the sake of argument let's unrealistically assume it's trivial. Imagine you have an organization where some engineers are good enough to work on the Hangouts Android client but not good enough to work on, say, the F1 distributed database.
Internal transfers become crapshoots. Is this person good enough to work on my new, highly complex project? Should I reinterview them to make sure they can hack it? Imagine what this does to the social and cultural stratification. "Oh, those Hangouts guys are nice but they're not that impressive, it's not like they're working on the machine learning or anything." It'd be a nightmare both practically for management and socially for the engineers.
Our philosophy is: all engineers should have the chops to quickly be able to ramp up on whatever project they like. This means rejecting a lot of people, but it also means that two engineers can look at one another across the hallway and immediately know they could swap teams and not miss more than a couple weeks of productivity. When framed this way, I think the interview process is a natural consequence.
Not sure what the culture is at other places, but I hope this is a useful data point.
But regarding your problem, you could solve that by having internal interviews.
And I really doubt that for any complex product people switching will only miss a few weeks of productivity.
If my comment expresses any frustration it's with people who fail to see the point in preparing for anything more difficult than "can you use the standard library and write a for loop" type interviews and then turn around and complain about not getting hired at selective organizations that do very hard things. And then they go and issue a blanket denunciation of a process that consistently meets organizations' expectations.
Some of the interviews at lower paid shops I’ve either participated in or rejected have had more stringent requirements like weird whiteboard questions in the interview while working on more simple implementations (including shops where I found you won’t even be issued your own machine. You partner solely and share) than places where the work will be significantly more difficult and significantly better paid the environment more adult and the perks better.
I know FANG et al employ those tests for various reasons. I think a lot of other places just blindly emulate it.