Continuous Change - 3 Oct 2002
Often heard in software engineering are the words continuous process improvement. Continuous process improvement is a good thing, however the perspective of which processes need improvement are frequently lost in the throes of accomplishment. As software engineering is about automating processes, continuous process improvement in software engineering is about automating the process of automating processes, so you had better be sure the process is worth automating and that the automation of the process is desirable or you will have accomplished nothing useful. Too frequently the process is performed only once or rarely, or should be redesigned rather than automated, and if automated is only useful until the next change is desired.
Software engineering consists largely of design, development, and maintenance. As design is novel and original, it is not amenable to automation directly, although tools can be created to assist with it. Development is also new but reuse can significantly reduce the amount of effort involved; then much of development can be the adaptation and generalization of existing code and components. Still there is little here that can be automated other than storage, retrieval, collaboration, build, release, and delivery processes and to a lesser extent testing. Finally, although maintenance deals with existing artifacts, each problem to be located and fixed, and each feature to be added or modified represents a new change. If an adaptable and flexible design and correct development procedures were used, then configuration can be simple and maintenance can be minimal. There is however little that can be automated in maintenance other bug and change tracking and updates.
The best that can be accomplished is an adaptable design consisting of reliable tested components that can be composed, configured, and scripted in flexible arrangements. The strength of object oriented design for this is in abstraction, not in specification. The process that needs improvement most is the process of adapting to changes in processes, not the processes themselves. Unless this is realized, most process improvement in software engineering is for nought.