This is a problem of definition more than anything else. I feel more comfortable thinking of Computer Science as the Math used to study algorithms and processes. The rest, although based on Math and the scientific process, looks more like Engineering to me.
I attribute that confusion to the fact that the term "Computer Science" is used as a facade for both Computing Science (a branch of mathematics), and the skills necessary to create and deploy software systems (which most of the time doesn't even require "engineering" math).
It's like grouping "Industrial Design" and "Theoretical Physics" under the term "Physics", if "Industrial Design" also included "Product Managment".
Computer science is definitely a science. Mathematics is a science and computer science is part of mathematics. Thus computer science is a study of computation or the automatic solution of problems or processing of data, etc.
The problem is that in most universities the computer science label is used for things that aren't computer science. Most computer science departments are mostly concerned not with studying or extending the science part of computer science, but with applying computer science to solve real world problems. This really should be called computer engineering or software engineering, just as applying certain aspects of physics to create electrical devices is called electrical engineering.
Computer Science has nothing to do with computers, and for the most part, is no more science than mathematics. Computer Science is not programming, but instead a subset of mathematics. A computer is to a computer scientist what a telescope is to an astronomer. Software Engineering is programming (though maybe the reverse is not true), and though many will insist that it is, I fail to see how it can be engineering unless a hair styist is also a hair style engineer.
Yeah, I tend to say "computer science" when I mean "theoretical computer science." To me there is a clear split between the stuff that's math/logic and the rest of it which I'm happy to lump under the catch-all of engineering (and don't feel comfortable labeling as any sort of science).
In my opinion, computer science is using mathematical constructs to produce correct programs. Computer engineering is getting the not-quite-ideal digital circuits in the computer to run programs correctly. Software engineering is a mixture computer science, computer engineering, and sociology while spinning a plate on a stick (or, if you're unlucky, while planning sprints).
- Systems, especially performance testing. Needs some statistics, but it's not hardcore math. No more than psychology or economics.
- Systems architecture. Not at all mathy. More like the biology of computer systems.
- Best practices. Software engineering. Not really mathy. Not really science either.
- OOP. Theology?
Of course, if you are good at math, then the most mathematical parts of computer science may be the ones that catch your eye. So you equate computer science with math + a bit of fluff. But there are things to study that aren't just math, even in the field of computer science.
There is actually an old argument about whether Computer Science is math or science. The lack of hypotheses and physicality drives the "it's math" camp. I tend to fall into that camp. Most computer science is either math or applied math.
That said, most of machine learning is not just engineering. If anything, there is little engineering done at all.
Computer Science is a ill-advised conflation of two different fields, of which one is largely an engineering discipline and one is essentially applied mathematics that the engineering side draws upon for tools and techniques. Neither is a "science" under any plausible definition of the word.
I can't agree more. I think computer science is somewhat unique amongst fields that are typically called engineering. While mechanical and electrical engineers build things that are based off of scientific theories, computer scientists build things that are based off of mathematical theories.
Computer science is the study of algorithms, the study of algorithms fits the scientific method. Programming and electronics is not computer science. QED.
In this context, most of computer science is more a form of applied mathematics.
Of course there are different ways to look at science, like making a distinction between analytical (or empirical) science, and synthetic science; the science that makes stuff, rather than analysing it. Not sure if that's really a good distinction; the latter is really technology, isn't it?
I think Computer Science is the branch of maths that studies computing. Things like Computability, Complexity Theory and Information Theory are clearly branches of Maths, and Math is a science. Now, most CS courses are not about this: they are engineering courses at heart, that only use CS in the way a Civil Engineering course may us Physics.
But maybe it is a science: there are certainly a number of things in CS that yield facts about things like algorithms (Big O, etc).
I read other comments here that compare computer science to math, and it is not an unfair comparison. However, even amongst mathematicians, you will see something of an avoidance to associate math with science. Math is a framework of a sort, a way to think. When we are talking about how to think, we are talking about philosophy. Science has its own roots in philosophy, so it is not surprising that we see some grey areas here.
So let me rephrase it a little... When you learn Computer Science, you learn how to think.
People compare CS with engineering disciplines, but we find that there are a lot of methodology salesmen but few magic bullets. The problem with comparing computer programming (the practical side of CS) to engineering is that programming is very difficult to measure. We graduated from the idea of measuring lines of code. We have not figured out how to accurately measure a technique like TDD. We have an idea that code quality can rise when people pay attention to it, when people think about the problem; we can encourage this with code reviews, but we can do the same by encouraging developers to have a good night's sleep. We have conjured approximations for our measurements, but none of this has quite the feel of engineering. We are not building bridges, complete with a starting plan based on knowns and an execution.
Algorithms are not building blocks. They are possible solutions to specific problems. There is more than one solution, and the algorithms our professors taught us come with trade-offs. Recently on HN, there was an excellent article and discussion on the trade-off made by grep to improve string searches.
So you cannot just pick from your handy dandy book of algorithms, fit them together in a programming jigsaw, and expect results. The world of software is soft; requirements change, and systems change. It is extremely flexible in a way that other, more physical entities, such as bridges, are not.
In addition to thinking of CS as a philosophy, I favor thinking of CS as an art. I am communicating something to the computer, certainly, but in order to ensure that my code can be picked up by others or myself a year down the line, I must also dive into aesthetics. The code must be readable. It must make sense, must describe the problem, be expressed in such a way that humans can derive meaning from it. Thus is CS as much about beautiful design as it is about getting results.
Computer Science has always seemed to me to be the study of algorithms and information, correctness, methodologies, and their applications. Math is used in order to advance this knowledge. It is readily apparent to me that everything in CS is applied math and logic.
And in the same way a mechanic uses physical principles (arrived at by way of math), software engineering uses insights, practices, methods, and languages (which are mathematical entities to control a Turing machine) developed by computer science. Computer scientists in turn also learn quite a bit from challenges found and attacked by the engineers.
A few computer scientists I've met have math degrees and they enjoy exploring intersections of discrete math and formal methods; some also do research almost exclusively in engineering / application domains (e.g. computer graphics). And, some engineers I know do quite a bit of graph theorizing before hitting the keyboard (whether they recognize it or not) because it's useful.
A good SE will be a computer scientist when faced with a new, challenging problem and a CS will engineer on occasion to help her research.
I disagree with you on the notion that CS is a branch of Engineering and not mathematics. It's not that I'm with the view that CS is a branch of mathematics btw.
I'm with Edsger Dijkstra's point that Computer Science is a new emerging paradigm which should be approached with a Zen-like mindset... It depends on the natural sciences, however, take for example: mathematics, information theory...etc and on the other hand it depends on Engineering... Yet it's not an interdisciplinary field for any of the mentioned ones above! It's a field of its own making.
"Computer science is no more about computers than astronomy is about telescopes." - Edsger Dijkstra
reply