Poisoning the Java well

ziggy on 2004-08-26T06:06:06

I'm a big fan of Paul Graham. But his latest essay has me a little uneasy. Specifically, where he says:

For example, if your company wants to write some software, it might seem a prudent choice to write it in Java. But when you choose a language, you're also choosing a community. The programmers you'll be able to hire to work on a Java project won't be as smart as the ones you could get to work on a project written in Python. And the quality of your hackers probably matters more than the language you choose.
Java programmers have taken great offense at this. Specifically, when they refer to this part of the quote, almost entirely out of context:
The programmers you'll be able to hire to work on a Java project won't be as smart as the ones you could get to work on a project written in Python.
Why am I uneasy? Because Paul is flirting with poisoning the well. So Java programmers are dumb. If you want proof, look at all the blather they have spouted arguing with Paul asserting how non-dumb they really are. (Here is a list of links into some of this discussion.)

Now, I happen to agree with the overall message Paul was trying to convey. He has since clarified his point. It's not that Java programmers are dumb, it's that, on average, Python programmers are smart.* And, when this essay is taken in its entirety, Paul is really saying that he doesn't know any great Java hackers personally, but his opinion of J. Random Pythonhacker is generally much higher than J. Random Javahacker.

Furthermore, Paul was trying to be provocative and get us to accept that variability of programmer skill is a fact of life. Smart companies will aim for the most skilled hackers, not the most widely accepted toolchain. Smart companies will accept that there is great leverage paying a slight premium for great hackers (regardless of toolset). That leverage that makes it very desirable to hire a small number of his so-called "great hackers" compared to a large number of middling programmers. **

But that doesn't excuse a logical fallacy, accidental though it may be.

* I read somewhere that this is not a characteristic of Java as a language, but a characteristic of its mainstream status. Some programmers don't care much about coding, and just want to collect a paycheck at the end of the week. By definition, these are not great hackers. Avoiding a mainstream language (like Java) goes a long way to avoiding these people a smart company does not want to hire. Because Python is a boutique language, it's almost impossible to hire a Python hacker who is in it for an easy paycheck. Similar statements can be made for Perl, or Perl + some CPAN modules.

** I once worked in a shop where we had a team of "star programmers". Our main tasks were to figure out the hard problems and do the heavy lifting so our projects could be shoved onto some entry level programmer's desk. Because it was dirt simple to hire a floor full of entry level programmers, our manager saw his job as getting his star programmers to fire on all cylinders all the time, and shuffle the mostly completed project onto entry level programmers. Because entry level staff was cheaper, he could afford to let them spin their wheels for a week, or just sit idle.

A smarter manager wouldn't hire by body count, and would have replaced the stable of entry level programmers with a few great hackers. Entry level programmers, when hired, would pair with their more skilled colleagues to become great hackers themselves. Keeping a bench of entry level programmers ready to spin their wheels doesn't do anyone any good, and hurts the projects as well.


LISP hackers are smart too.

brian_d_foy on 2004-08-26T16:25:01

I took his comment to mean the same thing he's been saying for years about LISP people. The higher end of the bell curve migrates to the niche tools.

Stupid Programmers, Java is for Kids!

scrottie on 2004-08-29T01:15:08

Re: smart programmers gravitating towards niches, yes, that's absolutely one part of it - perhaps the most significant part.

Smart programmers working in an environment safe from the effects of failure, separated from conflicting views, will develop egos and fall pray to "bad hubris". Programmers not "held to fire" by programmers using competing languages will tend to assume by default that their language and methodologies must be the best. For lack of competing standards of excellence, their benchmarks for quality and productivity will drift until they're radically out of whack.

Microsoft hires the best and the brightest - everyone knows that. Most people in the trade know someone who has interviewed there. People have compiled the legendary Microsoft interview riddles. Why is the largest softare vender also stigmitized with a reputation for poor quality? Lots of reasons, but reading Anatomy of a Software Bug the other day, I was floored by the hubris. And no, not the good adventurous, optimisitic hubris we all love. This hubris was a frightened, cynical hubris.

I'm going to bash Microsoft in this article. There are plenty of software companies that charge a lot, leave their customers in the lurch, and feel as though they have no accountability to anyone, but Microsoft is the best known of these, and it was artifacts from them that prompted this line of thought. I's somewhat unfair that I'm not roasting a less hated but just as deserving company.

