How many mediocre programmers does it take to measure up to one good programmer?
The answer is that no number of mediocre programmers will ever measure up.
Well, that was rather jarring. It really bruised my ego.
His logic is that, if you could somehow quantify a programmer's work, a single good programmer will always out-perform a single mediocre programmer. (Very true, by the way... simple math... if 1a > 1b, then 1a > 1b.) Also, because programming is such a demanding task in both creativity and technical precision, communication is vitally important when multiple developers are working on the same project. As you increase the number of programmers, you increase the communication which must occur in order to release an acceptable product. There is also added overhead with rewriting code to fit in with code written by other people, time spent waiting on critical bottlenecks, etc.
It is impossible to quantify the overhead of working with multiple developers... Every project is different, every team has different dynamics, and even the meekest of programmers have very strong egos, even if those egos are hidden behind layers upon layers of modesty, and rarely everything works smoothly and an amazing product is released ahead of schedule. (Don't ever bet on development being smooth, quick, or easy. You're more likely to get rich by playing the state lottery.)
So, with that in mind, I'm going to pull out a baseless, arbitrary number out of my ass. Let's say that adding a programmer adds 10% overhead to the team. With just one programmer, they're free to just work on what they're working on... one "unit" of production per day. With two, they each do 0.9 units, a total of 1.8... with three, that's 0.81 each, or 2.43... Continuing on with this trend, we find that 9 programmers each do 0.4304ish units, for a total of 3.8742 units... certainly better than 1 unit only, but at 9 times the cost (if they're all being paid the same).
Overhead is unavoidable. If developers work in a vacuum, not able to communicate with their peers, then at best the developers will each write their own version of the entire project... at worst, they'll actually try to reconcile their part of the project with the code written by other people, introduce endless bugs, cause endless delays, and the project will, quite literally, never be finished.
Now, I'm not saying that developers should work alone. Interns need to do the boring stuff, so that they can learn how to develop instead of just dream... managers need to manage so that the project will eventually release a product... senior developers need to mentor the juniors and work their truly amazing magic... and corporate needs to realize that they're only good at signing the paychecks and very, very, ungodly poor at micromanaging. (Anything more than "Have the programmers mutinied yet?" "Nope." "Good." is micromanaging, by the way. Yes, deadlines are good, when they're realistic, based on an understanding of the creative process, and based on the knowledge and abilities of the developers, and based on the nitty-gritty details and scope of the project. Corporate knows none of this, and is incapable of knowing this first hand, by its very nature.) Programmers need to work in teams in order to grow and develop their skills (especially people skills, which many programmers (erroneously) believe they don't need). A programmer who is learning is a happy programmer, and happy programmers make decent programs.
Well, I've strayed from the topic I originally intended to discuss. What I want to ask is:
How can a mediocre programmer become a good (or even great) programmer?
Well, the obvious is to develop technical skills, including those that delve into hardware. Understanding how hardware works is a knowledge that is slowly disappearing from the scope of a mediocre programmer's education, yet this knowledge gives insight into shortcuts and tricks that the top hackers understand. My next "toy" is going to be a build-it-yourself circuit board kit. (Okay, actually, my next toy will be a trebuchet... but that's not a professional development toy.)
What is less obvious, and far more vital, however, is to learn a completely set of skills... non-technical skills...
I already mentioned people skills... communication is key, and it is easy to see how it effects a team. This includes diplomacy and being able to recognize or even create win-win situations. You don't have to learn to be the next great orator, but you do need to recognize how jargon effects people, including the "lesser" people who buy your software and make it possible to have a paycheck... or the office assistant who brews coffee and who handles your physical mail... you do like your company expensed copy of Wired to be in good condition, don't you? Go out, get away from programmers, and hold conversations with people who think that a prototype is a one-of-a-kind car with features that maybe they'll see in a couple years.
But far, far more vital that soft skills... just as important as having a firm grasp on the differences between a signed and unsigned integer, or how procedure calls work... the number one skill that often separates a mediocre programmer from a good programmer is pure, raw determination.
Not motivation... Anyone can be motivated. Motivation fades away... excitement wanes... the next shiny algorithm is always more appealing than the one you're slogging through right now, and it is easy to be distracted by big dreams.
Determination, however, is a conscious decision that you must follow through with. When XKCD has a comic about scientists being unable to find the G-spot, determination is what brings you back to your code, happily and ready to work, when otherwise you'd be tempted to search for the news article that spawned the joke. (Okay, after you've sent the link to your wife via IM, you can go back to your code.)
Changing diapers isn't "maternal instinct"... there were no diapers during the period of time that formed hominid instincts. Taking care of the people you love may be somewhat instinctual, but changing diapers is all determination... and a man can be just as determined as a woman, just as easily. (Society says that women change diapers... not genetics... and except for the final trimester of pregnancy, women are just as capable of hunting and gathering as men.) (by the way, some of the best programmers I know are women... as are some of the worst... It's not genetics, it's society which puts men and women into separate roles... okay, I'm trying to hammer in the point that yes, us guys can be just as determined as women. I think I'm doing an okay job of making that point, but I also realize that I'm probably just rambling within my parenthetical side points.)
So... this determination thing... it sounds interesting... and I want to be a good programmer. What does it take?
Well, I'm glad I asked. When I know the full answer, I'll post it here. In the mean time, here's a partial answer that is, so far, working better than anything else I've tried before.
- Realize when you're distracted.
- Stop being distracted.
- Envision the goal and your current position.
- Smile (even a fake one) and write the next line of code.
That's it. Each time you get distracted, look at where you are, where you're going, and take the next step. There are times to take a deeper survey of your work at the beginning and end of each day, at each team meeting, and while you're laying awake in bed puzzling through interesting problems. While getting into the "flow" of programming is certainly good for writing huge chunks of code at a time, the flow is fickle and should never be relied on... rather, simply welcomed when it arrives. Write the next line, and be happy that you won't have to write that line again.
If you get stuck, there are ways around it... Work on the problem with a different medium... White-board the problem, or even get out paper and pen. (not pencil... pencils are evil, though they do sequester carbon and increases demand (and thus production) of trees, which further sequesters carbon.) Grab marbles and iterate through your loops physically... don't check your RSS feeds, or read an article from Wired... they answers don't lie there, and your subconscious finds patterns more easily if you're also working on the problem consciously.
Another trick to remove distractions: Clean your desk. Daily. The benefits become self evident after a couple of weeks of this practice. (While you're at it, clean your desk at home, too... and do the dishes and take out the trash, and vacuum the rugs. If nothing else, you wife will notice and reward you... which isn't a bad thing.) When you're away from your computer, really be away from your computer... be wherever you are, whenever you're there.
Above all, be determined. Stay determined.