fortiss Center for Code Excellence CCE Blog

Center for Code Excellence

Die Perspektiven der Software Intelligence für kleine und mittlere Unternehmen

In jedem Aspekt unseres täglichen Geschäftslebens werden Daten erzeugt. Ob sie nun bewusst durch Handlungen entstehen, die wir direkt ausführen, oder implizit durch die von uns verwendeten Software-Tools erzeugt werden. Einige Aspekte dieser Daten werden bereits in Unternehmen genutzt. So wird zum Beispiel Business Intelligence (BI) in vielen Unternehmen eingesetzt, um aus tagesaktuellen Daten Metriken und Trends zu berechnen. Dadurch gewinnen die Unternehmen neue Erkenntnisse, die den Entscheidungsprozess unterstützen können. BI sammelt, analysiert und präsentiert die Daten oft in Form von Dashboards oder anderen Berichtsformen. In gleicher Weise können Daten aus dem Software-Engineering genutzt werden, um Einblicke in die Entwicklungsaktivitäten zu gewinnen und die diese zu unterstützen. Der Begriff Software Intelligence (SI) beschreibt daher eine Reihe von Methoden und Techniken, mit denen Rohdaten aus dem Softwareentwicklungszyklus gesammelt und in nützliche Erkenntnisse umgewandelt werden, die die Entscheidungsfindung, das Qualitätsmanagement und das Ressourcenmanagement in der Softwareentwicklung unterstützen.

SI umfasst nicht nur die Ableitung einfacher Metriken für die Entscheidungsfindung (z. B. Dateigrößen- oder Komplexitätsmaße), sondern auch aufwändigere Techniken, die eine vorherige Datenkonsolidierung und -aufbereitung erfordern. Angesichts der ständig wachsenden Menge historischer Daten kann das maschinelle Lernen dazu beitragen, Erkenntnisse zu gewinnen und den Lebenszyklus der Softwareentwicklung zu verbessern. Viele Forscher entwickeln neue Techniken, um maschinelles Lernen auf die Softwareentwicklung anzuwenden. ML4SE (Maschinelles Lernen für Software-Engineering) ist eines der Trendthemen in SI, um neue Wege zur Unterstützung von Entwicklern in ihrem täglichen Leben durch den Einsatz von maschinellen Lernmodellen aufzuzeigen.


Was sind typische Anwendungsfälle von SI?

Das Ziel von Software Intelligence ist es, Entwickler bei ihrer täglichen Arbeit anzuleiten und zu unterstützen. SI unterstützt u.a. die Analyse, Überwachung und Optimierung der Quellcodequalität. Oftmals werden Dashboards verwendet, um die Ergebnisse von SI-Methoden zu präsentieren. Einige Tools helfen auch dabei, SI-Techniken direkt in den Workflow zu integrieren und Informationen direkt in der entsprechenden Anwendung anzuzeigen (z.B. als Teil von kontinuierlichen Integrationsläufen) oder Nachrichten an den Posteingang oder an Kommunikationstools (z.B. Slack) zu senden, um über neue Erkenntnisse zu informieren. Im Folgenden listen wir Aktivitäten entlang des Softwareentwicklungslebenszyklus auf und beschreiben SI-Techniken, die diese unterstützen sollen. Einige dieser Techniken sind bereits gut etabliert. Andere sind noch Bestandteil aktiver Forschung und erst zu einem gewissen Grad in der Industrie adaptiert. Wir wollen einen Ausblick auf diese Techniken geben und neue Entwicklungen beschreiben:

