763 karma · joined February 14, 2011
The number of candidates who have told me that they want a computer rather than a whiteboard is small but not zero.
I do give the same few problems over and over again, and I do take extensive notes, but I am not keeping track of a specific set of metrics that I track across candidates. I have a pretty good sense of where the "middle of the pack" candidate is. The process could be more scientific, yes.
Having a photo also allows me to compare the candidate's work against that of previous candidates, so that I can ensure that my interview process is well-calibrated.
It is also a preventative measure, so that when a no-hire candidate sues the company claiming discrimination in hiring practices against whatever protected class they are in, I have more evidence than my notes and fallible memory. Fortunately I have never actually needed to use that.
I have had candidates with PhDs in computer science who had a deep understanding of static analysis of programming languages, but who did not know how many bytes were in a pointer on a 64 bit operating system, who thought that there was an algorithm for compressing any 64 bit number into a 32 bit number, who could not describe the possible consequences of a buffer overrun in C, and who had no idea whatsoever what a virtual function table was.
Now, to be fair, as Dijkstra is said to have pointed out, astronomers are not experts on telescope building. People with deep knowledge in one small area of a field are often ignorant of other areas, even closely related areas. In those cases it's even more important to get a sense for how the candidate approaches problem solving, whether they can learn on the job, and so on, because you know that they are going to be deeply in problem solving mode very quickly when faced with their first real-world problems.
I hold up myself as a case in point; I helped build the JavaScript engine that was in Internet Explorer in the 1990s, but know practically nothing about HTML, the browser DOM, CSS, and so on. If I were interviewing someone like me for a web developer position, I would have to be convinced that the candidate could learn quickly.
I have had several candidates with established work history who were turned down on the basis of their coding work during technical questions in interviews. For example, I once interviewed a candidate who had written a popular developer tool for the Mac; the candidate was applying for a job on a developer tools team and had an excellent resume. And did not know what a binary tree was, did not know what recursion was. Though success in industry may be correlated with ability to solve the most basic problems one faces every day when building the semantic analyzer for a compiler, it is by no means a perfect correlation.
Demonstrated ability to take the specification of a simple, recursively-defined property and translate it into two lines of correct code on a whiteboard is a pretty good correlate.
And of course, as I pointed out in the article, I am much more interested in how the candidate reasons about the code, not whether they can write two or three lines of correct code on a board, or type them into a computer.
The problems that I ask are so easy that it really does not make a difference whether the candidate is writing on a whiteboard or typing on a computer; most of the problems I ask can be solved in fewer than six lines of code. I am using the code as a starting point for the conversation, not the end point.
Now, perhaps I am alienating candidates, but first, I am very willing to accommodate any candidate who wishes to demonstrate their coding skills to me in some other way, and second, my primary goal is to prevent bad hires. If good hires go to the competition, that's too bad, but it is way more important to prevent a bad hire. What I am not willing to do is fail to test candidates on their coding ability; I have had candidates -- some with advanced degrees -- show up who had no demonstrable ability to solve practical problems.
For example, I used to give a question where the solution was literally: take two pairs of numbers, find their differences, add the differences together. (The problem involves computing the difference between two times represented in an unusual format.) A candidate who is unable to take the differences of two pairs of numbers and add them together is going to be unsuccessful -- and I have had candidates show up in my office claiming to be "9 out of 10" C++ programmers who could not write correct code that added and subtracted four numbers. The vast majority of programmers will solve the problem correctly, and that is step one; I want to know how are you going to test it, can you prove that it is correct, if the times were in different time zones how would you change the signature of the method, should the method return an error for invalid inputs... I want to know if the candidate can actually reason about code.
So I have tried it both ways, and I see very little difference in the outcome. For example, I give a problem on detecting whether a tree is out of balance. A great many candidate makes the same bug; they check to see if the subtrees are balanced without also checking to see if the subtrees are of similar height. They make this mistake whether they are writing the code on the whiteboard or on a computer, because the error has nothing to do with how you are writing the code, it has to do with the thought process that happens when trying to translate a clearly-written specification into one line of bug-free code. Candidates who are informed that they have a bug solve (or don't) the same way on a whiteboard or a computer: by reviewing their code, re-reading the specification and thinking about test cases.
That said, I do have some friends who are experts at working iron, so if I do decide to take it up, I'll have a lot of good advisors.
Whether oxidation or reduction is taking place during the melting process is determined by the amount of oxygen arriving via the air blast; too much oxygen and you get a hot oxidizing atmosphere, which oxidizes both my iron crucible and the top of the melt. Too little oxygen and you can actually get a reducing atmosphere, the furnace runs a bit colder, less heat escapes through the flue. So it's a tricky balance to strike and I'm still fine-tuning it.
I add potassium chloride and sodium carbonate to flux the melt and remove dissolved hydrogen; the KCl helps keep more aluminum oxide from forming apparently, though some home foundry sites report that they don't see a difference if they skip that step. Both chemicals are cheap, so I'm not too concerned.
In the future if you have a problem with something that someone has written on the Internet, why not contact them and have a civil conversation about it? It's not like I'm hard to get ahold of.
If in the future you do that, you might find that you've misunderstood the motivation of the article you find so objectionable. And the author might find out from you that they could communicate their point in a better way. The world would get better all around, and that could all happen without resorting to profanity and name-calling in a public forum.
When I was a CS student at Waterloo, no one taught us how to debug small programs. Maybe things have changed since then, but at the time this was just a skill you were expected to pick up for yourself. I remember many times coming into the lab early in the morning and finding my fellow students asleep on their keyboards, having stayed up all night trying to find a bug in a 20 line program.
If you don't like my article then that's too bad; my suggestion to you is rather than complaining about it, why not write your own that you like better? I'd be happy to publish a link to it.
I assure you that "how C# is treated" was in no way a factor; C# is treated extremely well at Microsoft. Moreover, think it through: I would not have taken a job that continues to improve the broader C# ecosystem if I thought that the .NET platform was some kind of dead end. It is vital.
And for the record: I do not think that I am as smart as Feynman; that would be ridiculous.
The piece was intended as satire, and is in a long tradition of such dialogues intended to ridicule a "straw man" of a particular position. Consider, for example, Gallileo's Dialogue Concerning Two World Systems, in which the scientist, Salviati, criticizes the position of Simplicio, who believes the earth to be the center of the universe.
I couldn't think of a better modern figure to stand for science, reason, clear thinking, and a mischievious sense of fun than Richard Feynman as my Salviati, and I hope that he would appreciate the spirit in which it was presented.