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...
TRANSCRIPT
Data Science on Data Science on Software DataSoftware DataMarkus Harrer, Software Development Analyst
@feststelltaste
Java Forum Stuttgart 2019, 04.07.2019
Was ist Data Science?Was ist Data Science?
"Statistik auf nem Mac."
Nach https://twitter.com/cdixon/status/428914681911070720
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 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!
Beispiele für AnalysenBeispiele für Analysen
Performance-BottlenecksVerborgene TeamkommunikationModularisierungsschnitteArchitektur-/Design-/Code-Smells...
=> Individuelle Analysen für individuelle Probleme!
GrundprinzipGrundprinzip (Intent + Code + Data + Results) * Logical Step + Automation = Literate Statistical Programming
Implementierung: Computational notebooks
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...
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
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
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
@feststelltaste
Demos & "Slides": https://github.com/feststelltaste/software-analytics => demos/20190704_JFS_2019/