# What is Computer Science?

This meta question is intended to be a place to direct people who ask what is Computer Science and answer misconceptions about it.

What is Computer Science?

• I think this is subject to ongoing research. – Raphael Apr 3 '12 at 21:45
• If I wanted to know about XYZ and came to a site for XYZ, being directed to an answer in Meta would make me move on, and possibly leave the site forever. Stock answers for such can be found at Wikipedia; I would come to CS:SE because it has real people with real experience and diverse points of view. CS-definition and Misconception tags may work better. :) – Guy Coder Apr 3 '12 at 23:12
• Apart from my tongue-in-cheek response below, one can also consider the ACM computer science curriculum as a possible definition. – Dave Clarke Apr 4 '12 at 19:50
• @Dave: so your definition of "computer science" is "what computer scientists study"? Would your definition of "computer scientist" then be "somebody who studies computer science"? I'm not sure this is that helpful. :-) – Peter Shor Jun 24 '13 at 1:39
• @PeterShor: Maybe not, but it helps pay the bills. – Dave Clarke Jun 24 '13 at 5:25

It seems to be the case that our biggest problem is separating CS from related disciplines to some extent. I think this can be best achieved by analogy to fields people have more intuition for.

I have attempted to create such a table:

Software        Buildings         Generalprogrammer           construction worker     performs assigned tasks
software developer   foreman                 translates plans into work assignments
and monitors workers
software engineer    architect               makes plans and develops principles
than ensure some level of quality of
the plans.
computer scientist   structural engineer,    develops and analyses methods/techniques
material scientist        for the above to use.
theoretical computer                         develops models and verifies principles
scientist            physicist                 that lead to and support new methods
and techniques.
mathematician        mathematician           provides means to deal with models
in a unified, abstract fashion.
Develops meta models.

[LaTeX source]

Of course, such a table would have to be decorated with appropriated disclaimers: "This is no attempt at defining either notion rigorously; it is only a rough analogy to relate to general knowledge. The same person can perform more than one role. Some tasks may be associated with more than one role." and so on.

What do you think, can an analogy clarify what we have trouble defining clearly?

Do you have other/better analogies?

Computer Science is the science that studies computation and related issues. It has strong connections with other disciplines, particularly with: mathematics, computer and electronic engineering.

There are various lists of topics which are considered part of computer science:

which among others include:

discrete-mathematics, combinatorics, complexity-theory, algorithms, data-structures, computational-geometry, formal-languages (and automata theory), logic, computability, information-theory, numerical-analysis, symbolic-computation, cryptography, security, artificial-intelligence, machine-learning, computer-vision, computational-linguistics, natural-language-processing, knowledge-representation-reasoning, robotics, computational-engineering (and science), computation-finance, databases, information-retrieval, distributed-computing, parallel-computing, neural-computing, evolutionary-computing, algorithmic-game-theory, information-networks (and social-networks), computer-graphics, multimedia, sound, computer-architecture (and hardware-architecture), computer-networks (and internet architecture), operating-systems, programming-languages, software-engineering, human-computer-interaction

• +1 for a good first answer. However, I feel like Raphael's point is a good one; we will never provide a useful, meaningful answer to the question of what computer science is (more broadly, what questions are on- and off-topic here) by listing specific areas... we need to seek some sort of more general criteria by which, e.g., "algorithms" and "robotics" can be judged to be on-topic, and "kittens", "Riemann sums", and "transformers" can be judged to be off-topic. Doing that is much harder, but I feel it would be much more useful... – Patrick87 Apr 3 '12 at 20:19

Misquoting Justice Potter Stewart:

I shall not today attempt further to define the kinds of material I understand to be embraced within that shorthand description computer science; and perhaps I could never succeed in intelligibly doing so. But we know it when we see it ... so if in doubt, ask on meta.

Computer Science is the science of computation; that much seems clear. Less clear is how to define science and computation in a useful and meaningful way.

Generally, we might divide science according to two classifications: formal versus empirical, and pure versus applied. Whereas formal science (such as mathematics and much of computer science) relies on deductive reasoning from assumed truths, empirical scienc (such as physics and chemistry) relies on inductive reasoning from observed phenomena. Whereas the goal of pure science is to advance the state of scientific understanding, the goal of applied science is to use such understanding to harness the forces of Nature (in the broadest possible sense of the word) to achieve other goals.

We might define computation as a transformation applied to a piece of information. In the broadest possible sense, computation is, then, any process which causes a change to occur in the universe. There is no need to provide any more detailed definition than this.

Computer Science, then, consists of that part of the human endeavor which satisfies the following criteria:

• It is science, that is:
• It is either (1) formal or (2) empirical:
1. employs deductive reasoning from assumed truths
2. employs inductive reasoning from observed phenomena
• It is either (1) pure or (2) applied
1. seeks to advance the state of scientific understanding
2. seeks to apply scientific understanding to harness natural forces
• It studies computation, that is:
• It studies either (1) transformations or (2) information
1. processes which map information from one form to another
2. entities subject to transformations

