s o f t w ar e dat a dat a s cien ce o n · 01.07.2019 · dat a s cien ce o n s o f t w ar e dat a...

43
Data Science on Data Science on Software Data Software Data Markus Harrer, Software Development Analyst @feststelltaste Java Forum Stuttgart 2019, 04.07.2019

Upload: others

Post on 09-Sep-2019

1 views

Category:

Documents


0 download

TRANSCRIPT

Data Science on Data Science on Software DataSoftware DataMarkus Harrer, Software Development Analyst

@feststelltaste

Java Forum Stuttgart 2019, 04.07.2019

Data ScienceData Science

Was ist Data Science?Was ist Data Science?

"Statistik auf nem Mac."

Nach https://twitter.com/cdixon/status/428914681911070720

Meine DefinitionMeine Definition

Was bedeutet "Was bedeutet "data"?"?

"Without data you‘re just another person with an opinion."

W. Edwards Deming

=> Belastbare Erkenntnisse mittels Fakten liefern

Was bedeutet "Was bedeutet "science"?"?

"The aim of science is to seek the simplest explanations of complex facts."

Albert Einstein

=> Neue Erkenntnisse verständlich herausarbeiten

VorgehenVorgehenNach Roger Pengs "Stages of Data Analysis"

I. FragestellungII. DatenbeschaffungIII. ModellierungIV. InterpretationV. Kommunikation

=> von der Frage über die Daten zur Erkenntnis!

Was hat das mit Softwareentwicklung zuWas hat das mit Softwareentwicklung zutun?tun?

Was ist ein Data Scientist?Was ist ein Data Scientist?"Jemand, der mehr Ahnung von Statistik  hat als ein Softwareentwickler  und mehr Ahnung von Softwareentwicklung  als ein Statistiker."

Nach zu https://twitter.com/cdixon/status/428914681911070720

Data Science & Software Data: Perfect match!

Software DataSoftware Data

Was ist Software Data?Was ist Software Data?

StatischLaufzeitChronologischCommunity

=> Krass viel!

Beispiele für AnalysenBeispiele für Analysen

Performance-BottlenecksVerborgene TeamkommunikationModularisierungsschnitteArchitektur-/Design-/Code-Smells...

=> Individuelle Analysen für individuelle Probleme!

LösungsstrategieLösungsstrategie

GrundprinzipGrundprinzip (Intent + Code + Data + Results) * Logical Step + Automation = Literate Statistical Programming

Implementierung: Computational notebooks

Computational NotebooksComputational Notebooks

TechnikTechnik

Technologie (1/2)Technologie (1/2)Klassischer Data-Science-Werkzeugkasten

Jupyter (mitRISE)Python 3pandasmatplotlib

Technologie (2/2)Technologie (2/2)Jupyter funktioniert und integriert sich auch mit

jQAssistant / Cypher / Neo4jJVM-Sprachen über beakerx /Tablesawbash...

Praktischer TeilPraktischer Teil

Erstes Hands-OnErstes Hands-On

FallbeispielFallbeispiel

IntelliJ IDEAIntelliJ IDEA

IDE für die Java-EntwicklungVieles in Java geschriebenGroßes und lang entwickeltesProjekt

I. Fragestellung (1/3)I. Fragestellung (1/3)Offene Frage explizitniederschreibenAnalyseidee verständlich darstellen

I. Fragestellung (2/3)I. Fragestellung (2/3)Frage

Welche Code ist besonders komplex und oft wird in letzter Zeit häufiggeändert?

I. Fragestellung (3/3)I. Fragestellung (3/3)

UmsetzungsideeUmsetzungsidee

Werkzeuge: Jupyter, Python, pandas,matplotlibHeuristiken:

"komplex": Lines of Code"letzter Zeit": Letzte 3 Monate"oft geändert": Anzahl Git Commits

Meta-Ziel: Grundmechaniken kennenlernen.

II. DatenbeschaffungII. DatenbeschaffungDaten in Data-Science-WeltladenRohdaten bereinigen und filtern

Wir laden Git Log Daten eines Git Repos.

In [1]: import pandas as pd

log = pd.read_csv("../dataset/git_log_intellij.csv.gz")log.head()

Out[1]: additions deletions filename sha timestamp author

0 4 0 java/java-impl/src/com/intellij/codeInsight/hi... be6247932aa9 2019-07-01 14:40:24 Roman.Ivanov

1 4 6 java/java-impl/src/com/intellij/codeInsight/hi... ee2032b77eca 2019-07-01 11:36:14 Roman.Ivanov

