idea
Software engineering is the practice of designing software corresponding to a customer's need, with economical and longevity in mind. The trick here, is that programming, testing and debugging the code are actually design activities[1].
There has been a long winded debate as per whether software engineering actually is an engineering practice. The main aspect to that has been with trying to caricature other fields' practices (e.g. waterfall and upfront design) to make software engineering more like engineering.
The problem with that approach is that it doesn't map properly the process to the physical-world bound engineering practices. In construction engineering, engineers create designs, which are then built by labourers using material and parts. In software engineering, these workers are replaced by compilers and suites of automated builds and tests that transform the detailed specification (code) into what customers effectively pay for (binaries)
In other fields such as civil engineering, cost of manufacturing and materials is very high in proportion to the total cost of projects. A lot of how engineering is structured for other fields is to delay the construction phase as much as possible until everything (design, plans and models) has been proven.
In software the construction phase is practically free. This reverses the economics of software engineering compared to other practices: the right way to minimize cost is to iterate as much as we can, to validate the design.
This is why software engineering needs methods tailored to its specificities and its economic equation, such as agile[2].
links
agile is defining principles and values linked to the specificity of software, and in particular to the iterative and flexible nature of the engineering practice compared to civil engineering.
references
[1]: Jack W. Reeves / What is software design (and ref) is making the point that software is what runs on computers, not code. That code is a detailed specification, and that programming is a design activity, which means that the best way of validating the design is to build and test it ; which makes debugging and testing also design activities (validation of the design).
Programming is a design activity—a good software design process recognizes this and does not hesitate to code when coding makes sense
~ Jack W. Reeves, What Is Software Design?
Since software is so cheap to build, formal engineering validation methods are not of much use in real world software development. It is easier and cheaper to just build the design and test it than to try to prove it.
~ Jack W. Reeves, What Is Software Design?
Testing and debugging are design activities—they are the software equivalent of the design validation and refinement processes of other engineering disciplines.
~ Jack W. Reeves, What Is Software Design?
YouTube / Software Art Thou: Glenn Vanderburg - Real Software Engineering - A talk on software engineering and why it is a special engineering practice.
Proposed definition of software engineering:
Software engineering is the science and art of designing and making, with economy and elegance, systems so that they can readily adapt to the situations to which they may be subjected
~ Glenn Vanderburg
Wikiversity / Structural engineering
Structural engineering is the science and art of designing and making, with economy and elegance, buildings, bridges, frameworks and other similar structures so that they can safely resist the forces to which they may be subjected.
~ The Institution of Structural Engineers
[2]: Robert C Martin in Clean Agile:
I am always frustrated when people ask me how to apply Agile to hardware, construction, or some other task. My answer has always been that I don’t know, because Agile is about software
~ Clean Agile: Back to Basics, Robert C. Martin