+10  A: 

My view is that software has never been on a par with engineering. It lacks the scientific basis that physics gives to engineering.

Civil engineering has been with us since the pyramids and aquaducts; mechanical, chemical, and electrical engineering have been making rapid progress since the late 19th century. Software has only been around since the 50s. It hasn't had the same time to develop that engineering has.

Software development has more of the feel of writing or art or craft than engineering does. All the UML and false metrics like KLOC and code coverage won't make it so. I think the analogies with building ("architecture") and manufacturing ("widgets", "metrics") don't do it justice.

That isn't to say that software development isn't a wonderful activity with its own rigors and challenges. It's just not "engineering" yet and may never be. Tom DeMarco appears to have lost faith.

UPDATE: The fact that 27 years have passed since DeMarco's metric book came out, and we still don't have an agreed-upon way to measure quality or productivity or value in software says that it hasn't delivered on its initial promise.

I always laugh when I hear about applying Six Sigma techniques to software. The people who suggest that have never been on a shop floor, and have little idea of how a tolerance band for a given dimension figures into its success in that domain.

When I was practicing as a mechanical engineer I could count the number of people with "engineer" in their job description without a bachelor's degree in the field from an accredited institution on one hand. While I'd agree that a degree is no guarantee of quality or above average results for all, it's an important difference that separates it from computer science and software development. The barrier to entry in programming and software development is a lot lower than it is for professions like engineering, law, or medicine. Every person who wrote Basic on an early PC can be considered a programmer. Not so with other fields.

duffymo
I both disagree and agree with most of the points :P
Aiden Bell
Your points are well taken. But, please do read the PDF article. I *have* quoted very out of context with the expectation that the two page article and Jeff's post would not take much time to read.
nik
Another such question: http://stackoverflow.com/questions/1117763/is-software-engineering-a-mature-discipline
nik
I did read the PDF article. What leads you to believe that I didn't?
duffymo
Surely, whatever you are doing, the 'correct' metrics to apply to measure anything are variable to the task. Supporting weight and span for a bridge, stableness and abstraction in a kernel. The decoration of the bridge or the grace of the API are different matters.
Aiden Bell
I agree, Aiden. I know what the metrics need to be for a bridge; do you think you can rigorously define terms like "stability" and "abstraction" for a kernel? Is the *nix kernl more stable or abstract than Windows? I think it's hard to do.
duffymo
@duffymo, I should have expanded with "please read if you have not already". I did not mean to suggest your answer indicates otherwise.
nik
You are right, but I think this isn't a bad thing. In many ways it keeps us re-thinking the terms of suitability. Having no concrete foundation, software's suitability and measure changes as often as the requirements themselves. Unstable, but I don't see it changing, or needing to.
Aiden Bell
That said, maybe the metric for software is its meeting the requirements, and those need to be more absolute. Like a bridge's requirements.
Aiden Bell
My experience says that those absolute requirements for are rare, especially for really complex systems. Even when people are forced to write them down, how often do they see the system in action and say, "That's what I said, but now that I see it that's not what I want."
duffymo
True. I don't know, all seems very messy to sit and think about it. If only we could get Telford's view :P
Aiden Bell
+25  A: 

This sounds alot like the software, art or engineering? arguments that go around.

IMHO, software engineering assumes fixed constructs like duffymo stated. Mechanical engineering has the laws of physics to contend with.

In programming we have other rules such as business constraints, chip constraints and general constraints of computation and complexity theory that give foundation to the topic as an engineering discipline.

Computer software is engineering when you work within fixed bounds, often applied by yourself. Computing is so abstract and fluid that software engineering is almost as odd as "mathematical engineering" ... Engineering of what?

I think that software is engineered within arbitrary bounds, implied by business and complexity costs. Computing, and in turn software however is not fixed to these bounds, allowing its concepts to become an art without boundary other than those artificially or physically imposed.

So long as software must be created within some fixed boundary of cost, time, complexity or the other, it will be software that is engineered.

When those bounds don't exist, it is like mechanical engineering, without the constraints of physics.....

