8 ms·
What is software engineering anyway? I've heard this term for almost 40 years, and still wonder what it really means since everyone has a different idea.
by coldcode 7y ago
What is software engineering anyway? I've heard this term for almost 40 years, and still wonder what it really means since everyone has a different idea.
- wjmao88 7y agoIts called software engineering when it needs to operate under a set of requirements and conditions in scale and complexity comparable to other engineering projects. Everyone has a different idea because everyone has different ideas about what other engineering is about too. Its just that governments/guilds usually publish specific descriptions of what it is and as outsiders we take that as the truth.
- seanmcdirmid 7y agoSoftware engineering a practical art related to the large scale production of software (vs programming as a smaller scale production of programs). Given its practical nature and young age, it isn’t surprising that we don’t really know what it is yet (like how carpentry was practiced a few thousand years ago).
- hashberry 7y agoYou're not alone. Wikipedia has an interesting "Controversy" section about software engineering[0], with a quote from Edsger Dijkstra: ... software engineering should be known as "The Doomed Discipline", doomed because it cannot even approach its goal since its goal is self-contradictory. Software engineering, of course, presents itself as another worthy cause, but that is eyewash: if you carefully read its literature and analyse what its devotees actually do, you will discover that software engineering has accepted as its charter "How to program if you cannot." [0] https://en.wikipedia.org/wiki/Software_engineering#Controversy https://en.wikipedia.org/wiki/Software_engineering#Controver...
- ScottBurson 7y agoAh yes, I love this line: "How to program if you cannot." The fact is, nobody can program, not when programming means building complex systems (pretty much anything bigger than 30kLoC) absolutely correctly. Not I, not you, not the late Prof. Dr. Dijkstra — nobody. We can't. But we need to build these systems nonetheless. So, "how to program if you cannot" becomes an essential area of study.
- skybrian 7y agoDijkstra is a good source of controversial quotes, but they tend to be hyperbolic and I wouldn't take them as the last word on anything.
- hermitdev 7y agoMy favorite is "goto Considered Harmful". Yes, it can be abused, but can so nearly every other programming construct. There are places where goto makes sense, such as error handling or breaking out of nested loops. I hate seeing a Boolean flag(s) being tracked for whether or not break out of nested loops. It's more typing and confuses the intent. Just goto the label following the nested loop. Also, nearly any looping construct can be implented using a conditional goto, and if you go down to assembly, they almost universally are. Jumps are goto's by another name. I've seen exceptions used for control flow. Awful. It's about knowing the appropriate construct for the problem at hand. I've seen do{...}while(false) used with conditional breaks to avoid use of goto in error handling and it's confusing as you're reading through an unfamiliar codebase to see abuse like that. As I'm reading through the code, I see the 'do' and I expect the code to loop, only to continue reading and find out it doesn't loop. Frustrating.
- goto11 7y agoDijkstra was arguing in favor of structured programming languages powerful enough that you didn't need GOTO. For example you mostly see GOTO for error handling in C, because C lacks a structured way for resource cleanup. Dijkstra certainly wasn't arguing you should use trick like do{...}while(false) to avoid using the GOTO keyword.
- carapace 7y agoDr. Margaret Hamilton coined the term while developing the software for Apollo 11. She went on to design a system that permitted bug-free software development ("Higher Order Software" or HOS) and attempted to market it. It was panned by e.g. the Navy and Dijkstra, and languishes in obscurity to this day. The basic details of the system are described in a book called "System design from provably correct constructs: the beginnings of true software engineering" by James Martin (he mentions Hamilton in the references.) In modern terms you work directly with an AST and the UI only permits modifications by operations that preserve the correctness of the AST. It eliminates all sources of bugs, and it was simple enough to teach normal people to use it with just some coaching. Anyhow, that's "software engineering". The rest of us are just pushing text around in buffers and hoping it isn't broken. There are a few people using math to make software, and it works out really well (E.g. https://www.categoricaldata.net/ https://www.categoricaldata.net/), but mostly "software engineering" as it is usually used is an oxymoron.
- skybrian 7y agoThe claim that a "correct AST" would eliminate all sources of bugs is unreasonably bold, and I wonder if they really made that claim, or you misunderstood something? That just means the code compiles. Some languages are stricter than others, but none claim to eliminate all bugs. Static analysis and safe refactoring tools are great, but they are certainly not going to protect you from implementing the wrong thing because you misunderstood the requirements or the environment; that's not possible even in principle. At best you can check for consistency (for example, consistency between a specification and its implementation).
- Jwarder 7y ago> you work directly with an AST and the UI only permits modifications by operations that preserve the correctness of the AST. It eliminates all sources of bugs With the caveat up front that I know nothing about this beyond what you have written: wouldn't this just catch compilation bugs? The compiler tells me if the blob of text I gave it is incorrect in terms of any syntax errors. Business logic bugs and accounting for bogus data seem more important to me.
- ScottBurson 7y agoMy definition is that software engineering is about the management of complexity. Complexity in software proliferates faster than in any other discipline precisely because it is so easy to create and change. The difficulty is not in writing or editing a line of code, but in understanding how that line of code interacts with all the other code in the program. The essence of software engineering is building large systems in such a way that they are as easy to understand as possible.
- paulddraper 7y agoIt's the software equivalent to electrical engineering, civil engineering, etc. Designing/creating software.
- bigger_cheese 7y agoWhen I was studying engineering in the early 2000's my degree was structured such that in the first year all the engineering students (regardless of whether they intended on majoring in Chemical, Civil, Mechanical, Electrical etc) all took a common set of courses. This included classes such as: Calculus, Linear Algebra, Physics, Chemistry etc. There were two required CS courses (one in the first semester of first year and one in the second) The first semester course was "Intro to programming and algorithms" which began by assuming no one had any prior programming experience and started with the very basics "This is a variable", "This is a function" "This is a conditional statement", "This is a loop" that sort of thing. Eventually it covered algorithms like quicksort, bubblesort etc and really helped get you into the mindset of "This is how you use programming to solve a problem" For example I remember writing code to solve simultaneous equations (i.e Linear Programming), finding line of best fit through a series of discrete points things like that. In the second semester the required class was "Intro to software engineering" I remember the course covering things like Object oriented programming - classes/inheritance public/private members and all that stuff, this was a component on unit testing. There was also an essay component to the course I can remember having to write an essay about the Ariane 5 explosion. I really didn't enjoy this course and the impression I got was not a lot of my friends did either. I can understand the intent of making us sit through the course but in some ways I think it did more harm then good pretty much everyone came out of that class at the end loathing "object oriented" programming. At the time it was kind of a struggle to see the relevance behind the topics covered and even now with 15 years of engineering experience working in manufacturing what we learnt in that classroom is very divorced from what goes on in the real world. When I write code I am, typically speaking, not writing complex software that has multiple reusable components that talk to each other most of the code I write is trying to solve some type of problem. When I write code I'm usually thinking in terms of mathematics and problem solving rather than classes + objects and unit tests, my code tends to be a lot more in the style that was taught in the algorithms course rather than in the software engineering course I suspect quite a lot of "research code" would be similar.
- agumonkey 7y agoI learned what an engineer was when dabbling in electromechanics. I think after the 80s, engineering lost its meaning in computers because people could abstract the machine away and hodge-podge a lot of systems. No need to carefully encode data, precompile addresses, state etc which would be similar to the dimensioning computations in physical systems. ps: to extend the story, most engineered things have very carefully defined dimensions and limits which drives most things in the design. Max Wattage in your PSU will reflect in the gauge of wires, size of capacitors etc. A bit like choosing an arch when compiling. I remember some threads in 2000s boards where some guys did talk about jobs like these in computing. They had said space and said cycles to work with, with that they could see what algorithm could compute the needs back against the limits. I found it especially interesting brain wise because you could "think" in hard figures, instead of glueing things without any idea what was really going on.
- skybrian 7y agoThis went out the window in favor of portable software, multitasking, and reusable components. As soon as you have software that can run on a variety of machines (including new hardware that hasn't been invented yet), there is no way to give a performance guarantee. (An exception might be something like a game console where hardware is fixed.) Even if hardware is fixed, if you don't control the other programs running on the machine, you don't know how many cycles you'll get. And whenever you allow a newer, "compatible" version of a library or OS component to be swapped in, all bets are off. No mainstream languages take performance into account when deciding whether a newer version of a library is "compatible". So, any security update could invalidate your measurements. (And in a way, the same is true of hardware since you don't control the environment it runs in or what might be plugged into it.) We can ignore all this stuff and it mostly works. We wouldn't have an Internet without it. (Imagine if web browsers had to give performance guarantees.) Instead we'd have some kind of fixed-hardware monoculture.
- madhadron 7y agoMy definition is a bit different from what I generally hear, and is based on discussions with my father, who is a structural engineer. Engineering is about making a process legally defensible. A structural engineer can stand up in court and say, "As designed, this should have stood up to all expected loads in this location," and have it be taken as expert opinion. In the US, where engineer isn't as controlled a term as elsewhere, we use the term engineer for all kinds of roles. In, say, Canada, engineer means a professional engineer in one of the legally protected categories. You can't use engineer as a job title outside of those. So if you're trying to talk about software engineering, imagine something horrible has happened with a system you were involved in designing (say, Therac-25). What what you need to know and do to be able to say that this failure should legally qualify as an "act of god"?
- keithnz 7y agoIt gets used broadly for any kind of software creation, but I think of it as software that is created in an engineering context ( like software for machines ) where you apply engineering concepts via software. So software engineers would be able to, in software, apply principles of things like control theory to a problem.
- ilaksh 7y agoSoftware engineering is what programmers do. The idea that programming is a different or less-skilled occupation is false. The engineering part is any skill and knowledge you use that goes beyond the basic language syntax. Things that everyone who programs for a living has to have, such as the ability to determine requirements and organize code in a maintainable way. The controversy is due to human biases and stupidities.
- theshrike79 7y agoSoftware engineering is what happens to programming when you add time and other programmers. –Russ Cox, GopherCon Singapore 2018