Build Your Career: Agile Careers 

Agile Careers

"Cope" Coplien

Jim ("Cope") Coplien is an old C++ shark who now integrates the technological and human sides of the software business as an author, coach, trainer, and executive consultant. He is one of the founders of the software pattern discipline, and his organizational patterns work is one of the foundations of both Scrum and XP. He currently works for Gertrud & Cope, is based in Denmark, and is a partner in the Scrum Foundation. He has authored or co-authored many books, including the Wiley title, Lean Architecture for Agile Software Development. When he grows up, he wants to be an anthropologist.

Log in to register a comment. We encourage lively debate, but reserve the right to moderate comments. Contact for questions.

Subscribe here.

Blogs (Blog) Blogs (Blog)
« Back

It's Not Engineering, Jim

I guess that I’m an engineer. I have a degree in Electrical and Computer Engineering. I have a good grounding in mathematics and the sciences.

And I go to Software Engineering conferences.

This casual use of the term “engineering” by software folks has always bothered me a bit. It was Peter Naur’s suggestion in 1968 to attach the term “engineering” to software, which Helmut Goss (who was there) reports was meant to be taken tongue-in-cheek. Engineering builds on solid foundations in the sciences such as physics and chemistry. There is actually an element of science in software complexity and automata theory. But software engineering rarely ascends (descends?) to this level.

The IEEE states that software engineering is: “The application of a systematic, disciplined, quantifiable approach to the development, operation and maintenance of software” (IEEE Standard Glossary of Software Engineering Terminology, IEEE Computer Society, 1990.)  Numbers, technology, nerd stuff—no people or life. But the IEEE identifies engineers as “promoting the development and application of electrotechnology and allied sciences for the benefit of humanity, the advancement of the profession, and the well-being of our members.” I like that “benefit of humanity” and “well-being.”

On one hand, the use of the term “engineering” is a caricature that stilts the expectations of its own constituency. “Architect” conjures another metaphor for what some of us do. It was proposed by Fred Brooks who himself expressed skepticism about the label until encouraged by Jerry Weinberg, who felt it was a good model for what we do. And Peter Naur (again) would say in 1968 that software should look to the architect Christopher Alexander for inspiration. Both “software engineer” and “architect” reflect internal value; engineering is about delivered value.

Software engineering lifts its moniker from a sense of formal envy that characterized its search for identity in the 1960s. But little of the engineering profession is either quantitative or systematic. In fact, the bulk of engineering is about management, contract administration, and project management. 60% of surveyed Canadian engineers over 45 report their job responsibilities are primarily managerial (Engineering and Technology Labour Market Study, Engineers Canada, 1990). Software engineering literature has a significant qualitative side: Count qualitative results as you thumb through ICSE proceedings.

Software academics too readily don the engineering mantle, and there are dangers that the metaphor masks the bulk of its foundations of design and method that are dynamic cycles of fashion rather than invariants of nature. On the other hand, as it seeks its identity, software should learn from any discipline it can.

Further, as we look at engineering and software, we find that there is nothing that delineates them as formally separable concerns. They characterize arbitrary definitions from society rather than laws of nature. Much the same is true about the supposed division between architecture and digital system design. So it is with any broad element of upward human endeavor. Half of all engineers work in more than one engineering discipline over their careers, and more than 65% work in more than one industry. These labels have more to do with our desire to belong (the discipline focus of the software engineering definition) than to reach out to other disciplines and society (as the broader engineering definition implies).

Software engineering is not, and should not become, engineering. It continues to seek an identity of its own. In the mean time, it’s probably better that it live alongside engineering—it might as well have neighbors who are a good influence. But art, psychology, and a host of others should also be in the neighborhood.

Trackback URL:

There's an old joke that if builders built buildings the way programmers write programs, the first woodpecker would destroy civilization. The truth behind that joke is why I call myself a software developer, not a software engineer. I think we should aspire to be an engineering discipline, but we aren't there yet.

David Parnas has written a couple good articles on this topic recently (CACM October 2010, and IEEE Computer October 2011). They're well worth reading.

Posted on 4/10/12 10:49 AM.

