Software engineering has two distinct facets.
The first facet is engineering OF software. Here the system is the computer; the product is the symbolic computation and its results.
The second facet is engineering BY software. Here the system is the physical world and the computer together; the product is the physical behaviour in the physical world evoked by their interaction.
The facets differ in two major ways. In engineering OF software the only physical part of the whole system is the computing equipment itself. This equipment has been developed over many decades to provide reliable physical implementation of formal operations on mathematical and other abstract objects. As Fetzer observed , correctness of an abstract algorithm cannot guarantee its correct execution on a physical computer; but, pace Fetzer, computers are reliable enough for many purposes, and in practice his observation can often be ignored. Further, on a reliable computer, operating systems and compilers can provide a homogeneous programming environment in which complex problems can be solved by expressing useful abstractions in a single programming language.
In contrast, engineering BY software confronts the engineer with the essentially non-formal nature of the world at the scales relevant to a cyber-physical system. In this world no mathematical or formal model of the world can be perfectly faithful, and every assertion about the properties and happenings in the world is inescapably contingent on a bottomless recursion of side conditions. Structures of abstractions cannot work perfectly: abstractions are always vulnerable to contradiction at a concrete level. For a critical system, much engineering effort must be expended in several directions to overcome or mitigate these problems. Further, the physical world for most systems is heterogeneous: its relevant properties are resistant to capture in any one language—and certainly in any programming language.
This blog is about both facets of software engineering. It's about cyber-physical systems, in which the software governs behaviour in the given physical world: that's definitely engineering BY software. (The word given is important here: the role of software engineering per se is not to modify the governed world's domains, but only their collective behaviour.) It's about engineering OF software, too: for systems of realistic size, transforming and restructuring the software for deployment and efficient execution is a vital engineering task.
 James H Fetzer; Program Verification: The Very Idea; CACM Volume 31 Number 9, pages 1048-1063, September 1988.