At the GOTO Amsterdam 2015 conference Mary Shaw talked about progress towards an engineering discipline of software. She explored what it means to have an engineering discipline, how far we have progressed toward having one for software, and what can be the next steps.
According to Shaw the characteristics of engineering are:
- limited time, knowledge, and resources force decisions on tradeoffs
- best-codified knowledge, preferentially science, shapes design decisions
- reference materials make knowledge and experience available
- analysis of design predicts properties of implementation
Engineering evolves from craft and commercial practice through interaction between commercial practice and science, especially through codification of practice. Commercial practice in turn depends on production and management techniques. Exploiting technology therefore requires both management techniques and a body of systematic codified knowledge.
When engineers make design decisions they want to be able to predict what the properties of the product will be. Engineering implies that you will take confident decisions of what your systems will do.
Engineers don’t rely fully on science. If established science is not available they will look for experience or other things that will help them to decide.
Shaw uses civil engineering as a model to understand software engineering. When the Romans were building bridges, learnings from the repairs were incorporated into the design of next objects. They made empirical progress via failure and repair said Shaw. Their process was not science based but experience based, decisions were made based on what they knew worked. It took until 18th century to develop general theory based upon formal analysis that supports building bridges. Nowadays the use of software for automated design is required.
Shaw defines engineering as "creating cost-effective solutions to practical problems by applying codified knowledge, building things in the service of mankind". She presented a definition of software engineering that refined the general definition of engineering:
The branch of computer science that creates cost-effective solutions to practical computing problems by applying codified knowledge [for] developing software systems in the service of mankind.
According to Shaw software is design intensive, manufacturing costs are low. Software is symbolic, abstract, and constrained more by intellectual complexity than by fundamental physical laws. Software is not that much limited by what computers can do, there’s a mental limit on what can be made by humans.
The term software engineering was first used in 1968 NATO conference. It was intended to be provocative to make people aware of the problems that were being faced in software development.
There has been a lot of effort over the years in software development methods. This established the production methods that support commercial practice. However, it did not establish the codified basis for technology that is required for engineering practice, said Shaw.
Science is driven by commerce, scientist are responding to solve commercial problems. For instance, to be able to develop large systems architectural patterns were invented and model checking has been developed to design systems with large state spaces.
Software architecture is the principled understanding of the large-scale structure of software systems as collections of interacting elements. It emerged in the 1990s from informal roots, initially by codifying the common informal vocabulary for software system structures, based on types of components and connectors. It now provides guidance for the explicit design choices that bridge from requirements to code.
Shaw questioned if software development has become engineering, by checking the characteristics:
According to her we are not there yet. She showed headlines from recent major incidents with software on health care, safety and welfare.
The greatest need for an engineering disciple exists for software systems that are fully automated and are operating unattended and where the consequences of failure are catastrophic. Examples are nuclear safety devices, medical implants, self driving cars and stock trading programs. The need for engineering in software depend upon how serious the consequences are when things go wrong and whether human beings can take action in time to minimize the consequences says Shaw.
Things also tend to move. When automation increases the opportunity for oversight goes down, which increases the need for software engineering in developing systems. Software engineering will have to keep up to satisfy the increasing needs.
There are lots of casual developers said Shaw. She quoted the stackoverflow 2015 developer survey which states that "48% of respondents never received a degree in computer science". There are even more people who are not principally software developers but who develop computing applications such as web pages, spreadsheets, and small databases. The computing industry has not done a very good job of supporting these people for whom software development is a secondary activity.
"The greatest need for engineering is in the most critical applications" said Shaw. We are in some respects an engineering discipline, but we cannot yet consistently achieve a level of practice that assures computing systems of a quality that satisfies the social contract associated with engineering. We need to continue to infuse scientific and codified knowledge into design and analysis of software.