Slashdot Mirror


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."

17 of 306 comments (clear)

  1. Is software "engineering" really engineering? by KnowThePath · · Score: 4, Insightful

    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? ie something that you acquire on your own rather than something that can be formally taught or imparted as training? Makes you wince when you see all those job adverts asking for programmers to work in their "engineering departments"... Disc: I'm a coder myself, working in a structural engineering environment, so watching people design buildings around me feels more like "real" engineering... Go on, mod me down now.

    1. Re:Is software "engineering" really engineering? by KnowThePath · · Score: 4, Interesting

      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."

    2. Re:Is software "engineering" really engineering? by Idiot+with+a+gun · · Score: 5, Insightful

      In this case, "Physical analysis" would be running tests, deployment, crash analysis, etc. If we're comparing software engineering to "real" engineering, I feel it would be disingenuous to knock down software engineering because it works with code instead of physical items. The complexity is still there.

      For me, what delineates "engineer" is much better defined in my mind by "engineering type." While a software engineers, civil engineers, and mathematicians may vary quite a bit in average disposition, they are more similar than dissimilar compared to the rest of the population. I genuinely believe that there is a major difference between the engineering mind (or in my case, CS), and everyone else. Similar to how painters, composers, and photographers all may vary in general, yet they're more similar to each other than the rest of the population.

    3. Re:Is software "engineering" really engineering? by dov_0 · · Score: 4, Interesting

      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 /cup/tea /mouth /etc/init.d/relax start
    4. Re:Is software "engineering" really engineering? by mcrbids · · Score: 5, Interesting

      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.
    5. Re:Is software "engineering" really engineering? by johannesg · · Score: 4, Insightful

      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."

      So... A "real" engineer uses heuristics, common sense, estimation, and best of all, a complete unreliable piece of _software_ that was written by a programmer (who we just established can never be an engineer since they cannot be rigorous) to rigorously analyse his work? Looks to me like you are building your bridge on rather shaky grounds there, if you'll forgive the metaphore...

      In the meantime, I found myself wondering how maintenance works for real structures. Apparently you _can_ rule out the human factor there completely, making "real" engineering thereby far more rigorous? Don't forget that "maintenance" means something very different for software than it does for real structures: you don't have to paint your software once every two years... What we call maintenance really is "changing the structure that is already there to become something else". I'd like to see someone add a lane or two to an existing bridge without involving humans at some point as a fundamental factor.

  2. Software Engineering is trying by mad+zambian · · Score: 5, Insightful

    .. to become a rigorous engineering discipline. It's not quite there yet. I am not convinced that it ever will be. Writing software is a creative process, arguably even an artistic one. Well understood rules can be followed, provably correct algorithms applied, formal design methods used, but it is still a human creative process, and as such, I suspect inherently non-rigorous.
    Computer Science compared to Software Engineering?
    Think aeronautics. The science of aeronautics ponders the laws of aerodynamics and the laws of flight.
    Engineering aeronautics is all about building the damn aircraft.

    --
    Trying to associate Microsoft with "fun" is like trying to associate Satan with aromatherapy. -Tycho
    1. Re:Software Engineering is trying by jbacon · · Score: 4, Insightful

      .. to become a rigorous engineering discipline. It's not quite there yet. I am not convinced that it ever will be. Writing software is a creative process, arguably even an artistic one. Well understood rules can be followed, provably correct algorithms applied, formal design methods used, but it is still a human creative process, and as such, I suspect inherently non-rigorous.
      Computer Science compared to Software Engineering?
      Think aeronautics. The science of aeronautics ponders the laws of aerodynamics and the laws of flight.
      Engineering aeronautics is all about building the damn aircraft.

      As a senior in a software engineering major, I tend to agree. While there are any number of methods, design tools/patterns, and whatnot to help me do my job, in the end it is my own ideas and styles that define the product. There's certainly an element of artistry to it - a small block of recursion that accomplishes something horribly complex is just... beautiful.

      Another thing that contributes to its non-rigor is the domain knowledge requirement. I can't effectively build a system unless I understand (at least at a high level) how it works. Each industry has its own specialties and levels of difficulty, and you can't teach all of that in school, so they teach us how to think and learn instead. They give us ways of understanding the problems we need to solve, and that's really what we do - solve problems.

  3. Before we get all sweaty about terms by symbolset · · Score: 5, Funny

    If you're an X Certified Y Engineer, you're a technician.

    If you can be counted on to design a system that reliably works without killing people, you're an engineer.

    If you can observe phenomena, reliably document previously unobserved phenomena, and from that produce useful but not mathematically precise practices or products you're a scientist.

    If you can gather observed facts into a sheaf of postulates and a system of symbols that can predict unobserved phenomena, you're a mathematician.

    If you can't do any of the above, you can always check bags at LAX for $150K a year.

    If you can't get bags from the trunk to the belt, you might consider a position in middle management.

    --
    Help stamp out iliturcy.
  4. Formal definition of a software engineer by OutputLogic · · Score: 4, Informative

    Here is a formal definition of a Computer Software Engineer occupation, according to the US Department Of Labor:
    "Research, design, develop, and test operating systems-level software, compilers, and network distribution software for medical, industrial, military, communications, aerospace, business, scientific, and general computing applications. Set operational specifications and formulate and analyze software requirements. Apply principles and techniques of computer science, engineering, and mathematical analysis."

    OutputLogic

  5. Software Development is actually an art by bill_kress · · Score: 5, Insightful

    So, I'm sure, are a lot of things I don't recognize, like designing a sky-scraper or space shuttle.

    Programming is an art, Anyone can follow instructions and follow an existing style or try to paint a realistic scene, but to come up with a skilled interpretation that really conveys a meaning takes a better painter. To bring together 20 painters, outline a collaboration and manage the production of some giant, detailed interpretation takes a master--at this point natural talent starts to mean more than training, and no level of training can improve someone without talent.

    Anyone can write a small program. You can fit 20 generic programmers in a room and have them each write a small program. You might even be able to get them to join the programs somewhat-properly, but the whole thing will never go smoothly.

    One or two really good programmers will probably out-produce 20 people that "know how to program".

    How many amateur painters do you need to create something like the sistine chapel?

    Just because most people can't see the art that allows large programs to work doesn't mean it's not there. In fact, most people can't tell any type of good art from bad without some training.

  6. Re:Experience by symbolset · · Score: 4, Insightful

    Don't we all need more experience?

    The basics are pretty simple. And by the basics, I mean where Niklaus Wirth got his ideas for the mathematical basis for algorithms, Alan Turing.

    Then we learn about functional programming from the guys who invented it: Kernighan and Ritchie. Grok lex and yacc and we're halfway there. After we've written three or four languages we realize their purpose is to formalize our interaction with libraries of prewritten code. Along the way we learn about the importance of portable compilers and the interdependence of portable compilers and portable operating systems and libraries of prewritten code, and the importance of all of those to the persistence of data.

    Then we study the evolution of C++ and figure out by ourselves why its inventor Bjarne Stroustroup is a brilliant idiot. (Hint: it has to do with interface hiding).

    We join the ACM and read and understand their Communications up until 1990 (anything after that is encumbered by patents). This takes a very long time.

    And then we invent some stuff and every fool that just got his AOL account feels qualified to call us an idiot because we didn't do things the way he expected.

    How about a rigorous, ever changing, ever intriguing discipline? It already is and will be more so.

    It is. You were right.

    --
    Help stamp out iliturcy.
  7. Re:Perspective? by ThePhilips · · Score: 5, Insightful

    Computer Science compared to Software Engineering?
    Think aeronautics. The science of aeronautics ponders the laws of aerodynamics and the laws of flight.
    Engineering aeronautics is all about building the damn aircraft.

    That's pretty much how I think myself.

    Engineering would stop being engineering if it becomes a science.

    Engineering is in deep real world, with human nature and business requirements intervening all the time. Science (like religion) is in some sort of ideal world, vacuum, where all is simple and described by a formula. They are both trying to understand a problem - but from different angles. So different - or better say orthogonal - that they are guaranteed to cross only rarely.

    Writing software is a creative process, arguably even an artistic one.

    Same with science. I'd say that in the respect there is not much difference.

    The difference is as I try to put it above is that in engineering "it must work," while in science it doesn't even have to compile. It only has to work in some ideal world with unlimited resources and non-existent foreign factors.

    --
    All hope abandon ye who enter here.
  8. Re:Experience by beelsebob · · Score: 5, Informative

    If you think K&R invented functional programming, you're sorely mistaken, Go look up people like Peter Landin and Haskell Curry. Secondly, if you think that the C language book has anything to do with Functional programming, you *badly* need to get an education with regard to what FP is.

  9. Professional Engineer by nonregistered · · Score: 4, Insightful

    As a degreed engineer with 30 years of work in computer hardware and software, I firmly believe there will be no such thing as a "Software Engineer" until such engineer has a "PE" after his/her name. That's "Professional Engineer" (wiki it); a responsible party who can be put in jail if the software kills someone. There's nothing like the threat of punishment to put rigor in your processes.

  10. Re:Perspective? by jc42 · · Score: 5, Interesting

    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.
  11. Re:Experience by scamper_22 · · Score: 4, Insightful

    I think the real issue is there is no 'routine' aspect to software.

    Most other domains of Engineering have a very defined field and set rules. There are also very standard way of doing things. Simulators have been built...
    I would argue that anytime some *new* device in another field of engineering is done, it suffers from the same 'flaws' as software. I can't speak for too many other fields, but I can speak for electrical engineering. Any new kind of hardware follows the same kind of iterative, simulate, debug... aspect as software. Fortunately, for hardware it needs to accomplish its set goal and people recognize the costs involved... and it somehow managed to escape the anyone can code mentality.

    Now software, we must understand is be definition new. ANY repetitive work is done by the tools (compiler, linker...). In Civil Engineering, you still need the civil engineer to oversee the building of the structure. To make sure the workers do things correctly... this is all very routine work. Often there are standard blue prints already done and the civil engineer just makes some small tweaks and then has to oversee the project. Just follow the damn process. In software, we are so fortunate, that our builders (compiler, linker...) work amazingly well. They never make a mistake and can repeat their work as often as possible.

    Once built, software can be deployed a million times over without fail. Not so for civil engineers who must pursue the same rigor each time a building is built.
    Heck in software, we like to make one deployment so flexible by these amazing things called 'options'. everything is a bloody option and configurable. Again, unlike many other forms of engineering where the regularity and standard process dictates how things are done.

    We must understand this key difference. Because of the nature of software, *some* people have made the mistake of trying to superimpose other disciplines onto software.
    There are those who would say that software is design and implementation.

    First you design it, like the civil engineer designs the building.
    Then you implement it, like the workers build the building.

    I cringe whenever I hear a similar analogy. Yes, there is some 'abstract' notion of design away from a specific language, but expressing that design in a particular language is still design.
    The civil engineer who uses autocad or whatever to design their building is expressing his design in that format.
    The software engineer is just expressing his design in C++/Java...
    THERE IS NO IMPLEMENTATION WORK IN SOFTWARE.
    Everything is design. Just high level design and low level design.

    Sadly, some people continue to try and draw parallels with factory or civil engineering work. They claim there is some design that can be done, and then a bunch of code monkeys (construction workers) assemble and build the software. It's so wrong on so many levels, I'll repeat it again. The compiler and linker assemble and build the software. Every code monkey is doing design.

    For sure, I think we will get *some* formalization of the process as certain practices become more standard. Our tools will most certainly become better and better (issue trackers, source control...). Yet at the end, the code still needs to be designed. There is no escaping the need for good software engineers.

    Just like there is no escaping the need for good civil engineers if you every try and do something out of the ordinary.

    I could write more about formal testing and the like, but I'll leave this point as is.