Mike has an interesting post up over on his blog which is a response to Josh which is itself a response to Bruce Eckel. After seeing that long line of discussion, how could I refrain from adding my own brilliant thoughts to the conversation??
On the whole 5% thing... I don't know. Its a widely held belief in programming circles, one I've heard numerous times (certainly as Mike says, the number is made up, but the sentiments are there). I used to believe this idea with all my heart. Now? I don't know. I certainly used to not only believe it, but was absolutely convinced I and my close friends were a member of that elite group. I still think I'm a great programmer, one of the best, and my friends as well. But, I've started to doubt the other side of the equation the 20x as productive.
I've just going to skip over Mike's arguments of measurement. They are valid, and well put, but I'm not interested in that side of the discussion. In my career as a programmer (yes, all 5 years of it!) I have seen a lot of productive people and a number of non-productive people. My consensus is that people who want to be productive are, and people who just want to not get fired aren't. Are you excited about your space? Are you committing yourself to the successful completion of the project? There are a dozen ways (ok, way more) to waste time on the job, without looking particiularly unproductive. Everything from reading email, attending all the optional meetings, to things like reading web comics and even coding, but not tackling the hard parts of the project. It seems to me that those who want to succeed move those obstacles and distractions out of the way and those who don't embrace them.
So, I guess it is possible for the top programmers to be 20x more effective, becuase of the effort they put in. If you spend 5 mins an hour checking email, and another doesn't, he's already 40mins ahead of you at the end of the day. Add in some meetings that he skips, and some of the other stuff, and its easy to see how even similarly skilled people differentiate themselves.
I will agree with Bruce Eckel that programmers can really differentiate themselves with continual learning. Its really important in any technical fields (look at surgeons or scientists) to continually learn, and it's no less true in programming.
Maybe with all these factors together you get up to something like 2x... But most of the times these numbers are bandied around its always something like 20x. I think 2x is already waay awesome. Additionally, Josh's comments on letting less skilled programmers write until the heat death of the stars is also a good point. Its definitely true that less skilled people just can't produce the same code as others, and in many cases could never implement the same feature jumps that the masters can.
Hmm... that is a little long and rambling, but I still have something else to address. Mike's question of taking 50 cs students and getting them into the top 5%. Well, I think there are a couple of important pieces to this puzzle. First of all: screw traditional curriculum. As my dad has told me a couple of times, Colleges don't want to teach practical skills anyway. Is it any real surprise that they aren't very good at it? You want to know who the best new hires at Amazon are? They aren't traditional undergraduate students. They aren't any students from the US even. They are Waterloo students. You want to know why? Its very simple. Waterloo students spend (I believe) 5 tri-mesters working in Co-Ops at companies. They quickly get exposed to a number of languages, design methodologies, companies, etc. Most importantly... They know what source control is. They know how to really write code for re-use. THey have some idea of how to work with others to get projects done.
So, if you want 50 people to be the best, how do you do that? You could just emulate waterloo, but I think you'd need to go farther. Start a startup with them. Teach them datastructures and algorithms while you're under pressure to get a website up. Let them learn about file size limits when their logs grow larger than 2GB. Learn by doing. In the world of software, there is little cost to screwing up. Its not like bridge building or even auto repair where you might be hurting others. I think the heart of learning in CS is related to doing and figuring out for yourself what works and what doesn't.
But even that is not enough. You must must must get people excited about the act of programming itself. How can this be done? For one, I think you pick projects to tackle that are exciting to people. One of the most time-consuming applications I've written was a character generator that was written over the summer. I would work all day as an intern, come back to the apartment, and code until it was time to go to bed. Why did I do this? I saw real use for this program and I wanted to make an awesome program I and others would really use. You want to know what I did in my programming languages and compilers class at UIUC? I implemented half of a lisp compiler. Who wants a lisp compiler? I'm sure there are those that do, but I didn't. Wouldn't it be immeasurably better to have projects your excited about?
I think there are other, more gimmicky things you could do as well. Give monetary awards to those who do well. College students will do a whole lot for some money. Really do a start-up, let the students really feel like they're a part of something worth working hard for. Have people teach topics as they come up, and make sure that anyone who teachs is really excited about what their teaching. When I give tech talks about Amazon, I see people light up and get interested. Why? Because when I speak I put a lot of emphasis on how much I like Amazon and how exciting and interesting it is to work there. My material is normally less exciting than others (Build tools vs. awesome Kindle or Scalable Storage for the Internet, etc), but people take notice because I am excited about it. Make sure you provide the tools for those studnets to be productive both in and out of class. Make sure teachers are available one on one. And most of all be focused on projects, not on chapters in a book.
If it were possible, I would find the 50 most excited, talented and teacher-y programmers in the world, and have the 50 students apprentice to them for 4 years, maybe on a rotating basis.
I don't know if any of this is possible in the reality of the collegiate environment. But I know it would be cool to try.