Joel have been talking about finding great developers. Every bloggers seems to have their own ideas about what makes a great developer. [1] [2] [3] [4] Maybe I do too.
We could ask widely-acknowledged great programmers, like Stiff did, what makes a great programmer. Ironically, one of these great developers, Linus Torvald, has terrible habits that violate the criteria of each blogger.
Paul Graham, who wrote about Great Hackers, also notes that is difficult to recognize a great hacker without working with one.
So who are the great hackers? How do you know when you meet one? That turns out to be very hard. Even hackers can't tell. I'm pretty sure now that my friend Trevor Blackwell is a great hacker... But when I first met him, I thought he was a complete idiot.
Paul says its also difficult to recognize one's self as a great hacker. Naturally, every one thinks himself to be at least a very good developer. How do you know for sure?
Someone at Reddit asked "How do you know if you're a good programmer?" Interestingly, one replied that only good programmers ask themselves that question. Another commenter, BigTech replied,
To me, a good programmer optimizes code--they can get more done with less code, for example:
If X = 0, then X = 1 else X = 0 End If
becomes X=ABS(X-1)
By BigTech's own definition, he doesn't seem like a good programmer. (He also uses VB--a warning sign.) His expression could be optimized down to 1 - x or even !x. Apparently, BigTech mistakenly believes he's a good programmer; he didn't realize that he defined a function over two points, which could be directly expressed as a linear function. I also disagree with his optimization theory, but then again Steve Wozniak spent "his whole life trying to optimize things."
BigTech's overassessment of himself reminded me of Chris Sell's post on how to recognize expertise. (Apparently, Chris didn't have a mirror at home.) Chris later mentioned an article called "Unskilled and Unaware of It. How Difficulties in Recognizing One's Own Incompetence Lead to Inflated Self-Assessments," which Alan Bellows has a good summary on:
When asked, most individuals will describe themselves as better-than-average in areas such as leadership, social skills, written expression, or just about any flavor of savvy where the individual has an interest. This tendency of the average person to believe he or she is better-than-average is known as the "above-average effect," and it flies in the face of logic… by definition, descriptive statistics says that it is
impossibleabsurdly improbable for a majority of people to be above average. Clearly a large number of the self-described "above average" individuals are actually below average in those areas, and they are simply unaware of their incompetence.
The inability to recognize one's incompetence is not unlike the experience of being color-blind. [2] [3]
Just as we might overestimate ourselves, so too we might overestimate the abilities of others we regard as great. John Rozewicki argues that we turn great people into superhumans, but in reality no one is a genius. (How else can three housewives outsmart computer engineers, rocket scientists and NSA?) Guardian Unlimited writes how Einstein struggled with his grand theory - and the maths. Einstein also had a smaller than average brain, which probably doesn't mean anything. Another research article, "The Expert Mind," suggests that anyone can become a genius. Even for child prodigies like Mozart, Gauss, and Bobby Fischer, heavy labor spanning over a decade was required to prepare each genius.
Stevey, who equates greatness with fame, writes "get famous by not programming." His programming heroes, he realized, become heroes either because they were more vocal by writing a popular book or blog or were associated with a popular product, neither of which necessarily equate to being a good programmer.
Do you have any programming heroes? I do! Oddly enough, though, I've never really seen much of their code. Most of the famous-ish programmers I respect have actually made their impact on me through writing, and it's usually just prose, with maybe a little code interspersed....
.... But when someone builds a framework — any environment that we live in and actually enjoy programming in — and there's one person who's chiefly identifiable as the primary author of that framework, then I think we tend to admire that person, and unlike other programmers, the person starts to become famous...
Even if they're a crappy programmer.
Joel, I am pretty sure, considers himself a great programmer. The post suggests that he may just be famous because of the articles he's written and how he leverage that into book sales, product sales, and forum activity. As for whether he's a great programmer, he's has the same natural tendency to inflate his worth as any other developer. He could simply be tooting his own horn, which is larger than everyone else's. Is FogBugz really that technologically impressive? Well, Joel does have one attribute of genius mentioned by Bertrand Russell.
One of the most important elements of success in becoming a man of genius is to learn the art of denunciation. You must always denounce in such a way that your reader thinks that it is the other fellow who is being denounced and not himself; in that case he will be impressed by your noble scorn, whereas if he thinks that it is himself that you are denouncing, he will consider that you are guilty of ill-bred peevishness. Carlyle remarked: ``The population of England is twenty millions, mostly fools.'' Everybody who read this considered himself one of the exceptions, and therefore enjoyed the remark.
In another ironic twist, Bertrand Russell also says that one must delude himself (a common refrain of mine) in order to become a genius.
Ignore fact and reason, live entirely in the world of your own fantastic and myth-producing passions; do this whole-heartedly and with conviction, and you will become one of the prophets of your age.
If we are to delude ourselves, how do tell if we're geniuses or simply incompetents with inflated views of ourselves.
You may want to rethink the "above-average" portion of the show. Most people seem to think that having a majority of people be above or below average is a logical fallacy, when, in fact, it is by no means improbably. For example, the vast majority of people have an above-average number of legs (the vast majority of people have 2 and a small number of people have 1 or no legs at all, bringing the average to below 2).
This just points out the limitations of the statistical mean without any measure of normality. In the case of intelligence, I would guess that the curve looks something like that of the number-of-legs curve, meaning that most people center around the same area, with some low outliers that bring the average to below the majority of the population. Someone please correct me if statistics show otherwise, but I would assume that the effect of low outliers is not counterracted by equally high outliers. Just a thought.
Posted by: Noah Richards | September 08, 2006 at 10:09 PM
That code-optimization example reminds me of something I read decades ago, in some programming book from the 60s or 70s: programmers write for code size first ("I can do that in fewer lines of code!"), performance next ("I can make that run faster!"), and maintainability after that ("I can make that easier to maintain!").
In my own experience, I think this rings true, as general phases of a programmer's development. At first you're struggling with matters of form and syntax, so you learn to express something more efficiently. Then, when people start actually using your code, you need to optimize performance. And finally, when you start taking a long-term view of the process over the entire life of a piece of code, maintainability becomes your focus.
Posted by: Doug Mahugh | September 09, 2006 at 12:24 PM
if (x == 0) {
x = 1;
} else {
x = 0;
}
is not functionally equivalent to x = 1-x. Imagine that x is initially 25.
It is only functionally equivalent to x = !x depending on the language (as !x will actually return a boolean).
I propose therefore a safe bet which is pretty optimal is: x = (x == 0) ? 1 : 0;
Of course, it's just shorthand for the same bit of code, but I don't think you can optimize it any further without changing what it does. (I'd be interested if there was a way though!)
Posted by: David Rainsford | September 10, 2006 at 06:13 AM
This is in response to Noah Richards' comment. I agree with Noah's argument, but I think that when people say they think they are "above average", they don't really mean average in the statistical sense. They mean that they are above the norm / masses, ie. that they would be one of the "high outliers".
Posted by: Jaco Esterhuizen | September 10, 2006 at 11:38 AM
The real reason why women can distinguish between periwinkle and lavender:
Women may be able to perceive a wider range of colors than men, because the genes to distinguish color lies in the X chromosome, women have additional copies. Color blindness is more prevalent among men (8%) than women (.4%).
The additional ability to see a fourth color instead of the usual three leads to tremendous increase in the ability to see that most people can't realize.
http://www.post-gazette.com/pg/06256/721190-114.stm
Posted by: Wesner Moise | September 13, 2006 at 10:48 AM
With the recent poor posts by Joel criticizing Ruby developers (see http://www.codinghorror.com/blog/archives/000679.html), Joel should keep this continuation of the about quote from Bertrand Russell in mind:
You must not denounce well-defined classes, such as persons with more than a certain income, inhabitants of a certain area, or believers in some definite creed; for if you do this, some readers will know that your invective is directed against them. You must denounce persons whose emotions are atrophied, persons to whom only plodding study can reveal the truth, for we all know that these are other people, and we shall therefore view with sympathy your powerful diagnosis of the evils of the age.
Posted by: Wesner Moise | September 14, 2006 at 01:29 AM