An amazing blank canvas for art.

But I am no expert.

addition:

In software, the same people design and then build. How many mechanical engineers or architects are plastering, welding and riveting their designs?

After reading all the other comments, I have come to a personal conclusion that from software engineering through to electrical or mechanical engineering ... both design processes involve some form of science along with current and past methodologies. These methodologies are used to design a system, of any kind, within some design constraints.

Doesn't really matter if this is a car, bridge or otherwise. You have convention and innovation that breaks convention. The design is the art. Keeping it within the bounds of the brief is a composite of design and engineering the art-form into constraints.

Then comes the execution, building or implementation, both mechanical, electrical, software or other have the same problems; managing expectations of the construction of a given design. I am sure bridges, buildings, car production and circuit productions run over their budgets and time constraints just like software.

In the end, IMHO, metrics are applied to the management of implementation and the requirements of design, regardless of the underlying science or design discipline. The design itself is an art. So I would consider mechanical design an art, just as is architecture or software design.

What makes things different is that software designers are often the builders too. Im not sure too many architects/mech.engs get are also welding the frameworks of their buildings. In this way, software has a bias because as software designers and builders our hands are involved in both sides ... but they must be treated in a separate regard when looked at for measurement of any kind.

In my very humble opinion, software is no different from other engineering disciplines I think, but our separation of design and implementation in terms of measurement is not the same as other professions, and the boundaries blur.

Aiden Bell
Well written, sir.
AJ
@PITADev Thanks!, im just sat here imagining what mech.eng would be like without the laws of physics. Look like an M.C. Esher painting.
Aiden Bell
There is always *some* boundary when developing software.
luiscubal
Also, there is always some boundary *running* software too. In theoretical terms rather than implementation terms, it is the maths that limits things imho.
Aiden Bell
"Complexity" in the mathematical sense is definitely not something you can conquer. It is as real as gravity. Most real-world applications can make due with approximated solutions for hard problems though.
Jørgen Fogh
You didn't get the De Marco point: usually software that must be created within some fixed boundary of cost and time it will go out of budget and it will be delivered late. Or it will produce a very low marginal value. Conversely projects with low or flexible boundary deliver very high profits and values.
IlDan
@Jørgen Fogh, I agree, but the mathematics of programming don't too often bring people imaginations to earth with a bump!@IlDan - I got the point. With anything that is an art it HAS to be confined or engineered to the constraints of its purpose such as canvas size or amount of marble.
Aiden Bell
+2  A: 

I admit beforehand that my answer is an over-simplification. That said, I think there is an essence of truth in what I say below.

In regular engineering there is discipline that is applied almost universally. Rules and standards that are enforced. Specify an non-trivial engineering problem and it is possible to construct a methodology for solving that problem that broad numbers of engineers would agree upon. Follow that methodology and success is likely, even though you will still face problems and setbacks. Deviate from the methodology and success is elusive and the project may fail.

I have worked as a programmer at a lot of places, some very big and some very small. Rules varied from company to company, and in some cases from person to person. Some places enforced their rules, most did not. It worked upon the honor system. Specify a non-trivial computer software problem and there may be no consensus for how to proceed. Regardless of the methodologies chosen, there is an equal chance the project may fail.

Like it or not, computer programming has more in common with art than with engineering. Creating software has become a curious blend of mathematical theorem proving and non-fiction writing. Which is what I found attractive about it in the first place.

RB Davidson
+1, I am happy programming is more art than engineering. Michelangelo's Cappella Sistina is art engineered into chapel constraints.
Aiden Bell
-1 for programmers who compare themselves to Michelangelo
Christopher
Do you not mean comparing programming to artistry. I could equally say a child engineers scribbles to the bounds of the paper (unless it is your newly varnished table)
Aiden Bell
+2  A: 

I feel that programming and software design is analogous to apprenticed crafts of old, more like blacksmithing than accounting. It can be learned, and perhaps mentored, but never taught. Anyone who's ever worked with someone whose sole qualification as a programmer is a Computer Science degree might concur. The principles of software design are vague, and often contradictory. To make matters worse, their over-application can be as disastrous as their under-application. There are guidelines, but no simple rules.