Requirements Engineering

  • Tracing
    Das Sammeln von Softwareanforderungen ist der erste Schritt bei der Planung eines Softwaresystems. Anforderungen beschreiben die gewünschte Funktionalität (Features) und das Verhalten (Akzeptanzkriterien) des Systems. Bei guter Nachverfolgbarkeit können deren Status und Arbeitsschritte durch mehrere Systeme (VCS, ITS, Kommunikationskanäle) verfolgt werden, was das Auffinden von unerwünschtem Verhalten und technischer Schuld erleichtert. Daher ist die Nachverfolgbarkeit von Anforderungen durch alle Phasen der Softwareentwicklung eine gut etablierte Aufgabe, die die Wartungskosten senken und das Ressourcenmanagement erleichtern kann.
     
  • Modellierung und Überprüfung
    Die Modellierung geschäftlicher Anwendungsfälle kann helfen, die Auswirkungen der gewünschten Funktionalität zu verstehen und eine Anleitung für die Implementierung zu geben. Die Modellierung von Anforderungen ist jedoch eine komplexe Tätigkeit. SI kann eine Anleitung bieten und helfen, Anomalien in solchen Arbeitsabläufen zu erkennen. Dadurch unterstützt sie die Entwickler dabei, die Aufgaben zu verstehen und die Anforderungsdokumente aufzudecken, die möglicherweise weitere Aufmerksamkeit und Überarbeitung erfordern.
     
  • Priorisierung
    Die Priorisierung von Anforderungen nach deren Erhebung kann von SI anhand früherer Anforderungsbeschreibungen und bereits durchgeführter Entwicklungsaktivitäten vorgenommen werden. Durch die Bereitstellung einer Übersicht über alle Anforderungen und deren automatische Klassifizierung kann ein Teil des Aufwands eingespart werden und Metainformationen zu den Anforderungen können besser visualisiert werden.
     
  • Aufwandsabschätzung
    Die Fähigkeit, verlässliche Vorhersagen über den Entwicklungsaufwand und das Risiko einer Verzögerung zu treffen, hilft Softwareunternehmen, die Kundenzufriedenheit zu verbessern und gleichzeitig die Kosten zu senken und die Liefergeschwindigkeit zu optimieren. Heutzutage arbeiten die meisten Softwareunternehmen in Umgebungen, in denen Softwareentwicklungsteams schnell auf Änderungswünsche reagieren und kontinuierlich Geschäftswert liefern müssen. Maschinelles Lernen hat in letzter Zeit in den Bereichen Aufwandsschätzung und Risikovorhersage an Popularität gewonnen. Dabei werden Informationen aus früheren Anforderungsschätzungen genutzt, um aktuelle Aufgaben zu bewerten.

Software-Design

  • Modellierung
    Die Modellierung des Software-Designs kann helfen, Fehler im Software-Design und Modulabhängigkeiten zu verstehen. SI Methoden analysieren diese Modelle, wodurch Code-Duplikate sowie die übermäßige Verwendung von Vererbungsstrukturen oder die fehlende Verwendung von Software-Mustern aufgedeckt werden können. Diese Techniken können dabei helfen, fehleranfällige Bereiche des Codes aufzuspüren und Umstrukturierungsmaßnahmen zur Verbesserung der Software-Qualität und -Wartbarkeit anzuleiten.
  • Pattern-Vorhersage
    Angesichts einer Entwicklungsaufgabe ist es nicht trivial, das beste Design einer Softwarekomponente zu bestimmen. ML4SE schlägt vor, Entwurfsmuster aus bestehenden Codebeständen zu erkennen und zu lernen. Unter Verwendung der aktuellen Codestruktur oder der Anforderungsdokumentation haben Forscher Modelle entwickelt, die lernen, das am besten geeignete Entwurfsmuster für den Anwendungsfall vorherzusagen. Die Forschung auf diesem Gebiet ist jedoch recht neu und noch nicht in der Industrie etabliert.

