<p>This is my view (with the introductory thought that one man’s theory is another man’s application and vice versa):</p>
<p>“Computer science” is a branch of mathematics that studies computability, algorithms, discrete structures, formal languages, that kind of thing. Computer science can be studied without the aid of actual computers (and often is) or can be studied in such a way that the computers/languages you actually do use are incidental. Like what kind of pen a writer uses, or what kind of telescope an astronomer uses. When you take a class like “discrete structures” or “algorithms,” one of those classes where it’s all pen-and-paper analysis and no actual programming, this would be a “computer science” class.</p>
<p>“Computer programming” is the practice of actually making software by using a language like assembly, C, or C#. One can, in principle, practice computer programming while knowing little about computer science, in the same way a person can (to some extent) build simple machines or a primitive, small bridge or building without knowing much about the physics involved (forces, energy, elastic and plastic deformation, etc.). Computer programming is akin to “building.” When you take a class like “data structures in c++” you are taking a programming class.</p>
<p>“Software engineering” is a kind of engineering that is concerned with good design practices, usability, testing, quality control, extensibility, etc. Software engineers practice computer programming or they may be involved in higher-level design of a system, such as class hierarchies and project management. They are schooled in programming, the necessary computer science, as well as the usual tools of engineering (or at least they should be) to ensure software works the way it’s supposed to, is delivered on time, can be supported, etc.</p>
<p>In my view “computer science” as defined above could (COULD, not necessarily should) be its own degree, whose degree-holders learn little of the applications of their work as it wouldn’t be their job. I see computer science and software engineering having a relationship similar to the one math has with physics, or physics has with engineering, or physics has with chemistry, or chemistry has with biology, etc. One is the more abstract, theoretical discipline, the other is more applied and draws on its “parent.” I could also see software engineering becoming its own degree with either less theory than a CS major currently has, or the same amount (some schools are mathier than others with their CS). </p>
<p>In that case I’d expect “software engineering” to become the popular major, and “computer science” to be like biomathematics or any other specialize math field.</p>
<p>I could also see “computer programming” as defined above become its own major. In a way, this is what the Devrys and ITTs are already teaching. They aren’t so concerned with teaching graph theory, neural networks, (real) computer graphics, or OS development, they’re more concerned with cranking out programmers who can work 9-5 making programs in C#, VB, and Java that are all classes and function calls with little in the way of algorithm development and whatnot. And that’s okay, there is demand for people who can do that.</p>