Whats the difference between an engineer, a scientist, and a mathematician? An engineer sees his equations as an approximation of reality. A scientist sees reality as an approximation of his equations. A mathematician just doesn’t care.
There was discussion in a relatively recent Basement Coders podcast (ok, it went out mid May and its not even the most recent podcast they have released, that tells you how often I post to this blog) about whether or not Software Engineering is a good title for professionals writing software. It was sparked by a blog post suggesting that a better title would be “Software Gardeners”. Reading the blog post, I can’t agree with much that he says, and while I have never like the term “Software Engineering” (though less so recently, in fact the subtitle of this blog is “A blog exploring the world of software engineering”), but “Software Gardener” is much worse. I don’t want to diminish what gardeners do, as it certainly does involve a lot of work. But what gardening involves is mostly preparing the environment and letting the plants grow. That might be a good metaphor for, say, management. But not software development. There you need to do the work to build the product.
Craig from the podcast, however, seems to disagree with the term “software engineering” as well, but for different reasons. His argument is that writing software is not deterministic, while mechanical engineering (such as building a bridge or skyscraper) is. I’ll have to disagree with that as well. Software can be deterministic, it just usually isn’t. And similarly, engineering in the physical world is rarely deterministic. You can build a nuclear reactor that is safe from any imaginable disaster, only to have it meltdown after being hit by both a magnitude 9.0 earthquake and a resulting tsunami. That kind of real world interference is not something we have to think much about in the world of software.
So why does software seem so indeterministic? There are many reasons for this, but the biggest is that comparing the development of a web application for posting messages for friends and a bridge really does not work. In the web application, you can sacrifice quality for speed to development, which you can’t do with the bridge since human safety is involved. This results in more attention being spent on detail for the bridge, giving the impression that it is more deterministic. If you spent as long as bridge engineers spend writing your web application, it will probably be very stable (but of course you will be the last one to the market). Instead, compare something like developing the software behind a car vs engineering the car’s engine. When your car breaks down, how often is it a software failure vs a problem with the physical engine.
So why do I have issues with the term software engineering, and generally prefer “software developer”? I did graduate with a degree in engineering (though just barely, I started in Virginia Tech’s College of Arts and Sciences, but about a year before I graduated the Computer Science department got moved to the College of Engineering). But I do still see a difference between developing software and the more physical engineering disciplines. And that’s where the quote at the top of this post comes in (which I first read on VT’s Mathematics department webpage back when I was in school). Based on that description, developing software is neither a science nor an engineering field. Its a branch of mathematics. We spend huge amounts of resources trying to distance our code from the real world of the computer electronics. From assembly languages abstracting out the processor to the operating system abstracting out the assembly languages to the virtual machines abstracting out the OS, we’ve been moving further and further away from real world with each year. We don’t see our programs as an approximation of the real world, nor do we see the real world as an approximation of our programs. We simply do not care about the real world.
And to be honest, that’s why I love developing software. I probably should update my blog subtitle though.
Excellent post and definitely probably the closest analogy I’ve seen yet to describe what software development is closest to in practice.
Extract from Wikipedia :
The American Engineers’ Council for Professional Development (ECPD, the predecessor of ABET)[1] has defined “engineering” as:
[T]he creative application of scientific principles to design or develop structures, machines, apparatus, or manufacturing processes, or works utilizing them singly or in combination; or to construct or operate the same with full cognizance of their design; or to forecast their behavior under specific operating conditions; all as respects an intended function, economics of operation and safety to life and property.[2][3][4]
Extract from your post :
Based on that description, developing software is neither a science nor an engineering field. Its a branch of mathematics. We spend huge amounts of resources trying to distance our code from the real world of the computer electronics. From assembly languages abstracting out the processor to the operating system abstracting out the assembly languages to the virtual machines abstracting out the OS, we’ve been moving further and further away from real world with each year.
You’re using mathematics to build logical automations over a physical machine, as civil engineers use mathematics to abstract a physical world and design structures that supports its rules. Does it convince you software engineering has a meaning?
That just moves the discussion from one on the semantics of the term “engineer” to one of the terms “structures”, “machines”, “apparatus”, or “processes”. Does a software program fill one of those, or do they imply a more physical body? And then there is the term “scientific principles”, does that include mathematics or just the traditional physical sciences?
I would personally argue the virtualness (assuming that is even a word) of computer systems really do cause us to face different issues than a physical engineer would have. That being said, I certainly don’t deny that an argument can be made that the term “engineering” can be applied to software development, just as arguments can be made that the term “engineering” can be made to apply to other disciplines such as “domestic engineering” (though that strains the definition even more). I just find it useful to consider the too separate disciplines.
The real difference is peoples feeling and reputation attached with each word.
Javin
10 example of grep command in Unix