1 Quality, Productivity and Learning in Framework-Based Development: an Exploratory Case Study. Maurizio Morisio Politecnico di Torino, Italy morisio@polito.it Daniele Romano Università di Cagliari, Italy romano@dimeca.unica.it Ioannis Stamelos Aristotle University of Thessaloniki, Greece stamelos@csd.auth.gr Abstract This paper presents an empirical study in an industrial context on the production of software using a framework. Frameworks are semi-complete applications, usually implemented as a hierarchy of classes. The framework is developed first; then several applications are derived from it. Frameworks are a reuse technique that supports the engineering of product lines. In the study we compare quality (in the sense of rework effort) and productivity in traditional and framework-based software production. We observe that the latter is characterized by better productivity and quality, as well as a massive increase in productivity over time, that we attribute to the effect of learning the framework. Although we cannot extrapolate the results outside the local environment, enough evidence has been accumulated to stimulate future research work. Keywords: application framework, framework, product line, process quality, software reuse, empirical study, learning. 1 Introduction Project managers and software engineers have often experienced a sense of frustration when a function, module or application must be developed that is similar to previously-developed ones. In fact, the concept of software reuse is nearly as old as software itself. Earlier reuse models promoted the development of small-grained reusable components (for instance, procedures or classes) and their insertion in a reuse library. This model proved effective but limited because applications were able to reuse small-grained components only -- reuse occurs at the code level. Application frameworks are a more promising reuse model, which aims to reuse larger-grain components and high- level designs. Based on object-oriented technology, they are defined as “semi-complete applications that can be specialized to produce custom applications” (Johnson and Foote 1988). Usually a framework is made up of a hierarchy of several related classes. With the function or class library model, one or a few isolated classes (or functions) are reused. With frameworks, reuse takes a completely different form, with much higher leverage. The application is built by slightly modifying the framework, and by accepting in toto the framework’s high-level design. In other words, most of the framework is reused, and reuse takes place both at the design level and at the code level. As part of this approach, the high-level design of the framework establishes the flow of control that has to be accepted by the application. This is called “inversion of control”, since in traditional development the flow of control is defined by the application. Framework-based development has two main processes: development of the framework and development of an application adapting the framework. Developing a framework is more demanding than building an application. The designer should have a deep understanding of the domain the application is embedded into, and should anticipate the needs of future application developers. Domain analysis techniques, focused on modeling the scope of the domain, and commonalities and variabilities of applications, have been developed to guide the definition of framework requirements (Coplien et al. 1998). As a matter of fact, successful frameworks have evolved from re-engineering long-lived legacy applications, abstracting from them the knowledge of principal software designers.