Cargo Cults and Interview Questions
raganwald.posterous.com
raganwald.posterous.com
I gave a client's boss a copy of DeMarco & Lister's "Peopleware" to read. I was younger and more innocent at the time and thought it would persuade him to change some of his incredibly damaging management practices. He'd produced an incredibly adversarial fear-based working environment that was killing productivity.
For those who've read the book (and if you haven't you should... now... seriously....) this guy was the poster-boy for the Teamicide chapter.
He came back to me after the weekend telling me how much he loved the book. Could really see how it could help the organisation. Would be making changes this week. I walked away feeling smug.
What was the lesson he drew from the book? Of all the lessons that he could learn?
In one chapter there is a brief section on how to spot jelled teams where they mention signs like going out for a drink together after work.
So he decided to take the company bowling on Friday nights.
Attendance compulsory.
Correlation. Causation. So easy to confuse.
(At this point I'm less smug.)
Let us say the result of mandating adversarial teams working fifty hours weeks socialise around a competitive game where alcohol was available was not ideal. During week 1 there was shouting. Week 2 resulted in a fight. There wasn't a week 3.
On the bright side it was the final straw the caused some folk to resign :-)
I'm not a formally schooled developer. I don't know a heap about traditional computer science. I don't know all the sorting algorithms off hand (but could throw one together with a little time and reference). I'm not even fluent in all the jargon, vernacular and glossary terms that devs bat around.
I don't know if I'm the best for this job, but I know only 3 short years ago, I was doing graphic design and 3 years before that, I was trying to make good on my degree (and dream) of journalism.
None of us choose how we learn, but I think the best of us just know how to.
Hope you have better luck ;)
An assumption: it is bad for the prospective employer to see no code at all.
I see two basic options:
1) see code written before the interview, and
2) see code written during the interview.
Option (1) has a few sub-options:
a) look at open source work,
b) ask for private personal work to be made available, and
c) ask for custom work of your choosing.
All of these share the weakness of requiring work outside work hours. There are many qualified candidates who don't have work of the (a) and (b) sort available, and while many see option (c) as a welcome intellectual challenge, many others see it as a tedious (or even offensive) waste of their time.
Option (2) also has a few sub-options:
a) provide a computer and a project or set of coding questions to be solved in your absence,
b) same as (a) but with pen and paper,
c) ask a question and watch on a projector or over the shoulder as it is solved on a computer,
d) same as (c) but with pen and paper, and
e) same as (d) but on a whiteboard.
Option (a) is basically the same as (1c) above, but attempts to mitigate the waste-of-time factor by using already-committed interview time to do it, and option (b) is just a much worse variant of the same. The weakness of these options is that it is impossible to get an idea of a candidate's thought process while solving the problem. Option (c) is really good for interviewers but very high-pressure, which selects against many qualified candidates. Option (d) and (e) are identical, but some people hate pen and paper, others hate whiteboards, and most hate both! It is imperative when not using a computer to avoid requiring or judging by the use of things that computers help support, like specific languages, specific APIs, or syntactic accuracy.
Or is this all wrong - have you found the general solution?
Can you write code? Yes? Well then you probably can fit the role of somebody who is hired to write code.
Nobody on the planet is expecting you to waltz in the first day and grok their entire stack and their entire codebase; expect the first couple of months to be just you getting your head around what you'll eventually be doing.
Don't sweat it, you'll be fine :)
edit: but maybe it is not the same in Silicon Valley?
A funny coincidence, i did journalism too -- you're not missing out on ANYTHING (I'm trying to escape the career myself, even contemplating school).
Well you sure do talk the talk. ;)
Ba-dum---Crash!
If you're in the interview room, I'm not so concerned about book learning and knowing facts, but whether you have the correct amount of knowledge to do the job and the ability to apply it.
I got the job, and learned something along the way
You can know the name of a bird in all the languages of
the world, but when you're finished, you'll know
absolutely nothing whatever about the bird... So let's
look at the bird and see what it's doing — that's what
counts. I learned very early the difference between
knowing the name of something and knowing something.
- Richard Feynman https://en.wikiquote.org/wiki/Richard_Feynman and https://www.youtube.com/watch?v=05WS0WN7zMQ class Foo
{
public:
Foo(const Foo& other)
{
//copy state from other Foo here
}
};
What this example is talking about is a normal constructor that can be (perhaps unintentionaly) used in the context of an implicit conversion, so something like class Foo
{
public:
Foo(int heyThere)
{
}
};
This allows the C++ compiler to create an automatic conversion (in some instances) from int -> Foo simply by inserting a call to this constructor. So it can cause code like this to compile even if it was not intended void HandleTheFoo(const Foo& theFoo)
{
//Do something here
}
void SomeMethod()
{
Foo intended; //assume there is a default ctor available even though I didn't show it above
int whoops = 5;
HandleTheFoo(whoops);
}
Marking the constructor explicit prevents the compiler from using it in an implicit conversion context. HandleTheFoo(Foo(5));
or even HandleTheFoo(Foo(otherFoo));
is perfectly cromulent with the constructor being marked explicit. But that is just me engaging in terminological quibbling, I get what you meant/said in spirit and don't disagree that people asking questions they don't have a deep understanding of themselves can only lead to fail.I wasn’t trying to suggest that Ted didn’t have deep knowledge of C++, as we can see his fictional knowledge is far better than my distant memories. I was trying to suggest that he was engaging in copy-and-paste interviewing, and that it’s a bad idea for all of the same reasons copy-and-paste coding is a bad idea :-)
In my experience, the most accurate interview processes is to ask a candidate to solve a short (but non-trivial) problem in the language of their choosing (or pseudocode). Ideally, candidates could be interviewed by a few people independently to ensure an accurate sample of that interviewee's knowledge. This isn't always possible (due to time and other constraints) but this process better guarantees that a smart candidate isn't tripped up by a very unusual question, or that a weak candidate doesn't memorize common interview answers.
And the objective should be to establish a level of capability which is acceptable for business purposes, not to try to optimize on intelligence.
Be truthful with yourself about whether you really want the smartest guy possible. The smartest guy sees the boss's (or company's) bullshit and is more likely to say something about it. This makes trouble. The smartest guy may be a "bipolar" type. The smartest guy, with the mind that needs meat to chew, is more liable to implement things in a clever way than one which average joes will be able to maintain and extend easily. You probably don't want the smartest guy because he probably isn't as good on some other dimensions.
What I see in this industry is that we project intelligence onto the people with traits which satisfy our prejudices (typically people with high class/status). Then we filter on this perceived-intelligence with the rationale that we want a company with people who are as smart as possible. The actual effect is at least as much to favor people with high social status and self-promotion ability and physical attractiveness as it is to favor smart people.
Hiring processes are irrational not because nobody can ever work out the right processes, but because we work backwards from unexamined pictures of "the right candidate" to the processes which will select that candidate.
Other than adding in some rudimentary skills tests (say, FizzBuzz + walkthrough writing the code with them), and checking if they've developed anything out of their own initiative, I can't see why you'd bother asking anything else.
I'd rather get a candidate to write some (relatively simple) code using what they do know about the language, and then we can dive into the code and see if they really understand what it does, and what happens if I poke this or prod that. I don't even care what language they use - although if they pick one I don't know it may be harder for them because I'm going to ask pointed questions about how parameters and equality work in that language.
The interview "question" is just a starting point for a conversation. Trick questions and minutia don't serve that purpose at all.
Right. There are lots of very capable people who have optimized by offloading a lot of information from their heads because they can get it from their tools. These are very different from cargo-cult programmers who are only guessing about which completion in their IDE they should use. However, the two types will be unable to answer many of the same questions when away from their IDE.
Am I missing something? Or are IDE's a waste of time? (I usually just use gedit, fyi, on my ubuntu box)
Some languages lend themselves to IDEs easier than others. For Ruby I use textmate, for Java I use eclipse. For Perl I use vi, and when I did .NET I used Visual Studios.
I often think that not having this tool would be like what primates' self-awareness must be like: a glimmer of insight, but even the simplest thought requiring impossible effort, as in a thick fog.
PS: And don't forget the big things like built in debugger support.
Your question is fine: it's open-ended, the interviewees can answer whatever they feel like (and you can assess their knowledge of the language to some degree), and ideally you get a nice little discussion going, that also covers other topics.
On the other hand "What's up with that explicit keyword and constructors in c++?" is a pop quiz questions.
For example, someone asked me once about the warts in Python. I started thinking about complaints I've heard others say, like Python 2.x's "print >>fileobj" syntax. I understand the reasons for and against it, but I nearly only use print statements for debugging, so it's not one that I want to bring up. Or there's the lack of block syntax, which Smalltalk/Ruby developers love, but Python has different ways to handle most of the underlying requirements.
So there I'm thinking about the different aspect of Python, trying to figure out which ones I want to bring up, but I hadn't fully considered the other issues with the language, in order to figure out which is the most relevant, but then, I don't know how to rank the relevancy because the question was structured without any rank preference.
Now if you had asked "... when used for systems programming ..." or "... as a programming language for scientists ..." or "... compared with Perl ..." then I would find it much easier to give the thoughtful answer you're looking for.
I had the same problem a couple of years back at our monthly Python meetings. We did a code refactoring exercise: given code, make it better. I had a really tough time because I couldn't figure out what "better" meant. The exercise code worked, although it mixed business logic, database interface, and presentation into a single file. But without an idea of the direction the code was supposed to go for the future, I couldn't figure out why anyone would want to modify working code.
But every time I read about someone like Alice, it does cause me to reflect on the "hiring troubles" companies are experiencing, the "shortage" of top candidates.
She has contributed to open source, shown the ability to learn and write small apps in new languages. She can code, definitely, but she shows some weakness... NO HIRE. Not only no hire, she's a faker, a cargo cult-er, she "pulled the wool over your eyes." She's not just unqualified (by high standards, in my opinion), she's insincere.
Please, understand that I'm not saying that hiring standards shouldn't be high, or that weak team members don't do more damage than good. I get all these things. But the bar is high enough that it should be utterly unsurprising that there's a shortage of "qualified" people, and that a lot of people (who might have become good programmers) bail out, get forced out, or want nothing to do with it after their first taste.
I'm ok with these high standards, but I think we celebrate it a little too much.
EDIT: raganwald, jbooth, peter...
thanks for replying rather than just downmodding - unfortunately (for me), yeah, you're right, I misread this.
I'd like to take it down, but once someone has responded, I leave it up with an EDIT...
The term cargo cult programmer may also apply when an unskilled or novice computer programmer (or one not experienced with the problem at hand) copies some program code from one place and pastes it into another place, with little or no understanding of how the code works, or whether it is required in its new position.
https://en.wikipedia.org/wiki/Cargo_cult_programming
I don’t know if this term can be applied to Alice, but I am pretty certain that the story describes Ted blindly copying the surface form of something Bob did in an interview with Carol into Ted’s interview with Alice with little or no understanding of how Bob's conversation worked, or whether it was required in Ted’s conversation with Alice.
Interviews are lossy compression of a career, experience, and brain shape, over a noisy channel of whiteboards and human speech. The best you can hope is that your interviewer will recognize the larger pattern.
BUT. There is limited time in an interview, so we try to scry nuances like a soothsayer with a pile of sheep guts. Every detail gets magnified.
Examples:
"You chose to return an error code instead of throwing an exception." Is this an optimization, or have you spent a lot of time on system programming?
"I see a couple of fenceposting errors." Is it nerves or do you not have the right shape of the problem in your head?
"You passed some bookkeeping information in a recursive call that should take care of itself." Do you not understand recursion, or are you misremembering something cool about accumulators and tail recursion?
"You chose to use inheritance instead of composition." Have you ever had to extend or maintain such a design, or did you read about it in a book?
"You used template metaprogramming." Are you a misunderstood genius or do you delight in writing unmaintainable constructs from the dark corners of C++ into production?
"You chose to use Perl but don't know what a hash is." Do you have any questions for me?
This reminds me of someone who once told me they knew C and were proficient at it, but they just "didn't get pointers and I don't use them."
We interviewed a Busuness school Finance senior to help on our COMSTOCK satellite feed parsing project.'Do you know C++?" we asked. "Yes" he lied, then "Can I come in over the weekend to get started?" How enthusiastic! Sure!
Turns out he spent the weekend studying code, learned to program C++. I didn't see him for a few weeks, then consulting on his code over something I mentioned "This would be better allocated". "Yeah, I wondered what the pointer stuff was about". I was astonished he'd come so far on guts and smarts. I explained malloc, pointers, he was off again.
All I'm trying to get at is if you take your experience as a rule.
The population of people who lie about their programming skills is unfortunately all too high. The subset who can make up the difference in two days, unfortunately all too small. I think a Google or Amazon has to play the percentages to keep a high bar. The cost of a bad hire reverberates through the organization.
Anecdotally: We had a guy in for interviews a few months ago. In the phone interview prep by HR, it was mentioned that there would be some written “tests,” and the guy was extremely resistant. We had him in anyway and he did very poorly. The test was pretty simple: some stuff about magic methods in php, a fizzbuzz type question, and a few jquery selector questions (it was for a front- and back-end position), etc. Were we to granular with the questions? Did we fall into the same trap as Ted here?
2) Were the written questions on paper or a whiteboard? If so, you should at least give them the option of doing it on a computer with a screen editor (you know the way that almost everyone has written code since the 80s). We have a few computers with just about every editor known to man (well win32 and *nix only, but we could probably scrounge up a powerbook if we needed to) installed on them along with gobs of syntax-highlighting themes so that candidates can feel comfortable when writing code.
Ultimately some good programmers have trouble writing code on paper, and most good programmers have trouble writing code on a whiteboard (though they should at least be able to sketch out an algorithm graphically or with pseudo code as that's a useful communication tool).
When I just randomly interview a single time, I feel like a dolt, do pretty miserably. After a few interviews all the whiteboarding starts to take effect and I do much, much better.
When I interview people I usually explain a problem I'm working on and see if they can think through it, then ask a lot of questions about what they've learned from their past failures. People that can go into detail about something they failed at and learned from usually impress me, as I suspect they won't make the same mistakes over and over. Also, if you haven't failed spectacularly with something very hard and you've been a software dev for 10+ years, you might not be doing it right.
Obviously, I've been a dev for 10+ years, and I can't pass whiteboard tests very easily, so I suppose maybe I'm not doing it right, either...
I interviewed somewhere a few months ago and had a former programmer turned product manager grill me about b-trees (this was a Ruby on Rails position). I was not surprised to hear later that he was the one who gave me the final thumbs-down, I assume he thought I wasn't worth it because I didn't work at the same level of abstraction that he did when he was a coder.
I want to see that people are aware of what's going on below them. Not that it's just "magic" to some keyboard basher. ruby on rails attracts an extreme number of keyboard bashers, so they get extra scrutiny.
That's not to say that you don't need to weed out the people who only know how to recite various incantations to make magic happen; a knowledge of what's actually happening is very important. But at this level of abstraction, the correct focus should be on different, more relevant things: HTTP, caching, security, etc, which Rails (I'm guessing) handles for you but you should still know.
I'd be very wary of asking questions about potentially-obscure corners of tools (I don't know how obscure magic methods are in PHP) -- in a real work environment, you could look it up in a moment, but you usually can't in an interview. You could easily trip up a programmer who thrives with the references to hand, but isn't yet confident enough with the tools not to struggle without the references.
1) Ask something simple, like FizzBuzz. You'd be shocked at how many people talk a good talk but can't actually write basic code.
2) Ask an open-ended question, like "how would you design a multi-player chess game". That leads to a discussion that lets you assess all sorts of traits, the most important of which is communication style.
In this analogy, you are the company hiring programmers, and the things you need to survive are that your programmers can write basic code, can communicate effectively, and some other things — probably "can design software" or "doesn't rathole excessively" is the next item or two on the list. You're still in a lot of trouble if your submarine doesn't have any food onboard, but the situation is not nearly as bad as if the submarine lacks means for producing air and drinking water.
This is coming from a python guy who does very little javascript.
If he did get some of the methods wrong you could always ask the candidate what he thought the method did. If he knew there is a method to accomplish a specific task and he just got the name of it wrong that I'd say he is good to go. He can always google that kind of thing on the job.
..... I sincerely hope he's kidding. Having less than 8 months experience with a language (AT ALL!) I can write code out on paper that works. IS this 95%+ figure correct ? :S It's come up a couple times in google results, but I dont see where people are getting the number.
I'm asking this because, the companies I work for are mostly tier-2 companies which hardly use any of this stuff and generally get away by using proper libraries. So when ever I have to prepare for attending interviews of the tier-1 companies, I'm forced to re-learn most of this stuff - because knowledge fades when you don't use it.
The answer is: it varies, but generally no. There are some roles where you're going to be spinning mad data structures & algorithms day in and day out... but for the most part you write code that isn't overly dissimilar from what's written everywhere else.
This is my own observation and hypothesis: "tier 1" companies have very algorithm and data structures heavy interviews because their signal to noise ratio is horrific. Being household names, you have tons of people applying who can't even Fizzbuzz. In this environment the natural reaction is to check, first and foremost, for CS fundamentals, because you can't assume that it exists and is just rusty.
I now work in startup-land, where hiring is so much easier, since people who find their way to your doorstep are overall much more qualified by default.
I'll admit, when I interviewed for Amazon, I always hit with algorithms and data structures questions first, because by my own unscientific estimates, at least 50% of applicants at the phone interview stage do not even understand what a tree is, much less how they might go about crawling one or representing it in data. I'd reckon about 10-15% cannot pass Fizzbuzz.
However, this isn't to distract from importance of using explicit and copy assignment. Here's a public service announcement: really, if your C++ class has a constructor that takes one argument, please use explicit.
Additionally, please disable copy constructor and assignment operator, unless you actually implement them yourself. Here's a free macro for you, courtesy of Google's C++ style guide:
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
class MyClass {
private:
DISALLOW_COPY_AND_ASSIGN(MyClass);
};
I will thank you for this.The point, I think, is that asking interview questions without understanding why the questions are appropriate is worse than useless - it's actively destructive to the end goal of hiring good people.
You can generalize this Cargo Cult behavior to any field - blindly carrying out activity without understanding deeper principles is likely to produce undesirable results.
class Foo : boost::noncopyable
{
// ...
};I work on libraries more than apps. When I want to hire someone to work with me on libraries, you better believe I'm going to look for a C++ expert. And the explicit keyword is crucial in a lot of cases -- sometimes it can mean the difference between code compiling or not, but even worse is the bug where a parameter is missing and an int is converted to be some class it shouldn't be.
Using existing libraries and just assembling bits into apps? Sure, learning on the job can be OK (though honestly I wouldn't trust C++ written by anyone using it for less than a year full time). Though even then if you don't understand C++ well you're likely to shoot yourself in the foot with the language.
But there are some times that I really, really want someone to know the explicit keyword, at a minimum. Your example of DISALLOW_COPY_AND_ASSIGN is also good to know -- and it's likely in the Google style guide so that people don't have to be experts.
But I'd rather have people know why it's important and how it works than people who are just trusting to the compiler and luck to make everything work right.
I've seen C programmers clear a class that contained a std::string with memset(&foo,0,sizeof(foo)), which happened to work on one implementation but failed badly on another. I've seen people take the raw pointer out of a smart pointer and attempt to manage it themselves -- including trying to wrap ANOTHER smart pointer container around it later. I've seen people fight with a bug for weeks because they didn't bother to initialize all their class members (fixed that bug in about 10 minutes on code I'd never seen before).
The list goes on, and the list of "coding standards" we created to try to enable people who weren't good enough at C++ to work effectively with our C++ library got to be so large that no one could remember it all, rendering it useless. [1]
So yes, if I'm going to have someone work on C++ for me, I either want them to have at least a solid year of real experience, or I'm going to want to code review every line before it gets committed to main. Maybe I'll still hire them, but I've seen so many examples of people misusing C++ (and then having to fix their bugs later) that I've been more than a little burned by it.
Even more esoteric than explicit is the mutable keyword. Major bonus points for anyone I'm interviewing to know what that one means and when it's used. But no major negative if they don't know -- it has very few compelling use cases, after all, so I can imagine people not remembering it.
It's just that I feel like higher-level languages like Ruby, Python, or JS are so much more productive for most things, most of the time, despite things like Rachelbythebay's interesting set of posts about hacking together stuff in C++ [1].
But, aside from things like that, I guess there are some domains where C++ is a viable option and Lua or whatever still isn't. And it sounds to me like the average quality of C++ has gone up since I was doing it, to the point that most people have read Alexandrescu and never call delete explicitly, so it might not be quite so painful?
Should I be taking advantage of being one of the Fat Guys Who Know C++? [2]
[0]: http://lists.canonical.org/pipermail/kragen-tol/2007-March/0... [1]: http://rachelbythebay.com/w/2012/01/14/blort/ [2]: http://medriscoll.com/post/9117396231/the-guild-of-silicon-v...
To tell the truth, I have a love/hate relationship with C++. Yes, I know it really well at this point. I've learned everything I know because it (at the time) was the only tool reasonable to get the job done. Now I actually avoid using it as much as possible.
The perfect combo for me (in games) is C++ for performant code combined with tight integration with Lua. I hear you on higher-level languages being more productive, which is why most of my game code ends up written in Lua. (I'm far from alone in using this combo -- most major iOS games seem to use the same combo, as do a lot of games in general.)
Why not use one of the three you mentioned? Size and speed both.
LuaJIT is pretty much the fastest dynamic language around, and the overhead of linking into a program is tiny compared to Ruby, Python, or JavaScript. The language itself gives you advanced features like coroutines with upvalues and operator overrides, but at the same time it's super-simple -- to the point where non-programmers can use it to script behaviors.
If you're doing server code you can afford to have things be a bit slower and/or huge (relatively speaking). If you're doing games downloaded OTA on a phone, and you've got a 20Mb limit before they have to use WiFi...well, size is critical (an extra megabyte or two means a lot of assets won't fit any more) and phones are far more processor-bound than most server tasks you'd use a scripting language for. On the other hand, with distributions like OpenResty [1] that hand you an extremely fast server and LuaJIT all bound up together, allowing me to create a cheap server that can handle 3000+ requests per second without barely breaking a sweat...well, since I know Lua ANYWAY, I use it on the server as well.
YMMV. :)
Addressing what you asked: C++ development is in reasonably high demand compared to the number of Fat Guys, so it tends to pay well. Having experience in a niche can also be handy -- by virtue of knowing Android C++/NDK development I've had random people contacting me to ask if I want to work for them, with no real promotion on my part. I don't even want to say what my rate was publicly, though I will say that I expected him to turn me down when I said how much I wanted.
I imagine gzipped Lua bytecode would be quite a bit more compact than gzipped compiled C++; does it work out that way in real life?
Does OpenResty work well with LuaJIT?
As to bytecode...I think it probably does end up more compact than compiled C++, and it seems like it would have properties that would allow it to compress more tightly, but I don't have any numbers on that.
I tend to strip the source and compress and encrypt it; I could convert it to bytecode first, but the last time I tried that it ended up bigger than the compressed text.
>Android C++/NDK by itself counts as a niche? That's kind of surprising! I would have thought a profitable niche would have to be a bit more specialized by now... I guess the NDK hasn't been out all that long.
A lot of "Android" developers are actually Java developers who are trying to cash in on mobile. Serious game developers almost all use the NDK, but serious game developers are in high demand (myself included). So yes, NDK is itself a niche, in that the number of jobs seems to exceed the number of developers available.
On the other hand, by being able to do games in NDK I'm even better off, but just being good at NDK development is pretty powerful. Keep in mind that you also have to deal with Java and the Android stack -- you can't do everything in the NDK. So you need to be someone good at C++ who also can get around in Java.
Not saying you COULDN'T write games in other languages. MineCraft is written in Java, for instance. But my statement still predominantly holds true: Most serious game developers use C++, and many use Lua.
For some definitions of serious, anyway. I guess I mean "ones that have been doing it for any length of time professionally." Or maybe I just mean "almost every one I know." Something like that anyway.
1. Tell me the difference between final, finally and finalize in Java. (Of course it was completely irrelevant to the discussion that my resume at that time never claimed that I knew Java; The only mention of Java was a library that I had used as a black box)
2. This is a fairly new one but most software engineers must have seen equivalents over the years :).
Rate yourself on a scale of 1-10 on the following:
-- Machine Learning
-- Convex Optimization
-- Linear Algebra
You know what was really disappointing? The second question was asked to me first by the recruiter (whom I don't blame for asking me the question) and then again by an engineer (after we had just concluded a long discussion on my projects touching upon those topics).
This should be obvious by now. Standard CV reviews, colleges and references say nothing about how efficiently a candidate is able to think through new problems or how elegant their solutions will be. Nor does that mean that formal training and real-world skill exist in an inverse relationship as a lot of self-taught coders (myself included) like to pretend it does. They simply aren't co-related, at least not as far as we can tell from most leading posts about hiring on HN.
So if the goal is efficiency, why not just hire people based on their IQ? What else is there that qualifies people for positions where their bosses 2 levels up have no idea how they're actually executing the work that's put in front of them, and rely completely on them to come to the best logical solutions to new problems creatively, quickly and every single time? The only other standard you might want to look for is trustworthiness, but you can't measure that in an interview.
Anyway, it doesn't matter if someone with 140+ IQ has ever coded before. It's probably worth paying to train them. So let's just cut to the chase. You need people with brains and integrity, and the rest of it is just huff and puff nonsense from HR people who don't have a clue, and couldn't do the job their hirees do.
secondly, IQ testing covers a number of areas, many of which are not necessarily related to the kind of thinking needed for programming. i think most of the verbal stuff in IQ tests wouldn't relate that much
thirdly, even if someone aces the IQ test, there's still no indication that they would actually enjoy programming if they've never done it before. It's kind of pointless to train someone to code if they're just going to get sick of it and quit in 6 months.
and fourth, an IQ test doesn't say anything about a person's ability to work with other people or prioritize things properly. an IQ test provides no protection against ending up with a prima donna who obsesses over brace style at the expense of getting useful things done.
really, i think the best way to find out if someone can code is to look at something they've coded
You make a good point about primadonnas and other potentially toxic personality types with high IQs, but you can screen that too. And I mean, I don't care about IQ. To me, pretty much anybody with talent should be able to come in with something awesome and say "look what I did", and if it's great, then who cares? Hire them. Obviously this isn't an argument for creating a new narrow-minded structure to replace the current one; I'm just talking about prioritizing along the essential lines instead of dancing around the real question. Isn't someone who codes and who can give you a fibonacci sequence in realtime more valuable than someone who codes, but can't? I can't do it, but I'd hire that guy.
The classic example goes as follows:
The testee is shown four pictures: a teapot; a saucer; a table, and a water pump. They are then shown a teacup, and asked to match it with the appropriate picture. The upper-class testee, for whom tea was always served in a cup on a saucer, selects the saucer. The middle-class testee selects the teapot, as the tea obviously goes in the cup. The child in sub-Saharan Africa recognizes the teacup as a cup, a so selects the water pump, as water goes in cups.
This is obviously a contrived example, but it shows how the biases of the test-makers can conflict with those of the test-takers, leading those from different backgrounds to score worse on the test.
The "correct sequence" was: Get Up, Eat Breakfast, Go To School while many of these children were getting subsidized breakfasts at school.
Except that cultural background is not, unfortunately. And it's highly correlated with the first and probably weakly linked to the second and third classes as well.
For argument's sake let's assume a test that doesn't discriminate or give advantage to any given race or culture. How is that different from a coding test, other than that it requires more general interest and knowledge, and doesn't overly reward memorization of algorithms?
But directly relevent:
* even if the concept of some sort of underlying general intelligence were valid, we have yet to come up with an unbiased test of it.
* And then if you could somehow prove an IQ test was unbiased and germane to the job, then the court ruling referenced elsewhere in this thread wouldn't prohibit it's use.
You've gotta measure people somehow in order to hire them, right? You can spend all day talking about how unfair any possible test is, but the world will continue choosing people based on a multitude of criteria, most of which boil down to intelligence, and all I'm suggesting is that there are more efficient and less circumspect ways of doing that.
(Go and read the wikipedia article about the relevent court case: http://en.wikipedia.org/wiki/Griggs_v._Duke_Power_Co.)
I am not sure how well this is known. I have tried, in preparation for this talk, to read some evolutionary economics, and was particularly curious about what biologists people reference. What I encountered were quite a few references to Stephen Jay Gould, hardly any to other evolutionary theorists. Now it is not very hard to find out, if you spend a little while reading in evolution, that Gould is the John Kenneth Galbraith of his subject. That is, he is a wonderful writer who is bevolved by literary intellectuals and lionized by the media because he does not use algebra or difficult jargon. Unfortunately, it appears that he avoids these sins not because he has transcended his colleagues but because he does does not seem to understand what they have to say; and his own descriptions of what the field is about - not just the answers, but even the questions - are consistently misleading. His impressive literary and historical erudition makes his work seem profound to most readers, but informed readers eventually conclude that there's no there there. (And yes, there is some resentment of his fame: in the field the unjustly famous theory of "punctuated equilibrium", in which Gould and Niles Eldredge asserted that evolution proceeds not steadily but in short bursts of rapid change, is known as "evolution by jerks").[3]
[0]http://lesswrong.com/lw/kv/beware_of_stephen_j_gould/
[1]http://www.wired.com/wiredscience/2011/06/gould-morton-revis...
[2]http://en.wikipedia.org/wiki/The_Mismeasure_of_Man#Criticism...
2. The microscopic number of black engineers have already run the gamut of cognitive testing. An IQ test would not have a "disparate impact". This is why big corporations ask for university degrees: the degree itself is an IQ test.
3. FizzBuzz will screen out virtually the entire African race, and is provably related to actual job performance. After that an IQ test will not appreciably change the statistics.
For more background about IQ testing for employment in America, check out https://en.wikipedia.org/wiki/Griggs_v._Duke_Power_Co. .
Who would do such a thing? Cops.
On the other hand, of course, if your house has been burglarized, you want just his guy on your side, ignoring the lame folks babbling inanities and looking for the one that won't meet his eyes, has a cut from broken glass on his hand, or too much cash in his pocket. Never mind socioeconomic theories. And when he finds him, he brings him in, even if it takes the truncheon.
Everybody thinks they know who should be running things. Scholars think scholars would do well. Merchants think they should rule. Soldiers want to rule all the time. Most of the time they're wrong.
It takes a certain mindset to survive any job. Assembly-line, sales, engineering. Even police work. You have to be pretty thick-skinned for that. More important, you have to go where angels fear to tread, confront argumentative people pretty much all the time, and be willing to be yelled at afterward because you gotta do what you gotta do, out on the street.
Because pretty much everything I can find on it has the whiff of urban legend, which folk like you repeat because it feed into their worldview.
http://en.wikipedia.org/wiki/Intelligence_quotient
If there are factual inaccuracies there, please point them out. However just going by the "whiff" of something seems like you're opening yourself up to rejecting parts of reality that do not fit your worldview.
Edit: better source: http://www.aele.org/apa/jordan-newlondon.html and here is an interview of the man by CNN: http://www.postroad.com/news/2000/20000912-new-london-police...
"No IQs above 125" is not the same as "No IQs above 90".
A human mind is multidimensional. The idea you can find one number to measure it is downright ridiculous. You wouldn't even buy pants based on just one number, say waist size. You'd get home, they'd be too long or too short. Obviously!
But folks buy into the IQ cargo cult big time. Totally baffles me.
Most software engineering jobs involve communicating with people. Customers, other engineers, other teams, leaders, etc. I would hazard to say that most effective senior engineers will spend at least as much time communicating with people as they will spend on individual technical tasks, if not more.
Communication skills are vital. If you cannot effectively persuade a team of people that your approach or point of view is correct, then your views, no matter their objective merit, will not impact the organization. Being an effective engineer requires having good ideas and also influencing other people to understand and adopt them.
A person can be an effective journeyman individual contributor engineer without strong communication skills, but to become a master with wide impact requires it.
Suffice it to say that I would have a hard time getting a job based on my IQ score because I can't do repetitive arithmetic operations as fast as other people.
6 ADD kids from a farming community. One Entrepreneur :), an environmental researcher, a Nursing research specialist, two software directors (Case pumps, Intel) and one IT head.
One of the tests had a lot of memorization - given a list of 9 numbers, repeat them backwards. Or 9 letters. Or a combination. Getting read "q9dh73b1wm6" and then having someone expect to hear you say back "6mw1b37hd9q" was quite nerve-wracking. Another test was "say as many names as you can in 30 seconds" (or something like that). Some of the tests appeared really odd, but the test-giver explained the thinking behind some of the questions later, and it was interesting.
But many people don't even take the SAT. At least when I was in high school (and likely still today), midwest universities tended to prefer the ACT. Thus, you're essentially looking for people who hit some percentile on national tests, similar to what one would do when applying for MENSA.
Also, as you and others have stated, this isn't really the best way to evaluate people for programming jobs.
then again, there are several IQ tests, so that could contribute to the problem of having a generic conversion equation.
1. SAT scores can be greatly inflated simply by taking an SAT class. 2. The SATs are pretty bias towards native English speakers (as 2/3 of is reading and writing and the 1/3 that is "math" has a lot of reading comprehension required) 3. SAT scores aren't really a good indicator of the prospect employee's work habits or ability to play nice with others, both of which are pretty important points to consider when hiring someone.
Well. I suppose points 1 and 3 also apply to IQ tests.
If I got a candidate with a 140 IQ who was unpleasant, derisive, and had only coded in Pascal, I'd send them packing. It speaks to their drive, personality, and people skills.
A winning team is not built on intelligence alone.