The fact that we separate the good from the bad my "smell" indicates to me that the endeavor is intuitive in nature. It is art, and one of the primary goals is beauty. Try telling this is your boss, who is more interested in talking about deliverables. The notion that something that the primary users of the product will never see, that only a small percentage of the population has any change of understanding (let alone appreciating) -- the notion that this thing must be beautiful sounds absurd. But we all know: it must be.

It's one of the few disciplines in which several people (or perhaps many more than that) are expected to collaborate on a work of art for profit. To my knowledge, even architecture doesn't attempt this to the same degree. I've always thought that architecture is one of the best analogies we have, but I'm not sure how to utilize that analogy. Can we take inspiration from their organization structure or design process? Or is our craft just different enough that we're on our own? They manage to control their output and deliver on time -- what's our malfunction, as an industry?

The question isn't really whether the production of software is different from just about every other process on earth, but exactly why that is, and what we should do about it.

WCWedin
Functionally visually clean and uncluttered, and therefore more comprehensible and maintainable, yes. But beautiful? No, I couldn't call it beauty.
Craig McQueen
I come from a background in Physics, so maybe my idea of beauty is a little skewed. But in my opinion there is beauty in symmetry, simplicity, and abstraction. Understanding and clarity are the essence of beauty.
WCWedin
Fair enough! Beauty is subjective, true.
Craig McQueen
+2  A: 

Whenever this 'engineering or not' debate comes up, I am amazed by peoples understanding of engineering. 'Strict rules that are always followed', 'discipline that is applied almost universally', 'exact numeric answers', etc, etc. For SW development OTOH you read 'There are guidelines, but no simple rules' and similar statements.

When I started university, I believed those, too.

After several years working with process and mechinical engineers, I know differently. They are working just as chaotic and cluless as any software developer.


Edit:

Quoting from areply to Jeff's blog entry: 'In civil engineering, and most other engineering disciplines, there is only a 'correct' way. Either you design the bridge to support the correct amount of weight or it falls down.'

Wrong. Wrong, wrong, wrong. Wrong!

There are at least as many ways to design a bridge as there are ways to design a string class. If you design a bridge that not only supports the required weigth, but tenfold the required weight, you did it wrong, because you could have lowered the cost by using less material and completing it faster (less wages to be paied) etc.

If you design a new gear for a car, that needs less maintenance, but requires the whole motor to be removed from the car in order to replace the old gear, you did it wrong, because in complex systems, there are always more aspects to consider than just your module, you also need to think of it's interaction with the rest. That should sound familiar to a developer, shouldn't it?

Treb
"They are working just as chaotic and cluless", im never driving over a bridge again :P
Aiden Bell
If bridges occasionally shut off your car, spat you back to the tool booth, and caused you to lose your radio station, I would agree with you. Sure, these kinds of metaphors can be misleading if taken too far, but the fact remains that the degree of rigor and the user's willingness to accept failure states are separated by massive gulfs between the industries. And software failure can be just as deadly as an engineering failure.
WCWedin
Nice examples. There certainly are parallels there, but are there enough to call software design an engineering discipline? Can we borrow methodologies and principles from engineers? Maybe the trouble is a preponderance of competing abstractions. We don't start with forces and work to trusses and cables and build a bridge. We start with transistors and end up with any of hundreds of paradigms before we even start. Maybe we just need time for the industry to mature before its engineering-ness comes out. For now, I'm not sure what the comparison buys us software engineers, other than prestige.
WCWedin
You have valid points there, especially the prestige part ;-) As for the parallels: Think not only of designing a bridge, but actually building it. That needs project management, just like a SW project does. (And that's what I was referring to with *chaotic and clueless*)
Treb
Well, the problem with drawn-out and over-budget roadwork, if you ask me, has more to with the mob than the managers. ;) But I see your point now.
WCWedin
Again with the bridges! What's with the bridge fetish?
Jeanne Pindar
You are quite right about other types of engineering - electronics for instance, which is what I do - not being anything like the idealized image some people have.
Jeanne Pindar
A: 

