I. Introduction
In today’s society, software plays an indispensable role. With the persistent growth in both size and complexity of software, it is unavoidable that certain bugs or issues may persist even after the product is delivered to users. In the process of analysis and design, developers plan a new system by defining the architecture of the system and its components or modules to satisfy specific requirements. However, as the software development cycle continues to evolve, the systems grow huge and complex. Furthermore, rapid change to the hardware platform and software technologies are also becoming challenging for software maintenance [1] [2]. The software quality eventually declines after the maintenance activities [3]–[7]