I don't believe that all software development is engineering, but there are people who actually do engineer, and by that, I do mean "promote the development and application of..." software systems "...and allied sciences for the benefit of humanity, the advancement of the profession, and the well-being of our members". I don't think you want to live in a world where sound engineering principles aren't applied to the software that runs aircraft, cars, power plants, and medical equipment.

As such, I think that the blanket statement that "software engineering is not, and should not become, engineering" is rather bold. Although I do agree that software engineering, and any professional discipline, should learn from its neighbors. For software engineering, that includes a number of other engineering disciplines, computer science, art, psychology, sociology, business, and so on.

Another gripe is with the statement that the "engineering profession is either quantitative or systematic". I'm a software engineer that currently works in a multi-disciplinary environment with computer, electrical, mechanical, and systems engineers. I tend to find their work very quantitative and systematic, analyzing their models and prototypes, analyzing data from tests and producing spreadsheets and graphs and statistical analyses, and making appropriate changes to their designs. That has been my experience right along, from the university that I attended all the way through working. I would be concerned about any engineer that didn't ground their work in quantitative and/or systematic analyses.

Posted on 4/10/12 1:39 PM.

Hi James,
I'm a Master's student of Software Engineering.

Don't criticize what you can't understand. -- Bob Dylan

Your degree is in Electrical and Computer Engineering, not Software Engineering.

There are at least 3 remarkable books on SE. One of them is Software Engineering by Ian Sommerville:­e_summary_r&cad=0#v=onepage&q&f=false

The other book is Software Engineering: a practitioner's approach by Roger S. Pressman at­redir_esc=y

Another example of a good book is Software Engineering Principles and Practice by Hans Van Vliet.

I've read all 3 as a part of my study and I'm also a practitioner of Software Engineering.

Software Engineering is an engineering discipline that is concerned with all aspects of software production from the early stages of system specification to maintaining the system after it has gone into use.
-- Software Engineering, Ian Sommerille

Some of the main points are:
* project management
* requirements engineering processes
* system models (context models, behavioral models, data models, object models, structured methods, ...)
* formal specification
* architectural design
* distributed systems
* object-oriented design
* real-time software design
* user interface design
* rapid software development
* component-based software engineering
* critical systems development
* verification and validation
* software testing
* software cost estimation
* quality management
* process improvement
* configuration management
* security engineering
* service-oriented software engineering
* software engineering with aspects
* software engineering management
* software reusability
* software reliability

One can either develop ad-hoc, or develop using sound engineering techniques. The former is what software developers do today whereas the latter requires a Software Engineering degree.

There is a Software Engineering Institute at and some of the top universities including Oxford that offer postgraduate MSc. or PhD. degrees in Software Engineering.

The IEEE has further produced Software Engineering Body of Knowledge which describes what a software engineer should know:

It's a shame an IEEE member publishes such a misleading blog post.

Posted on 4/10/12 4:44 PM.

I'd agree; not all software development is SE.
However, I think Jim's statement is a serious overstatement; not that SE does not include art, etc, but rather because he is coming froma particularly flawed view of what engineering actually is. SE is (much) more like systems engineering, and is more interested in quality, process, and value both in practice and in well-formulated education.
Most post-modern forms of engineering today are overly focused on mathematics (think Calculus) and natural science, and not on management, process, quality, value or art. And most engineers, especially educators that I've met, read, or heard, don't know enough (me too) about epistemology to define engineering very effectively. Especially for a branch of engineering rooted in computer science. emoticon

Posted on 4/10/12 5:07 PM in reply to Thomas Owens.

I also have a degree in Electrical Engineering (study group/specialization: Computer and Software Engineering), and I disagree with the author. Self-educated people who lack a full understanding of background principles and theory can successfully make buildings and machines and electronic devices (I did the latter a lot when I was a kid, using and modifying schematics published in magazines), and especially software (since all equipment that is needed for such an activity is a computer). It is not an engineering activity, but software produced in such way is often good enough (for example, many programs for retail stores, bookkeeping, etc. are made by people who are not engineers).

However, when one enters the domain of operating systems, compilers, parallel and distributed programs, and fault-tolerance, formal education becomes very important. People who mastered the rigorous mathematical foundations of that concepts, and showed their knowledge through solving of problems - in other words, passed corresponding university exams and completed their studies - have the full right to consider themselves engineers.

