The science that studies the organization and design of computers, and more generally studies computation.
...organization and design of computers... Actually, this is more the domain of Computer Engineering, isn't it? Computer Science is all about the computation*, trying to get as far away from the actual hardware as possible. Stuff like Big Oh and Algorithmic Complexity. Intro classes often use Sorting Algorithms to explore these topics, and often teach a Programming Language at the same time.
The theory of computation (the central area in CS) studies abstract mathematical models of the functionality of a computer, independently of concrete hardware organization. The central concepts in the theory of computations are automata, languages, complexity and computability.
Computer Science has close ties with mathematics (some consider it a specialized area of mathematics), physics, and linguistics.
Computer Science is not concerned with refactoring, methodologies, object technology, CORBA, UML, EJB, patterns, Oracle, SOAP, etc., except possibly in relation to or as applications of more general theories. These are more appropriately in the realm of Software Engineering.
Some people prefer to call it Computing Science. Ew Dijkstra: "Computer Science is as much about computers as astronomy is about telescopes."
Only a Mathematician pretending to be a Computer Scientist could remove the "computer" from Computer Science with a straight face. -- David Clarkd
One of the most accessible, yet in-depth and comprehensive, books that can serve as a gentle introduction to CS is "Introduction to the Theory of Computation" by Michael Sipser (ISBN:053494728X)
Is Economics just a branch of Math? I took 3rd year University courses in Econometrics where some classes had nothing but formulas for notes. Economics is the study of how humans behave in the presence of unlimited demand and limited supply. Economics uses Math but it is not Math or a branch of Math. Math is a useful and very organized kind of language that is used by many disciplines including Computer Science.
Is it still "Computer" science if we leave out the computer part? Computers are not whatever we can imagine them to be (at least not the common ones we actually use). They are physical machines that constrain what tools we can use to solve problems with them. Unlike most machines, they are programmable which means that we can implement other things on top of the basic set of (assignment, conditions and looping) to create many things but fundamentally, we can't just make it up. Math can. Lattice theory is an example of Math that has no physical use. Programming implies a computer language (even if that language is just Assembler). "Computer Science" research that doesn't program, use a language or take "computer constraints" into account might be useful but it is not "Computer Science". If you can't add or multiply or know anything about numbers, you probably shouldn't be a professional Mathematician. If you can't program and know little about computers, then you shouldn't think you should be a professional Computer Scientist.
Computer Science is not the study of computing. Is a calculator, Computer Science? Without programming, Computer Science would just be about logic gates and the hardware. If a "science" must directly deal with the "real world" then Math is obviously not "science" either. When I design new systems, do I hypothesize how the system will work, create that program and then test to make sure it works as I planned? Can my program results be repeated by others? Sounds a lot like "science" to me, even if not exactly the same as some other sciences!
Most plumbers don't create the tools or the techniques of their field and most programmers don't make the tools of theirs. Computer Scientists are people that understand and create the tools that others use to solve problems using computers. Computer Engineers design the physical machines we call computers. Software Engineers try to use some of the systematic methods of other engineering disciplines to design software, with mixed success. System analysts design/program systems of programs to solve problems.
As a self described, "Computer Scientist", I resent the idea that Computer Science is just some subset of Math. My long experience as a programmer, software designer, computer language designer and tool maker, tells me that Math is rarely used in Computer Science (I don't consider simple arithmetic to be Math). The Math used in Computer Science is but a tiny subset of Math in general and the Math that is used is but a tiny subset of information used or needed in Computer Science. Logic, problem solving and language all preceded Math by 1000's of years, so when all of these are used in Computer Science, it is not evidence that Math was the originator. If you want me to understand your idea, show me a pseudo program, a real working program or just plain English and I will understand what you mean. Show me Math formula and I will know you are an academic that doesn't live in the real world. I always felt it was strange that we use amateur programmers, with few real world skills in programming, to teach each new generation of programmers. It surprises me we have come so far. -- David Clarkd
All that can be taken with a pinch of salt. You can't even spell "evidence" correctly. [Is this the extent of your criticism? Spelling mistakes!]
{Typos aside, I stopped taking it seriously when I read "I don't consider simple arithmetic to be Math". Computer Science is the study of computation in all its myriad forms, including how "simple arithmetic" can be calculated. A calculator isn't Computer Science (it's a computational device) but it's certainly a product of Computer Science. Computer Science certainly encompasses programming, but is not limited to it.}
So you would have Computer Science a branch of Mathematics because it calculates numbers? Please name some "science" that uses no Math whatsoever? Even though computers do some calculations, you can't see the difference between a calculator and a programmable computer? I read that simple spelling mistakes were supposed to be corrected without comment. So much for looking for some intelligent debate!
{You intended to start a serious debate? I thought it was just an off-the-cuff rant. I can only assume the quip about spelling was intended in a somewhat sarcastically humorous spirit, and it was meant in the apparently throwaway spirit as the original (what appeared to be a) rant.}
{I didn't state that I "would have Computer Science a branch of Mathematics", nor do I think it matters where Computer Science is positioned in some subject hierarchy. I merely pointed out that Computer Science is the study of computation in all its myriad forms, but what that means is (deliberately!) open to interpretation. One view is that it includes study of the mathematics of computation, the application of that mathematics to produce algorithms and computational devices (including pocket calculators), algorithms, programming, social aspects of using computer technology, and so on and on and on. Another view is that it is strictly the study of the mathematics of computation and algorithms -- and the other topics are aspects of computer engineering, software engineering, sociology, and so forth as appropriate. It was Dijkstra who said, "Computer Science is no more about computers than astronomy is about telescopes." That is the latter view of Computer Science. The former view of Computer Science encompasses computer engineering, software engineering, sociology (as related to computing), and so forth. That same view would probably argue that astronomy is also about telescopes when it's related to remote exploration of space. Which view one embraces doesn't appear to matter. If Computer Science were definitively identified (by who or what, I know not) as a branch of mathematics -- or if it was definitely identified as not being a branch of mathematics -- it would not change anything. It certainly wouldn't change what I do as a professional Computer Scientist and university lecturer. Notably, the field as it is actually practiced -- independent of whatever definitions it might embrace -- is wide enough to admit pretty much anything I want to do with computers whether purely theoretical, purely practical, or somewhere in between.}
I have worked all my adult life in the field I call Computer Science and for 10 years I had a partner that was a world class Mathematician. I saw first hand for many years what a poor view Mathematics is for Computer Science. I think of Computer Science as a system of mutating data structures that solve real world problems. Even though computing is what computers do, the kind of computing that is done is quite simple and frankly, not very interesting to me. I have used and programmed many structures that have been borrowed from Math but I have also programmed many algorithms that aren't. If some Math makes my programs better then I will accept help from any place I can. I see problem solving as the most important quality of anyone programming computers and that is a human discipline, rather than a Mathematical one. Programmers must be pragmatists and juggle many real world concerns whereas Mathematicians think in infinities and correctness at any cost. Astronomy would still exist without telescopes but computers aren't optional for Computer Science. The computers create the whole world that embodies Computer Science so the analogy isn't correct. I have never even programmed without the online help of a computer.
{Computers came from computer science, not the other way around. It is possible to program without a computer, but it's admittedly not much fun. Computer science would still exist without computers because computation does not require computers, but its purview would certainly shrink. However, I have no objection to your definition of computer science, but that's because its definition doesn't matter to me, nor does it appear to matter to anyone I know who calls himself a computer scientist. I've known a few self-identified software engineers -- programmers by profession -- to whom it mattered a great deal. Some of them might argue that mutating data structures that solve real world problems is only part of computer science, and appears to (erroneously?) exclude stateless functional programming. They might argue that being pragmatists and juggling real-world concerns is Software Engineering, not computer science.}
I don't think you have history correct by saying that programming and computer science came before computers. You are absolutely correct that I think functional programming (FP) is not fit for the real world as it excludes 1/2, the data half, from it's definition. In the end, they will tell you to store your state in a RDBMS if you need to. When I was at University, we only used simple sequential files for a few of the exercises we programmed over 3 years of classes. In the real world, tables and data are central to almost every project, no matter how small, every day. Functional programmers think of variables as evil so they juggle the variables on the stack as passed parameters and give up to the database when that doesn't work. Languages that include both data and programs can execute functions just as well as functional programming does and also look after the variables. The argument that FP, without real variables fixes concurrency problems might be true but there are other techniques that also solve concurrency problems while not giving up the data part that is intrinsically what computers are all about. FP is mostly used by academics that enjoy a Math style syntax. It doesn't surprise me that the vast majority of programmers have never even bothered to look at it. I look at FP as a specialized "Domain Specific Language DSL" that has some useful purpose to Math professors who don't want to learn how to really program! On the Software Engineering comment, I create new ways for programmers to express their programs and I do that with what I would describe as a "scientific" approach, so I wouldn't call that Engineering at all. I have a list of desirable goals to design toward but none of them requires compliance with some Math axiom. CS is not Math. -- David Clarkd
{The origins of Computer Science are arguably with Charles Babbage and Ada Lovelace, whose work pre-dates building the first true programmable computers. Alan Turing was arguably the first computer scientist, whose work (along with Alonzo Church) on formalising computation and algorithms in the late 1930s led directly to the development of digital, programmable computers including (probably -- there's some debate over history here) the first electronic, digital, programmable computer -- Tommy Flowers's Colossus -- in 1943. Subsequent hardware development (primarily computer engineering), theoretical work (primarily computer science in the classical sense), and pragmatic work (primarily software engineering) have been closely bound together ever since.}
{Your assessment of Functional Programming shows some typical misunderstandings and prejudices. Before hastily dismissing it, try some practical experimenting with Haskell, F# or Lisp. It can be an enlightening experience, helpful for improving your code and (perhaps especially) the way you think about code, even if you don't use it for "real world" projects.}
Like all good programmers, I am always open to learn something new but I am curious, what in my post makes you think I either don't have extensive experience, haven't programmed in enough languages or know little about functional programming languages? I would give you a little friendly advice and ask you to study FP yourself. If you care to know what kind of experience I have, just follow the link to my web site from here. I have known about Lisp programming since 1978, can you say the same? That was 3 years after I bought and put together my first micro computer and just 1 year before I wrote a 50,000 line word processing program in Z80 assembler. -- David Clarkd
[One thing that comes to mind is "functional programming (FP) is not fit for the real world as it excludes 1/2, the data half, from it's definition". This is simply a false statement. Functional languages do not ignore the data half, and it's such an obvious error that it makes it extremely unlikely you have any significant experience with them.]
...Discussion moved to Why Functional Programming...
{Indeed. A lot of us here are "old timers", so having programmed since the 1970s (I started in 1977) doesn't carry much weight, and mentioning your thirty years of experience too frequently is likely to draw sarcastic comments about having 1 year of experience thirty times. You wrote that you "have know about Lisp programming since 1978". I've known about Lisp programming since roughly the same time, but I only started doing Lisp programming relatively late, in the early 1980s. When did you start doing Lisp programming? (Kudos for your 50,000 line word processing program in Z80 assembler, though. I'm quite proud of my 256 byte text editor that ran in the zero page on a 6502-based Ohio Scientific Superboard II.)}
Talking about definitions like "What is Computer Science" (which is this topic BTW), requires a long view of what we do, which is why I think my experience re-enforces my arguments (I have made some arguements.). I think it matters that I have a lot of application as well as system experience with a large number of languages. I believe that people without that kind of experience are speaking more from the experiences of others rather than from what they know for a fact, themselves. It is good to hear I am talking to experienced professionals on this wiki, like yourself. I wouldn't waste my time using Lisp for many very good reasons. I have never used Forth because it is a stacked based language that I believe is harder to visualize than a more procedural approach. Likewise, I think the polish prefix notation of Lisp is very easy to parse for the compiler while being much harder for the programmer to use. I like the structure of a program to stand out against the programmer's expressions and functions while Lisp doesn't distinguish between them. I love Lisp compile time macros and have them in my language. I love an interactive language which Lisp is also. I dislike the S expressions a lot and I think a good language should "natively" include database type facilities which Lisp does not (along with most others). Objects are an add-on to Lisp rather than designed in everywhere from the start. I won't go further, but my attitude toward Lisp is not based on ignorance and I respect the fact that my list of desirable language features aren't exactly the same as some other programmers. -- David Clarkd
{I note that anthropologists like to treat linguistics as part of anthropology whilst linguists prefer to treat linguistics as a distinct field. The same tends to happen with mathematics and computer science. This says nothing about mathematics and computer science (or anthropology and linguistics), but it says something about human behaviour. In neither case -- linguistics vs anthropology, or computer science vs mathematics -- does it have any impact on working linguists, anthropologists, mathematicians or computer scientists, other than to provide fodder for discussions in pubs and around water coolers.}
See US News and World Report for the latest rankings of graduate programs in computer science: www.usnews.com
Programming (as commonly taught in universities as Computer Science) is not in actuality a science at all. Electricity that runs the computers is the only Computer Science available. Most supposed Computer Science people are a bunch of quacks and homeopathic practitioners who pretend to speak about truth (even though it is art/lies/personal opinions). I say this with tongue in cheek, though. Hmm the art of computer programming applies.
Programming is not Computer Science, true, though knowledge of programming is quite necessary to understand it. There are Science aspects to Computer Science - in particular, the creation of models and theories to describe and predict (and design or explain) computations ARE science, not merely math, because one actually can and often does test hypotheses empirically. That much is hard science. Similarly, proper studies of HCI, linguistics, and the ways humans can express themselves and their intent qualifies as soft science. But 'programming' itself? It's just a necessary step on the path to becoming a computer scientist. Being a skilled programmer, or even a good software engineer, does not a computer scientist make.
Agree. And I was thinking recently, to argue my own point, that one could define some common proven ways to parse text and make a science out of programming by defining proven methods to parse data that are better than others.. but then I kind of realized that it is all a fake little world on the computer, and not so sure it could be claimed science. Hmm. For example we could make a video game where in the video game it was right that 2 plus 3 is equal to 9 (making our own science since we are working with a virtual world).
It might even be better called "programming science" because computer science could be about the science of circuit boards, electricity, and central processing unit, along with resistors, capacitors, and transistors. Computer science means the science of computers. Programming languages are not computers. Therefore logically "computer science" should be dedicated to the science of computer chips/boards, whereas programming science should be dedicated to the science/math of programming.
Since programming also requires engineering GUIs (along with some art), programming is a combination of math, science, and engineering. Making a button the right color or designing a GUI is not a science, it is a combination of engineering and art. So programming is not just science and math, it is also art and engineering.
"*" Actually, I think Computer Science isn't hardly about computation, per se. That's a historical usage. Nowadays, it's hardly about calculation but the more general idea (and science) of "getting computers to do what you want". For more about this, see Computer Science Version Two.
My CS professor said that basically CS can be described in terms of three ideas: "algorithms","programs" and "computers". Naturally there's a lot to be explained in terms of the relationships between those things.
Related:
Is Computer Science Software Engineering How Much Do You Learn In School Open Problems In Computer Science Programming Language Theory
See also: Computer Science Version Two
See original on c2.com