Topics which we might reasonably exclude from Computer Science include that part of the human endeavor which satisfies the following criteria:

• It is not a science, that is:
• It contains elements which are neither (1) formal nor (2) empirical:
1. does not employ deductive reasoning from assumed truths
2. does not employ inductive reasoning from observed phenomena
• It contains elements which are neither (1) pure or (2) applied:
1. it does not seek to advance the state of scientific understanding
2. it does not seek to apply scientific understanding to harness natural forces
• It does not study computation, that is:
• It studies subjects which are neither (1) transformations nor (2) information
1. processes which do not map information from one process to another, or for which properties of the mapping are not the focus of discussion
2. entities not subject to transformations, or for which such properties influencing such transformations are not the focus of discussion

Comments, edits, and suggestions are welcome. I realize that it is practically impossible to give a universally accepted definition of either science or computation, and as such, I have tried to remain at a high level, possibly to a fault. Also, some of these items must be interpreted broadly (e.g., "scientific understanding" is intended to include individual understanding, so that it doesn't require research-level academic questions), while it might be preferable to interpret some of the items more narrowly (for instance, many elementary physics questions can be construed as computation, according to my definition; in a very precise sense, aren't they computation, after all?).

• 1) "causes a change to occur in the universe" and "harness natural forces" are too general, imho, and dangerous; I don't think we want to deal with mysticism. 2) The second part is not useful; everybody should be able do negate the items in the first part. – Raphael Apr 4 '12 at 15:15
• @Raphael 1) In what sense does this language admit mysticism? How do you think these could be defined more narrowly, without throwing out the baby with the bathwater? 2) True, but natural language isn't as precise as mathematical language; I don't think it's out of line to explicitly state what I believe to be the negation of the first part. Of course, if your and my interpretations of the first part are the same, it would follow that the negations should be as well, hence the second part would be redundant. – Patrick87 Apr 4 '12 at 15:39
• @Raphael I think that part of the difficulty with trying to do what I'm doing is that to exclude programming from "computer science" is a more-or-less arbitrary decision... the more I think about it, the more true that seems. Is programming part of computer science? Of course it is, no matter how much I'd like to think it's not. It's clearly applied formal science, or at least that's the realization I keep coming back to. – Patrick87 Apr 4 '12 at 15:48
• @Patrick87, actually it is not as difficult as you think to state the programming per se is not computer science. For comparison, physics, civil engineering, and architecture are different from the job of people who actually build a building, paint its walls, etc. Computer science is the former, programming is the later. The confusion comes from the fact that almost all computer scientists also know how to write (at least simple) programs and many programmers know something about computer science. They are related but I think the distinction is still quite clear, – Kaveh Apr 4 '12 at 16:40
• programming is a skill not a science. If you know how to program in C# it is like knowing how to control a crane. Software design and engineering can be part of computer science, but programming per se is not. I personally haven't seen anyone being called a computer scientist because they are a programmers. (Analogy between civil engineering and computer science and in particular software engineering is a standard one that can be found in many textbooks, and it is typically emphasized that software engineering and programming are diferent.) – Kaveh Apr 4 '12 at 16:43
• @Kaveh I am aware of the standard arguments in favor of distinguishing "computer science" from "programming". And I would agree that, even according to the definitions in my post, not all "computer science" needs to involve programming, and not all "programming" needs to involve computer science. The point is that one can approach programming as an exercise in applied science, and as such, I propose the following: rather than making programming off-topic, we close "bad" programming questions either as not a real question, or too localized. – Patrick87 Apr 4 '12 at 17:26
• Give me the code := not a real question. Fix the code := too localized. But are questions like "why does this C++ code do X," "how could I do Y in functional language X," "does code snippet X perform better than code snippet Y," etc. really count as off-topic here? That seems excessive. – Patrick87 Apr 4 '12 at 17:32
• @Patrick87, yes, but the perspective is important here. If it is about coding or analyzing or debugging code in a particular language then it is probably off-topic and should be asked on SO. It might be possible to rephrase the question in a way that it becomes about algorithms or the programming language itself (not using it) or something else which are on-topic, but as long as it is not phrase that way it is off-topic IMHO, and should be on SO. Using a programming language and tools related to it is not computer science, and I think it is similar to using other softwares e.g. MS Office. – Kaveh Apr 5 '12 at 3:55
• @Patrick87: Depends. Typically, such questions will be targeting language specifics, ergo offtopic. If it does not matter for the question wether the code is C++ or pseudo code, then it is fine. – Raphael Apr 5 '12 at 10:42
• @Kaveh I think where my doubt arises is when we try to say that what makes a programming question off-topic here is when it depends on the language used to express the program. This seems objectionable to me on the following grounds: we accept questions on algorithms design and analysis, the ends of "programming"; and we accept questions on languages, syntax and semantics, the means of "programming". But questions which involve both are not allowed? Are the on-topic questions on this site not closed under intersection? What if the person is unsure about where a problem lies? – Patrick87 Apr 5 '12 at 13:13
• @Patrick87, because they are not computer science questions? (please reread my previous comment.) – Kaveh Apr 5 '12 at 13:54
• @Patrick87: It is a simple question of politics. If we say "No programming questions!" and allow exceptionally good ones to remain, everbody is happy. If we say "Everything is allowed!" and then close/migrate bad/offtopic ones, we have hell. As you say, we need a clear line; "no programming questions" is a clear line. We can always step over the line in either case, but this way does not hurt us. – Raphael Apr 5 '12 at 17:38
• @Patrick87 Across SE, people ask questions on the wrong site all the time. Sometimes because they've been banned on the right site for asking too many bad questions. SO is huge; posts that should have been on SO can represent a nontrivial amount on a smaller site. If we allowed programming questions, we would become IWasBannedFromSOButWantSomeoneToWriteMyCodeFromMe.SE. Furthermore, the whole point of having a separate site was that computer science questions didn't work on SO; we're not competing with SO, we're targeting a different topic. – Gilles 'SO- stop being evil' Apr 5 '12 at 21:17
• @Patrick87: do you have an example of a programming question you think should be on topic on this site? I personally see programs as instantiations of algorithms; programming as an almost mechanical translation of the algorithm into something that works, and hence not something I'd categorize as 'science'. Programming language design is science about how to program well, but that does not make programming itself science. If we use TMs to specify something, we almost never do that to have the TM do work for us (like why we program), but rather to find out some science fact. (cont.) – Alex ten Brink Apr 5 '12 at 21:47
• (cont.) Furthermore, I think it's a bad idea to have overlap with SO: I already don't know where to go if I have a question that could either turn out to be a research level CS question or that could turn out to have an easy answer, and this could give rise to the same problem. Worse, if we allow programming questions, I don't see why we should allow all programming questions, at which point SO is a subset of our site. We have two websites to separate these two topics, as both fields are huge and deserve their own place for Q&A. – Alex ten Brink Apr 5 '12 at 21:51