I shure hope software engineering is not dead... I'am presently in my 3rd year as a Software engineering student! The fact that universities actually make the distinction bwtween computer science, computer engineer and software engineer tells us something, doesn"t it?

For what you guys say about software not beeing "scientific" enough, you need to come up to date on the subject!

I don't think software engineering is going to go very far, especially since projects are become bigger and more complicated by the second!

David Menard
The main reason universities make the distinction IMO is because you get more students with more programs. Perhaps not 200% more by spitting one program in three, but high enough to be worth it.
MSalters
+5  A: 

I hadn't read DeMarco's original work. I now know who to blame for managers who think only in terms of metrics.

From early in my career, I felt it important to make a distinction between people who just write code and people who are "professional" about it. That is, people who understand that process is necessary to some extent, understand the concept of source control, etc. I didn't know what to call those people until I heard the term "Software Engineer".

If I'd known I was using a term that implied that I thought I could control things by measuring them, I'd have stuck with "computer programmer".

I like the term "Software Craftsman", but it doesn't leave me with a good feeling about whether such a person would work well in a team. It seems to me that you can be a craftsman, but only check in your code once a week, or not get your code done in time for QA to test it. I'll be on the lookout for another term to use.

John Saunders
+11  A: 

Agree with most of what's been said here, but I just wanted to pick apart the sound-byte, and it is pure hyperbole sound-byte:

"control is ultimately illusory on software development projects"

Control is illusory in all aspects of everything to a greater or lesser degree. That's just a consequence of quantum physics, entropy, or humans being humans depending on the scale of your subject. Managing software development has never been about control (at least not for a good manager), it's about minimising risk and compensating for failures. Anyone who says otherwise is selling something.

annakata
+1! I like your answer
Aiden Bell
And yet, people accept that software is almost never done on time. If the problem isn't control, what is it?
WCWedin
My experience is that software teams can deliver accurate software estimates, but those estimates are frequently shortened (directly or indirectly) by managers who believe them to be too long. I've been involved in many projects that started with "So, how long will this take to get done in 6 months?" But we don't hear "managers' shortening of estimates are almost never accurate", we hear "software is almost never done on time".
Craig McQueen
@WWCwedin - the problem is expectation.
annakata
Interesting idea, Craig. Definitely something to think about.
WCWedin
A: 

I don't consider software engineering dead because I think there are enough people out there (mostly engineers) who would like the software development process to be more like engineering, who will keep trying to make it more like engineering, and who will keep trying to convince people (especially programmers) that it should be more like engineering.

Personally, I don't think engineering principles work too well for software in general, but software engineering's apparent lack of success thus far will only be taken as evidence by engineering evangelists that there must be greater effort in advancing their cause.

John Y
+4  A: 

Software engineering never was an engineering to begin with. Engineering is a hard science with cumulative and cooperative progress.

I can't sum it up much better than Richard Hamming:

Indeed, one of my major complaints about the computer field is that whereas Newton could say, "If I have seen a little farther than others, it is because I have stood on the shoulders of giants," I am forced to say, "Today we stand on each other's feet." Perhaps the central problem we face in all of computer science is how we are to get to the situation where we build on top of the work of others rather than redoing so much of it in a trivially different way. Science is supposed to be cumulative, not almost endless duplication of the same kind of things.

Sufian
+1 ... Reinventing the wheel is to be expected in a science that is new, abstract and has few hard-and-fast rules. Imagination (and computability) is the limitations.Computer science is *very young*. We are impatient.
Aiden Bell
+2  A: 

The basic flaw in the DeMarco approach is that it was never software engineering, it was software production engineering. He accidentally slipped a level of meta in there.

Software metrics are executable file size, memory usage, latency, ... Software production metrics are lines of code, defect count, complexity, ...

