The whole software development process is an attempt to codify knowledge. We start with some vague idea of what a system should do and, through successive processes of specification, design, implementation and testing, try to turn that knowledge into a useful working model.
Our problem is that knowledge is difficult to codify. As software developers, our skills and knowledge reside in our own domain, our own field of ba. We take a problem domain, with its own ba field, and attempt to produce a product that will exist in both domains, satisfying the requirements of the problem domain while meeting the engineering requirements of our own solution domain. (Chapter 4 will look more closely at the different domains.)
Software needs to exist simultaneously in these two environments. Commercially, it is the part seen by customers that tends to get priority. However, this often represents only the tip of the iceberg (Figure 3.1). As engineers, we see the bigger, more complex, problem beneath the waves.
Once our software is developed and given to users, an interesting thing happens: the software develops its own ba. In any community of software users, ...