As a CS prof, I never understood why they were allowed to use the term at all. (There are even state laws limiting who can supposedly call themselves “Engineers”.)
“Engineer” (as in designing stuff) means something quite specific. In particular, it means that there is a very high standard for the reliability of your designs. Software is so ridiculously unreliable that it is totally removed from the realm of being an engineered product.
Many types of engineers must be certified to practice, and take exams to be PEs. But I don’t know any non-Canadian digital design engineers who are PEs. 15-20 years ago this was a hot topic in IEEE, with the PEs really pissed that lots of non-PE engineers had no trouble getting jobs, and advocating licensing exams.
One reason it never caught on is that the field is changing so fast. If you are a civil engineer, what you learned in school is pretty valid. What I learned in my EE classes in school 45 years ago is pretty worthless today, and that goes double for my CS classes.
As for stability of software, much of it is a lot more stable than you think - but you don’t think about the software in your DVR or microwave or TV. Yeah, Windows is unstable, but it sits in an ever-changing environment. If a bridge had to work over a river, under a river, and on the moon, it would be unstable too.
Some software may be unreliable–especially commercial systems that are developed with the philosophy that bug fixes can be applied by pushing updates–but embedded software for mission critical applications such as avionics or ground control software has very high reliabilty requirements that have to be explicitly verified by exhaustive and well-defined test protocols, hence why software–which has expanded from just basic navigation and guidance to controlling every aspect of an aircraft, rocket, or satellite control interface–has become such a ridiculously large cost driver in modern space and flight systems.
When reliability failures occur it is typically because the product initial operational capability was pushed up for political or fiscal reasons and in abeyance of good software engineering practice, and the complete reliabilty and regression testing was curtailed or scheduled after release. Software controls virtually every aspect of operation on a modern commercial airliner, for instance, and they hardly every blue-screen and fall out of the sky…which tells you something about the priorities of Microsoft or Adobe when their products show immediate functional problems after initial release.
The term software engineering was first used regularly by Margaret Hamilton during the 1960s. Apollo 11 required a lot of coding and Hamilton figured early on that quality control would be necessary.
I think most of the main points have been brought up already, but there’s another one that hasn’t been addressed yet.
Where I went to school, there were two different Computer Science programs: one out of the college of Engineering and the other out of the college of Letters and Science.
The engineering CS degree had all the same requirements as any other engineering degree: numerous courses in math and physics, courses in engineering fundamentals (chemistry, statics, material science, etc.), and so on. The L&S version had significantly weaker requirements in these areas and replaced them with “softer” ones.
So while what I do day-to-day mostly doesn’t quite qualify as engineering, I do at least have an engineering degree and everything that entails. It’s been a great positive influence on my overall skill as a programmer. As such I have no shame in calling myself a software engineer.
Interestingly enough, when I was in school, we had computer science and computer engineering (I think the exact title was 'Computer Science and Engineering") both run out of the Computer Science department, which was part of the College of Engineering.
CS students got an 18 or 12 hour minor in the subject of their choice, had to take some 16 hours of science, but not necessarily physics and chemistry (I took biology and geology, FWIW), and we got the option of linear algebra or differential equations for our advanced math course. The CE folks had two degree tracks- the hardware or the software track. The software track people to take physics and chemistry as their required sciences, differential equations as their advanced math, and were required to take a series of EE courses and some other basic engineering courses like drafting, etc… In essence, they had a CS degree with an EE minor. The hardware track people had it flipped- the essentially got an EE degree with a CS minor.
In practice, the CE-software folks ended up working in more hardcore technical careers like writing microcode or kernel stuff, the CE-hardware crowd went into stuff like processor design/compiler design/assembly code, and the CS folks either went into academia or into straight-up development or even into the IT world (what I did).
My undergrad had CS, and CE. CS was under the college of science (which I think is a dumb college to put it under, and would be better under math, but hey), but CE was under the college of engineering and was shared with Electrical Engineering (I think the department was actually called “Electrical and Computer Engineering”). ECE was super hardware heavy, the “software computer engineers” you mentioned would more likely be CS/ECE double majors, or CS majors with an ECE minor at my undergrad.
My grad has no formal computer engineering program, but CS is part of the “school of Electrical Engineering and Computer Science” which is under the engineering college.
My degree was also called “Computer Science and Engineering”. There was also a separate “Computer Engineering”, which was perhaps halfway between EE and CSE. And then the plain CS that was not engineering.
All of the engineering degrees required:
4 quarters of calc (roughly: derivatives, integrals, multivariable, and vector)
linear algebra
differential equations
statistics
4 quarters physics (roughly: classical mechanics, thermodynamics/optics, electromagnetism, and relativity/QM)
miscellaneous other stuff like chem and material science
We lost a few people from CSE to CS that couldn’t hack the math and physics.
Some CS departments were long standing like the one at Illinois, and some grew out of EE, like the one at MIT. I started in only the second year that CS was an option in the EE department. Computer Engineering hadn’t yet broken off from CS. We learned both the software and the logic design parts.
I don’t know if CS majors today learn any decent amount of hardware, but I know that the undergrads we get out of EE and computer engineering don’t know squat about software. Forget about them programming, and many are scared of command lines. A lot of people with advanced computer engineering degrees know quite a bit more, but that might be from my tossing resumes with no decent amount of programming.
Still like the joke about old people having an easier time of learning history because there was less of it, when I was in school half the subjects they teach today didn’t exist. No databases, no networking and the Arpanet was just beginning. So we had time to learn everything.
When I renew my IEEE membership I’m going to drop the Computer Society, since there hasn’t been anything in it of the slightest relevance to me in ages. Which is depressing since I’ve edited two special issues a long time back and used to be on the Editorial Board, also a long time back.
The non-eng CS course sits alongside the math majors at my school. Which makes sense to me, since there’s not a huge gulf between that and discrete mathematics. Wouldn’t surprise me if the historical division was between math and engineering.
I learned a decent amount of hardware. I built a small CPU that executed on an FPGA. And of course we learned all the software/hardware interaction stuff like virtual memory and all that.
I have to agree with your assessment of the software quality that CEs and EEs produce :).
Words can have more than one meaning. And they can have different uses in different countries and in different eras.
An engineer was originally a skilled tinkerer who invented a gizmo that solved a problem and who then operated his gizmo to solve his problem. Sine day one there has been a blend of design, construction, and operation with a focus on practicality above pure science or art.
What has happened since, with the enormous growth of technology is simply a much greater degree of specialization. Design, construction, and operation are now three separate job specialties. And maintenance of the gizmo is now a fourth job specialty.
You *can *argue that you want the word engineer to mean only “technological designer” from 2015 onwards. You don’t get to validly argue that “engineer” wasn’t the correct term of art from the 19th through mid 20th centuries for operator/maintainers of steam powerplants, both mobile and fixed.
Nor can you validly argue that there aren’t some officially recognized terms for operators or maintainers that include the word “engineer”. Because there are. And will continue to be.
To be sure, the garbage truck driver calling himself a “sanitation engineer” is pure puffery. So is the carpet cleaner calling him/herself a “rug doctor.”
Nonsense, as eloquently refuted by Stranger and others. When software is unreliable – and a lot of it is – then blame the practitioners and the implementation, not the discipline. As already discussed, some software is mission-critical and extremely reliable – the technology exists to develop and verify such software. Sometimes software is reliable even beyond necessity and reasonable expectations as a result of the engineering culture of the organization, as was the case with many of the products of Digital Equipment Corporation (DEC).
Bottom line, the fact that Microsoft Word does weird things to you isn’t an indictment of software engineering. Nor is the fact that Windows used to crash a lot. Oddly enough, it never did after it migrated to the NT kernel, unless third-party drivers brought it down. Know why? Because Dave Cutler brought the DEC engineering culture to Microsoft for that OS development. Otherwise, Microsoft never did and still does not know or care about reliable software development, and I’m sure the NT kernel has been massively botched by now. It was always already crippled by having Bill Gates’ Windows GUI bolted on top of it.
Indeed.
I think that’s more a joke than anything else. There really is such a thing as a sanitation engineer, and apparently someone thought it was funny to apply the term to one of our most perceived lowly occupations.
This seems pretty dismissive of an interesting question and the part I bolded seems to make your argument circular. I don’t think the Roeblings did any coding when they designed the Brooklyn Bridge nor the Wrights when they designed the first airplane. So they weren’t engineering?
I’m not sure if you’re trying to argue semantics or what, but in the case of software engineering the work product is code and the applications it runs, whereas with a bridge or an aircraft the work product is a structure or a vehicle, which is then tested to verify it meets requirements. The essential point is that good engineering is done by defining the requirements that a system has to perform to, or that it interfaces with, flowing those requirements up or down to create a set of criteria for each component or subsystem to meet, and then defining tests, analyses, or demonstrations to verify that the design meets requirements. In the case of a bridge, these major components are things like footings, suspension members, fasteners, road surface, et cetera; for an aircraft they are the engines, controls, wings, fuselage, et cetera. For a computer application, the components are things like calculation kernels, user interfaces, libraries, database interfaces, hardware drivers, et cetera.
BTW, what the Wrights did with aircraft was barely engineering, hence why their aircraft barely flew. That’s not a criticism, just an observation of the crudity of both knowledge of aerodynamics and the lack of sophistication in engineering circa 1903. They basically built and tested one prototype after another until they got an intuitive feel for what worked. What we do today to design aircraft ensures that they will operate at high efficiency and performance (relative to requirements) long before a single piece of hardware is built. This is necessary because to try to design something like a 787 the way the Wright brothers arrived at their flying designs would be impossible. Engineering provides the means to apply physical principles and empirical knowledge to a new product, or streamline and refine an existing product, in a way that is cost effective and (hopefully) reliable and safe.
My first adviser at Illinois had a joint appointment with the Math Department, and his PhD was in Math from Princeton. So there was lots of math in the department, but I’m not aware of Math departments spinning off CS departments the way EE ones did.