2 0 3 java/java-impl/src/META-INF/JavaPlugin.xml fbeb4d639dc1 2019-06-26 11:14:34 Roman.Ivanov

3 6 3 java/java-impl/src/com/intellij/codeInsight/hi... fbeb4d639dc1 2019-06-26 11:14:34 Roman.Ivanov

4 11 6 java/java-impl/src/com/intellij/codeInsight/hi... a3d5a9b855fe 2019-06-14 10:32:15 Roman.Ivanov

Was haben wir hier eigentlich?

In [2]: log.info()

1 DataFrame (~ programmierbares Excel-Arbeitsblatt), 6 Series (= Spalten),1128819 Rows (= Einträge)

<class 'pandas.core.frame.DataFrame'> RangeIndex: 1128819 entries, 0 to 1128818 Data columns (total 6 columns): additions 1128819 non-null object deletions 1128819 non-null object filename 1128819 non-null object sha 1128819 non-null object timestamp 1128819 non-null object author 1128819 non-null object dtypes: object(6) memory usage: 51.7+ MB

Wir wandeln die Zeitstempel von Texte in Objekte um.

In [3]: log['timestamp'] = pd.to_datetime(log['timestamp'])log.head()

Out[3]: additions deletions filename sha timestamp author

0 4 0 java/java-impl/src/com/intellij/codeInsight/hi... be6247932aa9 2019-07-01 14:40:24 Roman.Ivanov

1 4 6 java/java-impl/src/com/intellij/codeInsight/hi... ee2032b77eca 2019-07-01 11:36:14 Roman.Ivanov

2 0 3 java/java-impl/src/META-INF/JavaPlugin.xml fbeb4d639dc1 2019-06-26 11:14:34 Roman.Ivanov

3 6 3 java/java-impl/src/com/intellij/codeInsight/hi... fbeb4d639dc1 2019-06-26 11:14:34 Roman.Ivanov

4 11 6 java/java-impl/src/com/intellij/codeInsight/hi... a3d5a9b855fe 2019-06-14 10:32:15 Roman.Ivanov

Wir sehen uns nur die jüngsten Änderungen an.

In [4]: recent = log[log['timestamp'] > pd.Timestamp('today') - pd.Timedelta('90 days')]recent.head()

Out[4]: additions deletions filename sha timestamp author

0 4 0 java/java-impl/src/com/intellij/codeInsight/hi... be6247932aa9 2019-07-01 14:40:24 Roman.Ivanov

1 4 6 java/java-impl/src/com/intellij/codeInsight/hi... ee2032b77eca 2019-07-01 11:36:14 Roman.Ivanov

2 0 3 java/java-impl/src/META-INF/JavaPlugin.xml fbeb4d639dc1 2019-06-26 11:14:34 Roman.Ivanov

3 6 3 java/java-impl/src/com/intellij/codeInsight/hi... fbeb4d639dc1 2019-06-26 11:14:34 Roman.Ivanov

4 11 6 java/java-impl/src/com/intellij/codeInsight/hi... a3d5a9b855fe 2019-06-14 10:32:15 Roman.Ivanov

Wir wollen nur Java-Code verwenden.

In [5]: java = recent[recent['filename'].str.endswith(".java")].copy()java.head()

Out[5]: additions deletions filename sha timestamp author

27 1 10 platform/smRunner/src/com/intellij/execution/t... f4ed78c8f574 2019-06-2818:28:41 Ilya.Kazakevich

29 28 0 platform/smRunner/testSrc/com/intellij/executi... f4ed78c8f574 2019-06-2818:28:41 Ilya.Kazakevich

30 6 3 plugins/InspectionGadgets/InspectionGadgetsAna... a724467ad1a5 2019-07-0119:47:38

RomanShevchenko

31 2 2 plugins/InspectionGadgets/test/com/siyeh/igfix... a724467ad1a5 2019-07-0119:47:38

RomanShevchenko

32 2 2 plugins/InspectionGadgets/test/com/siyeh/igfix... a724467ad1a5 2019-07-0119:47:38

RomanShevchenko

III. ModellierungIII. ModellierungNeue Sichten schaffenWeitere Datenverschneiden

Wir aggregieren die Zeilen sowie die Anzahl der Änderungen pro Datei.

In [6]: changes = java.groupby('filename')[['sha']].count()changes.head()

Out[6]: sha

filename

RegExpSupport/src/org/intellij/lang/regexp/RegExpFileType.java 3

RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHost.java 14

RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHosts.java 13

RegExpSupport/src/org/intellij/lang/regexp/RegExpSupportLoader.java 7

