As many others are saying, I find that this is the most comfortable way for me as an interviewee to demonstrate that I do in fact know what I'm talking about. Put me in front of a room full of people and a whiteboard and throw something at me, and I'll freeze. Freezing in that situation and being a bad engineer are wholly separate things.
Anecdotally, when I get one of these problems, I spent 20 minutes reading the prompt, looking at resources and making an outline of my code. Then I step away for the afternoon and don't think about it. Let the subconscious internalize the problem for a while and when I come back, I've got a much better mindset to approach it. Solving new problems on the spot is just a skill I don't have. I prefer to think that this is what makes you valuable as an employee and engineer, solving a problem by the end of the day. Not while under scrutiny. Personally, my resume and experience don't get me far interviewing by the big companies, but on the occasions that I get take home code assignments, I tend to get pleasantly surprised and pleased reviewers and it takes me to the final rounds (where I face the dreaded white board and actually-there-is-a-correct-answer situationals).
My two cents, this just really resonated with me. Does anybody else happen to solve problems this way?
Don't let me connect to internet. I'll also leave my phone with you just to make sure I don't have access to the internet. I don't mind taking the time away from current employment to go through the process.
BUT PLEASE LEAVE ME ALONE THOUGH WHILE I AM AT IT. FOR GOD'S SAKE DON"T SIT NEXT TO ME AND TALK TO ME OR EXPECT ME TO TALK TO YOU WHILE I AM SOLVING THE PROBLEM !!!
Let's discuss the solution or the non-solution AFTER I have spent some alone time with the problem. I don't mind getting rejected AFTER I have made a serious attempt at it.
It is simply beyond me why people think it's all right for a complete stranger to sit next to a programmer while he is trying to solve a problem under the significant cognitive load of a new environment, new people possibly a laptop/keyboard he has never used.
This did sound like a rant :-/ but what I wanted to say was that the process in the article seems fair enough. Interviewees should be given the alone time to solve the problem.
Most people are decent and sociable enough that once they are one board and are comfortable and familiar with the rest of the team they will be able to function and be reasonable in pair programming envoirnment or other technical discussions as well. BUT not when they are in an interview. No matter how it is sugar coated, interview is where a programmer is getting JUDGED and that by default leads to pressure.
But cutting off internet access means no StackOverflow, no online documentation. The test should be very similar to normal working conditions.
Yes, but do you love pair programming:
-with a person you met less than 5 minutes ago?
-on a non-standard programming task you've been given less than a minute to think about?
-with a person who is focused on assessing you rather than assisting you?
-with your future job at stake and potentially your ability to ever interview at that company again at stake as well?
I enjoy pair programming too but I still choke on whiteboard programming questions during interviews. And this is after 20 years in the industry.
I am fine with white board type situations, don't worry about writing code without IDEs etc (in my very first job vi editor was the only thing we had to write code so I still have instinctive memory to be resourceful without an IDE but I love IntelliJ for most things). Happy to discuss/draw out ideas/solutions on whiteboards.
But find it very seriously annoying talking or being expected to talk while I am writing code !
I think the internet-access requirement depends on the problem. If I am expected to solve a problem by first-principles on a core CS topic then I guess internet is of no use ? Online Java Docs for e.g. may not serve a purpose here.
If the problem requires using many different tools/APIs for the solution then I guess you are right, internet access adds value.
Here, I'm like you. But it carries over to normal job - I work best when left alone. Especially when I have a tough problem to solve, just having people sitting close to me makes me frustrated, and if they're talking, then I won't be able to concentrate at all. It takes a lot of energy for me to be able to work in the presence of other people.
I think somehow the world was agreeable enough to drink the Pair-Programming KoolAid. The consulting companies or body shops were happy since they could bill 2x the number of heads for the same amount of time. The "buy-side" of Pair Programming were happy because the KoolAid evidently worked.
Don't get me wrong, I am all in favor of getting my code eye-balled by anybody because I know I don't write perfect code 100% of the times and always open to critique and learning.
Here's a thought experiment. Have two teams A and B. A are pair programmers i.e. |A| = 2*|B|.
Now make team A don't do any unit testing, let them purely rely on pairing to ensure quality.
Enforce team B to do TDD to the best of their efforts.
I would be personally very interested in knowing where the consumer of the code and writers of the code have more confidence on code quality and functional completeness.
Open-plan offices are hip and in Europe maybe even a requirement due to space constraints but I'd personally choose a cubicle over higher pay.
> Open-plan offices are hip and in Europe maybe even a requirement due to space constraints but I'd personally choose a cubicle over higher pay.
Yeah. When I was still a high-schooler and later a university student, I used to laugh at cubicles. Oh, the corporate culture, oh, the rat race, etc. Now that I spent some time in this career, I would voluntarily go to cubicle and even take a pay cut. I now understand that cubicles were a good idea of solving the space/cost constraints.
Hell, every now and then I think about building my own cubicle out of pizza boxes, but I'm pretty sure the management wouldn't be happy about it. Over-the-ear headphones suffice for eliminating sound for now, but I still can't focus when I have people walking behind my back.
Service/backend programmers often extol TDD because it is easy when working in a single language where your only IO is strings (i.e. Undergrad CS)
Front-end programmers may use TDD in certain established contexts, but pair may be more important when there are numerous integrations across unsupported toolchains. For example, when was the last time you used TDD with CSS? Oh? Too hard to verify that the CSS for a page makes it so that you can't click a button or print a page? Oh? Market bug isn't your responsibility?
Yeah, I see a lot of defensiveness when TDD is impossibly hard, so it's not "all that". But, use it if it makes sense. Know your tools and use the right tool for the job.
Not sure what you mean. In 25 years, my latest job is the only one that pair, and even then it's only a few teams in a very large organization.
I don't think your AB test makes much sense. The two practices are orthogonal. Complementary, but orthogonal.
If I had to take one over the other, I'd to TDD, or at least strive for excellent test coverage over pairing, but they really don't have anything to do with each other.
Try enlisting services of a consulting company such as ThoughtWorks, Accenture etc. Talk to the people who are already using such consultancies.
Every single job interview I have had this year involved a pair programming session and lists pair-programming as a "culture-fit" requirement.
The very latest one I had to go to, I had already warned the recruiter that that is not my strong point but he still sent me in anyways !
>But they really don't have anything to do with each other
I was trying to propose that maybe enforced pair programming is actually of no real value or very little value it at all and hence pair-programming has nothing to do with anything actually.
I value formal code-reviews. I have ZERO love for being forced into pair-programming be it in a real job or during an interview.
Somehow pair-programming caught on because KoolAid happens.
done well is the tricky bit. You need people who get on ok with it, social skills need to be developed, and you need discipline around not committing code which hasn't at least been reviewed. Social skills is the hardest part IME: knowing you can ask for a break, some time to think, or to split for some research before resuming work as a pair.
Having suffered through a couple code interviews in Java, I now pick Python when allowed to pick a language. It seems like the language for me that allows me the best chance of coding effectively without an IDE.
I just did a phone screen yesterday that was extremely painful. After 45 minutes of fumbling around the thing mercifully ended and I googled for a few solutions. According to what I read on stack overflow, the problem is unsolvable with the constraints given. I expect to get the "no thanks" email from the recruiter soon and I plan on asking him what the proposed solution to the problem was - not out of spite, but because I'm genuinely curious. Maybe I misunderstood the problem statement.
In pair programming you're both working together, complementing each other to tackle a particular problem or issue. In a good pair programming session we'll both work together to surpass an obstacle.
In an interview, one person is observing, testing and ultimately judging the other person, while actively ensuring they do not contribute to the solution of the problem so as not to skew results. Only one person is truly working towards the programming goal, and both participants know this.
That is how I expect people to work once they are hired so I expect candidates to be comfortable with it. Many are not, including me 10 years ago. But most are these days.
I don't expect them to solve the problem perfectly during that time, or even at all. The important bit is to test how they try to solve it, and how they communicate during it. Using Dash, google, SO, etc if fine, asking for help is fine. Essentially portray how they would work if hired.
Many times this has quickly highlighted complete blaggers, or cowboys that should be rejected, or people caught like rabbit in head lights that are not right for us now (but maybe later).
Adding a requirement that completely blows most people's initial domain model is good way to see how people respond, even if the requirement is essentially impossible.
When you say "describe and extend your sample app", where does this sample app come from ? Do you give the candidate a chance to work or go through the sample app on his own for some time before you pair ?
If that is the case then yes, I guess that is probably the correct way to do it.
However of late what I have experienced in general is that I have to go in, meet up people for the very first time in my life, they give me a problem and a laptop/computer/pairing station and a written description of the problem which I get maybe five minutes to assess and understand and then... have a go at it, while the strange (sometimes grumpy) developer sits next to me. If I go quiet for 5 minutes I get the "what are you thinking ?" question and then I have to talk while I write code at the same time !
Maybe it works for some or most of the people out there.
Not for me.
The other extreme end is the young students assumption, "you don't need to know everything, just where you can find it", but the ammount of stuff I have to look up repeatedly increases exponentially with, eg, every wiki-page I read and that just takes too long to the point of impossibility.
In the 'old days' you had maybe one or two languages and the language was the thing (not vast libraries like Java or .NET .. oh excuse me, the guys who used to get teased for the size of the CMS VAX reference are barely a man page in comparison to modern libraries) -- and now we have a proliferation of languages. Any web dev these days has to know at least 5, maybe more. Any old-timer has had to learn dozens during their career.
So no, I'm not going to use my precious grey-storage to remember an arcane Perl invocation when I can find it easily on SO.
Perhaps I don't meet your definition of 'programmer', but I've seen many junior devs get trapped in SO 'solutions' and wonder how I can possibly glance through 30 solutions and categorize them: "crap, crap, doesn't know what they are talking about, cargo cult, ... ah, there it is.. that's what we should try."
Benefit of experience?
When you've done two dozen programming languages, everything including low level assembly hacking, embedded & kernel development, graphics programming, network services, traditional desktop software, mobile software, video games and front end web stuffs and you've used more libraries and frameworks than you can count, it is quite possible that you're more than competent enough as a programmer. Yet you might need a bit of a refresher on whatever tech you're being asked to use because chances are it's not the only thing you focused on last year, or maybe indeed you haven't used it in a year or three.
Of course it's not black and white; if a company needs a C expert right now, somebody who knows all the pitfalls and can point at security issues & UB, then maybe he should do well on a test for that, without a reference. Although even then I'd let him use a copy of the standard (or its draft).
Then again, I don't really use SO anyway - I know somepeople use it daily.
IMHO, what makes you a good software engineer is not an encyclopedic facts in your head but general knowledge about principles, algorithms, patterns, etc. You don't have to remember all methods of all classes of standard library, for details you can check the web or use IDE. But if someone asks you about thread safe objects you have to know what does it mean. What may go wrong if you fail to make it so? Why properties must be immutable? And what the hell immutability is in the first place? All other things you should be able find in the online documentation / language reference.
What makes you a good software engineer is the ability to ask a meaningful questions. We have a powerful tools at our hands these days. Why wouldn't we use them for our benefit? You don't have to remember everything. It is there, within a hand's reach. Sometimes I have a feeling that asking Google the right question to solve your problem should be another skill tested during interviews.
What makes you a good software engineer is the ability to switch the tools and adapt quickly to new environment. Give him Internet, give him StackOverflow and ask him to solve a problem in new language, new framework. If he got the concept well, if he knows principles, that should be more than enough to jump in. Don't get me wrong here. I not going to underestimate guys with years of experience. I am not saying he will write flawless code. But he will solve the problem - that's a good start, isn't it?
Thank you for your verbose reply - I'll reflect on it.
I think that we just don't believe you. Did you arrive at every job with perfect knowledge in the areas you'd be working on? Have you not had to learn anything on the job?
If that's the case, then you're vastly overqualified. I feel like I'm being utilized as an employee the best when my manager says: "Hey, there's something weird happening in area X" or "I want you to explore feature X" and I get to dive deep into something for a few days. Our strengths are our ability to learn.
I mention it as a copy/paste mechanism as I am surrounded by people who use it for that very purpose.
I also did have the knowledge required for the job I applied for, and whilst I have learned a lot (off my own back) over the last 18+ years, very little of it is actually required, as demonstrated by those others who get given similar tasks that they can complete using Stack Overflow.
I'm definitely in the wrong place, and after a while I sense I lost a lot of perspective due to my peers / surroundings.
Personally, I never use downvotes for things I disagree with, but perhaps some people who are luckier to work in better scenarios believe that situations like mine don't exist - I don't wish anybody to walk in my shoes.
Thank you. I appreciate you taking the time to explain.
There are good places out there, _even_ if they're low-skilled environment. I think it's totally a cultural attitude, to be willing to take the time to learn, and to have a good attitude and effort about it. You can copy/paste from SO and still be using it as a learning tool.
I'm sure part of it is the context switch: if I were using one single language 100% of the time, perhaps I could memorise its core libraries. But why bother when it takes 3 seconds to look up and every professional job I've ever had its perfectly fine (expected even) to look up online documentation on the job.
So why not during an interview too? If your interview isn't testing me on what I'll be doing when I'm on the job for real, then whats the point? Testing my memory isn't a good reflection of my skill when working on real tasks.
Now, when I learned to program, I didn't have internet and worked completely from offline documentation (I learned Visual Basic, C++ and Python this way), so its not that I'm completely incapable of it, but it seems like a terrible use of my resources.
Out of curiosity, what do you do professionally? I'm impressed that you have so much domain knowledge memorized that you seldom ever need to look up anything.
Example: you have a failing install of a package in a linux version you never used before where the solution would be to increase ulimit but you are applying for a frontend position so you don't even know what ulimit is, but by a quick search on google for the error message there is an article providing a 1 liner for this issue.
One thing I've found from technical interviews is that, due to the pressure to speak and communicate and "show my thoughts", I'm more susceptible to falling prey to trick and vague questions that I would otherwise treat more carefully. This is consistent with scientific results on the way people respond the pressure situations. They tend to fall back on what is familiar instead of trying approaches that may be better. Working alone, there is no fear of judgement if I need to try an unusual strategy that may not work or if I need to backtrack. Let me dabble and doodle on my own sheet of paper and iterate rapidly over whatever comes to mind freely.
Furthermore, turning problem solving into a theatrical event unavoidably increases the cognitive load on an interviewee simply due to the fact that you have to make more decisions. You have the technical decisions like data structures and algorithms which are normal and expected, but on top of that, there are all these non-engineering decisions that you have to make because they want you to talk about how you're solving the problem in real time. Should you mention some fancy algorithm or approach that you are considering? You must choose your words carefully since anything you say can be used against you.
I'm not claiming that everyone works better alone or even that I don't like working with others. I just think that the interviewee should have the option of working on the problem alone for up to 30 minutes. As suggested by parent, we can discuss the solution or non-solution after I've become familiar and comfortable with the problem. One of the worst feelings is when I fail to solve a problem during an interview, only to have the solution come easily when I'm able to tackle the problem in a pressure-free environment. Expecting some kind of portal into someone's mind while they solve an unfamiliar and maybe tricky problem strikes me as overindulgent and voyeuristic. It is a flaw in the current technical interview process and the only way to mitigate its effects is to just get more comfortable interviewing.
 - https://www.psychologytoday.com/blog/choke/201106/flocking-t...
 - For tough problems, tend to use my own idiosyncratic variant of Z-Notation. I have a very high success rate solving algorithm puzzles when I use it but it is easy to forgot to use it under pressure of an interview.
