2. Background and Motivations
2. Background and Motivations
Software production for the mass market requires the adoption of techniques and approaches to increase software development productivity. The pressure to produce software has promoted approaches derived from manufacturing, such as design patterns, component-based development, and standardization. The underlying assumption is that the software industry may improve productivity by applying similar approaches to those used in manufacturing.
Despite the adoption of design patterns, reuse, commercial off-the-shelf components, code generators, middleware, frameworks, and RAD tools and techniques, the software industry is still far from the anticipated productivity level.
Moreover, software development is recognizes now as only a small part of the software life cycle as software systems must evolve continuously through maintenance to meet ever-changing user needs, driven by market pressure, adaptation to legislation, or improvement needs.
Design patterns have been a major trend in software engineering since their introduction in the software engineering community around 1995. They have been the subjects of many research contributions on their writing (through the Pattern Languages of Programs promoted by the HillSide Group), on their instantiation, and on their identification.
After 10 years of use, design patterns have brought many advances to software engineering, in particular for maintenance, in terms of program quality, ease of understanding, evolvability, self-documentation, and reduced maintenance effort.
However, the reason why design patterns were so much acclaimed, so easily adopted, and so widely used are not yet explained clearly. Moreover, despite the design pattern wide adoption and advantages in day-to-day practice, the reasons why design patterns help in maintaining (through understanding) software systems are yet to be explained.
We believe that only a deeper and better understanding of the mechanisms at play when using design patterns for maintenance (and program understanding) can help software engineering to make substantial progress, for example, in proposing adequate maintenance process, techniques, and tools.