RegExpSupport/src/org/intellij/lang/regexp/UnicodeCharacterNames.java 7

Wir holen Infos über die Code-Zeilen hinzu...

In [7]: loc = pd.read_csv("../dataset/cloc_intellij.csv.gz", index_col=1)loc.head()

Out[7]: language blank comment code

filename

java/java-tests/testData/psi/resolve/ThinletBig.java Java 299 1140 20125

java/java-tests/testData/psi/parser-full/declarationParsing/class/LongClass.java Java 10121 10164 10166

python/gen/com/jetbrains/python/console/protocol/PythonConsoleBackendService.java Java 1971 591 10086

jps/jps-builders/src/org/jetbrains/jps/api/CmdlineRemoteProto.java Java 502 3066 8605

plugins/java-decompiler/engine/testData/obfuscated/aj.java Java 551 1 8043

...und verschneiden diese mit den vorhandenen Daten.

In [8]: hotspots = changes.join(loc[['code']])hotspots.head()

Out[8]: sha code

filename

RegExpSupport/src/org/intellij/lang/regexp/RegExpFileType.java 3 40.0

RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHost.java 14 92.0

RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHosts.java 13 168.0

RegExpSupport/src/org/intellij/lang/regexp/RegExpSupportLoader.java 7 NaN

RegExpSupport/src/org/intellij/lang/regexp/UnicodeCharacterNames.java 7 119.0

VI. InterpretationVI. InterpretationProblem: Ergebnisse oftumfangreichDaher: Kernaussagen klar darstellen

Wir zeigen die TOP 10 Hotspots an.

In [9]: top10 = hotspots.sort_values(by="sha", ascending=False).head(10)top10

Out[9]: sha code

filename

platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/StructuralSearchDialog.java 81 1097.0

platform/platform-impl/src/com/intellij/idea/IdeaApplication.java 68 366.0

platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java 64 1425.0

platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java 63 810.0

java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/TrackingRunner.java 61 1300.0

platform/lang-impl/src/com/intellij/build/BuildTreeConsoleView.java 60 936.0

platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerConfigurableNewLayout.java 58 1284.0

platform/platform-impl/src/com/intellij/idea/StartupUtil.java 57 551.0

java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java 55 1012.0

platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java 55 299.0

V. KommunikationV. KommunikationErgebnisse managementtauglichdarstellenNächste Schritte lostreten

Wir plotten die TOP 10 Liste als XY-Diagramm.

In [10]: top10.plot.scatter('sha', 'code');

Ende des ersten Hands-OnsEnde des ersten Hands-Ons

Weitere AnalysenWeitere AnalysenAbhängigkeitsanalyse mit Daten von jdeps und Visualisierung mit D3 (

, ,

).Analyse von Performance-Hotspots mit jQAssistant / Neo4j (

Priorisieren von Aufräumarbeiten mit Groovy / Tablesaw (

Code analytics/blob/master/demos/20190704_JFS_2019/jdeps_demo.ipynb) Staanalytics/blob/master/demos/20190704_JFS_2019/jdeps_demo.ipynb) Intefilepath=demos%2F20190704_JFS_2019%2Fjdeps_demo.ipynb)

Code (https://analytics/blob/master/notebooks/Mining%20performance%20HotSpots%Blog Teil 1 (https://www.feststelltaste.de/mining-performance-hotspots-w(https://www.feststelltaste.de/mining-performance-hotspots-with-jprofile

Code (https://gitanalytics/blob/master/notebooks/Production%20Coverage%20Demo%20

ZusammenfassungZusammenfassung1. Analysen mit Standard-Werkzeugen einfach möglich2. Wer mehr will bekommt auch mehr!3. Es gibt unglaublich viele Quellen für Daten in der Softwareentwicklung

=> von der Frage über die Daten zur Erkenntnis!

Tipps zum EinstiegTipps zum EinstiegAdam Tornhill: Software Design X-RayWes McKinney: Python For Data AnalysisLeek, Jeff: The Elements of Data Analytic StyleTim Menzies, Laurie Williams, Thomas Zimmermann: Perspectives onData Science for Software EngineeringMini-Tutorial (

)Blog (https://www.feststelltaste.de/mini-tutorial-git-log-

analyse-mit-python-und-pandas/)

Vielen Dank! Fragen?Vielen Dank! Fragen?Markus HarrerinnoQ Deutschland GmbH

[email protected]

@feststelltaste

Demos & "Slides": https://github.com/feststelltaste/software-analytics => demos/20190704_JFS_2019/