Arbtirary thoughts on nearly everything from a modernist poet, structural mathematician and functional programmer.

Thursday, January 3, 2008

Dijkstra

Yesterday, I read both A Case Against the Goto Statement and On the Cruelty of Really Teaching Computing Science, by Edsgar Dijkstra. They were both rather eye-opening. One amazing thing about Dijkstra, is that he did not even own a computer until very late in his life, and rarely used them throughout his life... but he is one of the most important computer scientists in history. Why? Because "Computer Science is no more about computers than astronomy is about telescopes." Just like telescopes for astronomers, computers are the tool used by computer scientists to engage their science with the real world. Fortunately for us, Computer Science is abstract theorization, rather than concrete study of physical phenomenon. Because it is abstract theorization, a computer scientist is allowed to spend no time actually using a computer.

The point is that computer science is not a discipline, but a branch of mathematics. A branch that deals specifically with the generating, solving, and analyzing algorithms. Some people may try to disagree with me on this. "How is a professional [insert type of program here] an algorithm we can analyze?"
Firstly, this argument is ridiculous, because all a computer can do is manipulate symbols by a concrete, predefined set of rules. That is, all a computer can do is process an algorithm. If you don't believe me, read anything on the theory of computation (typically by mathematicians), specifically pay attention to Turing's work. Anything a computer can do must be describable by an algorithm... Would you be surprised, then, if I told you that all programming languages are just systematized algorithm languages? All compilers do is translate these algorithms to a form the computer can use.
Secondly, I would hardly call most of today's programming an exercise in computer science. To continue Dikstra's analogy, putting a satellite in orbit is not a job for astronomers. A computer scientist lays the groundworks: creates algorithms, creates languages, etc, and then the programmer uses these as tools for a finished product. Just as a physicist doesn't need to know why group theory works, just that it does, or an aerospace engineer doesn't need to know or why wings work, just how they work.
The why and how are for theoretical disciplines, primarily math and computer science (I know, I'm biased away from sciences). The engineer, or applied scientist doesn't need to know why,they need to know what and sometimes how.

Cheers

No comments:

Creative Commons License Cory Knapp.