How to Recognize a Good Programmer
KDan writes to share an article he has written about what some of the key factors in recognizing a good programmer. "It's not as easy as it sounds. CV experience is only of limited use here, because great programmers don't always have the 'official' experience to demonstrate that they're great. In fact, a lot of that CV experience can be misleading. Yet there are a number of subtle cues that you can get, even from the CV, to figure out whether someone's a great programmer."
How to recognize someone who would give good advice about how to recognize a good programmer ? I think the C.V. can be misleading : the " official " experience at hiring programmers does not necessarily mean the the person would be apt at giving good advice about hiring programmers.
The best I've met have degrees in English, Physics, Engineering, or Math. They then focused on the programming aspect as needed to create tools that helped them and their peers to streamline their work. As that focus became more of a primary job function, they honed their skills and methodology around maintainable code, version control, security, documentation, reusable modules, etc.
I'm guilty of being one of these types myself, but have since moved up to project management around security type stuff after having taught those who replaced me the things that I learned through experience.
CV is latin for Curriculae Vitae which as someone else noted means "course of life" and it is a bit of a misnomer to use "CV" as a resume as traditionally a CV actually includes everything related to your "life" - thus "course of life" - a true CV would be more a of a large binder with many many pages - a portfolio if you will - of anything and everything you have accomplished and achieved in your life whereas a resume is usually just a one page condensed version of anything relevant to the job you are trying to acquire.
I actually have something that is closer to a true CV - a portfolio that is about 25 pages of material of all my IT experience, education, major projects, contacts, letters of recommendation, etc. When I apply for a job I send them my resume but if I get called for an interview I bring in my portfolio and use it during the interview - it often has a very large positive impact.
One of the best programmers I ever knew wrote and maintained a large Cobol-based Point-of-Sale program for MS-DOS. It was an incredibly good product, with all sorts of hooks for all sorts of POS-based equipment, right down to pump controllers for gas stations. He had an office, worked there, but when he went home, he went home. It's tough in this day and age to do that sometimes, but I really envied the way he actively divided his world between work (development, marketing, support) and home (family and recreation).
The world's burning. Moped Jesus spotted on I50. Details at 11.
I disagree with a lot of these points.
Reasonably good indicators
Ability to yammer on about a subject one's audience does not care about is a weak indicator of programming ability and a strong indicator of poor communication skills
OK
NO, NO, NO!
A good programmer has an open mind and makes decisions after thought, study, and understanding the users' needs; not based on some knee-jerk personal prejudice.
There is nothing wrong with taking advantage of company-sponsored courses. Taking advantage of classroom opportunities is just good time management (it can be easier to learn more, faster, in a well-taught course than in self-study).
So what you're looking for is a prima donna who will refuse to work in the environment you ask him to, and is insubordinate out of the gate? No. A good programmer will find the strengths of the technology you've picked and design a strategy that plays to those, rather than just telling you you've made a stupid choice and should have used his pet technology instead.
I don't know if it's ever a good idea to hire someone who "doesn't seem too smart."
That's a stupid criterion. Why someone starting programming is a lot more important than when
Inability to write a complete CV is hardly an indicator of competence. The author is biased in favor of people who started programming at the age of 9, as he did.
Nonsense; depth of knowledge is as important as breadth of knowledge. Ability to justify 50 different buzzwords on one's resume doesn't make someone a good programmer. It is a lot better to talk about the problems the candidate has solved, than the technology used to solve them.
[Sir Garlon] is the marvellest knight that is now living, for he destroyeth many good knights, for he goeth invisible.
As one of the elite few programmers who does know how to spell, thank you for noticing. I would say "take it as a good sign" rather than "get out your checkbook" but I'm just the cautious type I suppose.
However - I can spell, and my brother can't. I believe this has more to do with the teaching methods in our respective elementary schools than with our inherent attention to detail. His school used an experimental method that I think failed him utterly - at a time before national standards were yet fashionable.
[Sir Garlon] is the marvellest knight that is now living, for he destroyeth many good knights, for he goeth invisible.
"A; B; while(F) { C; D; A; B;} C; D;" from "while (F) {A; B; C; D; }" works only if the loop always iterates 2 or more times. If F is not true or F is true for 1 iteration, the proposed substitution is incorrect.
Every time you have an interview, it should be their interview as much as yours. That's the point of an interview, to see if you fit together, not just to see if they think you fit them, but to see if you think they fit you too.
Every interview I've ever had, I interviewed my interviewer as much as they interviewed me. Maybe I'm strange, but it's worked so far.
"Growing old is inevitable; growing up is optional."
Funny... from the point of view Central/Eastern European country citizen... your last names are often unpronounceable. Think about as dollar weakens.
LOL - I double-dog dare you to post these magical 20 lines here. If you do, I guarantee you will find that:
(A) Most of us will understand it.
(B) Many of us could make it better.
(C) It's definitely not voodoo.
I do agree with you on the "programming is a day job" part, mainly because I'm going through the transition myself. I used to spend a lot of time at home playing around in different languages, writing my own games and utilities, endlessly writing and rewriting websites... Now, I just want to go home and vegetate in front of a game or the TV...
The change? Full-time job. After spending a full day programming to earn my paycheck, it just becomes mentally separated from what I do in my spare time. I kind of miss the old college days when I could just spend hours and hours doing it for fun, but now I just want to zone out.
As for the new technology part, I somewhat agree... A good programmer shouldn't be ranting about how everything MUST be done on Ruby-on-Rails, because that's the new fad (Yes, I realize it no longer is. That's the point)... A good programmer will look at a new technology, look at the needs of the project/business, and decide whether or not that technology is a good fit. If it's a major improvement that fixes existing problems, then he'll start pushing it.
On the other hand, when you're interviewing a programmer, and ask them about some personal project or technology they worked with, getting your ear talked off is a good sign, because this ties into the whole "passion" part. If they find this project or tech interesting enough to ramble on about, this is probably someone who's in the industry because they enjoy it, not because their high school guidance counselor told them it pays well.
So, on to social skills. Yes, you need to be able to communicate with and get along with other programmers, even those who aren't on the same level. Apart from that, the importance varies depending on the person's role. If they're going to be one programmer on a large team, working off design documents and style conventions, then it's not that important. If they're on a smaller team, and will be working directly with the business side to design parts of the application, then social skills become a necessity. Of course, if you find someone who just wants to sit in a dark room apart from the rest of the team, and just silently deliver code modules to them, then you might want to look elsewhere.
Qualifications... Degrees... I think the article was basically preaching against certifications, and in that respect I agree entirely. I don't care if someone passed a certification test by Microsoft or Sun... That means they know how to work with one specific area of technology, well enough to pass a test once. It doesn't say whether they can think for themselves, or adapt to a new situation.
On the other hand, an undergrad degree can be a good thing. You don't learn how to program in college (Well, I hope not), but you do learn how not to reinvent the wheel. You learn some standard algorithms, data structures, and methodologies, and you learn about lots of things that you'll consider useless at the time (Natural sciences, higher maths, etc), but will still influence the way you think. A master's degree or doctorate, well, I don't know... I've worked with PhDs who couldn't think outside the smallest box, and I've worked with a few who could work miracles. A dropout might be a bad sign (Though not a disqualifier, depending on other factors), but I wouldn't trust a PhD to necessarily be better than an MS or BS.
In short, you make some good points, but you're leaning toward the other extreme. Remember, you're looking for a programmer, not a corporate executive. This is about looking past the doublespeak and self-promotion and determining whether someone can write quality software.
On a side note... The phrase "working yourself out of a job" is starting to look really scary... I shouldn't have automated this place so well that I have nothing to do but post on slashdot...
"The amount of intelligence on this planet is a constant. The population is growing." -Cole's Axiom
char *reverse (char *buf) {
int len = 0;
while (buf[len] != 0) len++;
for (int j = 0; j < len / 2; j++)
{
buf[j] += buf[len-j-1];
buf[len-j-1] = buf[j] - buf[len-j-1];
buf[j] -= buf[len-j-1];
}
return buf;
}
Dude, you're right on spot, with the exception of the Bangalore code-monkey, which sounds a bit racist to me.
I've worked with a few nerds before and, in spite of being considered "geniuses" by the management they are a pain to work with, they work too many hours and force others to do the same because they are unable to plan and organise, and also explain themselves and listen to others. Once, for a particular project, the lead developer coded an FTP stack of her own in C++ because he didn't trust the standard ftp unix command or any free FTP library.