Software production metric possibly matter in the case where you need to manually produce 10,000 or more similar software systems: that's about the scale where hardware production engineering kicks in as worthwhile. You don't build a factory and establish an optimised production line to build a few hundred cars a year. And very few software firms are on that scale: even IBM produces far fewer software products per year than Rolls Royce produces cars.

You might find two or three organisation worldwide that would benefit from a robust set of software production engineering techniques. Places like the US army, NASA and the NHS.

But there are far more who would benefit from an appropriate level of actual software engineering skills, metrics and techniques.

soru
+3  A: 
Norman Ramsey
+4  A: 

When I was at university, I was told other engineering disciplines were much better at engineering. I believed my professors.

What I discovered, working with Electronic and Mechanical engineers over 15 years, is that other disciplines mostly don't do something nobody's ever done before. If you asked a Civil engineer to do something nobody has ever done before: their reaction would be to tell you it was going to cost enormous amounts of money and would have an uncertain schedule. And nobody would tell a civil engineer what kind of tools or parts to use.

Bridges, Engines, Cars, Telescopes....

As things get more and more complicated, and more and more novel, "traditional" engineering disciplines start looking more like software engineering. One place I worked invented the dishwasher that looks like a filing cabinet. The mechanical design had bugs just like software. They fixed it eventually ( well enough to sell.)

The contradiction is that beyond simple things, the engineering approach to most things these days is to have software in the middle making it all work.

A car company ran an advertisement when I was a youngster about spending 6 million developing their new car. (Toyota Camry IIRC) Toyota had made a car that was different to their other cars. It cost them millions.

I think that if you measure the complexity of an electronic circuit, or mechanical system it is not anywhere near the complexity of "simple" software. Complexity in the mathematical state space/chaos theory sense of the word.

Consider a standard suspension bridge: no moving parts. Some pivots, some vibration dampers. Copy the bridge for your next project.

A software equivalent would be what ? We don't (on the whole) do critical and simple in software.

Lets look at manufacturing:

Software: Design software, Write program, hit compile. Copy onto a CD. The manufacturing bit was at the end. The copying of the data.

Mechanical Engineering: Design system: design assembly, design parts. Repeat for every one you want (Get parts made, assemble parts. Test, align)

The manufacturing bit was on another line and had to be repeated for every instance.

WARNING: Car Analogy.

We design a new thing every time we write software. Every program is not an Aston Martin, but a custom built car. Some will be from Monster Garage and some will be supercars from a guy in Italy with price tags in the tens of millions.

The funny part it that we can duplicate the "supercar from Italy" in 3 seconds and sell it to everyone in the world. So the cost drops to "shrinkwrap" software prices.

Software is different to other disciplines : because it is uncommon to design things that are not software from scratch.

Software not designed from scratch is really common. But still very complex. So, unreliable. After all, we're only selling it for $20.

END Car Analogy.

If a company said that the CEO was getting a car designed for him that the company was going to pay for, the shareholders would geek.

If the same company gets software written to their "business processes", nobody blinks.

(I lied about the car analogy ending :-) )

Tim Williscroft
A: 

DeMarco's article is a reflection of current trends seen all around the development community lately, I think. People are exploring the potential space when it comes to software development models, possibly because the software engineering aspect is currently a bit tired.

Engineering is just one aspect of creating good software. It's the "do it again" aspect -- learn what you can from your past experiences, use that knowledge to measure your current performance, and control your future results. But the engineering process is built to reproduce, not to create. The engineer trains his entire career to be able to take a model that works and apply it with precision as the core component in something new.

But, as DeMarco points out, new ideas, the stuff that's really significant, is about creating, not reproducing.

Personally I've always found that the science model works much better for developing new software -- a mindset of discovery and testing. Perhaps software management should try to model itself more closely to science management than engineering.

But regardless, the lessons learned from the software engineering movement aren't about to be squandered or forgotten -- I continue to believe there is real value in applying the correct amount of measurement and control to software practices, it's just a matter of recognizing what parts of a project can be tightly controlled, and which cannot.

Gus Melo

related questions