Do like GORDON cut a knot is his legendary manner: Computer Science is the science around the term Computer.

there are some answer(s) here looking at more pragmatic angles on this topic eg how CS contrasts vs software engineering or programming & plays out post-graduation eg in the employment market. have worked in IT for many yrs and would suggest this is a complex question with quite a bit of nuance and no simple answers/distinctions even though it is a key question of interest to pre-university students attempting to make an informed decision about choice of major and future directions.

the analogy to building construction is somewhat useful. industry generally has two common roles: lead developer and developer. the latter is sometimes called a software engineer in more professional organizations, or simply a programmer. industry does sometimes have a "software architect" role who may or may not be involved in developing, their role is more to focus on "big picture" aspects of large systems [such as defining/streamlining inter-system interfaces, somewhat analogous to generating construction design "blueprints"], and this dedicated role is not so common except in large corporations; midsize-to-smaller corporations may have individuals that fill aspects of this role but are not fully dedicated to it (eg also do major development). Grady Booch is an example of an expert figure who has great insight into more accurately/precisely delineating the software architect role.

furthermore at my university [which is presumably somewhat representative], software engineering is a branch of the engineering school and the student must take many engineering classes [which often have more depth in mathematics and physical science–eg physics, statics/dynamics, chemistry, thermodynamics, fluid mechanics!–than required of CS degrees] and specialize in software in their later grades. in other words the student is trained and certified as an engineer [there are certification societies] with a speciality in software.

post-university however these background distinctions may tend to blur in some corporations as it would be somewhat rare that both software engineers or computer scientists actually utilize all the diverse pedagogical/theoretical/scientific/engineering/mathematical aspects of their university education on particular jobs esp "entry level"–although over an entire career of course much more will come into play.

one approach to answering this question: look up the course descriptions or curricula/requirements for CS vs software engineering majors at a school that offers both or across schools.

there is quite a bit of material on the internet to add some insight (but caveat unfortunately/apparently not a lot of definitive/authoritative analysis on the subj). eg

• fyi other advanced math classes often reqd in engr school but not nec always CS: statistics, linear equations, differential equations, multidimensional calculus, etc – vzn Feb 3 '14 at 16:43
• :( disappointed/ perplexed at low votes ... is it merely because it mentions & compares/ contrasts software engineering (incl programming/ development)? is it seen as too industry focused? in business, very many CS graduates work as programmers/ developers/ software engineers, the distinctions there are not so critical vs outside or abstractly, and quite possibly far more CS graduates are working in industry than academia. – vzn Apr 2 '15 at 18:25
• some more contrast of cs vs software engr edu vs workplace in this controversial article/ blog "more universities should shut down their CS programs" / McManus – vzn Jul 3 '15 at 16:01