Software is not produced, but developed
Software is often understood and treated like a 'regular' product. This view leaves essential differences unnoticed and crucial potential unused.
In most industries, production costs are a key factor determining prices. On the other hand, software can simply be copied, practically without costs. This has profound consequences. Without the production step, the need to specify, prototype and test the product in advance can largely be omitted. Instead, software can flexibly adjust to changing circumstances. It can assist the employees with their core work. By treating software as a product, this important advantage is often transformed into its opposite, where productive processes are adjusted to accommodate a new software.
Software is also not a regular product in the sense that it is never 'finished'. Instead, software is always just a version with unknown bugs and errors waiting to be updated.
To utilize this potential of software, development projects need to remain open for change. That means, no one can tell in detail how the 'product' will look like and what it will do. These issues must be communicated and decided along the way and may be reversed at any time. In effect, the customer is asked to spend money without knowing what to get for it. Therefore, contracts should cover only a few steps ahead to make sure that both sides can quit if the communication fails or the collaboration doesn't yield satisfactory results.
For this to work, software development projects need to be managed to limit dependence from a particular provider. If the collaboration doesn't evolve well, the project shouldn't be overly delayed or even stalled. With up-to-date documentation and comprehensible code, new people will be able to join the team and become productive quickly.
Transparent and Agile