- A History of Increasing Complexity
- Mechatronic System Organization
- Amplifiers and Isolation
- Scope: The Unit Machine
- Real-Time Software
- Nasty Software Properties
- Engineering Design and Computational Performance
- Control System Organization
- Software Portability
- Operator Interface
- Multicomputer Systems: Communication
- The Design and Implementation Process
1.7 Nasty Software Properties
Software complexity tends to increase exponentially with size. What starts out as a small, manageable project can expand into something which literally never gets finished. To compound this problem, the economics of software-based products are such that over the lifetime of the product, maintenance costs dominate the total expense.
The complexity leads to a severe lack of predictability in software projects: "A 1997 survey indicated that 80% of all embedded software projects fail to come in on time". "No surprises" is the hallmark of effective engineering. While it is all too easy to treat programming as an unstructured activity, engineering reality demands a higher standard so that, to the extent possible, software time, cost, and size are reasonably predictable.
Both the complexity and the asynchronous nature of real-time software lead to situations in which bugs can remain dormant for long time periods, waiting to do their dirty work at the most inopportune time.
The antidotes to these problems flow from adopting an engineering perspective such that code writing (programming) should not be viewed as a creative activity!
On the engineering side, a method must be found to describe in detail how the control software should behave (a specification). This enables the needed engineering review function and enables the act of code production to become much more routine since the creative engineering part has been done at the descriptive level.
The second way of avoiding at least some of the complexity problems is to modularize the software and its production process. In this way, specific pieces of software are directly connected to certain machine functionality. System malfunctions can thus be traced to the relevant software more quickly, system changes can be made with reasonable assurances that the changes will not adversely affect some unexpected part of the machine, and individual software elements can be tested more easily. Modularization is also important in achieving reasonable delivery times for large projects. The modules can be worked on simultaneously by different people (perhaps in different parts of the world) and integrated into the final control system as they are produced.