Posted on 4/10/12 5:31 PM.

Some fundamental activities well align aspects of "software development" with "software engineering". Rather than by the discipline style employed by particular participants, one of the greatest historical advances in mechanical engineering was the adoption of standardised components, specifically, nut and bolt thread sizes and standardised performance specifications for each. Not all designers using such components would be designated "mechanical engineers" but their existence certainly evidences a discipline of mechanical engineering.

Posted on 4/10/12 8:08 PM.

Hi Jim,
I am a theoretical physicist by training (they would not let me into the lab) but have worked all my professional life as a programmer, while aspiring to be a software engineer. To this end I wrote the CSDP exam, and now may (or may not) outrank a vanilla software engineer.
The point is that I and some colleagues from a scientific background, do what we call Experimental Programming.

Normally one develops a program to solve a problem. (In Agile you would think about test cases first.) We then think of ways to break the program.

The difference with Popper is that not only can we change the theory (algorithm or code), but we can also change the physical reality we are supposed to be modelling. For example, if the algorithm does not work for left-handed loraxes, we exclude them at the UI. I am sure this is encapsulated by agile, testing and elsewhere. However, it is interesting in that it brings science back into software.

I reproduced your article here - - hope you don't mind.

Posted on 4/11/12 3:27 AM.

The term 'systems engineer' was very popular for IT technical staff in the 60s. IBM used it and so did General Electric, the firm I worked for at the time. There was no rigid definition of what a systems engineer did, the job could involve pre- or post-sales technical work. The title sounded good though, especially if the bearer wasn't a real engineer.

Later I did a computer science degree and encountered software engineering. I could understand why computer science academics were using the term: it made what they were doing sound more disciplined than it really was. But I felt the same kind of fraud was being perpetrated as was the case with the systems engineers.

I think major software disasters like the Denver baggage handling system made the academics anxious about software's reputation. The obvious answer was to redefine software development with a more respectable name and a new suit of clothes.

But it's a stretch to say that software is developed with the same rigour and professionalism that we might find in bridge building or building a dam. Most bridges and dams are similar to some other bridge or dam, so they can be designed and built literally building on prior knowledge. Not so with complicated software systems; development languages are still evolving, delivery methods are evolving, and despite what we would like to have happen, most software is written once and is never used to seed another project. That's not real engineering.

Posted on 4/11/12 12:55 AM.

I once looked up the definition of 'engineering' in a dictionary a long time ago. I believe the short definition was that engineering was the 'practical application of science'. To the extent that any of computer science is science, anytime you apply it practically, it is engineering.

Posted on 4/11/12 1:19 PM.

I want to add: i believe that same dictionary defined the word 'science' as the 'study of knowledge'. I think the term computer engineer is distinguished from computer scientist in that not everyone applying computer science is trying to create/learn new knowledge, some of them are just applying that knowledge (applying the science - i.e. being an engineer as opposed to being a scientist).

One thing that always got me, why is the guy who drives the train called an engineer, while the guy who drives the bus is just a 'bus driver'. There is an imagined level of superiority among engineers, whereas engineering is by definition inferior to science on many levels; it relies on scientists to create the knowledge they just apply.

Posted on 4/11/12 2:10 PM in reply to Robert Wilkens.

Well written. I admire the ability to be just wrong enough to get the rest of the story back in comments.

We engineers get wrapped around the axle attempting to find the perfect name for something. Naming things is an occupational hazard unique to engineers. However, to name a whole field of endeavor, the architecture for naming needs to more capable than can be expected of single words. Talk about way-overloading terms. A better construct is needed if we are to adequately distinguish the Software endeavor adequately from the hazy hodgepodge created by referring to everything else as "engineering". Here are some thoughts on how the word "engineering" relates to many of the topics put forward as connected to software.

I started as an EE in chip electronics, slowly moved through to the vehicle level adding many disciplines including an MSCS in Computer Arch. I now work with a lot of software people and am supervising computer and middleware development as a Systems Engineer for technical concerns. Yes I do belong to Engineering as a member. To be an engineer, a person must know how things need to work so that they perform well against expectations.

The "how this works" part in HW/SW/SE requires much the same discipline to deliver a quality, reliable product at a defined cost and schedule. Tiny bit of math, physics, understanding of dependences, performance, etc. While I am a different breed than my Software buddies, the "how it works" mindset is significantly the same.