Implementierung

  • Codegenerierung
    Mit Hilfe von Codegenerierungsansätzen können einzelne Anweisungen oder ganze Klassen auf der Grundlage des aktuellen Entwicklungskontexts erstellt werden. Diese Methoden zielen auf eine schnellere und effizientere Entwicklung ab. Mehrere Studien haben gezeigt, dass Autovervollständigungsfunktionen zu den wichtigsten Merkmalen von IDEs gehören. Während traditionelle Ansätze alphabetische oder nutzungsbasierte Empfehlungssysteme für die Codevervollständigung verwenden, sind neue Ansätze postuliert, die maschinelles Lernen nutzen, um neuen Code auf bereits bekannte Codestrukturen abzubilden und eine Codegenerierung auf der Grundlage von unter ähnlichen Umständen geschriebenem Code vorzuschlagen. Obwohl solche Modelle vielversprechend sind, sind die derzeitigen Ansätze oft nicht ohne Überarbeitung einsatzbereit.
     
  • Logging und Monitoring
    Die Protokollierung ist eine wichtige Aufgabe bei der Softwareentwicklung, da die Software-Logs zur Fehlersuche (z. B. Debugging oder Überwachung in Produktionsumgebungen), zur Aufdeckung von Performanceproblemen (z. B. Aufrufzählung) oder zur Ermittlung der Ursache für unerwartetes Verhalten während der Entwicklung (z. B. Protokollierung der Aufrufhierarchie) verwendet werden können. Die Protokollierung kann jedoch auch eine Herausforderung sein. In der Praxis verbringen Entwickler oft viel Zeit mit der Pflege von Protokollierungsanweisungen und deren Infrastruktur. Darüber hinaus kann die Protokollierung ohne einen gründlichen Plan entweder zu viele Informationen oder Informationen ohne Wert produzieren. SI-Techniken können Entwicklern dabei helfen, zu entscheiden, wo Protokollierungsanweisungen platziert werden sollen, welche Variablen es wert sind protokolliert zu werden, und welche Protokollierungsstufen für bestimmte Szenarien zu verwenden sind. Darüber hinaus untersuchen die Forscher Methoden zur automatischen Analyse und Zusammenfassung von Protokollmeldungen, so dass der Überwachungsaufwand auf wichtigere Probleme verwendet werden kann, anstatt die Protokolle manuell zu analysieren.
     
  • Statische Codeanalyse
    Etablierte statische Code-Analyse-Tools zeigen technische Schwachstellen oder Sicherheitslücken im Code auf der Grundlage zuvor definierter Regeln auf. Immer häufiger können diese Tools mit maschinellen Lernmodellen kombiniert werden, die solche Metriken dynamischer analysieren und dabei historische Softwaredaten verwenden, um neue Regeln zu erstellen und anzuwenden. Dies hilft bei der Verwaltung von technischen Schulden und dem Ressourcenmanagement für Softwareentwicklungs- und Wartungsaufgaben.
     
  • Defektvorhersage
    Anhand von Informationen aus der Versionskontrollhistorie weist die Fehlerprognose geänderten Dateien oder neu hinzugefügten Übertragungen ein Fehlerrisiko zu. Dies kann dazu beitragen, Fehler frühzeitig nach ihrer Entstehung zu erkennen. Auf diese Weise kann die SI dazu beitragen, die Codequalität zu verbessern und den Ressourcenbedarf für Wartungsarbeiten zu verringern. Die Fehlervorhersage lässt sich leicht in bekannte Arbeitsabläufe wie kontinuierliche Integration und Überprüfungsprozesse integrieren, um den Entwicklern direkte Unterstützung und Rückmeldung zu geben und den Aufwand auf fehleranfälligere Bereiche zu fokussieren. Allerdings gibt es nur wenige Studien, die diese Methode in Industrieprojekte anwenden und evaluieren.

Software-Test

  • Testlückenanalyse
    Das Testen von Software ist eine wichtige Aufgabe, um die Qualität zu sichern und Regressionsprobleme zu vermeiden. Die Entscheidung, was und wie bestimmte Teile der Software getestet werden sollen, ist jedoch nicht trivial. Eine Technik namens Testlückenanalyse kann auf Software-Repositories angewendet werden, um anhand von Informationen über Codeänderungen und Testabdeckung ungetesteten Code zu finden. Diese Analyse ermöglicht es, den Testaufwand zu priorisieren und fehleranfällige Software-Module frühzeitig im Entwicklungszyklus zu erkennen.
  • Auswahl von Regressionstests
    Regressionstesten ist eine wichtige aber kostspielige Aktivität, die jedes Mal durchgeführt wird, wenn ein Programm geändert wird, um sicherzustellen, dass die Änderungen keine neuen Probleme oder Schwachstellen mit sich bringen. Die Testsuiten können sehr umfangreich werden und die Ausführung nach jeder Änderung kann sehr zeitaufwändig werden. Ein wichtiges Forschungsproblem ist daher die Auswahl einer relevanten Teilmenge von Testfällen, die sowohl die Testzeit als auch den Prüfaufwand minimiert, ohne die Validität des Testprozesses zu beeinträchtigen.

