#software #engineering


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


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.