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?
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 General
programmer 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.
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
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:
Topics which we might reasonably exclude from Computer Science include that part of the human endeavor which satisfies the following criteria:
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?).
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