Integration und Arbeitsablauf

  • Integrationsunterstützung
    Es kann schwierig sein, den Überblick über offene Integrationen und Änderungswünsche in aktiven Softwareprojekten zu behalten. SI kann dabei helfen, fertige Integrationsanfragen zu präsentieren und sie automatisch zu integrieren, wenn definierte Kriterien erfüllt sind. Diese Anwendungen können auch die interne Entwicklung von Funktionen verfolgen und Commit-Message-Anpassungen oder Squashing- und Rebasing-Aktivitäten automatisch durchführen.
  • Pre-Build und Testbereitstellung
    Nicht alle Bugs werden während der Entwicklung gefunden. SI kann die Qualitätssicherung unterstützen, indem entwickelte Funktionen vor ihrer Integration in das Produktivsystem bereitgestellt werden. Dies reduziert den Aufwand für die Einrichtung einer Testumgebung für manuelle Tests. Außerdem kann das zu testende System in einer produktionsähnlichen Umgebung überwacht werden. Die Bereitstellung auf einem Staging-System, bevor die Änderungen integriert und in der Produktion eingesetzt werden, ist eine bewährte Praxis. Problematische Änderungen können früher erkannt werden, wenn sie noch leicht rückgängig zu machen sind, wodurch manueller Aufwand eingespart wird.

Teammanagement und Prozessqualität

  • Flow und Workload Monitoring
    Offene Fehlerberichte und Pull-Requests können mit der Zeit aus dem Ruder laufen. Einige Fehlerberichte können sogar irrelevant werden. Durch die automatische Analyse offener Pull-Requests und Entwicklungsaufgaben kann man den Überblick behalten und gleichzeitig einen guten Fortschritt erzielen und die Arbeitslast priorisieren. Dashboard-Lösungen können auf veraltete Fehlerberichte und Aufgaben hinweisen, für die keine Fortschritte gemeldet wurden bzw. die in der Entwicklung feststecken.
     
  • Arbeitszuweisung
    Durch die Analyse früherer Entwicklungsaktivitäten, der Urheberschaft von Code und der impliziten Erfahrung von Entwicklern für bestimmte Bereiche der Software kann SI dabei helfen, geeignete Personen für verschiedene Funktionen auszuwählen und die Experten für bestimmte Themen zu finden. Auch wenn eine Entwicklungsaufgabe fertiggestellt ist, können Entwickler für manuelle Reviews auf der Grundlage der Vertrautheit mit Codestrukturen und ähnlichen Funktionsanforderungen vorgeschlagen werden. Dies hilft nicht nur bei der Qualitätssicherung, sondern unterstützt auch den Wissensaustausch.

Welche Daten sind für SI geeignet?

