Mining and untangling change genealogies

Developers change source code to add new functionality, fix bugs, or refactor their code. Many of these changes have immediate impact on quality or stability. However, some impact of changes may become evident only in the long term. This thesis makes use of change genealogy dependency graphs modeling dependencies between code changes capturing how earlier changes enable and cause later ones. Using change genealogies, it is possible to: (a) applyformalmethodslikemodelcheckingonversionarchivestorevealtemporal process patterns. Such patterns encode key features of the software process and can be validated automatically: In an evaluation of four open source histories, our prototype would recommend pending activities with a precision of 60—72%. (b) classify the purpose of code changes. Analyzing the change dependencies on change genealogies shows that change genealogy network metrics can be used to automatically separate bug fixing from feature implementing code changes. (c) build competitive defect prediction models. Defect prediction models based on change genealogy network metrics show competitive prediction accuracy when compared to state-of-the-art defect prediction models. As many other approaches mining version archives, change genealogies and their applications rely on two basic assumptions: code changes are considered to be atomic and bug reports are considered to refer to corrective maintenance tasks. In a manual examination of more than 7,000 issue reports and code changes from bug databases and version control systems of open- source projects, we found 34% of all issue reports to be misclassified and that up to 15% of all applied issue fixes consist of multiple combined code changes serving multiple developer maintenance tasks. This introduces bias in bug prediction models confusing bugs and features. To partially solve these issues we present an approach to untangle such combined changes with a mean success rate of 58—90% after the fact. Softwareentwickler andern Source-Code um neue Funktionalitat hinzuzufugen, Bugs zu beheben oder um ihren Code zu restrukturieren. Viele dieser Anderungen haben einen direkten Einfluss auf Qualitat und Stabilitat des Softwareprodukts. Jedoch kommen einige dieser Einflusse erst zu einem spateren Zeitpunkt zur Geltung. Diese Arbeit verwendet Genealogien zwischen Code-Anderungen um zu erfassen, wie fruhere Anderungen spatere Anderungen erfordern oder ermoglichen. Die Verwendung von Anderungs-Genealogien ermoglicht: (a) die Anwendung formaler Methoden wie Model-Checking auf Versionsarchive um temporare Prozessmuster zu erkennen. Solche Prozessmuster verdeutlichen Hauptmerkmale eines Softwareentwicklungsprozesses: In einer Evaluation auf vier Open-Source Projekten war unser Prototyp im Stande noch ausstehende Anderungen mit einer Prazision von 60–72% vorherzusagen. (b) die Absicht einer Code-Anderung zu bestimmen. Analysen von Anderungsabhangigkeiten zeigen, dass Netzwerkmetriken auf Anderungsgenealogien geeignet sind um fehlerbehebende Anderungen von Anderungen die eine Funktionalitat hinzufugen zu trennen. (c) konkurrenzfahige Fehlervorhersagen zu erstellen. Fehlervorhersagen basierend auf Genealogie-Metriken konnen sich mit anerkannten Fehlervorhersagemodellen messen. Anderungs-Genealogien und deren Anwendungen basieren, wie andere Data-Mining Ansatze auch, auf zwei fundamentalen Annahmen: Code-Anderungen beabsichtigen die Losung nur eines Problems und Bug-Reports weisen auf Fehler korrigierende Tatigkeiten hin. Eine manuelle Inspektion von mehr als 7.000 Issue-Reports und Code-Anderungen hat ergeben, dass 34% aller Issue-Reports falsch klassifiziert sind und dass bis zu 15% aller fehlerbehebender Anderungen mehr als nur einem Entwicklungs-Task dienen. Dies wirkt sich negativ auf Vorhersagemodelle aus, die nicht mehr klar zwischen Bug-Fixes und anderen Anderungen unterscheiden konnen. Als Losungsansatz stellen wir einen Algorithmus vor, der solche nicht eindeutigen Anderungen mit einer Erfolgsrate von 58–90% entwirrt.