Posted at 06/2020
As per Association of Computing Machinery, Software engineering is the systematic application of engineering approaches to the development of software. We can think as systems engineering followed by a process-oriented development activity making sure that what was specified and designed is what gets delivered.
Certainly, software engineering is an engineering discipline. The process of understanding specifications, determining architecture, implementation, testing has many similarities to other disciplines. While it has many differences too, for example, most work can be completed without physical fabrication.
Writing software is often called build, and so we compare it to the manufacturing or construction phases in other disciplines. But if we take a closer look, it is not construction at all, it is all design. Engineers write software designs in code, and computers do the building, whether by compiling it or directly interpreting.
In software, there is no manufacturing line. Building the final component is cheap, and replication of that final product is both perfect and free. Many designs in other disciplines either take longer than originally estimated, cost more, or simply never see completion.
Also, there are different types of software engineers just like in other disciplines. A software architect can design the overarching system, detailing what kind of communications are between entities. Once the overall system has been designed we then go down to application-level software development.
Different disciplines have different degrees of rigor in their processes. Process and standard oriented development is generally expensive, so many enterprises choose varying degrees of rigor in their development.
There is a significant effort that goes into the design of systems, trying to make every stage in its life cycle management. A well-designed system can allow a small team to perform even large overhauls in a manageable way.
Software can provide incredible value, and the best applications are constructed with high standards of quality, akin to the sort of construction one would expect from automotive or civil engineering. However, In general, the software engineering lacks many aspects of other disciplines, which gets in the way of projects.
Standardization and work item breakdown has certainly improved, but the design constructs still are not there to create out a large system. In some ways, software engineers can not even agree on what is needed for a given project, much less being able to break things down into components.
Other disciplines have very component-driven architectures with reasonably tight interfaces to allow parallel development. Software engineering still allows too much bleed through in the corresponding areas.
There are a lot of software applications out there, but many of them have suffered dramatically in some aspect or the other and would not come close to being called successful. There is a small body of successful, similar projects.
Also, there is also a lack of a large body of designers and builders who have worked on several similar and successful projects. Related to the successful project issue, not having the talent who has been there and done that, makes things very difficult from a repeatability point of view.
Software projects generally suffer from bad estimation. Since the repeatability factor is so low, it is difficult to project how large it will end up being and how long something will take to build.
Quality assurance and quality control are not emphasized as heavily as it could or should be for projects. This corroborates to having looser interfaces between components, and not having rigid specifications for how components should work. That looseness allows for unintended consequences and for mistakes to happen.
There is a lack of consistently measurable qualifications. Generally, software engineers speak of the number of years they have worked in a certain language or technology. They use time as a substitute for caliber or quality of skill.
Finally, software engineering has made significant strides. Organizations are working to standardize on baseline knowledge for software engineers. There is room for improvement, but the software engineering has come a long way in a short period.