Chris Pratley, also a Microsoft well-known blogging on the same, had also written an article earlier with repeated assertitions that Microsoft should not be held to the fire, the readers just don't understand, and we're no one to question Microsoft. These assertitions were separate from the technical information, and the technical information was extreme interesting, as far as looks into the quiet software giant.

The "Anotomy" article had the same theme of asserting that Microsoft is doing a good job but the readership of the article just doesn't understand what it's like, and that's where it went wrong - I do so know what it's like working on very large projects. I've seen hosed large projects and large projects that stretched you every inch but were fundamentally sane.

The "Anotomy" article asserted a lot of things as technical absolutes that didn't sit well with me, and these were things I recognized from failed software projects. It's little wonder Microsoft hadn't opened up before, but opening up is usually the best way to avoid demonization, and I'm not sure which is worse in this case.

Quotes come from the article:

"Nonetheless, the developer took a different approach. Knowing that the undo document was very likely to be involved, one could walk through the undo document, and copy the text for any pieces that pointed to the previously-saved version of the documents file to the scratch file. He coded up the solution, and handed a buddy-build off to the tester."

"very likely?" No. You don't apply "fixes" without understanding *exactly* where and why things are going wrong - even if you must refactor the whole project. If no one there can understand why it's failing, it almost certainly needs to be refactored.

"In order to understand this, we have to understand a basic principle of fixes. You make the simplest code change required to fix the problem. This reduces the chances that the fix will cause some other problem that is, potentially, worse than the one youre trying to fix."

No. This is not a "basic principle of fixes". This causes cruft accumulation - especially in this case where a design limitation is being hit, which is the case that this article describes! That goes back to my first point. The _best_ fix should be applied, with a thorough understanding of the entire subsystem or system. The system should be modular and use very little global state to make it easy to understand everything related. This guy is describing voodoo coding. He's describing the greatest minds at Microsoft voodoo coding. That's scary.

The error they're having is a "Disk full" error, but the real problem is that the process cannot open any additional files. Users are often confused by cryptic, vague, or incorrect error messages, but that developers took 10 years to figure out that the process was running out of file descriptions is really, really frightening. As a software developer, were I to walk into a large project cold, I expect that I'd be able to diagnose a file descriptor leak within a day. Maybe two days if the first day was an off day.

"Well, you might as well ask why police departments continue to have a large number of unsolved crimes on the books. The issue is the same: the investigation stalls for the lack of any further leads to follow."

He can't debug something without a groundswell of ultra-specific reproducable steps from your users, and you get more bug reports than any other software company on Earth, and they still aren't enough? This is amazing. Free Software developers, when resolved to fix a hard problem, will take core dumps and stack back traces from the field and effectively use those to solve the hardest of problems. In a crime investigation, you can't search every location, find every suspect, and monitor every action. When programming, you most certainly _can_. This is a poor analogy - or rather, a weak excuse.

Back to hubris. Stories of the hard-to-solve bugs are usually intesting. They're like detective novels. But this one reads more like a tragedy of errors. They can't debug something for 10 years. Yet hubris tells them that this is a _fine_ pace to debug at, even with leigons of programmers.

Developers, working on projects with like-minded developers, are seldom made aware of the limitations of their tools or methods. A Perl programmer is confronted daily by PHP programmers ("PHP is easy! I bought this book and now I make more money than you!"), Python programmers ("You should be fired for writing code like that"), and a host of others, including Java programmers ("our specifications are of the formal variety! Want to see the UML?"), C# programmers ("C# is now the preferred language - didn't you hear?"), and so on.

Java programs are seldom one-man efforts. Java programs are almost always the result of teams with year or two development timelines. Working with a mainstream language, your nads aren't held to the fire. Whether or not it makes you dumb, it sets you up to fall at the hand of your own pride.

(If I were really a Perl programmer, I'd have been able to make that point in 1/10th of the characters).

((Sorry to bother you all with this, but community and software qualtiy has been on my mind a lot lately - I see things go wrong, as with Microsoft, and I want to know how to it happened so I can avoid it for myself and the projects I love)).

-scott