David B. Held 
| Since many people (including me) hate deeply nested threads, I decided to start a new one on a slightly off-topic subject. IMO, "Computer Science" is a slight, but not complete, misnomer. On the one hand, students who take CS at a university expect to be taught Software Engineering, and that is what universities tend to teach them. On the other, the professors themselves, who actually do research, do a lot more than Software Engineering, and often tend to actually be bad at both doing and teaching SE (because they don't do it professionally, of course).
Do Computer Scientists actually conduct experiments worthy of calling them scientists? Well, when I was going to school, we knew there were certain times when it was not wise to attempt to build your project on the department minicomputer because one of the professors was running his genetic algorithm to solve the Busy Beaver problem. He ran his program as often as possible and regularly wrote papers on progress he made on this and other topics in CS. Given that his hypothesis was that a certain fitness function or selection rule or crossover strategy would produce better results than what was currently known, and that the only way this could be demonstrated was by running the simulations, I would call this "experimentation" and "science" just as surely as growing something in a petri dish or smashing molecules in an accelerator.
The reason most people don't associate CS with "science" is that they don't end up in the academic world, where most science is actually conducted. But if they did, they would see that all good papers involve an implementation to demonstrate (or fail to demonstrate) some new claim about how computers do or should or could behave. Whether it's about "computers" or just "software" seems like a pedantic point, especially considering that "softness" runs a continuum that is being updated every day (for instance, the kilocore architecture is really a bunch of PGAs for which the notion of "running software" is more like "reconfiguring hardware").
Agreed that much of what computer scientists do is heavily mathematical, but to call it an extension of mathematics would be like calling physics an extension of mathematics because it is heavily mathematical. While there is a field called "Mathematical Physics" which explores that realm between pure math and pure physics where it's not obvious which you are more of, it is generally recognized that math is a *tool* used by physics, and not physics itself. In the same way, CS uses math as a *tool* to make statements about computation without the math itself *being* the computation (despite the overlap in symbology).
The *field* of Mathematics is about making statements about the *tool* of math, independently of any *application* of that tool. And interestingly enough, there are lots of interesting (and obscure) such things to say. Whereas, the *application* of mathematics is about making statements about *another field*, using mathematical concepts and notation. This is why CS was originally considered a form of "Applied Math". But it is no more useful to say that than to reduce physics, chemistry, and biology to "Applied Math". There is a certain strict sense in which that is probably true, but there is no practical value to it. The way you can tell is that a pure mathematician would make a lousy computer scientist because there is lots in CS that is irrelevant to pure math that such a person would not necessarily have learned and become proficient in.
So it then comes down to the question of: "Do you need CS to be a software engineer?" Well, that's like asking if you need Physics to be a good mechanical engineer. And in both cases, I would say: "No, unless you want to be a *good* engineer." Plenty of people who have not studied CS make up the majority of the SE "working class". But when an SE does not understand the basics of algorithmic complexity and tends to select data structures based on whether they provide the particular method or interface they need at the moment, you begin to see the difference between CS-educated SEs and non-CS-educated SEs. If you think there are no such SEs in the world, try screening candidates for any large tech firm. Even more disappointing is that going to school and "studying" CS does not make you a CS-educated SE, as many folks prove with alarming regularity.
Proficiency in a task depends on having a strong mental model of that task, and such models are built up through examples. You can acquire examples through experience, or through education; but ultimately, your neural network needs *lots* of examples to build solid models of the Software Engineering discipline. The point of education is to expose you to a regular set of examples so that your resulting model is more likely to be useful and more refined than random sampling (i.e.: the self-taught route). Of course, education does not always succeed at this task, and highly motivated individuals will tend to expose themselves to more examples than unmotivated individuals. However, if selection biases cause them to fail to consider examples that they would be exposed to in an educational setting (because they just code what's "fun"), then there is a hole in their knowledge that differs from standard education.
That's a long-winded way of saying that school is good because it forces you to learn stuff that you don't really want to learn, which ultimately makes you a more well-rounded person. Learning networks learn the best when they are able to sample the largest subset of the state space. So being exposed to stuff that doesn't really interest you otherwise exposes your brain areas of the state space that help you generalize your mental models more appropriately. And when a school fails to do this, then they aren't adding any value at all. But odds are, most students judge a school by how boring their classes were, failing to recognize that some of those boring classes are exactly what they need to learn to fill in gaps in their knowledge.
I can't say that I learned most of what I know from school, because I probably didn't. On the other hand, I think I learned a lot more having studied CS at school than I would have on my own, because of the whole formal-education-enforces-discipline effect.
Anyway, CS is relevant to D because getting the kind of knowledge necessary to design a good language is very difficult to do by inventing *lots and lots* of languages. It's much easier to just learn the theory behind PLs and apply that to features being considered for D (and to fix features already in D). And whenever you have a theory, you have a science. ;)
Dave
|