Software Engineering vs. Computer Programming

<p>

</p>

<p>I have been writing software for a living for 30 years. I respectfully disagree… I’ve also gone thru the teaching part (undergrad and grad Comp Sci, plus another pair of engineering degrees). CompSci is not like engineering in my view.</p>

<p>From my limited experience in programming so far, I don’t know if I’d go as far to say those who are great at it have a “gift”, but I will say it takes a certain type of thinking and patience haha!</p>

<p>I can’t say I buy into the “gift” characterization, either. Being a good programmer just takes experience and effort.</p>

<p>

These are the same kind of unnecessary comments I heard back in high school about how some people just naturally know more than others.</p>

<p>For most problems ranging from trying to tie your shoes to finding an efficient algorithm, there’s an infinite number of possible ways to approach them. No matter how “gifted” you are, you won’t be able to iterate through all the possible approaches when trying to solve a problem. You can only prune down the set of possible ways to approach the problem, requiring some source of information to make inferences on what you should and should not try. Knowledge is that key source of information, and most importantly, knowledge is learned.</p>

<p>It’s not a subject of ‘knowing’. It’s mostly a matter of being able to see both the tree and the forest at the same time.</p>

<p>The difference between a good programmer and one that is really good (the gifted one) is so much in terms of productivity and quality that it can’t be attributed simply to knowledge.</p>

<p>There is absolutely no evidence that being good at canvassing makes you “gifted”.</p>

<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>

<p>

</p>

<p>Can everybody learn electricity and magnetism (EE)? What about force, momentum, energy, inertia, fluid dynamics and thermodynamics (mech/aero)? What about…uh…tractorology (agri)? See, I think the idea that engineering is about teaching anybody is false (if I’m misstating your idea please say so), I think other engineering disciplines also have their own things that people will either get or they don’t.</p>

<p>Though it’s true that CS is more like that in that there are far fewer people who took a long time and slowly absorbed concepts or who had an “aha” moment.</p>

<p>

</p>

<p>And boy are his wrists tired! :::bah-dump-bump!!!:::</p>

<p>I hear he once wrote a function that was SO recursive…I said it was SO recursive…</p>

<p>Audience: How recursive was it?!</p>

<p>It was so recursive, it was its own parameter! But seriously folks…</p>

<p>

</p>

<p>I have to disagree with you here. Software Engineering and programming are both proper subsets of Computer Science. What you described is theoretical computer science not all of computer science. We have a class called “software engineering” wheere we learn about software methodologies, design, requirements and all of that stuff. Software Engineering is the closest degree to CS but instead of taking Computer Architecture, computability and a few other CS classes, they specialize in the part of CS related to making software</p>

<p>

</p>

<p>Contrary to popular belief, EMACS does cause carpal tunnel syndrome :D</p>

<p>@lightnin, TomServo</p>

<p>After going back and forth on this issue for a long time, I think I’m finally at a point where I’m willing to strongly defend the position that programming is an activity which should be considered as part of what computer science studies. That is, computer scientists may legitimately do programming in the course of practicing computer science, and programmers may legitimately do computer science in the course of programming. Some clarifications:</p>

<ol>
<li>It’s possible to do computer science without doing what most would consider “programming”.</li>
<li>It’s possible to do programming without doing what most would consider “computer science”.</li>
</ol>

<p>The overlap in disciplines between formal studies of “programming” and “computer science” should be substantial. In particular:</p>

<ol>
<li>A computer scientist writing a constructive proof of a theorem, or defining an automaton or grammar, is doing something theoretically indistinguishable from programming.</li>
</ol>

<p>Ex.1. Kleene’s proof of the equivalence of regular expressions and finite automata is clearly computer science. However, Kleene’s proof can be (and indeed is often) used as an algorithm for constructiving equivalent regular expressions and automata.</p>

<p>Ex.2. Constructing an automaton is simply using some formalism to automate computation, no different than specifying the automation using any other programming language.</p>

<p>Ex.3. Defining a formal grammar to parse a language is basically just programming a special-purpose parsing computer to produce the correct output for certain kinds of strings.</p>

<ol>
<li>A programmer writing a program is doing something theoretically indistinguishable from defining an automaton or formal language, or constructing a detailed and convincing proof of some theorem.</li>
</ol>

<p>Ex.1. Writing a program that computes integer-roots of positive integers constitutes a mathematical proof that positive integers have integer-roots, and moreover, that these are computable.</p>

<p>Ex.2. Writing a program in a Turing-equivalent programming model demonstrates the existence of a Turing machine for the recognized language / effected computation. Moreover, defining a programming model capable of effective computation that is more powerful than Turing machines would be a major breakthrough in computer science, but could be achieved as a purely practical programming matter. Similarly, a program written in C++ that solves an NP-Complete problem in polynomial time would be a huge computer science accomplishment, and would garner the Millenium Prize money as a valid proof.</p>

<p>All that said, “Software Engineering” will likely be the de facto degree for working in the software industry as CS continues to become more rarefied and Software becomes increasingly important. Realistically, in the short term, the huge superabundance of positions in the software industry will basically make what academic credentials one has more or less redundant, and competition/differentiation will only exist at higher levels.</p>

<p>

</p>

<p>In practice, the few software engineering majors that I have seen curricula resemble CS majors, but with a greater focus on software engineering methods (e.g. several courses instead of one not-necessarily-required course), possibly displacing some CS topics courses (e.g. computer architecture, automata and language theory, compilers, databases, etc.) if the student does not add them back as electives (of course, in the FGCU case, the school’s offerings of CS topics courses is too limited, which is presumably why it has no CS major).</p>

<p>All the jobs I’ve had in the last 20 years required no knowledge of compilers (other than how to use them,) automata and language theory, computer architecture, almost anything from EE, or advanced math. </p>

<p>I was looking at the CIS with a programming emphasis program at FGSU, and it’s plenty good for most of the programming jobs available these days.</p>

<p>I have had jobs where knowledge of compilers was useful, although such usefulness is less common for compilers than it is for operating systems, networks, databases, and security, plus general algorithms and computational complexity knowledge.</p>