How Software Engineering Differs From Computer Science
cconnell sends in a piece he wrote for Dr. Dobb's which "argues that software development will never be a fully formal, rigorous discipline, and the reason is that software engineering involves humans as central to the process." Quoting:
"Software maintainability, for example, is the ability of people to understand, find, and repair defects in a software system. The maintainability of software may be influenced by some formal notions of computer science — perhaps the cyclomatic complexity of the software's control graph. But maintainability crucially involves humans, and their ability to grasp the meaning and intention of source code. The question of whether a particular software system is highly maintainable cannot be answered just by mechanically examining the software. The same is true for safety. Researchers have used some formal methods to learn about a software system's impact on people's health and property. But no discussion of software safety is complete without appeal to the human component of the system under examination."
I'm not sure if I want to reply to AC's, but I forgot to mention I'm a structural engineer myself by education... Most structures of respectable size fall back on Finite Element Analysis to gauge the response to a variety of loads. [The estimation of loads is a research topic in itself, where the factors of safety comes from a rigorous stochastic-based reliability analysis]. Once analysis has been performed, design is a bit of intuition, but certainly not estimation - it's more of heuristics... so you say, "this worked last time, let me try this option and analyse if it'll work this time too."
The author of the article should study a Noble prize-winning work "Administrative Behavior".
There is nothing secret about human cognition. The fact that software engineering relies on human resources and not on binary logic is in no way a limitation. Many modern algorithms rely on heavily on probability and work with uncertainty. Herbert A. Simon built a solid framework for understanding human decision making process. This framework is just as solid as mathematical formulas behind computer science.
Soft skill? Depends how well it's done. Lets use car repairs as an example. There are many times I've known or heard tell of where well trained city mechanics throw up their hands in defeat before the car is taken to either a 'mate who knows something about cars' or a 'bush mechanic' and fixed in 15 minutes. Ie. Sometimes the ability to observe, sort information well and problem solve is worth a lot more than a piece of paper with 'engineer' written on it.
Another example. I run a computer repair business with a 'no fix, no fee' policy. Even though I've never had a single day of formal training in the field, I have never, ever had to bring that policy into action. Meanwhile it's surprising how often my mates who have done IT or computer science ask me for help on something because they just don't know how to THINK.
sudo mount --milk --sugar
Going by the wikipedia definition, decisions made in typical software development cycles don't seem to rely on a justification based mathematical or physical analysis. Admittedly I might be generalising, but is it more of a soft-skill then?
That's just horsepucky.
The only reason it seems the way you mention is that software processing cycles are so ridiculously cheap compared to, say, 3" C-Channel girders. But just today, I was doing some engineering to develop a distributed, self-healing clustering file system. Specifically, I was doing performance analysis of different approach, doing a base unit of 1,000 simple file reads. That is most *definitely* a physical analysis - performance tuning always is. But do I care about each individual line? Not really. Do I do extensive analysis of each individual element? Not by a long shot, simply because the actual, real, overall cost of the software is so low.
We host highly complex, vertical-market database solutions. We have a pretty decent hardware cluster comprising some $25,000 in whitebox rackmount equipment. A nice half-rack of stuff. And another $10k or so for a failover DR scenario. But compared to the number of customers we service, and the size of my company, that's an insignificant investment, yet we are overbuilt at least 400%!
If 3" C-Channel cost $0.05 per linear foot, how much checking would you do beyond "good enough"?
I have no problem with your religion until you decide it's reason to deprive others of the truth.
Connell titles his article "Software Engineering != Computer Science." He later proposes Connell's Thesis, "Software engineering will never be a rigorous discipline with proven results, because it involves human activity."
I would suggest that the article's title reveals why software engineering doesn't have "proven results" in the sense that Connell means. It's not due to human activity. Rather: engineering != science. "Proven results" (i.e., a set of results logically derived as part of an axiomatic system) are more characteristic of a scientific field than an engineering discipline.
Engineering applies and relies on science, but is not science, per se. Mature engineering fields have standards and codes of practice, both science-based and empirically derived. When/if software engineering matures further, it is reasonable to expect such standards and codes to develop.
"completely unreliable piece of _software_"
I doubt real engineers would use a completely unreliable piece of software.
The point of this article was that software engineers are not real engineers because they lack rigorous frameworks and rely too much on human factors. Seen from that point of view, you really only have two classes of software: those that are rigorously engineered to be reliable (and the article already claimed those don't exist), and those that are not. The last group must therefore comprise all software that's out there.
Real engineers are practical enough to use software works well enough. They're not mathematicians who keep looking for complete proofs, or 100% - they are well aware of the real world.
Fine, no problems with that. But "real engineers" should then also accept software engineers as real engineers. Software engineers are also practical enough to make software that works well enough - even though software engineers are not mathematicians who keep looking for complete proofs.
And in the real world, it will be exceedingly unlikely that the finite element analysis software will work fine for lots of different cases, but fail dangerously for your case even though it is not really very different to other common cases.
"We tried walking across it a few times and it stayed up, so it is probably fine" - Yeah, that sounds pretty rigorous to me...
If the case is something really new and "far out", I bet a proper engineer would do more checks and perhaps add higher safety margins.
Again, where is that rigorousness of which the article speaks? What you are proposing is just a matter of intuition, without any grounding mathematical framework.
The other thing is, an experienced engineer will often know whether something is dangerous. It's just like you looking at a branch and guessing whether it will hold your weight or not. If a branch is way too weak it's easy to guess that.
And an experienced software engineer won't know?
Similarly if the software gives a result that's ridiculous an experienced engineer should notice it.
And an experienced software engineer won't notice?
It's more likely that the contractor botches up the job (or cheats) and doesn't build according to the required quality and spec - e.g. use more sand in the concrete to save cost, use less concrete, etc.
...and we're back to human factors. Thank you for disproving the article entirely on your own.
The way I see it.
... and the customers often buy it :).
Civil Engineering:
Design Phase costs about 10% of Build Phase
Build Phase involves tons of construction workers and heavy machinery.
The blueprints and plastic models are way cheaper to make than the Real Thing.
Management often doesn't mind spending a bit extra to get the design better, because the budget only allows for one big Build.
Software Engineering:
Design Phase costs more than 1000 times the Build Phase.
Build Phase involves the programmer typing "make all" and going to read Slashdot or fetch a coffee.
The plastic models cost as much to make as the Real Thing.
Management often sells the blueprints/plastic models as v1.0 because they compile and "kinda run" and the budget only allows for one big Design...
It should be no surprise then that the plastic models regularly fail.
But maybe I'm seeing things wrong?
BTW I suspect that a Civil Engineering Design phase is managed a bit differently from the Build phase. Still, I'm not an architect or civil engineer so what do I know.
Science (like religion) is in some sort of ideal world, vacuum, where all is simple and described by a formula.
I think you're confusing (or conflating) science with mathematics. But don't feel bad; people do this all the time. Part of the reason is that science routinely uses mathematics as a tool, and the two fields are deeply intertwined. Scientists use math to help understand and explain what they're working on, while mathematicians routinely use scientific work as inspiration for new ideas to pursue.
But the "science" part is usually very much about the real world. It's the mathematicians who carefully avoid dealing with the real world, since that's not their job. The interesting part is how often the abstract, theoretical stuff that the mathematicians work on turn out to be very applicable to figuring out what's going on in the real world.
One of the problems with our terminology is that "computer science" is generally used for the abstract, theoretical part of software. This is misleading, because the subject really is a mathematical field, not scientific. If it were scientific, the computer scientists would be performing experiments and developing hypotheses to explain how software works. But that's not what they do; it's the "software engineers" trying to debug software that do things like that.
And this leads to the problem that "software engineering" generally involves doing things that in other fields would be called "science". In engineering, you are generally working with tools and materials whose behavior is well understood, so you can concentrate on design. With software development, this isn't generally true. An engineer designing a bridge or house or airplane can expect to work with detailed specs for all the available components. With software, the equivalent information is usually proprietary and intentionally hidden from the people building the code. Even in "open source" systems, the concept of "information hiding" is popular, and all too often this does mean that needed information is intentionally hidden from the person writing the code. So the software engineer is working with poorly-documented material, and must develop using processes that test and discover the properties of the underlying stuff.
Of course, there are some software engineers who don't do any debugging. But we know how well this works. Civil engineers might be able to develop this way, since they have access to full specs for their material. Software engineers can't, because they are kept ignorant of the details of lower-level stuff. As long as this is true, software engineering must have a large scientific component, to study and test the software as it's developed. They must constantly develop and test hypotheses about their code, in order to get it to function as desired in an environment that is mostly hidden.
Anyway, there's little chance of getting the terminology straight any time soon. There's no chance of software people getting access to detailed specs for the underlying systems. We even have laws in place that block the access to full information. So software engineering can't really be true engineering, and software developers will continue to spend large parts of their time acting as experimental scientists in order to debug their software. And they won't get much help from the computer scientists, who are spending most of their time working with the mathematics of the subject, while disparaging the real-world portion of their discipline as being "mere engineering".
Now if we could only get the computer field to adopt the same definitions that other fields of engineering, science and mat use. But that isn't going to happen any time soon.
Those who do study history are doomed to stand helplessly by while everyone else repeats it.
Actually I wonder if the code written on the Vic 20 is exactly the code that matters. Even if it was just copying right from Byte magazine.
Here's what it says to me:
This is a software developer that was doing computer stuff when he was young because he enjoyed it. Not IM, not games, not first person shooters or flight sims. Software development in its basest form. For free. Because he could.
It also says he has been doing it for a very long time. If he is still doing it, he does it because he enjoys it - not because of how much it pays or how glamorous it is or how 'easy' it is compared to other jobs.
There were plenty of kids with the opportunity to spend all day every day on the Vic 20, but very few did so because in all honesty from an 'entertainment' perspective it sucked.
Give me someone who grew up hacking on a Vic 20 any day over a coder who knows the Java API set inside out (but started coding it three years ago, and doesn't know anything else.)
Glonoinha the MebiByte Slayer