That's a very interesting perspective actually.
If this process prevails then only a certain personality types will be able to work at companies which conduct such interviews.
The danger is that when the biggest and most successful companies (who's founding members didn't go through the same process, on the contrary were most likely solitary coders) conduct such interviews, the smaller and actually very nice places to work tend to copy the same.
I am somewhat in favor of the likes of Google and Facebook who need to filter an ocean full of applicants following this process.
But I have seen smaller companies copying the same process assuming they will find the similar hires as G and Fb. The funniest/hilarious part is when the recruiters start saying "we have a very bar" with so much conviction. Yes, you are a startup, you have a "very high bar" and you need to hire people who will scour the internet and integrate the various bits they find because they need to take the product from A to B YESTERDAY !!!
Although having said that, I think I may be a bit different from what you described. I actually don't mind whiteboarding or coding with pen and paper and I noticed for me it is a lot easier to "talk my thoughts" while whiteboarding. On the contrary, I get seriously annoyed if I have to talk while actually writing code and if it is during a job interview, I just choke.
> Expecting some kind of portal into someone's mind while they solve an unfamiliar and maybe tricky problem strikes me as overindulgent and voyeuristic. It is a flaw in the current technical interview process and the only way to mitigate its effects is to just get more comfortable interviewing.
Yes. We are problem solvers after all. A way shall be found.
Ugh. The worst step of interview process. Remember that guy who wrote a post about Google's hiring process, where they outsourced the asking of technical questions to untrained call-centre staff.
"Standard way to allocate memory in C?"
"Incorrect. Actually there's this cool library that does it for you with additional checks. Sorry, you have failed the interview"
I've always found that those kind of interview processes put far too much stress on being correct to their "ideals" rather than be consistent with your own and your team's. I.e. I don't care if you name your column "domain_id", but for christ's sake name the other column "account_id".
Hey, I had this experience with Amazon when applying for a software related position based in Europe. For the entry screening I got a call from Indian phone number and a person with Indian accent was clearly going through a list of various quirks an features of a programming language. Wasn't so bad though... the second round with MBA product managers was much worse:)
I didn't get the job, but it was an interesting experience. Certainly selects for a certain kind of engineer, and would not be my preference for how to hire people if I was setting up my own operation.
Every team needs a couple of people who can solve problems on the spot. They're going to fix your production issues. You need a couple of people who want to know why all the time. Someone with a big picture view. Someone with good aesthetics. Someone schedule driven, and a process nerd.
But they don't have to be the same couple of people. Diversity is more than fine, it's essential to avoid echo chamber syndrome. Some of the worst projects I've worked on had little to no dissent in the ranks. The code was self consistent but entirely wrong (bad info architecture, slow, brittle, impossible to learn after the fact).
But everyone tries to hire people that think exactly like they do. If we weren't so bad at determining that we'd probably never make anything interesting at all.
The other problem is that when you pay them you generate all sorts of nightmaris legal liabilities.
This goes against the core message of the article. The candidate is supposed to think about a problem on their own, and propose a well-reflected solution on Monday. That's pretty much the opposite of "sit down in this noisy corner in an unknown environment and give us something in two hours".
> The other problem is that when you pay them you generate all sorts of nightmaris legal liabilities.
If hiring a freelancer to do a little thing tends to generate all sorts of nightmarish legal liabilities, your company is either a government contractor or it has even bigger structural problems than hiring.
It might not be an issue for your company, but your candidate might have a non-compete (or other clause) preventing them from accepting compensation or even performing work for another company at all.
Things get trickier as soon as money is involved.
This payment looks like easy money for cheaters who would copy ready made solutions or ask friends for help. I'm not convinced, but this is indeed how things should be done in an ideal world.
I guess we could also ask candidates to pay. That is what is done in engineer schools in France. Not sure this is a good filtering method because of the Donner Kruger effect.
Well, it's a good thing we have (now domestic only) banking secrecy in Switzerland, for exactly these reasons. You only get into trouble when your livelihood doesn't make sense from what you earn and own - as long as you pay what's generally considered a 'fair' amount of tax, no-one will blink an eye and come after your documentation. And even if for some reason the government finds out, all that will happen is a penalty tax ranging from 20 to 300% of the missed revenue, usually 100%. There is an explicit difference between tax fraud (document forgery, which could mean jail) and tax evasion (when you 'forgot' to declare something, which leads to above penalty.
Overall, the system is set up so that the government can't abuse its asymmetric power over individuals, instead keeping it as close as possible to an 'employee' of the people.
But you are the one that placed yourself in a bad situation. They have a sane procedure that fully respects you, but isn't fine-tuned to your current problems. You can try negotiating their procedure too, but in their place (what I'm not, I'm in the "can't bill you" place right now), I'd refuse to.
Yes. And to make sure they don't cheat on it, maybe don't let them use a computer or the internet. A whiteboard ought to be enough. And just to be really sure, make them explain what they're doing in real time as they do it.
That will do quite well, and offer a wonderful alternative to the standard, awful, whiteboard coding interview.
Did you read the article?
That's what the article author is saying not to do, they prefer to see a well worked solution after you define a particular technology, showing they are adaptable and have thought it through properly.
Limiting them to your office, timeboxed, advantages people who spit out lines of code quickly, which is definitely not the right fit for a huge amount of coding positions, especially when you are emphasising logical choices and design decisions.
> Please don't insinuate that someone hasn't read an article. "Did you even read the article? It mentions that" can be shortened to "The article mentions that."
As I understand it, the more common form of pressure would come from having to deliver things in a tight schedule, and perhaps in certain kinds of meetings and presentations. Not from being forced to work in a foreign environment with foreign computers & tools and unknown people hanging around, watching and JUDGING you. If a company puts an engineer in the latter position very often, it might be doing something rather wrong. Whereas in the former situation, employers can find relief in at least having colleagues they are familiar with and an environment they're used to & comfortable with.
I was wondering about the tax and legal implications around paying someone for an interview challenge as well.
The overall idea seems fantastic, but paying or receiving money for an interview coding challenge is a little weird.
A company recently asked me to do a task they expected me to take ten hours, unpaid of course. I told them I thought it was kind of ridiculous.
"Well do what you can in two or three hours and if you really impress us with what you have done..."
The company really didn't impress me enough to bother.
But probably only 10-20% of people will have set that up, and for people who don't have an ABN, you have to basically fill out all the forms you would to make them an employee (you need their tax file number, have to submit a form to the tax office, have to get their superannuation details so you can pay them the mandatory 9% additional retirement savings on top of what you pay them, etc.)...
To save dragging people into an office for that time period, I set up a custom git server that marks the timestamps of their pulls and pushes. The instructions for the task are contained in the README of the repo, so as soon as they pull it they've started.
It's critical to me that the limit is adhered to so that over time I can compare candidate responses on a level playing field.
I prefer to see what people write in their normal way of working when they're not under extreme time pressure.
That's definitely a thing, and I believe it applies to some extent to everyone.
But here's the other side of the coin - the ability to operate efficiently when the world is burning. I've been in the industry for a while, and this sort of thing definitely happens. But it's very hard to simulate in an interview. You don't know who the adrenalin junkies are on your team until PagerDuty lights up glowing red across the board.
The only indication I've seen is the correlation with a preference for risk-taking activities, such as sky diving, etc. But it's quite circumstantial. And there's definitely also the true reverse of it: some of the car racers and bull fighters out there are not good team players in times of peace.
Well, if at least a few key players can handle pressure gracefully, I guess you'll be fine, since it's a skill rarely used. You don't need everyone to be able to switch to catastrophe mode at a moment's notice.
Also there are many indicators along the way, i.e. which parts the candidate got stuck at, did it take them 1 or 3 hrs to get to the same point (i.e. basic wiring of DB calls). I think all that would be lost if they did it on their own time.
Pressing them hard for information on Monday will expose this.
As such, if you hire any of those, you're hiring somebody with a proven willingness to ignore their contract, which is a strong anti-pattern.
"Work for contract for other employers" could literally mean I can't help my neighbor mow his lawn in exchange for a beer. In this case what it really means is a non-trivial amount of work done for meaningful profit.
If I fix a friends computer in exchange for a nice meal, I am using my relevant skills to perform work, but I'm not actually violating a contract forbidding outside work in a way that could ever possibly result in damages or firing for cause.
For a potential employee to be so rule-stricken as to concern themselves with performing a coding interview, that would be the potential red flag for me. So this could actually be another positive outcome of this approach.
You can call that a red flag, but it is the reality I live in. Maybe most of your candidates don't have that problem, but I would definitely be eliminated.
But since almost everything we do is in some way technically illegal, it is important for everyone to be able to function under that premise.
I mean, just to cut the check technically the employer would need a W-9, a work for hire contract, and who knows what else. Let's call the lawyer and spend $5k deciding whether we can do this, and then decide 6 months later it's too risky.... Or, we do it, get better hires, execute on our plans better, meet revenue targets, and succeed in the market, by not following all the rules, just the rules that matter.
Knowing the rules to follow and the rules to forget is the hardest part, but a crucial skill in life and business. The more you push the envelope, the faster you can run, and the more likely you are to combust. See Zenefits...
Learning of your little deal to pay them for software development work will be the stick they use to hit you with that interference suit.
Moreover, if you have a current employer that is sufficiently disrespectful of their employees that they'd even consider enforcing an anti-moonlighting clause in this circumstance, with the preposterous assertion that it qualifies as employment - run away now.
The law is not a programming language.
In California, it's illegal to prevent employees from moonlighting: https://californiaemploymentlaw.foxrothschild.com/2015/03/ar...
I would be much more willing to do the project if I knew the employer would lose $200. Among other things, this shows that I'm valued.
The thing is, there are always reasons why this method isn't viable. It's not till you try it that you notice huge gains.
I avoid these problems like the plague and very much prefer to whiteboard. If you pay me consultant rates, I can more easily justify the effort.
Edit: I most likely would have completed it if I were offered some type of compensation, even below market. They claimed it was an exercise and they wouldn't use it, but this was a startup with about 10 employees, and the deliverable was definitely something they could have used. That alone rubbed me the wrong way.
Who would have thought? Maybe - just maybe - not everyone has the same strengths and weaknesses. The real answer here is obvious: present the interviewee with options. Forcing all potential hires to whiteboard is a terrible idea. Forcing all potential hires to do a take-home project is a terrible idea. It's extremely short-sighted and a little pompous to assume that any single interview format one chooses is going to magically sort everyone into neat little buckets of "good" and "bad".
If you force the whiteboarding approach, you are only going to wind up hiring social butterflies who have absolutely no nerves standing up in front of complete strangers and having all the answers on the spot. If you force the take-home project approach, you're turning off a lot of people who can nail a first impression presenting themselves and their skillset in person.
People are different. Applying the same interview type to everyone is going to target a specific set of strengths, and a specific set of weaknesses. And frankly, no business should be composed entirely of one type of person. Some diversity does wonders when assessing the overall strength of a team.
Whiteboarding is a poor reflection of what people do day-to-day, and can be misleading if a candidate practices interview technique over coding experience. In other words, just because someone can regurgitate an algorithm on command, doesn't mean they'll be a good developer.
If all you want to optimise for is finding people who make a good first impression, by all means carry on with whiteboarding. However, if you want to find good developers then there is a one-size-fits-all solution, and that's to see how they develop code in the real world, which is exactly what the 'weekend project + appraisal' approach is a great fit for.
If you're a company that does any kind of business with the federal government, that's simply not an option. You have to be super-consistent in terms of your interviewing and
recruiting process across all candidates for a job req and can't do things for some candidates without doing it for all of them.
I think that would be misusing this approach.
We build recruitment software.
The recruitment process is a funnel. At each stage, the employer tries to weed out the bad candidates. Simple maths says they try and use cheaper tests early on in the process when there are more candidates.
For example, first stage is often eyeballing the resume and a quick search on GitHub/SO. 5 minutes, costs say $10, weeds out say 65% of candidates.
At the next stage, we use a more expensive test, since we have fewer candidates to filter.
This particular test sounds like it would sit after an initial phone screen and before a team interview in terms of cost.
Personally I would only use it after a first interview, or tell the candidate that you will decide immediately after completion of the first interview whether it was successful, and if so send them away to do this project afterwards,i.e. reduce double handling
...as someone that's fully employed I'm probably only looking at jobs I'm really interested in. I don't mind doing some free work for stuff I'm interested in. I also enjoy doing small unpaid side projects or programming puzzles in my free time...basically the same concept.
That being said, my guess is (ignoring legal implications) paying 200$ or whatever for it is actually more beneficial to the company than expecting you to do it for free so it seems like a nobrainer (once again assuming you can handle legal). Reciprocity and all.
I do something that I enjoy and throw it away afterwards or whatever I tend to do with little programming puzzles and project Euler stuff or I do the same thing and a company profits off it. The profiting doesn't really hurt me so I don't mind it. I'd also argue that if the intention of a company is to profit off my interview code I'm hopefully filtering them out (as they tend to be pretty boring)...having people write code for you by pretending to offer a job is also all kinds of horrible strategically so I don't see the potential for a mass exploit.
I can understand your point of view but I hear the dreaded "but my time is too valuable" more often than "it's unfair that they profit of it". My argument was mostly that...if you want the job, your time probably isn't too valuable to try to get it :)
That means you don't care enough about changing jobs. There are people who will happily do that "interview" for free even when being employed full-time. The only relevant question for the company is whether there are enough qualified candidates willing to do the test for free.
I'd much rather travel and meet you in person and do stuff there, but if you don't have the budget for it, we could figure other stuff out (shared docs, skype, whatever, I've done a few of these on both ends with some luck).
"Since the candidate is getting paid" seems like far weaker motivation than "since the candidate wants the job you're offering," which is what's going to determine my level of effort.
The "not a real problem" thing is key, though. I've tried testing out a few different "this is one of our real problem" things but there's almost always more hidden business rules or assumptions in there than you think.
There's a concept around a lot of preliminary engagements between two entities called "skin in the game." The idea is that when something is completely free the other party will take advantage of it without any real serious intent to follow through on anything.
Mostly this seems a reaction to the homework-type assignments where candidates are expected to spend a lot of time on some interview assignment with very little real cost to the company--which raises the possibility that it's effectively a cattle call.
I could run 50 candidates through a $200 problem for 10K. That's still a pretty large mismatch between "amount of work done by the candidate" and "amount of work done by the interviewer," and is cost-of-doing-business money for recruiting for a lot of companies currently.
Compare that to the cost of me flying people out (which is still done in this approach), or even the cost of spending an hour of mine or someone good on my team's time on the phone with them.
I guess it's just down to the difference between trying to hire fresh-out-of-college (or still in) free-time-to-spare junior devs and experienced people. That's actually a topic I should write a blog about somewhere myself, one day - I pushed pretty hard at my current company for moving towards a different process for industry candidates, and are extremely pleased with some of the people it's helped us hire.
I do agree that if people are flying around, that represents a fairly significant investment in any case. But in Silicon Valley, that often isn't true.
It's hopefully a case of coming up with processes that don't encourage people to waste others' time. But that also assumes some reasonable balance of power in the process.
Even after that, the "experience candidate phone call to see if they're worth flying in" part is definitely the one where I have the hardest time, being not in the Bay Area. I was lucky to find some great local people, where the cost was lower, because that's an expensive one to have to get good at fast. You lose a lot of nuance over the phone, though some other people in the company have been having very good luck with homework in this case - but as a candidate-choice option, where they could still go the traditional route if they wanted.
It's easier than it seems.
Just put a HackerRank test with a single question. "Print the numbers from 1 to 10 [inclusive, one number per line]".
20-30% of candidates won't attempt the test. 20-30% will be unable to give a decent solution.
If you're running 50 people through this, you're doing it wrong (unless you have 20+ positions).
I don't understand why you think improving your employment situation wouldn't be hard work.
Well that was very, very dumb of them. Maybe we engineers ain't so smart after all.
And I don't have an employee handbook. I own my own business.
Another problem, depending on your philosophy. Specifying the exact technologies someone has to use means that you've closed yourself off to generalists, unless they have time to learn a whole new stack that weekend. Not that it's rocket science to do so, but that turns a two hour project for me in say Angular into an eight hour project in your favored stack. I can always learn your stack on the job, as any good engineer can.
This format also doesn't appear to want full days: it should be an hour or two Friday afternoon, plus a half of Monday. Two part-days isn't really that worse than a full day off (Mileage may obviously vary; particularly the mileage to get to the interview). The initial interview could also very easily be done remotely.
Even if it is a bit higher-impact, I would still prefer it simply for the greater quality of experience, and that's before throwing in the payment.
Luckily not everyone thinks solving leetcode problems is a good way to hire.
You've got your main client staring over your shoulder, arms crossed saying fix it, and every two minutes asking "is it fixed yet?"
You damn well better be able to code under pressure... And like a freaking ninja
An interview situation is much more adversarial: They are looking out for reasons not to hire you, you are competing with others for the job and only one can get it! No such consideration on the job, unless the work environment is completely and ridiculously broken. When are you ever in a work situation where several people work on competing solutions and everybody else but the person who made the winning one is fired? At work you are working together, and to solve a problem, not to week you out of the pool.
Coding under pressure is quite different from coding on a white-board in an interview, often on an arcane CS problem.
Or a procrastinator ;)
"Hi, one coffee please."
"Sure, just one minute. Ok, first I'll pip install stripe…"
I have never in 12 professional years been given weeks to test anything. On only a couple of occasions have I been given 3-4 days to extensively test a project with multiple months of development time behind it.
Clearly you're talking about the project where the developer(s) told you very explicitly that it could not be done in less than 3 months. So you just assign the Jira ticket a 3 week deadline anyway. And then flip out when a half-assed project fails to ship. Welcome to the world of software development.
Congratulations that you can do all these things -- but unless 100% of the engineers in your company need to be like you, you might not want to use your list as hiring criteria.
Being able to 'code under the pressure of a deadline' is very different from 'solving a tricky problem with someone staring right at you'
Not everyone needs to be able to work well when the world is burning. Its not part of many jobs. However, if it is part of your job (eg your the guy who has to fix stuff at 4am) then I see nothing wrong with asking candidates to do timed work in an interview. I just think most jobs don't or shouldn't require this.
The type of situation you're describing is is why I avoid working for any sort of shop or agency.
The thing is, it's a vastly different kind of pressure. When I am coding as part of a job - by myself or with others - there is no inner monologue in the corner of my brain doing something like this:
"Could do that or... no damn, that's O(n^2), damn I'm taking too long that one looks bored, if I instead put those keys in a hash... no, I'm sure there's a better way, running out of time though, is he looking at his phone now? Okay, what was the profile of merge sort again? ... oh, shit! She felt like she had to offer me a guiding hint, I'm doing it wrong!"
And it never stops going. It picks apart every choice I make, and by five minutes into the interview I come across as a sub-articulate mess.
In no other high-pressure situation does this happen to me. Hell, this past summer I actually spoke at a conference and I didn't have the kind of trouble I do in an interview.
Whiteboarding, paired coding, participating in architecture design - these things come easily. In the context of an interview, though, it goes out the window.
That kind of scenario happens to me daily.
If you learn something from someone, is it that much trouble to give them credit for expanding your horizon?
If this mindset is recursive down your organization's hierarchy, doesn't it create a scenario where a legitimate critique never gets heard because people don't question the decision of a higher ranked employee because there is the impression that they know more than you?
Seems like you and your employer are worse off, but your ego remains intact.
Code now or die isn't usually something most people face in their day job.
If that happens consistently for months at a time, then as said the PM is severely fucking up. And if that wasn't communicated as an expectation before compensation was negotiated, then the company is probably fucking up.
As the quip goes "If a race doesn't have an end, then it's a death march."
B) If you're working a job like this you're working a shitty job and ought to quit. Unless you're maybe hacking the Gibson to stop some oil tankers from going belly up there is hardly a reason in our industry for this kind of shit.
But I will not work in a company where that's the norm.
I value my health more than the potential money from that stressful job.
Not all jobs give you all the time in the world on a test server without interruptions.
Also...these situations can be trained for to certain degrees. There's well established precedents in crisis management. If you write code for a customer with a 100k/h downtime risk you should have done a very thorough risk analysis and have mitigation plans for most scenarios. The unknown unknowns that can happen are obviously the hard cases but you should be able to justify that these are going to be expensive no matter what.
But even for these cases bricolage is trainable to a certain degree.
If you know there's 100k/h costs of failure you should also very specifically mention the fact that you are looking for these stress coping skills in the job description (and as such the interviewee should be prepared).
Performing well in this kind of scenario is much less about algorithms and data structures, and much more about systems thinking and the level of your understanding of your system.
System knowledge and knowing which one bolt to replace or turn is almost always more effective.
PS: Not to mention, if we're getting into algorithmic complexity levels of engineering on a monkey patch to a production system, then so many alarm bells are already ringing.
If there's ever going to be a situation where something costs $100k/hour if it's offline then you have 5 test servers and 2 or 3 load-balanced production servers so a failure doesn't take you offline, and you've written procedures and processes to handle critical problems long before they happen.
You definitely don't try to hotfix things while the foreman complains. That will make things worse.
For example, I may say please use functional reactive
principals in JS to solve this problem, but the decision
of using Kefir, Bacon, or RX is left up to them.
First, this model alone doesn't scale. Big companies interview hundreds of candidates every week. It's not possible to design and evaluate a weekend project for each one of them. This doesn't mean that they can't have projects, but early filters are needed. That leads to the classic phone and F2F interviews to rule out those who can't code. If you freeze in one of those because of the pressure, you're out.
Second, for simple developer positions, such weekend projects might be very good. But if you are trying to hire a senior developer who is going to solve problems at big scale, then the ability to create a simple movie catalog doesn't tell you anything. And there are no big scale weekend projects. You have to ask about algorithms, data structures and other CS topics. These things are important!
Bottom line, this is a nice hiring technique suitable for small companies at a small scale. But it might not be that useful for big companies.
Which is a bummer. When I interviewed at Amazon a few years ago, it was a day of coding on the whiteboard. Turned out I didn't have the Java experience that group wanted, and I'm allergic to pager duty so that was a non-starter for me.
The common approach for big companies is to declare that false positives are way worse than false negatives, but if the problem is that you can't find enough developers to fill your roles, it may be better to have false positives coupled with a trial period or something similar.
Can't you just design and evaluate one project that they can all do?
"You should just find that out upfront" I hear you saying. Well that is not always possible. Recruiters either don't know the range, or lie about not knowing, or you have to submit a big packet of info (cover letter, history, resume, homework) before you can even talk to a human about salary.
> but companies need to start specifying their salary
> range up front
> I've been having a lot of time wasted lately by
> getting through Tech Interview #1 or Homework #1, only
> to find out their max salary is laughable for San
"I am interested in roles paying above my current salary of $xxx,xxx only, and am looking for an improvement on that to reflect my increased experience and the risk of moving roles"
> Recruiters either don't know the range
> or lie about not knowing
> you have to submit a big packet of info (cover letter,
> history, resume, homework) before you can even talk to
> a human about salary
Are you really advocating that people disclose their salary to a recruiter, voluntarily?
What terrible advice. "How to immediately throw away your best bargaining chip 101".
> Are you really advocating that people disclose their
> salary to a recruiter
> What terrible advice
> "How to immediately throw away your best bargaining
> chip 101"
If they're an external recruiter, they have no control at all and are incentivized to get you paid as much as they can, as they're paid on commission.
Not only is it obnoxious to read on mobile, as horizontal scrolling is necessary, but it also fundamentally doesn't make sense as you should be able to copy/paste whole sentences.
One might expect that as a recruiter/(ex-?)developer you'd realize how painful it is when you use this formatting.
I agree with photogrammetry in that it's essentially unreadable on mobile portrait as you have to horizontally scroll each quote you want to read (then scroll back and again if it's multi-line).
Shorter >'s with italics are my preference.
That might be my salary. It might be my floor for moving to a new, more expensive, area. It might be what I think my current salary should be.
Depending on how things like bonuses are done, base salary alone isn't super relevant anyway. There's a potentially very big difference between a company that says "we give bonuses of up to 20k per year" and "our bonus target for good performers at this level is 25%."
Maybe 9 times out of 10 the recruiter says "sorry, that's not going to happen." But you only want to find the ones who say "we can work with that" anyway.
This may not be the best way to absolutely maximize your total, but if you pick the right floor, you can save a lot of time up front. And the way to really maximize your offer isn't to hide your current salary, anyway. It's to take that first offer to another other company you're interviewing with, and see if they can beat it. That's your best bargaining chip.
That's funny, I thought this was a employee's market... Better get with the program, bub.
I'm actually in favor of 100% transparent salaries. I've yet to hear a compelling argument against it that wasn't simply "it feels icky."
> I'm actually in favor of 100% transparent salaries.
> I've yet to hear a compelling argument against it
> that wasn't simply "it feels icky."
> State it upfront when you submit your application, rather than "find that out"
As an employee, I would say the costs of specifying my expected salary range upfront outweigh the benefits.
> As an employee, I would say the costs of specifying
> my expected salary range upfront outweigh the benefits
Another thing that companies could do better is think really hard about "required" and "desired" skills, and be truthful. Lots of companies list things as required which they're probably willing to bend on for the right candidate. All this does is scare off potential candidates (odd when you're complaining about that mythical shortage of engineers). On the other hand, recent events have encouraged me to not be afraid to apply for jobs that I'm unqualified for :) so maybe it's not such a big deal.
> There's so much song and dance that has to go on
> before you get to the meat of things
Got an awful offer to relocate to an area where 1/4 to 1/2 the house costs twice as much and I would no longer be able to work from home. I would also lose a significant portion of my life commuting. The offer was comparable to what I made working remote from Boston.
I don't mean comparable in the sense that they tacked on a CA bump to handle the cost. Comparable as in same money, but I would have to live in CA.
Ended up working remote for more somewhere else. Everyone's time wasted. I don't get it at all. It's not like they didn't know it was low.
Seattle is not even close to being as bad as silicon valley in housing costs.
But don't worry, they'll make it up with about $10k/yr of stock grants which you don't get until you've worked there 4 years.
I picked another lesser-known company and am making - no shit - about $70k/yr more than Facebook was offering. With stock grants that also might be worth about $50k after 4 years, though admittedly, the stocks are a much bigger gamble in this case.
I had to say no late in the process to several companies which offered me the contracting-to-maybe-hire dance.
Never again will I do contract-to-maybe-hire.
If you are in the higher range of salary, you gotta find out which local employers/industries are worth talking to and limit your application to them. There probably aren't many.
• What 2 hour project can you assign that would let the candidate go into enough depth for you to judge their code, design decisions, architecture skills?
• If you give them more time (e.g. a weekend like in the article), is it still financially viable to the company, especially at $100/hr??
• How do you filter out the candidates that aren't serious about the job but just want to make a quick buck?
• What about all the candidates out there who you can't legally pay (e.g. workers on a visa)?
This works when you are a small company that needs to pick 2 out of 6 total applicants, but otherwise completely unfeasible.
> "Create a single page app that lets me enter movies in my home movie collection, store them in offline storage and search through them. I want to search by Genre, Title & Actors."
Significantly more than 2 hours, unless you are looking for a quick hack and for the candidate to repeatedly explain "I would have done it this other way if I had more time..."
Part of software development is tailoring a solution to the scope of the problem, and this includes taking into account the time and effort available to come up with a solution. Someone who looks at that problem statement and designs something that will take a week has missed a very important requirement.
You could reasonably scale up any problem to take an arbitrarily long amount of time, by adding onerous requirements (must have 7 9's of reliability). What I've found more rare and precious is the developer who can limit the scope so that items that are not up for negotiation like time (2 hours) & resources (1 developer) are respected.
I fully expect a developer to state their assumptions up front, so that I can judge their design based on the stated assumptions and not some unstated imaginary assumptions. It also lets me see how or if they prioritize.
Let me answer that with an example. In my previous job, I had to implement a simple username/password based authentication API in the first interview. The problem was explained to me. A two page document with a written specification of the problem was also provided to me. After I read the document, I was asked how long I would need to solve the problem. I asked for 40 minutes. Then the interviewer left me alone in the room with a laptop. After 40 minutes, the interviewer returned and went over the entire code I had written, discussed the API design decisions I had taken such as the corner cases that were handled or not handled, exceptions that were thrown, how empty or null usernames or passwords were handled, what error messages were generated, how concurrency was handled, what performance problems could occur if thousands of requests invoke the API per second per thread, how the password was secured, etc.
After I got the job, I learnt that my colleagues had also gone through a similar coding interview with different problems of similar size and scope. Some people asked for 30 minutes while some asked for 90 minutes. Therefore, I believe that it is possible to have a tiny 30 minute to 90 minute project that lets a candidate demonstrate his or her software engineering skills.
I felt this method was very effective because it evaluated a couple of key skills that were important to do the work that we were doing there: time and effort estimation, API design, writing clean and correct code, robust error handling, and design decisions from performance and security perspective.
I didn't get paid for that 40 minutes but it was part of their half a day onsite interview process, so I did not have to spend any extra time apart from the time I had already scheduled for visiting their office. Also, they did provide me free lunch, snacks and drinks, so I didn't complain. I wish more employers did this.
Where I work, our take-home is a simplified version of a task that's common enough (in our field) that we built tooling for it. It's generic, it tests understanding of a few things, and we've gone through three iterations of our own tooling so we know there are multiple viable approaches.
As for judging decisions, that's why the interview that goes with it is a collaborative code review. You treat it the same as if you were reviewing code a co-worker had written; ask questions, discuss tradeoffs, etc. etc.
Maybe it would be better to explicitly state that the results of the work are to be released under CC-BY?
Write a program that reads a text file, and output each unique word with the number of times it appeared.
The program must be done in a programming language among: C, C++, C#, Go, Java, PHP, Python, Ruby.
This is on the level of a pretty simple first phone screen problem.
What whiteboard interview would?
Well, the movie project suggested in the article was a pretty reasonable one.
That feels like premature optimization to me. I can see how it'd find generally good web developers, but I can also see how it'd produce just as many false negatives as Google's interviews do. So is it really that much of a step forward?
I dunno...I've worked with a lot of people who could code a simple app but completely fail when it comes to serious programming.