Für all diese Anwendungsfälle werden geeignete Daten benötigt, die nicht nur Informationen über das Problem enthalten, sondern auch Schlussfolgerungen auf neu gewonnene Daten ermöglichen. Daten aus allen möglichen Softwareentwicklungsaktivitäten müssen kontinuierlich gesammelt und analysiert werden. Je nach Anwendungsfall und den eingesetzten Werkzeugen zur Datenerfassung im Softwareentwicklungszyklus kann die Qualität der eingesetzten SI-Techniken variieren. Ein umfassender und gründlicher Plan zum Sammeln und Aufbereitung der Daten ist ein wichtiger Baustein für die Anwendung von Software Intelligence. Einige der oben vorgestellten Methoden benötigen historische Entwicklungsdaten, um fundierte und korrekte Vorhersagen über den Status der Softwareentwicklung zu treffen. Wir kategorisieren Daten aus dem Lebenszyklus der Softwareentwicklung in 3 Bereiche: Prozess-, Produkt- und codebezogene Daten.

  • Prozessdaten
    Prozessbezogene Daten sind Daten, die während des Projektlebenszyklusmanagements gesammelt werden. Solche Daten werden durch die Analyse des Prozesses selbst gesammelt, z. B. Metriken über Arbeitsbelastung, Teamgröße und Geschwindigkeit oder Ressourcennutzung für Aktivitäten. Prozessbezogene Daten werden auch implizit erfasst durch
  1. Fehlerverfolgungssysteme und Tools zur Anforderungsdokumentation (wie Jira, Bugzilla, Github oder Confluence) bei der Planung von Softwareentwicklungsaktivitäten,
  2. Tools für die Kommunikation (Slack, E-Mail, Kommentarbereiche) und Überprüfungen (Gerrit, Github), wenn Entwicklungsaktivitäten abgeschlossen werden,
  3. und automatisierte Prozesse wie kontinuierliche Integrationsläufe (jenkins, circle ci, travis, teamcity), die Informationen über Test- (Abdeckung, Fehler), Lint- und Build-Ergebnisse enthalten.
  • Codebezogene Daten
    Auf einer niedrigeren Abstraktionsebene betreffen codebezogene Daten Anpassungen an Code, Tests und Software-Architektur. Statische Code-Analysen (wie Sonarqube oder Infer) analysieren den Code direkt aus dem Software-Repository, um neue Erkenntnisse über den Code zu gewinnen. Architektonische Daten können aus Modellierungsaktivitäten wie UML-Diagrammen gewonnen werden. Software-Artefakte können analysiert werden, um nicht nur Informationen über Code-Metriken zu erhalten, sondern auch die Commit-Historie (einschließlich Commits, Branches, Autorerfahrung und Code-Ownership) aus dem Versionskontrollsystem (z. B. git, svn, mercurial) zu erhalten. Auch Daten über Codeänderungen und Patches, Abhängigkeiten und Code-Evolution können gesammelt werden.
     
  • Produktdaten
    Produktdaten werden eher auf der operativen Seite der Softwareentwicklung erzeugt. Nutzungsstatistiken von Open-Source-Tools können auf Code-Management-Plattformen (z. B. Github, Gitlab, Bitbucket) gefunden werden, die die Community und die jüngsten Aktivitäten beschreiben. Die Überwachung der Produktionsinstanzen von Software ist eine wichtige Aufgabe. Daten aus der Protokollierung und Überwachung (z. B. elk-stack) wie Serverauslastung und Absturzinformationen können über Cloud- oder Incident-Reporting-Tools abgerufen werden. Wenn das Deployment in einer Continuous Deployment Pipeline (CircleCI, Travis) automatisiert wird, können Daten über den Deployment-Prozess und mögliche Fehler abgerufen werden.

Fazit

Mit der ständig wachsenden Menge an Daten in Software-Engineering-Prozessen (entweder explizit oder implizit gesammelt) können immer mehr Entscheidungshilfen durch die Analyse dieser Daten angeboten werden. SI oder ML4SE erhält immer mehr Aufmerksamkeit von Forschung und Industrie. Die Anwendung von SI-Techniken kann helfen, bei der Entwicklung und Bereitstellung von Softwaresystemen Zeit und Ressourcen zu sparen.

Um das volle Potenzial von SI auszuschöpfen, muss man sich auch Gedanken über die verfügbaren Daten machen und darüber, wie sie gesammelt und organisiert werden können. Daten können verstreut und nur umständlich zugänglich sein. Rohdaten aus einzelnen Quellen können bereits für einfachere Anwendungsfälle verwendet werden, jedoch ist die Kombination verschiedener Quellen oft notwendig, um aussagekräftige Datensätze zu generieren und maschinelle Lernmodelle zu erlernen. Die Verfolgung von Aktivitäten während des gesamten Softwareentwicklungsprozesses ist besonders wichtig.

Das CCE plant eine Serie zu den einzelnen Themen des SI und mehr interessante Anwendungen in verschiedenen Bereichen des Software-Engineerings detailliert vorzustellen, von der Vorhersage von Fehlern bis hin zur Gesundheit und dem Management von Teams.

 

 Peter Bludau

Ihr Kontakt

Peter Bludau

+49 89 3603522 534
bludau@fortiss.org

Dr. Severin Kacianka

Ihr Kontakt

Dr. Severin Kacianka

+49 89 3603522 286
kacianka@fortiss.org