Software is differnet because there are many workable ways to solve problems - some highly technically constrained - but most are not. This is where "the art" enters in, I say "much more so" in degree compared to the amount of art, elegance, utility required in more obvious engineering disciplines. There is so much to learn and account for in Software, we must factor in the human being as a major enabler and/or user and/or at least affected by software. In this sense, art, psychology, motivation, human performance are not traditional areas were engineering is done. No one really believes that social engineering is actual engineering. I think that Software shows us that engineering can be used to shape products so that people are accounted for more and more, even shaping how we are socially - if not in axiumatic ways thought to be the hallmark of engineering. It would be nice if software was written that actually decreases my workload rather than the opposite.

Posted on 4/12/12 9:27 AM.

Your quite correct, Jim.
A lot of what folks call “software engineering” isn’t; but let’s not throw out the baby with the bathwater.
From my perspective, we have (a) software engineering (NOT computer engineering), (b) computer science, and (c) computer programming. Just because software is involved does not make it one or another of the three; all three are different and each has a useful role.
Computer programming is a constructive technical activity, like soldering, riveting, and pouring concrete [1]. It requires skill and knowledge different from computer science or engineering, although not all practitioners have it to the same degree.
Computer science is an endeavor that focuses on language competencies and the mathematical, logical, and logistical aspects of algorithm development and implementation; the mathematics can be arithmetic or higher mathematics. Practitioners tend to bleed over into other disciplines, like human factors, but that is just interdisciplinary work. Computer scientists do not design and build computers; if they do, they are practicing computer engineering.
Software engineering, in my mind, differs from computer programming and computer science. It is essentially the application of classical systems engineering principles and practices to the design, development, deployment, and maintenance of software systems, rather than hardware systems. In fact, you really do not need to write a single line of code to do software engineering (I know that is just absolute heresy to computer programmers). What current curricula are for “Software Engineering” and who calls themselves “software engineers” really adds little the definition of the term. What counts towards the definition are the principles and practices – the functional aspects – of the field! Who is teaching what, and how, is transient and may be relegated to current fashion and academic politics …
As I indicated in a recent ACM Letter to the Editor [1], banking and accounting software may not need engineering, but software systems for nuclear weapons, medical devices, and transportation systems had bettered be engineered or were all going to be at risk.
GM Samaras Pueblo, CO
1. Letter to the editor: Software engineering IS engineering. Communications of the ACM. 55(1)6. 2012.

Posted on 4/12/12 9:30 AM.

Earlier in my career I worked closely with a number of different engineers from various disciplines. As a computer science graduate there were several instances where I debugged and cleaned up some horrible code written by said engineers. I argue if a person writes programs but has not seriously studied many of the advanced concepts within the computer science body of knowledge they are at best an ad-hoc programmer and not deserving of the title of software engineer or computer scientist.

What we seem to be struggling with here is language and associated societal perceptions. The distinction between "train engineer" and "bus driver" mentioned by another commenter is a good case in point. Historically, a train engineer in the days of stream trains was certainly more than just a mere "driver". Manage the steam engine wrong and the engineer risked exploding the engine and quite possibly losing their life as well as threatening the lives of others. It is fair to say a train engineer mastered at least a narrow body of mechanical engineering knowledge. The same perception was likely also true for fixed steam engines used in factories and the engineers that managed them. Do we expect a bus driver to have that level of knowledge and responsibility? No, hence society relegates them to the status of "driver" and not "engineer".

So, lets go back to the definitions of engineer and scientist. Society recognizes that engineers build new stuff by applying the existing body of scientific knowledge while scientists add to the body of scientific knowledge. It is also implied or expected that engineers apply analytical methods and rigor in their development processes. The notion of software engineering has grown and evolved since I completed my degrees in Computer Science and I have learned and continue to learn about these concepts and apply them in my daily work; an engineer never stops learning. Today, a lot of software development incorporates Open Source and COTS software as building blocks. My employers recognize this by granting me the title Senior Software Engineer, but I would be just as happy if it were Senior Computer Scientist as long as society equated this with more knowledge and skill than a mere "programmer". But in fairness to academics, I have done little to add to the body of computer science knowledge. The title "software engineer" is probably the more accurate label for what I currently do.

