Programmers and Scientists
A distinction should be made between Computer Science and computer programming that is more substantial than orthographic convention. Some might stop at the observation that the first is an academic discipline while the other is a vocation, hence the two conventions. Indeed, electricians do not study signal theory, and electrical engineers avoid cable installation. The same cannot be said about our discipline: in school, and at work, we spend most of our time contemplating software. If that is so, then perhaps software quality should be the metric. Does it follow that highly-trained computer scientists should produce better code? In fact, the opposite is almost always true: research software is often disorganized and unstable, more like a bicycle made from sticks and glue than a polished instrument. Software practitioners use this fact to arrive at an equally errant conclusion: a good programmer is a scientist (Jeff Atwood’s recent feature on NP-completeness illustrates this fallacy). For every parry from academia, there is a riposte from industry. In the end, neither man leaves the field unharmed.
Theory should replace artifact as the central premise of this argument. Computer scientists are theoreticians that use software to work out certain conjectures: for them, writing code is an act of exploration and validation, not an end. Programmers cut code; they are not paid, nor are they inclined, to induce theories from their art. From this angle, the distinctions between the two camps become more apparent. Imagine an informal trial in which a computer scientist is asked how to internationalize a software package, or how to re-factor an application for geographically separate databases. Most computer scientists will not have informed answers to these questions, but a decent programmer could sketch the current strategies.
Next, invite a few hackers to take this quiz:
- Use the pumping lemma to prove that w = 0n1n is not regular.
- Prescribe an algorithm for a Naive Bayes classifier (one prominent hacker already bludgeoned the math for this one).
- Say something (anything) about LL(1) parsing.
If your programmer friend waives his hand at this “impractical trivia”, then ask him to do an integral. If he stumbles, raise the bar and ask him to multiply two matrices together. Of course there are scientists who write great code, and programmers who know science, but if generalizations can be made, then knowledge of theory should be the guideline.
If this distinction is rightly understood, then it provides insight into several other vexing questions that receive equally vigorous discussion.
- How do I become a great programmer?
- How do I become a great scientist?
If you want to be a great programmer…
Write code. The expert phenomenon is well understood: there is no substitute for hard labor, early in life if possible (This Scientific American article provides a layman’s overview of the current research). Often this toil is unappreciated. Malcolm Gladwell argues that experts develop through no less than 10,000 hours of intense training. “Practice isn’t the thing you do once you’re good,” he writes. “It’s the thing you do that makes you good.” Gladwell accumulated his time in obscurity:
After failing to get a job in advertising, he landed at the right-wing American Spectator, which eventually led to a reporter position at the Washington Post in 1987. “That’s where I got my 10,000 hours,” he says of the ten years he spent at the paper covering business, science, and eventually New York. “People today write a lot, they write these blogs and things, but in all that research on 10,000 hours, they talk about deliberate practice. And the thing about a newspaper is, you have an editor … who’s saying ‘No, this doesn’t work, go back and do this.’ If I’d come up today”—when newspapers are doing more firing than hiring—“its very doubtful I would have been in such a supportive learning environment.” In 1996, with his 10,000 hours under his belt, he was hired by The New Yorker as a staff writer, which Gladwell says was his biggest break. [link]
Peter Norvig’s fine piece on computer programming makes the same argument, as does Eric Raymond’s position paper. And if you think that you’re already good, compare yourself to the people who write great code, often late at night after a full day at work.
Obsession can be virtuous.
If you want to be a great scientist…
Go to graduate school. Except for the true polymaths in the population, most of us need the rigor of formal training to learn hard material. Much of computer science is hard. Edsger Dijkstra famously said that he chose computer science over theoretical physics because it was harder, and in his youthful vanity, that was all that mattered to him. With programming, time invested equates to progress. The same cannot be said for science. Experiments fail; equations remain unsolved; conjectures are developed and discarded. Graduate school provides an environment in which these events are accepted as the natural order of the universe. In his appendix to the Challenger disaster study, Richard Feynman observed that “nature cannot be fooled”. So when programmers talk about ‘NP-complete cheats’–fooling nature–you can be assured that they have misunderstood their occupation, and that they might benefit from an advanced degree program.
Leave a Reply
You must be logged in to post a comment.