Finding good programmers

I just read an interesting article on Slashdot (made moreso by the fact that I have an interview with a company looking for the very best developers later today) about how a company can go about finding superstar programmers. As I expected, the discussion veered quickly into what I now call “the scientist bias”. That is, people began talking about how to set up tougher interviews, screening more rigorously, not checking past work, etc. etc. It’s the same sort of closed-mindedness that I lamented about when discussing peer review (and I still lament, even though 4/4 of my recently submitted papers were accepted). Just as you cannot hope to discover great ideas by being closed-minded, you can’t hope to discover great people by being closed minded.

The easiest way to find good programmers, I would think, would be to first admit that, like peer reviewers, you don’t know precisely what you’re looking for. Just as one scientist unfamiliar with the work of another can’t objectively judge the full ramifications of the other’s science, one programmer cannot objectively judge the programming ability of another. Pretending that you can introduces all sorts of ascertainment biases into the loop, not the least of which being that some people just don’t interview well. I know – I’m among them.

Once you admit that, look at the candidate’s past work. Run it. Try to break it. If you’re feeling adventurous, sic QA on it and see what they find. See (or ask) how long it took to make, how much maintenance had to go into it, and how efficient it is. Don’t neglect the circumstances under which it was written, either – I personally wrote some very professional code when I was 12 with no formal CS education, which I think is quite an achievement. I couldn’t have used knowledge I did not possess, but I made up for it with sheer ability. Not many people independently rediscover alpha-beta pruning at 14, for instance 🙂

Next, if you want to see how the person can actually code, give him a short assignment and ask him to hand it in the next day, for example. This models a real workplace condition – the skills demonstrated in the assignment are the same that will be demonstrated on the job.

By the time you bring someone in for an interview, you should basically have made a decision to hire already, and the final interview would then consist of making sure the company and candidates were fits for each other. If you ask any sort of technical question, ask it in full and let the candidate work. If you jump in every 5 seconds to change the requirements, it’s guaranteed to screw up the candidate. This happened to me during my final interview at Google and really cast doubt on my view of the whole process. For example:

“Write an algorithm to reverse a string”
*Writes about 80% of it, when suddenly…*
“Do it with just one byte of storage”
*Erases and starts over, getting about 50% of the way*
“Making just one pass over the array”
*Erases and goes again*

etc.

I think that interview actually went well, as I was able to perform everything the interviewer asked without hesitation, but it was a very frustrating process, and prevented me from forming any lasting “big picture” image of the problem.

Anyway, those are just my thoughts on the process. Right now I have to put up with whatever techniques people decide to use, but when I hire people, I’m going to do it my own way.

(Update: And I am completely amazed, but the average programmer apparently only codes 76.7 lines of code per hour. This isn’t a measure of quality, just speed, but now I understand what the mythical man month means about the best developers being orders of magnitude better than the worst.)

"Putty" classifiers

I’ve had this idea for a while, but was constantly debating in my mind whether it was the same thing as an SVM with a kernel. I finally came to the conclusion that it wasn’t:

Start with a hyperplane boundary and then split it into warp/deformation points. Optimize the warping by minimizing MSE using gradient descent (or something) and it should begin to take on the form of the points. Impose some sort of regularization to prevent overfitting. Since warping can modify the plane in three dimensions, it’s no longer a hyperplane, but neither is it equivalent to passing a hyperplane through a kernel.

It should be a very powerful means of performing regression (and thus classification). I might research it later; I have too much on my plate now.

Juggling

It’s funny – I’m juggling 9 large projects that all need to be completed in the short term. For most people (or me more than six years ago), this would have been a crushing load. But now? I’m knocking one off per day. I’m in my element when I have to deal with this sort of thing, and I’ve done it so much that it’s second nature by now.

4 for 4

The IWDM paper has been accepted, which brings my total count for this round up to 4. There’s no way the fifth paper we submitted to ICIP will be accepted (the results are terrible and we know it), so we’ll just end it at that 🙂

Contingencies upon contingencies!

It’s really the only way to live life successfully – knowing that any 5 things you’re anticipating could fail and you’re still set. This is important because people can fail – states can change – events can fall through. And since they can, Murphy’s Law says they will :).

Some options aren’t as good as others – but the important thing is to always have options.

It Begins

The process that will ultimately result in the loss of approximately 40 hours of freedom per week has begun – several months earlier than I wanted, but now is when everyone is looking to hire.

It’s going to test my balancing abilities like they were never tested before. I somehow have to fit everything I’m doing now into the small window of time I’ll have left afterwards.

That or I’ll need to finish it very quickly.

Now I understand why I felt like I was past my prime at 23. I can’t go back and do any of the things I want to do anymore. Biology training? It’s not happening. Music? Nope. Mathematics? I can pick it up, but I’ll never be supported while learning it.

This is why I want to start a school that trains polymaths. Anything less is just such a waste, because it cannot be done sequentially.

Defiant: Free-verse

I think I may have just came up with the very distilled essence of secondary integration in the process of sorting my own feelings out:

Defiant

I swim against a prodigious current,
and I know that I must falter.
It draws me towards the fall,
the inexorable fatal plunge.

But each stroke I take,
I count a small victory,
a stand.
For my right to exist.
For the betterment of the world.
For those who came before me.

And for everyone,
who has ever screamed,
defiantly at the heavens:
“No! There is a better way!”

For them,
For us,
I swim against the current,
because I am right.

Spam is getting more and more abstract

In an effort to avoid spam filters, spam mail is getting more and more abstract. I’m getting things like “make your machine run better”, which confused me the first time I saw it, as it sounded like it was pushing computer hardware upgrades at first glance.

Anyway, if this trend continues, pretty soon they’ll start saying things like “Y your X in the Z!” That would be awesome.

This doesn’t always work well, though. For instance, I just got an email from a diploma mill stating “Bachel0rs, mast3rs, MBA, or D0ctorate”. Anyone who is stupid enough to respond to an email that’s afraid to print the word “Bachelors” in full deserves what he gets.

3 for 3

I submitted 5 papers to conferences last month. I’ve heard back on 3 of them, all of which were accepted to their respective conferences. I should hear back on one more today, which I think stands a good chance. I’ll be extremely surprised if the fifth is published, however, since it’s not a good paper.

I still think the peer review system is broken (and will continue to do so irrespective of what fate my own papers meet).