Posted on 4/13/12 12:32 AM.

Very interesting discussion. The term engineer pre-dates the current concept of Engineering (for example, there's a military discipline whcih is called "combat engineering" which originated with soldiers who constructed and used "seige engines" - battering rams and the like) and the train driver gets his title from the old "steam engines" in much the same way as the men who looked after boilers on steamships (the "ship's engineer").
If we're going to discuss certain sofware-related activities as engineering, we first need to agree what engineering is, in more concrete terms than a one-line entry in a dictionary. I agree that a great deal of software that is produced shouldn't be considered as "engineering". That being said, there's a significant body of work which is produced on the basis of a firm theoretical foundation and in accordance with established "best practices". Is this engineering? It seems to meet the requirements.

Posted on 4/16/12 9:21 AM in reply to Curtis Schroeder.

It took me a while to finally accept that software engineering is engineering. That definition IEEE provides is very general indeed, however, and can be applied to just about any profession. Perhaps software development life cycle (SDLC) is high-level and a lot easier to work with in comparison to building hardware devices, but the idea and the technique used are very similar to each other (i.e., researching, planning, developing, testing, deploying, documenting, and maintaining). This makes me believe that software engineering is an engineering discipline.

Although I hold a PhD in electrical engineering working in the software industry, I cannot call myself an engineer unless I have a [professional engineer] license, but that's a legal issue.

The only problem I have is the overuse of the word "engineer" on job boards (like dice, monster, etc)..... like frontend engineer... no comment.

Posted on 4/16/12 11:16 AM.

Texas holds the term Engineer to be a specific one that requires licensing. Calling yourself an engineer there without a license is a criminal act. The divide between "software engineering" as normally practiced and "professional engineering" (PE, by way of Texas model) is:

"One of the consequences of being a professional engineer is that you can be held personally liable for the work your company performs under your signature. Courts in the United States have held that only members of a profession can be found guilty of malpractice. Doctors, lawyers, and architects can be guilty of malpractice. Garbage truck drivers, short order cooks, and computer programmers cannot be guilty of malpractice because, legally, they aren’t considered to be professionals. By establishing software engineering as a profession, we are paving the way for the courts to find that software engineers can be held liable for malpractice just like other professionals. On the other hand, following commonly accepted engineering practices can be a defense in a some cases. " -- (Your Stake section).

When someone tells me they are a software engineer I question them about the PE liability and insurance they carry: being that I'm not in Texas, I have never met a licensed software engineer yet.

Yes, there are people who follow what *would* be the requirements if software engineering licensing was more widespread, but the *vast* majority haven't even heard of the SWEBOK much less describe actual engineering practices. (the dead link goes to­archives/000056.html ) is a typical response to the IEEE's attempt to codify the basics of software engineering as engineering: a stark realization that, outside of some atypical development houses that are connected to "real" engineering of real world devices, our house is not in order.

Posted on 4/16/12 11:12 AM.

Can't say I totally agree. The term 'engineer' *is* overused and overloaded in information technology environments, whether that be 'systems engineer' (too often a field service agent), 'software engineer' (in most IT, really a developer) or 'application engineer' (this last borders on the ridiculous, for me). Consider it another symptom of the 'social promotion' epidemic in the US.

There *are* times, though, when engineering is a valid term. Take any system being built with inflexible requirements for performance, reliability and external standards, a medical device with a processor for example with safety demands, a piece of telecommunications gear with protocol adherence and latency guarantees, or the software for the traction control and ABS on your car with latency and safety requirements. The nature of the requirements elevate those tasks to the level of engineering.

Terminology is partly the issue here. There are engineers like train engineers, primarily operational, and engineers like R&D engineers, with software ones described in the paragraph above. (Being an R&D engineer, I worry about the overloading of the term, and wonder if the operations usage [the original use, someone to operate the engine], does not dissuade some students from taking an R&D engineering path.)

The bulk of what the author speaks about though, is software architecture and development, not engineering. Trying to include art, psychology, and other disciplines is the province of the architect in the construction world. It may be brilliant wizardry, but any R&D engineering usually happens at a much lower organizational level than that of the chief architect.

To me, software engineering is the province of the tasks hinted at by the last two sentences of the author's first paragraph "There is actually an element of science in software complexity and automata theory. But software engineering rarely ascends (descends?) to this level." I would argue strongly against "descends", and would sum up with: Please stop diluting the term 'software engineer'.

If 'software engineer' is to be reserved for the narrower domain of critical requirements, then what's the best term to use for the bulk of SW development? Half the point of "agile software development" (paraphrased from the author above) is that most software systems are neither as permanent nor as inflexible as a bridge or a tower and so should not be built with the same steps, much less the same roles. But what should the roles be called?

Hmmm ... I think I've just come full circle, and so maybe am not disagreeing as much as I thought at first. I would argue that there is a place for the name 'software engineer' as a narrow niche. I agree that we need better names for the roles performed by those not in that narrow niche. I, too, do not have good suggestions for what those names should be.

Posted on 4/29/12 3:55 AM.

Jim, you say that Engineering builds on solid foundations in the sciences such as physics and chemistry. I agree.

However, Software "Engineering" builds on foundations based on the von Neumann machine paradigm.

Using terminology from C. V. "RAM" Ramamoorthy:
Software Engineering builds on the "von Neumann syndrome".

This summarizes critics from several sources, like from Edsgar Diskstra, Niklaus Wirth, and many others, and "Nathan's Law" ("software is a gas which completely fills all available storage space").

This instruction-stream-controlled machine paradigm forces us to pile up multiple layers of massive overhead, so that software packages reach astronomic dimensions: up to hundreds of million lines of code.

This explains the "Reconfigurable Computing Paradox". Within a classical FPGA, maybe about 4 transistors serve the application, whereas the other 96 transistors are needed for highly area-inefficient routing resources to provide the reconfigurability.

From the migration (re-programming) of applications from software over to FPGAs a lot of projects report speed-up factors up to 3 or even 4 orders of magnitude. The maximum reached so far: more than 28000.

Massive speed-up with a much more area-ineffient technology?
What explains this paradox? It tells us, that the efficiency of this machine paradigm is even much worse because of the von Neumann syndrome.

On a classical FPGA implementation there are no instruction streams at run-time. Only data strems are running thru. The von-Neumann-typical high inefficiency of address computations is avoided by reconfigurable address generators.

The summary is, that software does not build on solid foundations in the sciences such as physics and chemistry. We should not call it engineering.

I know that what I am telling is a sacriledge. This is dangerous. And it has been very dangarous. More than a decade ago a colleague has been fired, loosing his tenure professorship, because he said in a keynote, that Turing is irrelevant in undergraduate software engineering education.

Posted on 4/17/12 1:12 AM.

Software should be produced using engineering principles, e.g. as in SWEBOK, but unfortunately it is mostly not. One reason is perhaps that it is too easy to write software and hence too cheap. People have become used to software being cheap or even free and are not prepared to pay for quality.
Software and software architecture are also art, but so are other disciplines - bridges and buildings are also judged for their artistic content (or lack of it).
Perhaps we should differentiate between "software" and "engineered software".

Posted on 4/17/12 8:38 PM.

I really don't think Reiner's comment is a sacrelidge, it is just a little myopic. His very valid point about Von Neuman inefficiency (and what it takes to understand the issues) has absolutely nothing to do with natural science like Physics and Chemistry, and everything to do with Computer Science and Discrete Mathemaics (e.g. Automata theory)

Reiner makes a very valid claim (SEs don't get this major theoretical and practical issue), but it does not rationally support the conclusion that SE isn't engineering because of a lack of natural science. What it does support is that for SE to be (good) engineering, it needs to be in the rooted in the correct Maths and Sciences. (I'll claim these are discrete math and computer science) .

But now we're both espousing sacrelidge/heresy emoticon - Asking engineers to consider that there might be more math to engineering than differential equations and that Computer Science might actually be science. Or SE isn't engineering.

Posted on 4/18/12 2:53 AM in reply to Reiner Hartenstein.

Showing 1 - 20 of 32 results.
of 2


Sign up for the Build Your Career newsletter to receive the latest career news and job listings.




View All Newsletters | Privacy Policy



Marketing Automation Platform Marketing Automation Tool