Software Maintenance
Software maintenance is a very important phase in the lifespan of a software system. As a result of maintenance, the software system fully or partially deviates from its original state and evolved into a new system (Lei, Ganjeizadeh, Jayachandran, & Ozcan, 2017). According to IEEE, software maintenance can be defined as the modification of a software system or its components, after its delivery to correct its faults, adapting to a changing environment or improving its performance (Larman & Basili, 2003). The software maintenance process plays a vital role in an organization because it consumes a considerable amount of overall lifecycle costs. Failure to change the software quickly and reliably according to the organization’s requirements leads to loss of business opportunities (Ågerfalk, Fitzgerald, & In, 2006).
Mostly software maintenance is carried out by a heavyweight method or even without any particular method. Several maintenance models, such as Boehm, quick-fix, Osborne, full reuse, iterative-enhancement and the ISO/IEC 14764 and IEEE-1219 IEEE standards for maintenance have been proposed. Those existing models generate challenges because they are largely based on the Waterfall model. It is difficult to handle problems properly due to their limitations such as team morale, lack of communication among stakeholders, unstructured code, and frequent prioritization of customer requests and poor visibility of the project flow. Agile methodologies were able to handle limitations by providing continuous testing, customer collaboration, incremental development and refactoring (Dyba, 2000).
Agile Methods
Anterior software development methods have been used to capture approaches to define and gather project requirements, investigate problems, and systematically implement problem solutions (Lei et al., 2017). Although most companies consider iterative and incremental methods as modern developmental practices, their application dates back to the mid-1950s (Larman & Basili, 2003), when other methods were sequential and linear and called “waterfall models” (Lei et al, 2017). In 2001, problems in the waterfall model were identified and the agile methodology introduced (Lei et al., 2017). Agile development methods are a set of software development practices defined by experienced practitioners (Ågerfalk et al., 2006). These agile development practices responded to traditional or plan-driven approaches that focus on “an engineering-based, rationalized approach” (Dyba, 2000; Nerur, Mahapatra & Mangalaraj, 2005).
Agile methods have some common features: iterative development process, adaptation to change, less documentation, customer interaction, focus on delivery, frequent testing, communication and collaboration among team members, motivation enhancement, high quality codes, knowledge transfer through openness and high quality products with customer (Ahmad, Kuvaja, Oivo, & Markkula, 2016; Devulapally, 2015; Rehman, Maqbool, Riaz, Qamar, & Abbas, 2018). Agile software engineering practices include simple design, small releases, pair programming, test-driven development, daily stand-up meetings, task boards, product backlog, user stories, and on-site customers. Agile practitioners have recognized benefits that include cost reduction, quality improvement, flexibility of development teams, increased productivity, and customer satisfaction and reduced time to market. These benefits are achieved in the software development phase and it needs to be examined whether these benefits are taken into account in the software maintenance phase (Devulapally, 2015; Heeager & Rose, 2015).