Dear Startups: stop asking me math puzzles to figure out if I can code
countaleph.wordpress.com
countaleph.wordpress.com
Before the interview, I ask them to write some code to access an HTTP endpoint that contains exchange rate data (USD, EUR, GBP, JPY etc.) in XML and to parse and load said data into a relational database. Then to build a very simple HTML form based front-end that lets you input a currency and convert it into another currency.
I ask them to send me either a link to a repository (Git, SVN etc.) or a zipball/tarball. If the job specifies a particular language, then I obviously expect it to be in that language. If not, so long as it isn't in something crazy like Brainfuck, they have free range.
If the code works and is basically sane, that goes a long way to get them shortlisted.
During the interview, I'll pull the code they sent up on a projector and ask them to self-review it. If they can figure out things that need improving in their code, that weighs heavily in their favour. Usually this is things like comments/documentation, tests, improving the structure or reusability. If it's really good, I'll throw a hypothetical idea for refactoring at them and see how they think.
The reason this works is that, despite Hacker News/Paul Graham dogma to the contrary, "smartness" isn't the only thing that matters in programmers. It's actually fairly low down the list. When hiring programmers, I want people who are actually able to do the daily practical job of writing code, modest and self-critical enough to spot their own mistakes, and socially capable to actually communicate their decisions and mistakes to the people they work with.
I interviewed a guy who was intellectually very smart and understood a lot about CS theory. I asked him why the PHP code he sent me didn't have any comments. "I don't believe in comments because they slow the PHP interpreter down." Sorry, he can be smarter than Einstein but I ain't letting him near production code.
That isn't what Paul means by "smart." Worrying about trivial inefficiencies like that is a sign of an ineffective coder. That's the opposite of a great hacker.
This isn't "common sense," per se. It's more like uncommon sense. Most people follow an effort in -> result out paradigm, believing the two are perfectly correlated. A "smart" person, in PG's view, attempts to min effort and max result. (I've also heard this sort of hacker described as "lazy," in a positive and non-derogatory sense. A "lazy" person finds the most efficient and effective ways to do things, minimizing man-hours and resources.)
The relationship between "smart"/"lazy" and IQ hasn't been studied all that well, but it seems plausible that there is some sort of relationship. Perhaps it's a strong one, and perhaps it's not. Either way, I don't believe an IQ test as a single-factor qualification gate will filter effectively for "smart"/"lazy."
Smartness is overrated but experience is critical for speeding up work. I can implement a whole site in Django but without good experience I will be slow (even being good at Python)
Nowadays, I think we need to find new ways to evaluate candidates productivity. For example, just following a Q&A method (stackoverflow) I can be faster than other developers.
I don't understand your point about dogma. I think HN assumes rationality as implied by smartness. Nobody wants to hire a poor coder/communicator to write code, CS degree or no. I bet most readers would find your process to be pretty good and have similar processes of their own.
Personally, I think that if you want a brilliant mathematician/problem solver, then that's what you should put in the job listing. Then asking the kind of questions exemplified in the article is likely merited. On the other hand, if you want a good programmer you should mainly look at the quality of the code they produce.
For some bizzare reason, a lot of PHP devs obsess over mini benchmarks and tiny speed issues while ignoring massive latency factors (like the DB).
I find it amusing, though, as PHP hasn't been a direct interpreter for years. It compiles to an internal opcode array and interprets that. While its opcode compiler is silly (it doesn't build an AST and directly emits opcodes, which causes all sorts of things not to work), it does have a proper lexer and I think comments are completely ignored aside from doc comments[1] which can be obtained in userland with reflection.
[1] They look like this:
/** DocComment */
/* Normal comment */This sort of behaviour isn't unique to PHP Devs, not even close.
Reminds me of all the roadies (road cyclists) who would come into our bike shop and demand the lightest components to put on their bikes, then rave about how they cut 10 GRAMS off of their bike weight. Totally ignoring the fact they're pushing almost 220lbs themselves.
1 rider managed to get more than half right. And he was a frame builder riding his own bike.
Sure most road bikes are pretty much light enough. Thus one should prefer an efficient bike over a light one.
But there nothing wrong with having light wheels for keeping the rotational and sprung mass as low as possible on a full suspension mountain bike.
You wanted a ______ and you are interviewing for a puzzle-solving mathematician really doesn't sound right.
Good stuff.
I've applied to other jobs who's owners frequent HN, and they did things like test my ability to write sort algos or data structures... but the job called for a good knowledge of JavaScript, Backbone and general knowledge of django to build a mix between a CMS and an elaborate voting system.
They didn't hire me. I'm utterly trash at working on algos under pressure. I felt like a lost child just trying to write a simple sort during the interview. Worse, I made it harder on myself by asking to not write the code in MSWord (or some other similar thing) and instead use jsfiddle. The owner looked at the code and said 'Yeah, that looks about right to me, it should work.' I foolishly hit run.
What I learnt was two-fold:
1) this doesn't test my ability to do the thing you want to pay me to do (as proof, I'm writing more complex applications today at a job I enjoy far more than I would have at that company).
2) The employer can't differentiate between a "smart developer" or "average developer" until the script executes.
I went for a job a few months ago where I had to write a program on paper to produce report data from raw data collections, it was reasonably complicated. This is the type of thing I breeze through when I'm sat alone at my desk, but for whatever reason I just went into panic mode and couldn't think straight at all. I apologised and told them just that. It was frustrating to say the least.
The interview went ahead and we ended up talking about various architectures, design patterns, programming languages, functional programming and even HN, but I'm sure I never got the gig because of the technical test.
For the interview at my current gig they walked out of the room for 10 minutes while I had to write sorting algorithms and I was able to do it without a problem. So, for me at least, the element of being watched while I wrote the code seemed to be part of the problem.
This one wasn't smarter than Einstein. It's been a while since I've been near a live PHP installation, but IIRC running with an opcode cache like APC probably means the comments will be parsed at most once (every server restart?)
Plus, the comments are there for future developers to use as a reference. Nothing worse than having something break, cracking open a file and have to spend hours having to untie someone else's code.
I'd rather have copious amounts of comments, then a minimal speed gain due to not having them at all.
// method takes Object argument and returns list
Are useless.
If Mr. not-Einstein had actually measured some production issue that could be traced back to commenting, he could always have written a filter that stripped them before production. My guess, though, is even he didn't believe this excuse; it was just a glib thing to say in hopes of wiggling out of trouble for being a negligent coder.
Smartness is great, I like smart. But I agree that it's probably the fifth- or sixth-highest-weight factor in my list.
1) I think a lot of start-ups want to hire "smart" people. Because they expect the new person to eventually wear many hats. Objective-C, Java, Android, CSS, server side concurrency, monitoring. An we've all seen Hunter and Schmidt reference that tokenadult usually posts when talk about interviewing comes around and it does seem that a general mental ability test (like an IQ test) combined with a work samples seem to predict future performance of that employee. Well except that one can't just straight up give IQ test to job applicants (there is a court case about that). So we are left with a job sample (which many forget to give, as is the point of the author). But instead many focus on the GMA and create proxies for it -- cute little puzzles about blenders, round manhole covers, and other such silly things.
2) Those interviewing don't know the technical stuff and are afraid you'd out-bullshit them. "How does an Ajax request work" well if the interviewer themselves doesn't quite know the details the might not be able to evaluate it properly. They could have it written down but well, some technical questions have many different levels of depth that a candidate might descent to. So a quick written answer to the question might seem wrong but it is really because the candidate is more advanced. So puzzles seems to be a generic and "easier" to handle.
But honestly, why can't we just start giving IQ tests? Or at least asking for SAT scores? We shouldn't have to run through training puzzles just to prove we're smart enough to build a site.
Both. They're not perfect, but I'm going to be picky and look for people who can generally reason well (both mathematically and verbally).
> but that doesn't mean they can code.
That's why you pair it with work samples.
The ideal hire would be an impressive GitHub + evidence of intellect. The GitHub shows they have coding chops, while an IQ test usually means they can react quickly and learn new skills.
(Skill and interest tend to be highly correlated.)
For 5.5 years (2004-2009), I was a core developer and maintainer over at Xfce. Over that span of time I wrote tens of thousands of lines of code, perhaps more. I did this in addition to my job, which morphed from engineering project management to programming tasks that I didn't find very challenging.
After I left that job, I joined a tiny, early startup. The programming work there I found very challenging, and the insane hours quickly ate up any spare time I might put toward Xfce. Eventually I realized that lacking a life outside of work made me sad, so I left. Fast forward a little bit, and now I'm at another startup, which (while demanding, challenging, and rewarding) gives me time for outside pursuits and a social life. But I don't feel the desire to work on personal coding projects anymore. The job fulfills my desire to write code, and outside of that I'd rather be, well... outside.
It's interesting, because all my Xfce contributions are on git.xfce.org, and not on GitHub. My GitHub account contains 2 personal projects: a semi-finished Android UI library (which was really only relevant and useful in the 2.x days), and a script for building a Gentoo image for a Raspberry Pi (which I've since abandoned as I mainly run Debian nowadays). Looking at my GH account would be fairly unimpressive, and might even be worse than not having a GH account at all.
So I'd easily fail the GitHub test. If a particular company was making that a no-go for getting through an interview pipeline, well... their loss, I guess.
I'm responsible for a fair bit of hiring at my current company, and I rarely ask about personal projects anymore, unless a candidate has one listed on their resume. While I'm not always happy with the coding problems I usually give (they tend to be data-structure/algo problems that I'd probably have trouble solving in an interview setting), they do at least clearly show whether or not the candidate can write code, and I also get a rough idea of how cleanly they code, not to mention insights in how they approach and solve problems. And not being able to completely solve the problem isn't an auto-fail in my book either, as long as they tried to work on it and their approach (and whatever code they did write) was sound.
I do very strongly believe in the aptitude test + work sample formula as the best way to evaluate candidates, but the problem is more that it's not always so easy to apply those tests in a traditional interview setting. Maybe that just means we need to come up with a different way of interviewing, though.
In this case, just mention it. It's not about github literally.
My assumption (which maybe is wrong) is that 5 years of OSS contributions that ended 4 years ago may not be all that impressive. Why did I abandon it? etc.
>> But I don't feel the desire to work on personal coding projects anymore. The job fulfills my desire to write code, and outside of that I'd rather be, well... outside.
Another thing to remember is that you're 5-10 years older then you were at that point. Life priorities have changed. You might not be a caffeine-fueled 19 year old anymore, instead you're 28 with 2 kids and a mortgage. Or 34 and just have other things that interest you than tweaking Linux or exploring video drivers.
My personal projects also include things like my very playing around with a new language (so it is freaking ugly and so I would never want it used as a job indicator) and old abandoned projects that I've salvaged and updated as a favor to friends, which means the entire architecture is alien and "I Don't Care If It's Ugly Just Make It Work Because Right Now It Does Not Work At All" is exactly what the 'client' wants.
I also reverse-engineer game protocols and find vulnerabilities in them. There is no social good to me releasing that stuff. (No, I really don't feel like being a soldier in your Full Disclosure army.)
I do lots of coding stuff in my spare time. I don't do it to get a job, I do it because it's fun.
> So I'd easily fail the GitHub test.
The github test isn't about your what you have on github. It's about what code you can show, out in the public. Github just happens to be the common way to do that now.
If a company requires Github specifically, than it's just a stupid company you wouldn't want to work for anyways, so it saves you the trouble.
The problem is that IP agreements in the state of California say that the employer is not entitled to work done "on the employee's own time, without using the resources of their employer, and unrelated to the lines of business of their employer". Google claims to be in basically every tech-related business there is. Do something as simple as a mobile app or casual game and you can potentially get in trouble for it because it may compete with a division you've never heard of.
There's a procedure to get around this, but it's fairly slow and bureaucratic, and so many Googlers find it more efficient to do their "for fun" coding as 20% projects. Facebook has a similar system with their hackathons. Apple just works its devs so hard they don't have time for independent coding products.
I think that GitHub profiles are a good way to identify good devs who don't work for the leading tech companies, but once you're in one of them you a.) don't have time for personal programming projects anymore and b.) find that the stuff that your coworkers are doing is more interesting than pretty much anything you could work on as a solo dev.
I like spending time with my friends and family, some of which I have to travel far to see, for one.
I spend 40+ hours a week in front of a computer, when I get a chance to go out in the world, I want to GO OUT.
None of these things don't mean I don't love software (I do) or I'm not interested in it (I am). I just have varied interests.
Disregarding that, I used to work for a Big Nameless Faceless Corporation, and the legalize in employment agreement said basically that because I was a software engineer for them, they owned all the software I wrote while employed, even if I wrote it on my own time and with my own computer.
http://www.joelonsoftware.com/articles/GuerrillaInterviewing...
http://www.amazon.com/Smart-Gets-Things-Done-Technical/dp/15...
http://steve-yegge.blogspot.com/2008/06/done-and-gets-things...
http://steve-yegge.blogspot.com/2008/06/done-and-gets-things...
It's entirely unrealistic as a business strategy. It sure is nice if you luck into it.
I still have a bit to show on Github and mean to put up more when I have a chance but still, most developers find that when you've got a decade or more of experience, you start to want to take on new challenges and experiences (whether family or woodworking) in your free time rather than more programming.
It's illigal. Or at least very very legally questionable.[1] Theoretically good proxies could be attacked in the same way, but there's a difference between doing something that could conceivably be the basis of a lawsuit and doing something that the Supreme Court has specifically ruled on.
[1] See Griggs v. Duke Power Co. (1971)
http://finduslaw.com/griggs-v-duke-power-co-1971-401-us-424-...
Still, asking for SAT scores is still legal and they correlate decently with intelligence.
I do not see any way "historical wealth" could directly - without intervening variables - influence one's SAT scores. Of course, having affluent parents may mean certain value given to quality education, certain amount of care and access to development tools and so on - but then those should be primary factors considered, not wealth per se.
"Does test preparation help improve student performance on the SAT and ACT? For students that have taken the test before and would like to boost their scores, coaching seems to help, but by a rather small amount. After controlling for group differences, the average coaching boost on the math section of the SAT is 14 to 15 points. The boost is smaller on the verbal section of the test, just 6 to 8 points. The combined effect of coaching on the SAT for the NELS sample is about 20 points."
http://nepc.colorado.edu/files/Briggs_Theeffectofadmissionst...
I would bet that's far more likely.
Id love to see Paxman interview sarah palin or Ted Cruz for example.
http://articles.washingtonpost.com/2013-08-29/national/41584...
So in fact, it is more likely that people from wealthy backgrounds are able to better utilize their intelligence, and thus retain their wealth and status, whereas people from poor backgrounds are at a disadvantage when it comes to escaping their position in life.
Maybe you should actually read the article I linked to, if it would help you understand what I wrote.
I just think it's a stupid use of "disadvantaged." It implies someone else has an advantage, in to quote you, "escaping their position in life." It's like saying a bad baseball player is at a disadvantage when trying to become a good baseball player. It almost doesn't make any sense.
Same goes with the idea that poor people are disadvantaged about making decisions wrt money. Of course they are, or they quite likely wouldn't be poor any longer. To use baseball again, or any skill really, the experts of course have advantages in deciding the best course of action, and typically have more ways to achieve it.
What I've gleaned here is that you consider poor people to be novices at the skill of acquiring wealth. I agree. For some reason people seem to think it's far different from rookies in other skills, because acquiring wealth is perceived by most to be a vital part of success, happiness, health, etc.
Google, on the other hand, appears to have done away with them, and now prefers to evaluate potential hires without giving too much weight to GPA or test scores: http://qz.com/96206/google-admits-those-infamous-brainteaser...
I didn't have very good grades and my SATs were ok but not great, both primarily because I didn't study or apply myself. I was completely uninterested in school. Get me to write code and you'll see what I'm capable of. I'm certainly not unique in this regard.
And how old are you? SAT scores? I'm only in my 30s and I don't remember my what my SAT scores were or remember if they were "good" or "bad" I only know that they changed the SATs after I took them because my youngest sibling took a different one than I did, with some crazy scoring. I wouldn't be able to find my SAT scores even if I wanted to.
What does it really mean to be smart? Lately I cannot stop thinking about it. I have always been considered a 'smart person'. I am a self-taught freelance developer now - it used to be my hobby and somehow (mostly because I needed location-independent work quickly) it became my profession. I get by because everybody thinks I am smart but I feel like an impostor because the more I think about myself the more I realize that intelligence is not some general ability to solve problems - it's more just a set of very different skills that corelate to much lesser extent than people usually think and you can be really good at something that people use to judge your abilities and at the same time really bad at something else that is actually required to get the job done.
I studied sociology and I shortly worked as a data analyst. It seems to me that this kind of work requires... ehm... a different intelligence than programming. You need to be good at connecting the dots, noticing things, seeing patterns. This is my kind of thinking and I have always been good at this - doubting everything, seeing pure assumptions where other people saw 'truths', permanently creating hypotheses and alternative theories, trying to spot logical fallacies in prevailing theories... basically trying to spot things.
Programing is very different (at least it seems to me - so different tat it's even difficult do describe it). I guess it's about creating stuff, not just observing stuff. You need to build very complex and abstract mental models, keep them in your head and be able to operate with them - and this is the part of intelligence that I seem to be lacking. It just does not feel natural. I try to solve some problem and I am thinking... if this condition and that condition but at the same time not that condition... and bang!, suddenly I am lost and I don't even remember what I am doing. I cannot keep it in my head. I totally get what OP was saying about passing anonymous functions in JavaScript - I had the same experience. The first time I encountered something so simple as JavaScript closures it took me two hours to get it. And the day after that I had to repeat the whole mental process to get there again because I somehow lost it over night. This is simply not how my brain works and I think I am really bad at this. Yet people pay me for this... which is just depressing (and you understand why I write this under throwaway).
I remember our 'statistical analysis 101' professor always telling us 'remember, you are not really testing hypotheses, you are only testing indicators!' - if HR department picks wrong indicators for the skills that they actually need both company and employee are going to be unhappy - and I think this is very common because our understanding of the indicators for different kinds of 'being smart' is still poor.
Knowledge, unlike intelligence, is in practice infinite. And now you can understand the inverse Dunning-Kruger effect: intelligent people have the capacity to recognize how little knowledge they have, and can ever have, about any given topic.
I don't think I am. I guess that you are probably referring to that stuff about JavaScript because that is the only part of my post where I mention something knowledge-related. But I am not talking about the lack of knowledge of JavaScript closures or functions passed as arguments - I was talking about the fact that it was surprisingly difficult for me to grasp that concept while trying to acquire that knowledge. Let me use your own words - it was 'a matter of capacity and capability'.
If you think I am wrong please explain how I am conflating intelligence and knowledge.
Closures are not simple. They are a powerful concept, one which introduces a whole new way of thinking about programming compared to what most people start out doing. It's normal for it to take a long time, over many sessions, for the concept to sink in and become a part of your programming vocabulary.
Freshmen year of undergrad, it took me well over a week to wrap my head around this "public" and "private" concept of classes. I had only written C++ that was mostly C with structs and C++ input/output. I had never had to reason in an object-oriented way before, and it was different. It was completely alien to me that I would intentionally "hide" some parts of my code from myself. Now, it's completely natural to me.
What the author did not see was those same developers learn about closures for the first time. When she sat down with them, they had already reasoned with the concept many times. Don't confuse initial difficulty with some inherent deficiency in your mental ability.
That's a real thing. Almost all of the wildly talented people in my life feel Impostor Syndrome[0] at some level. Three Panel Soul even did a spot-on comic about it [1]
[0] http://en.wikipedia.org/wiki/Impostor_syndrome
[1] http://threepanelsoul.com/2013/10/14/on-impostor-syndrome/
edited for sane line breaks
I find the hardest park of programming is getting over hurdles as they come up, over and over and over again. It takes a while to get over fear of small failure. Also, if you're constantly reanalyzing and have a perfectionism streak you can be paralyzed quite frequently. Have you run into the same problems?
This problem was addressed nicely in this functional pearl by Jeremy Gibbons, et al.: http://www.cs.ox.ac.uk/jeremy.gibbons/publications/rationals... . As interesting as the result is, however, it's a pretty well-made point that research-level ideas from the programming languages community are not really software engineering interview material in the vast majority of cases.
This is yet another example of "rockstar developer"-itis, wherein startups are given to believe that they need the best of the best when in fact they do not. This particular example is entirely egregious because they asked her about something that requires enumerating the rationals when what they really wanted was an iOS code monkey. Then they fired her, based on their own shoddy interview.
I had a similar experience (working for family, at that), where I joined their R&D group and it went well for a while, but eventually they decided they wanted to get into selling solar power and didn't need a software/electrical engineer, so I was lectured about this or that bullshit and eventually brought into a meeting with the IT director and offered a position on his team. I realize now that they were trying to make me feel unwelcome, but I felt entirely responsible at the time. I never felt like I had a choice in taking the IT position (or lose my employment there entirely), and I hated it. The new boss was, for the most part, a nice guy, but he turned into a major nitpicking asshole over little things.
I'm at a new place now and it's still hard to kick the habit of trying to avoid coworkers because you know they don't like you and want you gone.
Culture has a huge impact on hiring and working. I wish I had been taught about culture when I was in school, I could have avoided the problems I faced had I realized the warning signs earlier.
Certainly, asking only math questions is stupid as well, people should know at least a little about the stuff they're supposed to work with, but teaching an actual language to a smart person eager to learn is a breeze compared to teaching problem solving to someone who memorized the reference manual.
I would guess that there is actually significant overlap between these two groups.
I wouldn't. Smart people get bored sitting around memorizing things. They'd rather be thinking. Purely anecdotally, the smartest people I know rarely have encyclopedic knowledge of anything.
Yes, this is more what I was thinking of as "encyclopedic knowledge" (which may not be what the parent post to mine meant by the term).
Memorising the manual is the strategy of a surface learner. Surface learners can make pretty good PHP programmers, but they'll struggle with, say, passing Javascript closures.
A deep learner will look for the underlying principles and abstractions. They can quickly get an overview that, even when it's fuzzy, is still accurate enough for them to know where the gaps in their knowledge are, so they can fill those gaps quickly when they need to. They're like Mendeleev with his first periodic table. He didn't need somebody to show him a sample of gallium to know that it existed: he could inferred its presence and properties from the overall structure of the system.
Of course, a really advanced programmer will have done both. They will know and understand everything. But those guys are few and far between.
a) IT is akin to playing computer games all day.
b) It's easy work in a climatized office with solid pay
c) The jobs are relatively secure and abundant.
I've seen many people go into IT that would much better have been employed elsewhere, so I think that we, as programmers are not more intelligent on average than the rest of the population. I might agree that people who enjoy programming have a knack for a certain type of intelligence and problem solving ability, but I don't think that programmers are limited to the group of people that enjoy programming.
The phenomenon of the Computer Science graduate who can't write a FizzBuzz program, or even the post-graduate who can't write a simple recursive function, is well attested. But a Math student who can't handle a recursive definition is unlikely to make it through the first term.
The actual pain point I read from the article is a different one: There's a mismatch between hiring process and expectations. If I need a lead programmer for the iOS project that I'm about to start next week then I can't hire anyone that doesn't know Objective C and then I absolutely need to structure my interview accordingly. But if I have a couple of weeks more I'll happily teach him. And if I'm hiring somewhat smart I try to avoid those "we need someone urgently" situations.
So yes, "a couple of weeks" is certainly not enough to transform a graduate into a project lead for bespoke iOS project, but it could easily be enough to transform a decent java programmer with solid project lead experience. Transforming a crack Objective C Programmer with no lead experience can take easily as much time, if not more.
My gist is that programming knowledge will only get you so far and depending on what position you're hiring for other experience combined with the ability and willingness to learn may be much more interesting. And whatever I do, I tend to hire for that trait since that allows people to pick up other abilities when required.
I'm speaking from experience here: I learned iOS (even after having previous MacOS X desktop devel experience) on the job, when a friend asked me to write an iOS app for her startup. I learned quickly, but made a lot of mistakes in how I structured the app that came back to bite me months later. If I'd had the time to start over from scratch, I would have done things quite differently and the whole thing would have been a lot easier.
And I was slow. Every new framework I had to learn slowed me down and added days to implementing the part of the app that needed it. A seasoned iOS developer wouldn't have run into problems like that.
Games are a bit of a special breed, though, and there are several game engines out there that hide the platform pretty well. I draw a bit of a distinction between "building and iOS app" and "building an OpenGL app that runs on iOS". The latter is much easier if you lack iOS experience but have the required OpenGL skills.
I think the point of the article is that being smart at puzzles is not enough. It may not matter whether you have 3 or 10 years of programming experience, but if you have 20 years of puzzle solving experience with only 6 months of (real-life) programmering experience you have a lot of non-trivial learning left to do.
Being in a startup setting where everyone (usually) is expected to be a bit of jack-of-all-trades, I would argue that having programming experience trumphs being smart, at least for the first period. You may be the master of finding smart algorithms to design your application, but if you can't build the first CRUD website it does you little good.
There are not only smart people and persons referencing reference manuals. Being a programmer often means solving bugs in messed-up codebases, build web apps using the technology du jour, or making data go from one place to another, and asking math questions does not help a lot to find people able to do this. This blog post resonates with some people I met.
I have been programming for a while, and went through a CS education, but my experience with hiring made me realize that being good with maths and being a productive programmer are not necessarily two things that always come together.
But that's only one part of the equation - the number of unsuitable candidates that slip through is normally more important.
Suppose that somehow we magically know that 20% of candidates would be good hires - and the other 80% are unsuitable. But we don't know which are which!
As an interviewer, I'd be very happy with an interview process that discards 50% of the good candidates and 99% of the unsuitable candidates, because that leaves me with 10 good hires and 1 unsuitable hire for every 100 candidates.
On the other hand, if a different interview process discarded 20% of the good candidates and 80% of the unsuitable candidates, that would result in 16 good hires and 16 unsuitable hires - which would be disastrous!
Even from the point of the interviewee, one probably wouldn't want to work somewhere where 50% of your colleagues are not suited to their jobs!
Summary - it's a shame to discard good candidates, but it's worse to let too many unsuitable candidates slip through ...
Every question can exclude a good candidate, especially if you only ask the question and tick the "correct/incorrect answer" box. However, often you can learn the most interesting trait from asking a question which the candidate can't answer right off the bat: How does the candidate deal with failure or lack of knowledge. Does she/he start guessing? Does she/he ask the right questions moving in the general direction of solving the problem?
I'm not checking for academic knowledge in interviews.
> and even learn new paradigms when necessary.
This often requires knowledge about the stuff you don't know. That is a value of formal education: Not the stuff that you memorize, the bigger value I derive from my formal education is all that "I know that there's a solution to the problem but can't remember exactly" kind of knowledge. I can't remember all the sort algorithms I had to code, but I remember there's more than one and that there are tradeoffs between all of them. So if I'm constrained on memory and have a pre-sorted list I can go luck up how bubblesort is implemented exactly. That's a knowledge that self-taught programmers often lack [1].
> being good with maths and being a productive programmer are not necessarily two things that always come together.
No, nobody proclaimed so. But having a trait for problem solving and logical puzzles certainly helps :)
[1] n.b: often. Some of them have read and digested tons of theory books which could count as formal education.
Some research suggests that tests are much better at predicting performance than informal grading.
Furthermore, I've known plenty of smart math people that just never seemed to be able to program (well). I think they are different skill sets, certainly with plenty of overlap, but plenty of differences as well, and those differences matter. I laughed out loud at the "variables, variables everywhere!" answer in the OP - I've had to deal with so much code written that way. Some people, very smart people, just don't 'get' design in that way. I worked with a guy that used to run around the office, asking brain teasers, sharing tidbits of knowledge, but he couldn't execute a basic project - couldn't plan what to do, couldn't do things in a rational order, couldn't experiment and gather data, couldn't incrementally design, develop, refactor, nor do a big-bang waterfall kind of design, and so on. He was not sorely missed when let go. Smart as a whip, and useless (for programming).
I've worked at several companies with staff mathematicians. Sooner or later they got their hands on a compiler. Oh my. No, let me do that. You tell me what is wrong with my Kalman filter, but I'll take care of the implementation, thank you.
Its easy to kvetch at somebody else's answer without offering an alternative (I do agree whiteboard progamming is disastrous). So, instead of asking math, why not ask them to write a simple routine, but then start asking real world problems about the code they would face - how would you make this API interface robust? What kind of documentation would you write. How would you handle errors? Is this code exception safe? Thread safe? How would you make it either/both of those. Suppose your problem size was n=100MM, how might you need to change this (say they have a data structure that loaded everything into memory)? Ask them some problems they will see in production - what is the network delay, or whatever your problem case is. You still get to see how they approach problems, but in the context of the actual decisions they will be making while programming for you.
Anyway, that is what I try to do. I am revising my thoughts even on that, because I find people flopping on the 'code the simple problem (and, it is simple)' yet doing great on all the engineering questions, and doing fine if we hire them.
Did you read my post? May I quote myself:
> Certainly, asking only math questions is stupid as well
So what I actually advocate is asking questions about the field that the person is going to work in. I still like to ask some math questions - a lot of the stuff that programs deal with basically fall back to math. Heck, all relational database stuff falls back to set theory, so knowledge in that area certainly helps a lot. I'm not advocating employing pure theoretical mathematicians to develop contact forms in php. However, from my experience the following two statements hold true:
* Studying CS does just about nothing good to your actual programming skills and your knowledge of real-world problems. So just don't expect recent graduates to be able to develop a program in a rational order, using a reasonable process, refactor or any of the skills you're asking for just by virtue of having "programmed". If you're looking for an experienced programmer hire for an experienced programmer, but the OPs tale clearly shows that she was no experienced programmer - why would I quiz her in the way I'd quiz a 10-years-learned ruby programmer?
* If you have time to teach and educate a programmer, prefer a smart and eager type over someone who spools down memorized knowledge. While memorized knowledge can sometimes help, the ability to learn and educate yourself is much more helpful once your memorized stuff is not saving you.
Your first asterisked point does not at all square with my experience. It depends on the program of study; I've certainly come across kids with no real pragmatic ability, and other programs that turned out, as much as you can in that environment, very pragmatic and skilled programmers. Certainly this is a skill set that improves over time. But let's not quibble over that; you raise a larger, valid point about interviewing recent grads vs more experienced people.
As far as that goes, I try to question them about school projects. "So, if I was to try to take that and do Y with it, what would be the consequences" type questions. Like you w/ the math questions, I do not expect any particular expertise and experience in actually solving the problem. But, I can start to see how they think about things. If they aren't thinking that clearly, throw them a bone and see what they do with it. Does it give them an 'aha' moment that then leads them to a better answer (I infer, perhaps incorrectly, that they can learn and be mentored), or do they just stonewall, not make the connection, or what have you. My suggestion is pretty simple. Measure what you want measured, not some proxy. I will point out that recent data suggests I am right. Google has admitted that all of their algorithm type questions are not good predictors of on the job performance, but questions about experience and "how would you X" are. I don't consider their data the last word on the subject (their hiring is quite narrow after all), but certainly suggestive.
I absolutely agree with asterisk 2, so I didn't address it.
The author uses a graph search problem as an example - which is a very typical problem in IT. How do you approach such a problem? This is a valid math question that certainly adds value compared to other questions I might ask. It actually checks for multiple things: Does the candidate have a grasp of the underlying mathematical concepts. How does the candidate approach a problem decoupled of the actual real-world constraints of a programing language? Can the candidate describe a problem in clear, concise terms? Same for set theory: intersection, union, functions mapping input to output. Complexity analysis of algorithms - all of that is valuable knowledge and it's absolutely valid to ask people for that. How does binary AND/OR/XOR work? How does an exponential decay curve look like compared to a gauss or linear curve? This GH issue https://github.com/elasticsearch/elasticsearch/issues/3423 was posted on HN as example of a great feature description and it's full of formulas describing how it works. Vectors, matrix multiplication is a fundamental thing when you're doing natural language processing. Statistical problems are not exactly uncommon in programming either. Map/reduce are mathematical concept. What's wrong asking for that? Failing the answer does not mean that the interview is over, but to assert a candidate I need to know what she knows. As annoying as it sometimes is, math is _the_ _fundamental_ underpinning of what we do every day.
> As far as that goes, I try to question them about school projects.
Totally fine and I agree. Still - what's wrong with asking math questions?
> Google has admitted that all of their algorithm type questions are not good predictors of on the job performance
You're running into a problem if you hire only for math knowledge. But -repeat- that's not what I've been advocating.
Asking math questions that are unrelated to the employee's tasks has strong bias for recent graduates. Ask a 40 year old a question about an equation they haven't used since they were 19 and they won't remember.
I was once asked to do binary math on a phone interview. I hadn't had to do binary math since I was in school 10 years prior. I was pretty much guaranteed to fail. This was not a good test. If I needed it I could easily relearn binary math in a few hours at most.
One example I use is getting the candidate to write crud, list, and search controller actions for a simple category data structure. Given a basic category data model (e.g. Name, Parent), the candidate starts with the crud actions.
Crud actions aren't meant to be difficult to solve and serve as a basic screener to verify the candidate has working knowledge of the basics. The only edge case I look for the candidate to ask about is if orphaning child nodes is allowed (I.e updating parent node, deleting a node with children)
List action(s) start getting more interesting since recursion comes into play. A basic implementation of an action that can load the tree given an arbitrary category as a starting point is expected. If the candidate has some prior experience, a discussion of what performance concerns they may have with loading the category tree is a follow up question. The tree loading algorithm is then expected to be revised to handle an optional max depth parameter. An edge case I look to be considered is how to signify in the action response that a category has one or more child nodes that weren't loaded due to a depth restriction.
The search action implementation has a degree of difficulty scaled to the candidates experience level. All candidates have to write an action that returns a collection of categories matching a search string. Those with previous experience are asked about a paging solution. Senior level candidates are asked to return matching categories in a format that indicates all ancestors ( for instance: "Category 1 -> Category 1.1 -> Category 1.1.1" result for search string "1.1.1")
For an added degree of difficulty, candidates can be asked to recommend data model tweaks and algorithms supporting tree versioning requirements necessary to allow for loading the category tree's state at a given point in time.
The candidate's performance to this exercise seems to give some insight into their level of experience and ability to implement algorithms from a common real world example without having to ask much trivia or logic problems.
Although if you've been doing this interview for a while, you're bound to have come across someone who mentioned it, so I'm sure you're familiar.
Then the GP goes into detail about a tree-like structure of categories and their parents. If you're not familiar with trees and graph algorithms this might be quite daunting.
Do some googling on the terms I mentioned and please ask about specific things you do not understand.
Minor correction: create, READ, update, delete
At one company I interviewed with, I was asked to implement a queue using two stacks. At that time in my programming career, I had worked with C, C++, Obj-C, Lua, Python, JavaScript, SQL, and a handful of DSLs developing games, game development tools, and web applications. Want to know what I had never done? Written a queue using two stacks. My immediate response to the question was, "Why would you want to do that?"
If you really want to know if someone has the capacity to pull their weight as an engineer, ask them about what they've built. Even if they are fresh out of college, the best engineers will have projects they can talk about and explain. Ask how they approached/solved specific problems. Ask what they're most proud of building. Ask what was most frustrating.
Those are the kind of questions that will provide insight into a person's problem solving capabilities and offer a decent picture of what they're capable of doing.
"To find out if they can get stuff done, I just ask what they’ve done. If someone can actually get stuff done they should have done so by now. It’s hard to be a good programmer without some previous experience and these days anyone can get some experience by starting or contributing to a free software project." http://www.aaronsw.com/weblog/hiring
Now that I know this would be for a functional language, it makes way more sense. At the time I couldn't get over why you wouldn't just use a doubly-linked list like the standard implementation in most OO languages.
This would test programmers ability to learn a new language.
Before the internet my friends and I sometimes used to get to together, everybody got some time to write a Corewar warrior on paper, and then we'd watch the tournament together. It was great fun.
How long do you expect your interview to last?
Probably because the only person who doesn't lose from this is the interviewer: they get to have fun. Honestly, when you spend all day buried in code, it's fun to play with puzzles for a change.
Perhaps it's time we started optimizing interviews for hiring success rather than interviewer happiness.
Then do a short-term contracting gig (maybe just 1 day). If it works well, hire them.
Edit: clarify length which even the best people could do.
Also, I don't think it needs to be a long gig. Maybe even just a day, which isn't much longer than the gauntlet of technical interviews some companies will put you through. Even that short period should be enough to see if someone works well.
Truly high quality people are generally known by their reputation and are headhunted rather than expected to answer job ads.
They generally have a long history of awesome projects they have worked on, and they've built years of reputation through working on such projects.
And they just don't pick up any other project in any other company. They are pretty much clear about the best kind of problems they want to work on, and they don't wish to waste their time other than that.
Every time a company boasts about having a process to hire only 'A' candidates I chuckle. The 'A' or even 'B' candidates aren't even up for hire. The interview process begins with 'C' people.
Ideally, all of them. It's not hard to find a couple one-off tasks that you'd like to see done in a day. Or could could proceed sequentially until you find one whose work you like.
The position I was filling is a part-time position for a CS major, sort of like an internship. I devote time to develop his/her skills, s/he would get real-world experience, and a little money to help with cost of living. If everything works out, a position could open up for full employment.
I had a pretty good idea what I was looking for. Someone that had good grasp on theory but had no experience coding. Preferably enrolled in Uni. I had 5 applicants but the only candidate I interviewed is enrolled in Math-CS.
I basically tried to gauge if he had deep interests and asked him to code a bit, solve a simple control (find me the article with the highest hitcount from the day a week ago, gave him 10 minutes).
He failed the coding test but I made the hire regardless. Reason why was 2 things out of the 4 hours we spent together: When I asked him who he considered the father of CS he rattled off von Neuman, Djikstra and Knuth. Yeah, you can make that argument I suppose, but he knew who the influential people were. The other thing was: even if he failed the coding test he failed it by not reading the code examples quite right, he was using my code to try to help himself solve the problem. I'm sure he'll work out.
We as a field should employ internships a lot more than we do, get the college kids and undergrads working on real-world problems a lot more than we do.
I just don't have the experience or tools or interest for them.
And yet, somehow, in 20 years of business geekery I've never come across a problem I can't solve.
Maybe when writing Tetris for J2ME I would have saved myself 10 minutes googling if I'd had the experience to realise that right angle based matrix translations don't require fp maths and maybe when writing financial indicators, I'd have saved myself half a day if I hadn't had to look up integrals but this sort of stuff is definitely in the minority as far as my experience goes.
I believe this is deeply valuable. For some roles, I would much prefer to hire someone who can quickly see the value of breadth-first search from both ends.
If he/she doesn't happen to know the syntax of Ruby, or Java, etc. it's less important to me.
I think that was the thrust of the article. If you're hiring based solely on someones math and algorithm skills with zero concern about their coding skills, you cannot turn around and be angry when their coding skills aren't what you needed. It's not math vs programming as such, but more generally about tuning your interviews to finding the skills you actually need (as opposed the skills you think you need).
This is your company, correct? (I stalked your Github profile)
Seems like the types of problems you're solving are exactly those which require far more domain experience with Ruby/HTML5/Javascript/whatever than the ability to see the value of various graph-searching techniques.
Would you hire this guy even though he's said quite plainly that he lacks the experience with these technologies (and has difficulty picking up new ones owing to that lack of experience)?
Some of our projects have us on site, side-by-side with a client's staff programmers. These projects involve millions of dollars, hundreds of stakeholders, and years of existing code. The programmers have a wide range of skill levels.
The work in these projects involves figuring out the project's objectives, goal decomposition, some agile/lean PoCs, then developing the BDD, MVC, DCI, API, CQRS, SQA, etc. Much of this can happen in pseudocode.
We also do pair programming, code reviews, brown bag demos, cross-training, and the like. I believe all these can help with developers getting up to speed with language syntax.
That said, choose the right person for the job. YMMV.
I also believe algorithmic knowledge is important, and tend to give algorithm questions to my candidates, but it matters more for those who will write databases and game engines than for those who will write CRUD apps.
Far more important is how / when to index an database table, how to design the tables in the first place.
If I need an efficient algorithm, in most cases someone has written (and tested) it and put it in a library.
Bringing it full circle, a puzzle is just a peculiar form of algorithm, most of the time. You don't want to hire someone who will sit around thinking about graph puzzles and how to measure 4 liters when you only have a 5L and 3L beaker. Google it and get on with the job.
If the person wrote the code in such a way that no one else could understand that it was a breath-first search, is that valuable? If they didn't even leave comments when they write code? If they didn't realise that you're using some slightly arcane feature of your language to keep a library of useful tree operations, and was expected to use the pre-existing function through macros/generics? Or was expected never to use such a technique because half the team wouldn't understand the code?
Hey, I know the theory on how to bake a large amount of cakes, breads, cookies, etc. I learned it by watching it on TV, and from cookery books. But actually it turns out that I'm a pretty crap baker, because I lack experience to know when I'm over-working/under-working dough, how to adjust cooking time with an unknown oven, etc. And I make a huge mess when I'm doing this, and take a lot longer than anyone with basically any experience of doing it at all.
Interviewer: "How can we optimize the character replacement in a string such that we use no extra memory?" Me: "We do this and that and this. But, should we consider what situations we would need this optimization?" Interviewer: "What? Why?"
I can now use this as a filter as I interview organizations. Optimizing algorithms by creating your own core data structure classes (instead of using the built-in ones) is great in certain circumstances, but an absolute waste of time in many others. And if you're not going to ask me about those times when making those improvements is important, then you're not asking questions for a programmer -- you're asking them for a theoretician who can recall syntax.
It's poor practice, and I've seen it everywhere.
The review article by Frank L. Schmidt and John E. Hunter, "The Validity and Utility of Selection Models in Personnel Psychology: Practical and Theoretical Implications of 85 Years of Research Findings,"[1] Psychological Bulletin, Vol. 124, No. 2, 262-274 sums up, current to 1998, a meta-analysis of much of the huge peer-reviewed professional literature on the industrial and organizational psychology devoted to business hiring procedures. There are many kinds of hiring criteria, such as in-person interviews, telephone interviews, resume reviews for job experience, checks for academic credentials, personality tests, and so on. There is much published study research on how job applicants perform after they are hired in a wide variety of occupations.[2]
EXECUTIVE SUMMARY: If you are hiring for any kind of job in the United States, with its legal rules about hiring, prefer a work-sample test as your hiring procedure. If you are hiring in most other parts of the world, use a work-sample test in combination with a general mental ability test.
The overall summary of the industrial psychology research in reliable secondary sources is that two kinds of job screening procedures work reasonably well. One is a general mental ability (GMA) test (an IQ-like test, such as the Wonderlic personnel screening test). Another is a work-sample test, where the applicant does an actual task or group of tasks like what the applicant will do on the job if hired. (But the calculated validity of each of the two best kinds of procedures, standing alone, is only 0.54 for work sample tests and 0.51 for general mental ability tests.) Each of these kinds of tests has about the same validity in screening applicants for jobs, with the general mental ability test better predicting success for applicants who will be trained into a new job. Neither is perfect (both miss some good performers on the job, and select some bad performers on the job), but both are better than any other single-factor hiring procedure that has been tested in rigorous research, across a wide variety of occupations. So if you are hiring for your company, it's a good idea to think about how to build a work-sample test into all of your hiring processes.
Because of a Supreme Court decision in the United States (the decision does not apply in other countries, which have different statutes about employment), it is legally risky to give job applicants general mental ability tests such as a straight-up IQ test (as was commonplace in my parents' generation) as a routine part of hiring procedures. The Griggs v. Duke Power, 401 U.S. 424 (1971) case[3] interpreted a federal statute about employment discrimination and held that a general intelligence test used in hiring that could have a "disparate impact" on applicants of some protected classes must "bear a demonstrable relationship to successful performance of the jobs for which it was used." In other words, a company that wants to use a test like the Wonderlic, or like the SAT, or like the current WAIS or Stanford-Binet IQ tests, in a hiring procedure had best conduct a specific validation study of the test related to performance on the job in question. Some companies do the validation study, and use IQ-like tests in hiring. Other companies use IQ-like tests in hiring and hope that no one sues (which is not what I would advise any company). Note that a brain-teaser-type test used in a hiring procedure could be challenged as illegal if it can be shown to have disparate impact on some job applicants. A company defending a brain-teaser test for hiring would have to defend it by showing it is supported by a validation study demonstrating that the test is related to successful performance on the job. Such validation studies can be quite expensive. (Companies outside the United States are regulated by different laws. One other big difference between the United States and other countries is the relative ease with which workers may be fired in the United States, allowing companies to correct hiring mistakes by terminating the employment of the workers they hired mistakenly. The more legal protections a worker has from being fired, the more reluctant companies will be about hiring in the first place.)
The social background to the legal environment in the United States is explained in various books about hiring procedures,[4] and some of the social background appears to be changing in the most recent few decades, with the prospect for further changes.[5]
Previous discussion on HN pointed out that the Schmidt & Hunter (1998) article showed that multi-factor procedures work better than single-factor procedures, a summary of that article we can find in the current professional literature, for example "Reasons for being selective when choosing personnel selection procedures"[6] (2010) by Cornelius J. König, Ute-Christine Klehe, Matthias Berchtold, and Martin Kleinmann:
"Choosing personnel selection procedures could be so simple: Grab your copy of Schmidt and Hunter (1998) and read their Table 1 (again). This should remind you to use a general mental ability (GMA) test in combination with an integrity test, a structured interview, a work sample test, and/or a conscientiousness measure."
But the 2010 article notes, looking at actual practice of companies around the world, "However, this idea does not seem to capture what is actually happening in organizations, as practitioners worldwide often use procedures with low predictive validity and regularly ignore procedures that are more valid (e.g., Di Milia, 2004; Lievens & De Paepe, 2004; Ryan, McFarland, Baron, & Page, 1999; Scholarios & Lockyer, 1999; Schuler, Hell, Trapmann, Schaar, & Boramir, 2007; Taylor, Keelty, & McDonnell, 2002). For example, the highly valid work sample tests are hardly used in the US, and the potentially rather useless procedure of graphology (Dean, 1992; Neter & Ben-Shakhar, 1989) is applied somewhere between occasionally and often in France (Ryan et al., 1999). In Germany, the use of GMA tests is reported to be low and to be decreasing (i.e., only 30% of the companies surveyed by Schuler et al., 2007, now use them)."
[1]
http://mavweb.mnsu.edu/howard/Schmidt%20and%20Hunter%201998%...
[2]
http://www.siop.org/workplace/employment%20testing/testtypes...
[3]
http://scholar.google.com/scholar_case?case=8655598674229196...
[4]
http://books.google.com/books?hl=en&lr=&id=SRv-GZkw6TEC
[5]
http://intl-pss.sagepub.com/content/17/10/913.full
http://www.economics.harvard.edu/faculty/fryer/files/Fryer_R...
[6]
http://geb.uni-giessen.de/geb/volltexte/2012/8532/pdf/prepri...
1) The main thing to look for when hiring programmers is programming work samples. In general, for any kind of work, a work-sample test will tell you more relevant information about which person to hire than any other kind of hiring procedure. (Some other kinds of hiring procedures have incremental validity in addition to work-sample tests, but none have higher validity than work-sample tests.)
2) Insofar as a math quiz question purports to figure out which applicants are smart and which are not, it is legally risky, as are IQ tests and AS ARE EDUCATION CREDENTIAL REQUIREMENTS if the quiz question is not validated as related to bona-fide job requirements. The company that publishes the Wonderlic personnel test hires a lot of psychometricians and lawyers to be able to defend the use of that test for hiring for dozens of kinds of jobs, and I think the balance of the evidence across hundreds of studies on many different job categories in multiple countries shows that general mental ability matters for performing most kinds of jobs well. But in the United States, a smartness test that a hiring manager just makes up is legally risky. It's a good idea to hire smarter rather than dumber job applicants, but it's an especially good idea (for legal protection in the United States) to make sure that the smartness test you use has been validated for your workplace.
The research I'm referring to is more generalizable across more occupations than you suggest. In other words, the usual relevance of my FAQ about company hiring procedures in the frequent HN threads about company hiring procedures is that companies almost always go wrong by 1) NOT using work-sample tests, a very good way to find competent workers, and 2) often go wrong by posing trick question tests, presumably to find smart people, without validating those tests and ensuring that those tests don't have disparate impact on applicants. Companies can and should do better, and research tells them how. The people who often complain on HN about company hiring procedures are largely correct, but usually just share anecdotes about what they would do differently if they were hiring, or what they would like hiring managers to do the next time they apply for a job. Research on this topic is abundant, and it applies to people seeking work as programmers as well as to most other occupations.
That is brand new to me. I would love it to be true, but I've never encountered it in reality.
It's a shockingly sensible piece of legislation.
Some interesting consequences that I know have been tested in court:
You can't be 'over-qualified' for a job, that's a form of age discrimination. An over-qualified person shouldn't be less able to do the job.
You can fire someone for wearing a niqab if it stops them from doing their job (e.g. teaching English to young students to whom English is a second language).
So, if you can show that not having the qualification doesn't disadvantage you then I would expect that'd be a legal issue.
Yes, I did say that. I was surprised to find, upon a close reading of the Griggs v. Duke Power, 401 U.S. 424 (1971) case,[1] that the Supreme Court held in that case that not only was an IQ test an illegal hiring requirement, in the circumstances of that case, but so was a high school diploma requirement. The usual headline description of that case mentions only the holding about the IQ tests, not the holding about school credentials. Either kind of requirement could be challenged by a rejected job applicant based on that Supreme Court precedent.
[1]
http://scholar.google.com/scholar_case?case=8655598674229196...
And if you still disagree, don't downvote to express your mindless politics. Simply give me the names of the vast horde of African engineers and scientists waiting for a chance. I will hire them and become the world's first trillionaire.
But anyway back when I was living in France I've had the chance of studying and then working with a lot of great engineers (electrical engineers mostly) coming from Africa: Marocco, Tunisia, Togo, Cameroon, Rwanda, etc.
This is neither a rare nor surprising occurrence: engineers coming from african countries are plentiful and very competent. Maybe you didn't find them because they are not waiting for you to give them a chance: turns out they are as hard and expensive to hire as anyone else...
I suspect that a lot of what you were seeing in France was selection bias. The most talented third-worlders immigrate at a very high rate to the former imperial states. France gets the Africans because they colonized Africa extensively and were not especially vicious. If you moved your company to Rwanda, you would find that very very few locals would be trainable for engineering work.
Also, how good of a GMA score is needed? That is, how good of a score would be needed for me to stop looking at other candidates?
1) "Validity" here means hiring of better rather than worse workers, as all workers can be rank-ordered as to work performance, as compared to doing nothing to select workers.
2) Usually in hiring, it's enough to outrank someone else in a hiring criterion, for example general mental ability, without necessarily reaching any particular score level. The general idea is to rank higher than the other applicants when applying for a job, and to choose higher-ranked rather than lower-ranked applicants when hiring other people.
I'll see if I have time to add specifics later after some activities with my family.
I guess what I'm trying to do is turn your interesting information into an actionable strategy.
Let's try a scenario: Let's say I have a job opening for a senior developer. My goal is to recruit the best possible candidate. I put out the job description, and I get 20 responses. I give them all the same structured interview (.53 validity). I also ask for a work sample (.54 validity). So, in terms of these validity scores, what do the numbers represent? Does a .53 validity say that the applicant who scores better will have a 53% chance of performing better in practice?
Anyway, lets say I somehow qualitatively interpret their interviews and samples, and using some rubric, rank them. (But, how do I know that my qualitative review is even valid?) Then, I give the top candidate an offer.
How do I determine how much better the top candidate is than the 2nd top (to give an appropriate offer)?
Also, how do I know if need to continue interviewing another 20 candidates?
Nearly 100% of the applicants were remote, so I think that helped me from falling into traps of poor "traditional" hiring practices.
The point of hiring these remote folks was to help accelerate whatever team I was on. It can be a great way to scale your existing team very quickly if you know how to do it.
For example, I took over an iPhone app dev team and it was taking them 4 months to produce an app. These apps were all very similar in functionality, but the developers were spending a ton of time slicing images, testing, and other tasks that remote workers could easily do. So I hired some remote staff (via oDesk) to do most of that supporting work and we got the app production time down consistently to 1 month. That was a huge ROI for the business since the total cost for all remote staff was the same as for 1 additional on-site engineer.
There's nothing magic about hiring well, but I've watched others try to hire remote staff and the vast majority of them try once, fail, and give up on it.
They will approach the hiring process in a traditional way (personally interview them to watch how they handle puzzles, etc). It's a grueling process and then they still get really poor hires and conclude that "outsourcing doesn't work".
It's most helpful to think of the process as panning for gold. (Naturally, I'm not saying that some people are more valuable than others innately, just that you're looking for those who are most valuable at performing your given tasks.)
So, to find gold, you must filter, filter, filter. That's the exact process for finding applicants that are high performers. Most of your applicants will be pretty terrible at the job you're hiring for, so the filtering process is critical for success.
- filter out the very worst applicants with a small easy question
- filter out the remaining applicants:
- pick a real-life production task you've recently completed
- ensure that the task is *exactly* what they'd be doing in the job
- have them perform the task
- compare their task results to your task results
- hire more than you need of the top performers
- filter out (gently fire) the ones that aren't as good
- repeat as needed until you have gold
When I see others attempt this, the most common problem is that they essentially go down to the river and just grab whatever pebbles they see in their first handful and hope there's gold in it (hire without filtering). Or they go down and carefully pick the prettiest pebbles hoping they will be gold (wrong filter / puzzle interviewing). But the only way to really find gold is to seriously invest in a filtering process that will yield actual gold. That means filtering based on their ability to do the actual tasks they'll be doing on the job.The great thing about hiring remote folks is that I care 0% how they get the task done. I don't care if they've automated it, or have their mom do it for them, or whatever. If they provide the results I need, I'm happy, period.
There are plenty of other smaller caveats and gotchas to watch out for, but I'll try to cover those in a blog post sometime.
If you're a startup and want to go faster, try this out by off-loading some of the grunt work from your staff. It can be a big competitive advantage if you can do it right.
They may have performed work for you, and they might not have gotten paid. You open yourself to so much liability it's not funny. A judge would look very unkindly to such practice.
On odesk you hire people for projects of limited time.
He didn't mean that you don't pay the people you've hired if they do the work they promised - that will get you kicked out of odesk really quickly.
What he does mean by "gentle fire" is "don't hire them again for more work".
And that's how it's supposed to work: odesk freelancers have no right to expect being hired by you for second job if they didn't perform to your satisfaction on their first job, for which they were paid the amount they agreed to be paid (just to make this clear).
I guess you could think of it like a load balancer distributing work. If there is a worker that is less responsive or sending poorer results than the rest, then you start sending less and less work to them. Ultimately, you run out of work for them since it's all going to the higher performers.
At that point, there's no point in continuing the contract with the lower performer. So, then I will let them know and end the contract and give them the best review and feedback I can while still being honest about their performance.
It's worth noting again that these are short-term part-time contracts, so this already fits within the contractor's expectations. They don't expect this job to last forever and they're generally not too heartbroken if a contract ends. They are often working on multiple contacts simultaneously, so mine is just one of several contracts.
Ultimately all contracts end, even for the best workers. The nice thing about hiring temporary contractors is that their expectations are already set that this is a temporary engagement.
That is in my basic understanding of contracts it is assumed as part of the contract that there is good will between both parties to fulfill what is set out in the contract. Practices such as these would indicate that the company has no actual intention of hiring the employee and is using the hire as an additional filter.
I suppose if the contract stipulated that there was a trial period or some such it might be a way to wiggle out of it. From a quick google search it seems you can either sue for Fraud (they advertised a permanent position and that wasn't the case, or they didn't make it explicit that the position was temporary) or Breach of Contract if they didn't specify that you were in a trial period.
Would love to hear from someone with better grasp of the situation.
In the US, generally people are employed at will (http://en.wikipedia.org/wiki/At-will_employment) which means an employee can be dismissed by an employer for pretty much any reason and an employee can leave their job for any reason, without any notice.
There's some exceptions (for example, discrimination) but you're free to take a job in bad faith too.
Let's make an extreme example: I interview Anderson, Beth, and Charlee. I like Anderson and Beth, but Beth is a better fit for the team. Charlee is terrible.
Meanwhile, All three are interviewing with my competition. So... I give jobs to Anderson and Beth. I offer Anderson a very good salary just to make sure he doesn't go to the competition. They hire Charlee, and that's a win for me. Now I fire Anderson.
I suggest that if this was my plan all along, I wronged Anderson when I offered him a job in bad faith. I may not have wronged him when I used the "at will" provision to fire him, but I wronged him when I fraudulently offered him a job that I had zero intention of letting him earn the right to keep.
It's part of the balance between keeping a good economy and recognising that jobs aren't just profit generation for employers, but also the means by which people support themselves and their families.
The difference is not just semantics either. If they have other work already, the odds that they accept your first contract will depend on what you told them at the start.
This is how I was hired at my current job though. I was laid off for a few months, and a contract to hire position opened up. I took it, because it was better than not working -- but I would have never considered it if I was working at the time (they ended making me a permanent offer after 3 weeks, instead of 6 months, and I really like the place, so it ended up working out).
Do you know what's the general principle called, or have a reference ? Something like "hiring without intention of providing work". Wrongful hiring ?
God I would hate this. I'd rather be told that my work sucks, and shown examples of better work, so that I could actually improve and not just wonder if I was let go for some arbitrary reason. If I disagree with you BFD, life goes on, but I'd at least like to know if it was related to my output or not.
The feedback I give is also gentle. Well, I guess everything is done gently. These are all good human beings your dealing with, so why not be gentle? Gentleness doesn't mean you aren't honest with them. It just means that you are considerate of their feelings when working with them.
Have not used math questions at this stage as it seems a bit too obtuse and not to-the-point. Better to ask an actual coding question if you are hiring a coder. However I have had success in hiring people that have been involved in maths olympiads or also in coding competitions.
There's nothing in this that indicates it is at all customized for the article it is attached to. Especially given that you and the author seem to have some things in common (connection to small-town Minnesota & love of mathematics) it seems like you could have done a lot better than just re-posting virtually the same comment for the 11th time.
You have to go about half way down the page to find a comment that actually engages with the article. The way the HN system works out in practice the "winning" top level comment determines the entire structure of the ensuing discussion. I think that means that top level commentators have a particular responsibility to comment well.
The currency of actual cash money, which is not provided in our information-sharing environment here on Hacker News, would free up time for me to customize each comment I post more thoroughly. Under current conditions on Hacker News, I will continue to post for free, and I hope some of my comments are worth more than I bill for them.
Thank you for letting me know your opinion.
Most of the time one's hopes are not as valuable outside that person's head as they are inside.
If you're not interested in engaging the community except in terms of price, why participate?
I was interested in sharing information, did, was evidently appreciated for sharing the information, but also still criticized for how I did so. Fine. But I will go on sharing information here in a manner that fits my work schedule and other personal responsibilities. If all I dislike about somebody's comment is the MANNER in which it was written, when the content is accurate and helpful, my own style is not to complain about that.
If it's more than a 10-minute job, you should be paying for them for the work.
Being a developer is 80% Google and 20% actual coding knowledge. We are hackers at the end of the day, not miniature Einstein's with encyclopaedias for brains.
After years of being a programmer, I still can't.
“Never memorize something that you can look up.”
― Albert Einstein
OK, so there is a difference between computer science and programming. that's why there are two different stack-exchanges:
cs.stackexchange.com
stackoverflow.com
And we can make even finer distinctions if we wanted to.it's actually really fucking INCREDIBLE that
* you can know tons of CS without being able to build a decent app * you can a decent facebook clone without having any idea how it works
I feel really bad for Emma. I was a math major, but app developers won't even look at me b/c I'm not a full-stack whatever. So now I'm a Data Scientist at an advertising firm in Puerto Rico.
I moved to another country (Puerto Rico) have 2 excellent data scientist jobs and have enjoyed every day since.
We definitely do C programming at my program (shell, malloc implementation, thread pool, web server, MIPS assembler/interpreter etc.). I go to Virginia Tech, a public university.
Basically CS is a huge field and any assumption you make about someones skills just because they have a "CS degree" is almost certainly false to a greater or lesser degree.
Knowing everything about painting doesn't make you a good painter :).
Then again no one automatically expects an art history major to know how to paint (even though there no doubt is quite a bit of overlap).
I don't think I could write a simple echo clone in C anymore.
I miss C, but since entering the "real world" I haven't written a line of C for work purposes.
I tend to hate the interviews that ask me to solve math and logic brainteasers because I don't see the value in them regarding my knowledge of programming.
For example: "This database contains 100,000 problems with standardized parameters. The problem definition is defined in the file spec.txt which you can grab from our code repository. Write the code to solve these problems efficiently, passing each solution to a remote service via POSTing to a REST API, the documentation for which you can find here. Bonus points for parallel execution. Feel free to use any editor/IDE and reference online documentation, Stack Overflow, etc. that you want. If anything's not clear or you need a hand with something, just ask as you would if you were an employee already. Ready to get started?"
The great thing is that once you've identified a candidate, you can do remote screen sharing and have them write code before they even have to come into the office. I've interviewed a fair number of remote people this way and it's excellent for weeding out the people who can talk the talk but can't program worth a damn. And it limits bias because you don't care about much beyond their communication ability plus their technical ability.
That aside, one must have a way to measure the abilities of a candidate -- and asking the same set of questions to many people allows you to compare the answers as apples to apples.
I generally don't restrict my people from asking any particular question, but I will ask them to consider what a failed answer really means for the specific job (questions are generally adjusted then).
As an aside, some questions of mine that aren't specifically about coding:
* do you code outside of work (a love of coding translates to good coders)
* send me a link to some code you've written that you are proud of (let see what you got)
* tell me about a problem you had where your solution wasn't correct (how have you dealt with failure).
If one is good and quick in problem solving or has high GMA, that does indicate that he has the capacity to handle new and difficult things in general, but says nothing about the speed with which he can handle a particular new thing. Author's example with JavaScript is very good illustration how difficult can it be to learn a new paradigm for the first/second time.
Anyone who supports math puzzles (or whatever else) in an interview would have to argue that their perception of the candidates performance offers a clear enough data point that it doesn't dilute other information available to them. Given Google's study finding data otherwise, they certainly have the burden of proof.
I really understand that a startup with scarce resource would like to do its best shot. However as discussed long ago (https://news.ycombinator.com/item?id=2385424), it is really frustrating that asking math puzzles are assumed as the best way to hire the best for the job.
Because of this I've pretty much given up on hiring graduates based on their technical skills so instead I'm looking for someone smart, who gets that they've got a lot to learn, who is interested in technology and can get on with the other people in the team.
I don't think asking people math questions per se is a great idea, but if you've studied a maths degree it's a good way of working out if you're smart and if you were paying any attention at all during university.
(Incidentally this may be different in other countries (I'm in the UK) or in a company where you're able to attract the very best who have picked up really solid skills, but for most organisations that's not the case as most graduates spent more of their own time in the bar than coding.)
If a startup asks you to solve math puzzles, it's possible that the work you will be doing heavily involves the creative use of math or information analysis. (This is more broadly valuable than many people recognize.)
Also, it's also possible that that particular startup doesn't know how to effectively interview.
It doesn't sensationalisticly mean all Startups (capitalization yours) don't know how to effectively interview.
Also, rather than focus on your ability to learn, I would humbly recommend you reconsider the basic nature of employment. An interview should be considered a two-way conversation. You're not selling yourself as a slave, you're entering into a mutually-beneficial, private, voluntary arrangement. Thus, even someone who goes into an interview willing to accept anything and everything they offer could be expected to ask simply, "And what exactly will I be doing?" But better yet, grill them about every nitty-gritty detail you can think of. Although some insecure interviewers may be taken aback (I'm guilty of asserting the interviewer was wrong on more than one occasion, both times still receiving an offer), I for one am impressed when a candidate demonstrates a sharp, critical and skeptical mind in this way.
[1] http://www.codinghorror.com/blog/2007/02/why-cant-programmer...
However, you're probably not looking at the places where such programmers would apply... try an entry-level job here in Uruguay (pay: about U$ 800 / month after taxes), you'll get a lot of people that fail fizz-buzz .
The original poster (Imran Ghory) was from the UK, and Reginald is from Canada. Neither are Silicon Valley.
http://imranontech.com/2007/01/24/using-fizzbuzz-to-find-dev...
http://weblog.raganwald.com/2007/01/dont-overthink-fizzbuzz....
The irony is that, in an effort to hire the "smartest" people, they leave out the wisest. Which is arguably more useful.
If it is so, then it is a good thing. Right?
I don't like it that so many new startups fail and I have a feeling many of these (besides lacking an idea, failure in implementation etc...) are due to a lack of other options. If you can't get hired with the skillset you have, even though it should be more than enough, it can drive you to do desperate things. Including becoming a founder.
- After a first non-technical call, we ask the candidate to create a very small project based on our SDK. We send him the documentation and a very small sample. He can almost use every tools he wants to create that small project and, of course, we do not set any deadlines. It allows us to see how the candidate architecture his applications and it gives us a project to discuss during the following call. - If all goes well, we invite the candidate on site to present our code/project and eventually brainstorm together. So that both parties can see if they can work together and the candidate has an insight about how we work, how our code looks like.
Clearly, it's far from perfect and we are often considering changing it. Imagine if every company where you are applying would ask you to create an app from scratch with their SDK? We may lose some candidates, but at least we hire only people that fit the company's culture.
I am an excellent developer, with years of experience in the industry. I know lots of technologies, and already have a great job. There is no reason for me to spend personal time writing your projects, when I would be rewarded by spending personal time on my employer's projects.
"Interviews" like this will only grab candidates with nothing better to do than to fulltime interview with your company. In my opinion, the best people already have jobs, and you're excluding them from the process.
I hope no company will make their decision just because a candidate says that he is an excellent developer ;)
Technical interviewing in a broken process. I've given almost 200 technical interviews at Google, and I've seen all kinds of results. But, I believe Google's results. Having worked at Google longer than anywhere else I've ever worked, I can say that the people are incredible, and it's a direct result of the interviewing process. We interview someone for a set number of interviews (N≤8 nowadays) and we make a decision. I can count on one hand the number of people I think are deadwood.
All I'm saying is the "interview" process of having people do projects for you is broken. You will filter out a lot of people with jobs they are kicking butt at.
Also, who says "I am an excellent developer"?
Also, please avoid ad hominem attacks.
This should be easy to settle and show up the other guy. ;)
I would (and have) asked if the interviewer or organization has any evidence to show that interview puzzle performance (or shit like Myers-Brigg) predicts job performance. No? Not surprising. Google did look into it and found no relationship. (http://www.businessinsider.com/how-google-hires-2013-6)
Programmer interviews are so crazy and sometimes sadistic that I catalogued some of the more common interview patterns:
http://typicalprogrammer.com/thirteen-patterns-of-programmer...
+ knowledge - generally mastery of math/CS concepts and can be thought of as the potential
+ application skills - modeling a real world problem into a theoretical, computable, and (ultimately) programmable form
+ execution skills - implementation (coding) of a solution including the ability to utilize requisite tools/technologies such programming languages, DBs, OS, and so on
That said, hiring process should cover each of these areas and programmers should work on all these as well.
I could learn heroku/RoR/whatever other technology but news things are always coming out and some people keep up with it so easily. I'm not sure being a dev is right for me if I take so long to understand such basic stuff. But I love coding and algos! I write python scripts to do all my homework... and then run them in codecademy labs because doing it in unix makes me so confused.
If anyone has had the same problem please let me know how you got over this hurdle. Thanks.
background; sophomore, cs major, cornell
All that knowledge accumulates over time and you build skills about how to learn new things.
That's what allows people to pick up new technologies easily. Hard work, previous experience with similar technologies, and some intelligence (which you obviously have already).
I would recommend that you install Ubuntu in a virtual machine (VirtualBox is a good choice) and see if you can get some Python programs running. That process alone will teach you a lot.
For what it's worth, RoR and the Heroku stack are not basic and you shouldn't feel bad for not picking the up quickly. There's so much context that you need to have to understand what's going on and to use those technologies effectively. I bet if you polled your classmates the majority of them haven't even heard of Heroku.
Or I might ask them to describe how an event loop works.. or what the I/O path between their program and the disk looks like in as much detail as they can.
Someone that loves the field is going to have a decent idea about these things even if they never had to build one before.
caveat: these examples are very system level but you can substitute them with appropriate web, financial etc domain specific knowledge.
The reason is smart people can figure out git, or databases, or objective-c, or whatever, in a fairly short amount of time.
For example, my co-founder learned objective C off free online video tutorials and built an iOS app (talking an app with serious firepower and back-end transaction logic) from start to end by himself in less than 3 weeks.
That's why we're not as concerned about what you know right now as what it's possible for you to learn in 3 more week.
Yet, I have never had the balls to pursue it professionally. I build stuff and usually never launch it. I have learned several times over that marketing is not my strong suit.
That said, I'd actually like to work for a startup. Hit me up if anyone wants to talk.
The likelihood of failure of a startup approaches 100%, so you should optimize for likelihood of survival, not for IQ.
If you're not a startup, then the top ranked comment applies. But it doesn't really otherwise.
I like to ask "what will I be working on in the next 6 months" that way you don't rock up and than the second day they through you in the deep end of building a iPhone app.
Granted, startups only have a vague idea of what they will be programming with short periods but it helps.
Also ask "what will be my performance indicators". If they don't include "being able to very quickly learn new technologies" its hardly your fault.
Not long ago, Facebook made that 4.74 degrees of separation on its networks. Meaning a maximum of only 4.74 persons are necessary to connect any two random persons on the network.
https://www.facebook.com/notes/facebook-data-team/anatomy-of...
You can also find an article on Wikipedia about the "Kevin Bacon" reference.
I was asked, as part of my application, to take a programming quiz. The quiz consisted of a graph theory problem. I did pretty poorly on it, given that I have no real knowledge of graph theory.
Had they asked me a question about statistics (or something similarly related to data analysis), I think I would have actually been able to answer, or at least been at a point where my programming knowledge- not my math knowledge- was what was holding me back.
But this one talks about getting inadvertent benefit of being good in Maths to get selected for programming, and suffering the consequences later on.
Also, it highlights the importance of what is mostly taken for granted and thought of as mundane stuff, of programming - the idiosyncrasies, jargon, and best practices of various languages and OS environs.
* CS majors take math in college, but there's lots of other stuff going on with their CS classes so it's hard to remember math class. If you can actually remember anything from math class, you must be smart!
* Programmers like math, even though it's not their job, so interviewing is the only opportunity to have fun with it!
* We had to deal with this crap when we were interviewing so now it's time to make someone else suffer! >:)
Programming isn't difficult and you don't need to know complex maths or be able to solve mind bending puzzles to be a great developer.
Check out the last technical interview task that I got ``` Objective: Write a program that prints out a multiplication table of the first 10 prime numbers. The program must run from the command line and print to screen one table.
Notes: - DO NOT use a library method for Prime (write your own) - Use Tests. TDD/BDD - IMPRESS US. ```
I mean I can impress you but how will this correlate with production code?
This is like solving your submarine problem. Jeese.
Isn't XY years of records in the same field of interest working for a successful companies a good sign that I can code?!
Ask me theory - pay me to code.
Yes, I get that a whiteboard isn't an editor, and you don't have google/SO, and some people just freeze in an interview, but I've long ago stopped assuming people can code just because they've got coding on their resume for successful companies. (For all I know at the interview moment, they didn't have a coding role, or may not have even worked there.)
Stop asking this fine young lady math puzzles to determine her programming abilities. She is good at solving your seemingly pointless math puzzle, because she was practicing problem-solving since she was ten. But she is not anywhere near as good at programming, yet - which caused her problems at the actual jobs she had to do after she was hired.
Honestly, this is a weirdly naive question. Gung-ho startup culture does not represent the industry as a whole, and you don't need to eat, breathe, and sweat code every waking moment of your life to be a great coder.
In most cases an applicant must be able to read English (to google some code to copy-paste and occasionally search through documentation) and able to install and run Eclipse.
The real problem with hiring is that a HR middleman is ignorant and can't tell a good code form a restaurant menu. So he must give a very few simple exercises from common text-books with known answers.
The even bigger problem is that almost no one needs coders, everyone wants programmers which is a complete different set of analytical and engineering skills.
Coding is just a process of translation of a ready-made by someone else, poorly understood (if at all) specifications into a spaghetti [Java] code by calling poorly understood methods of ready-made classes, coded by someone else.
Programming is a process of understanding and describing reality (in terms of design documents, protocol specifications, and then, least importantly, source code in a several languages).
The criteria of success for a coder, btw, is when it just compiles (unit-tests? what unit-tests?) by the industry-strength most advanced compiler of the most sophisticated industry standard static-typing language (static typing is a guarantee from stupid errors, everyone knows) which is even verified to run correctly on the most advanced VM which incorporates millions of man-hours of optimizations, unless.. Never mind.
Success of a programmer is when it, like nginx or Plan9 or OpenBSD, is good-enough.)
E.g. if somebody hire John Carmack (ID Software), nobody will let him do some math test or ask him trivial programming questions.
But you are not John Carmack ;-)
It is like in every other job: if you are not a rockstar you are nobody.
It is reasonable.
The author was not saying she was above simple coding tests but that she was an inexperienced programmer who was GOOD at the maths puzzles and got the job then struggled and the interviewer's assessment of her software development ability would have been better with some software related questions.
We life in a world of casting shows, now we (the programmers) are in that shows too. They run only in companies.