SlideShare ist ein Scribd-Unternehmen logo
1 von 47
Codequalität messen EnterJS, 01. Juli 2014
Andy Grunwald
• Software Engineer bei @trivago
• Open Source
• @andygrunwald
• @PHPUGDus
• andygrunwald
Code | qualität | messen
–Helmut Balzert
„Unter Softwarequalität versteht man die
Gesamtheit der Merkmale … eines
Softwareprodukts, …, festgelegte oder
vorausgesetzte Erfordernisse zu erfüllen.“
(Software)-Metriken
Frontend
HTTP Requests
Navigation Timing
DOM Elemente
Browser Repaints
…
Backend
Request-Zeit
Cache-Miss / -Hits
Ressource-Zeit
Business-Logik
…
Source Code
Source Code
Functions count
Nested depth
Halstead
Maintainability index
LOC
Parameter count
Cyclomatic Complexity
nPath
Lint errors
CLOC
LLOC
Your metric here
Source Code
Functions count
Nested depth
Halstead
Maintainability index
LOC
Parameter count
Cyclomatic Complexity
nPath
Lint errors
CLOC
LLOC
Your metric here
_.isEmpty(e);
_.isEmpty(e);
• LOC: 19
_.isEmpty(e);
• LOC: 19
• CLOC: 2
_.isEmpty(e);
• LOC: 19
• CLOC: 2
• NCLOC: 17
_.isEmpty(e);
• LOC: 19
• CLOC: 2
• NCLOC: 17
• LLOC: 9
Source Code
Functions count
Nested depth
Halstead
Maintainability index
LOC
Parameter count
Cyclomatic Complexity
nPath
Lint errors
CLOC
LLOC
Your metric here
Source Code
Functions count
Nested depth
Halstead
Maintainability index
LOC
Parameter count
Cyclomatic Complexity
nPath
Lint errors
CLOC
LLOC
Your metric here
Cyclomatic Complexity / McCabe
Anzahl von Entscheidungspunkten
innerhalb einer Funktion (if, switch, for, while, …)
Cyclomatic Complexity: 4
nPath Complexity
Anzahl einzigartiger Ausführungspfade
innerhalb einer Funktion
nPath Complexity: 4
Cyclomatic Complexity === nPath?
Cyclomatic Complexity: 4
nPath Complexity: 8
escomplex
complexity-report
plato
Esprima
yardstick
jsmeter
ScanJS
JSHint
jsprime
DoctorJs
JSWhiz
WALA
+
Sprach-Features
JavaScript ist eine dynamische Sprache
Referenzwerte / Schwellenwerte + Kontext
Referenzwerte / Schwellenwerte
Niedrig Normal Hoch Sehr hoch
Cyclomatic Complexity 1-4 5-7 8-10 >= 11
nPath / / / >= 200
Java (45 Projekte)
Metrik Niedrig Normal Hoch Sehr hoch
CYCLO/LOC 0.16 0.20 0.24 0.36
LOC/Methode 7 10 13 19.5
NOM/Class 4 7 10 15
C++ (37 Projekte)
Metrik Niedrig Normal Hoch Sehr hoch
CYCLO/LOC 0.20 0.25 0.30 0.45
LOC/Methode 5 10 16 24
NOM/Class 4 9 15 22.5
Metriken
Source Code
Functions count
Nested depth
Halstead
Maintainability index
LOC
Parameter count
Cyclomatic Complexity
nPath
Lint errors
CLOC
LLOC
Your metric here
Verwendete Bilder
• „Ruler“ by Scott Akerman:
https://www.flickr.com/photos/sterlic/4299631538/
• „the JavaScript Code“ by Dmitry Baranovskiy:
https://www.flickr.com/photos/dmitry-
baranovskiy/2378867408
• „Ignition“ by Zach Dischner:
https://www.flickr.com/photos/zachd1_618/3489625168
• „Tools IMG_0171“ by OZinOH:
https://www.flickr.com/photos/75905404@N00/7126146
307
Verwendete Bilder
• „Danger & Skull, Legoland“ by bixentro:
https://www.flickr.com/photos/bixentro/338433029
• „Baby“ by The Noun Project:
http://thenounproject.com/term/baby/47/
• „Man“ by The Noun Project:
http://thenounproject.com/term/man/2/
• „Sasquatch“ by Mike Wirth:
http://thenounproject.com/term/sasquatch/2680/
Verwendete Bilder
• „Waking Up In Abbeyford Woods“ by Miles
Wolstenholme:
https://www.flickr.com/photos/oaktorphotography/14444
806464
• „Danke 102/365“ by Dennis Skley:
https://www.flickr.com/photos/dskley/13796815083/
• „Questions“ by Oberazzi:
https://www.flickr.com/photos/oberazzi/318947873/in/ph
otostream/
Zitate und Tabellen
• Helmut Balzert: Lehrbuch der Softwaretechnik. Band 2:
Softwaremanagement, Software-Qualitätssicherung,
Unternehmensmodellierung, Spektrum Akademischer
Verlag, Heidelberg 1998, ISBN 3-8274-0065-1, S. 257
• Michele Lanza, Radu Marinescu: Object-Oriented
Metrics in Practice: Using Software Metrics to
Characterize, Evaluate, and Improve the Design of
Object-Oriented Systems, Springer 2006, ISBN
3540244298

Weitere ähnliche Inhalte

Ähnlich wie Codequalität messen (enterJS 2014)

Never Code Alone: Von Symfony Forms zu einer SPA auf APIs
Never Code Alone: Von Symfony Forms zu einer SPA auf APIsNever Code Alone: Von Symfony Forms zu einer SPA auf APIs
Never Code Alone: Von Symfony Forms zu einer SPA auf APIsStefan Adolf
 
HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)
HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)
HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)André Krämer
 
Echtzeitvisualisierung von Twitter und Co.
Echtzeitvisualisierung von Twitter und Co.Echtzeitvisualisierung von Twitter und Co.
Echtzeitvisualisierung von Twitter und Co.Kai Donato
 
Echtzeitvisualisierung von Twitter & Co
Echtzeitvisualisierung von Twitter & CoEchtzeitvisualisierung von Twitter & Co
Echtzeitvisualisierung von Twitter & CoOliver Lemm
 
Docker Einführung @GPN15
Docker Einführung @GPN15Docker Einführung @GPN15
Docker Einführung @GPN15m1no
 
Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?QAware GmbH
 
Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Josef Adersberger
 
Integration von Security-Checks in die CI-Pipeline
Integration von Security-Checks in die CI-PipelineIntegration von Security-Checks in die CI-Pipeline
Integration von Security-Checks in die CI-PipelineOPEN KNOWLEDGE GmbH
 
Einführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungEinführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungChristian Baranowski
 
DOAG 2015 enterprise_securitymitlda_pundpki-pub
DOAG 2015 enterprise_securitymitlda_pundpki-pubDOAG 2015 enterprise_securitymitlda_pundpki-pub
DOAG 2015 enterprise_securitymitlda_pundpki-pubLoopback.ORG
 
Daten natuerlich modellieren und verarbeiten mit Neo4j
Daten natuerlich modellieren und verarbeiten mit Neo4jDaten natuerlich modellieren und verarbeiten mit Neo4j
Daten natuerlich modellieren und verarbeiten mit Neo4jPatrick Baumgartner
 
Ruby on Rails in a metro session
Ruby on Rails in a metro sessionRuby on Rails in a metro session
Ruby on Rails in a metro sessionVirttoo org
 
REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...
REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...
REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...predic8
 
.NET Datenzugriff einfach und performant mit Micro O/R Mappern
.NET Datenzugriff einfach und performant mit Micro O/R Mappern .NET Datenzugriff einfach und performant mit Micro O/R Mappern
.NET Datenzugriff einfach und performant mit Micro O/R Mappern André Krämer
 
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...Peter Hecker
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptSebastian Springer
 
DACHNUG50 Volt MX & AppScan_20230615.pdf
DACHNUG50 Volt MX & AppScan_20230615.pdfDACHNUG50 Volt MX & AppScan_20230615.pdf
DACHNUG50 Volt MX & AppScan_20230615.pdfDNUG e.V.
 
Android Apps mit Xamarin entwickeln
Android Apps mit Xamarin entwickelnAndroid Apps mit Xamarin entwickeln
Android Apps mit Xamarin entwickelnAndré Krämer
 
Crawl-Budget-Booster für eine bessere Search Engine Experience
Crawl-Budget-Booster für eine bessere Search Engine ExperienceCrawl-Budget-Booster für eine bessere Search Engine Experience
Crawl-Budget-Booster für eine bessere Search Engine ExperienceAndré Goldmann
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsJosef Adersberger
 

Ähnlich wie Codequalität messen (enterJS 2014) (20)

Never Code Alone: Von Symfony Forms zu einer SPA auf APIs
Never Code Alone: Von Symfony Forms zu einer SPA auf APIsNever Code Alone: Von Symfony Forms zu einer SPA auf APIs
Never Code Alone: Von Symfony Forms zu einer SPA auf APIs
 
HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)
HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)
HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)
 
Echtzeitvisualisierung von Twitter und Co.
Echtzeitvisualisierung von Twitter und Co.Echtzeitvisualisierung von Twitter und Co.
Echtzeitvisualisierung von Twitter und Co.
 
Echtzeitvisualisierung von Twitter & Co
Echtzeitvisualisierung von Twitter & CoEchtzeitvisualisierung von Twitter & Co
Echtzeitvisualisierung von Twitter & Co
 
Docker Einführung @GPN15
Docker Einführung @GPN15Docker Einführung @GPN15
Docker Einführung @GPN15
 
Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?
 
Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?
 
Integration von Security-Checks in die CI-Pipeline
Integration von Security-Checks in die CI-PipelineIntegration von Security-Checks in die CI-Pipeline
Integration von Security-Checks in die CI-Pipeline
 
Einführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungEinführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software Entwicklung
 
DOAG 2015 enterprise_securitymitlda_pundpki-pub
DOAG 2015 enterprise_securitymitlda_pundpki-pubDOAG 2015 enterprise_securitymitlda_pundpki-pub
DOAG 2015 enterprise_securitymitlda_pundpki-pub
 
Daten natuerlich modellieren und verarbeiten mit Neo4j
Daten natuerlich modellieren und verarbeiten mit Neo4jDaten natuerlich modellieren und verarbeiten mit Neo4j
Daten natuerlich modellieren und verarbeiten mit Neo4j
 
Ruby on Rails in a metro session
Ruby on Rails in a metro sessionRuby on Rails in a metro session
Ruby on Rails in a metro session
 
REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...
REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...
REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...
 
.NET Datenzugriff einfach und performant mit Micro O/R Mappern
.NET Datenzugriff einfach und performant mit Micro O/R Mappern .NET Datenzugriff einfach und performant mit Micro O/R Mappern
.NET Datenzugriff einfach und performant mit Micro O/R Mappern
 
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...
JavaScript goes Enterprise - Node.js-Anwendungen mit Visual Studio und den No...
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScript
 
DACHNUG50 Volt MX & AppScan_20230615.pdf
DACHNUG50 Volt MX & AppScan_20230615.pdfDACHNUG50 Volt MX & AppScan_20230615.pdf
DACHNUG50 Volt MX & AppScan_20230615.pdf
 
Android Apps mit Xamarin entwickeln
Android Apps mit Xamarin entwickelnAndroid Apps mit Xamarin entwickeln
Android Apps mit Xamarin entwickeln
 
Crawl-Budget-Booster für eine bessere Search Engine Experience
Crawl-Budget-Booster für eine bessere Search Engine ExperienceCrawl-Budget-Booster für eine bessere Search Engine Experience
Crawl-Budget-Booster für eine bessere Search Engine Experience
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 

Codequalität messen (enterJS 2014)

Hinweis der Redaktion

  1. Verteilung: Wer ist denn Entwickler? Wer ist denn Teamleader oder Entscheider? Vorlieben: Wer mag denn Mathe bzw. Statistik?
  2. Bachelor of Science in Wirtschaftsinformatik Anfang 2013 bei trivago Backend: Skalierung, Caching-Infrastruktur, Architektur (Hardware + Software) @PHPUGDus: Alles außer PHP … Web / Developer-Themen
  3. Was bedeutet „Codequalität messen“ eigentlich? Im Duden steht “leider” nichts
  4. Code JavaScript-Konferenz => Quellcode bzw. Innenleben von Software ==> JavaScript Viele der Konzepte / Kennzahlen auf andere Sprachen übertragbar! Bitte beachten: OOP, Funktionsorientiert, Prototyporientiert, etc.
  5. Qualität Softwarequalität: Ist === Soll-Zustand Codequalität: Teilaspekt von Softwarequalität Nicht-funktionale Anforderungen: Konformität, Verständlichkeit, Analysierbarkeit, Modifizierbarkeit,Prüfbarkeit => Codestruktur!
  6. messen Merkmale / Eigenschaften werden als numerische Werte zusammengefasst. Ergebnis: Messwert + Einheit => Übertragen auf Software: Software-Metriken
  7. Wer hat denn bereits Erfahrungen mit Kennzahlen oder Metriken? trivago usecase: Reicht die Server-Infrastruktur für die TV-Werbung? Argumente für … eine Anschaffung? … Refactoring? => Steigen wir ein…
  8. ====> „Was wollen wir messen?“ Fast alles messbar. Macht alles Sinn? Codequalität … Nicht funktionale Anforderungen Qualitätsmerkmale wie z.B. Wartbarkeit, Erweiterbarkeit oder Verständlichkeit
  9. Auch hier: ==> „Was wollen wir messen?“ Fast alles messbar. Macht alles Sinn? Kleiner Ausschnitt von Metriken. Zählmetriken: LOC … Zusammengesetzte Metriken + mehreren Faktoren: Halstead, Maintainability Index
  10. Kleiner Anfang mit simplen Metriken: LOC, CLOC, NCLOC, LLOC
  11. Leicht gekürzte isEmpty von Underscore.js LOC, CLOC, NCLOC, LLOC
  12. Lines of code
  13. Commented LOC
  14. Non commented LOC / Physical LOC
  15. Logical LOC Soweit alles klar? Recht einfach, oder?
  16. Noch mal zur Übersicht. 4 Metriken. 3 dargestellt.
  17. Etwas komplizierter Allein betrachtet (meiner Meinung nach) sinnvoller Start: Definition
  18. Indikator für die Komplexität des (Teil)-Programms => Variablennamen + Kommentare tragen auch dazu bei Synonym: McCabe
  19. Cyclomatic Complexity Nicht der schönste Code. Hat bestimmt jeder Entwickler schon gesehen
  20. Branch coverage: Anzahl der Tests um alle Möglichkeiten getestet zu haben
  21. nPath
  22. Nun könnte man meinen: Beides das selbe? => Nein: Ein anderes Beispiel
  23. Cyclomatic Complexity
  24. nPath
  25. Tools Es gibt nicht DAS Tool (leider) Tooling ist bescheiden, da gibt es noch viel zu tun
  26. ScanJS: Security Analyse von Mozilla, kann auch dazu verwendet werden JSHint: maxcomplexity option jsprime: Security Analyse Tool -> basiert auf Esprima DoctorJs: Mozilla JSWhiz: Static Analysis for JavaScript Memory Leaks (Google) Weitere Tools: WALA, cloc, sloc, sclc, pmd
  27. Open platform to manage code quality Plugins für jede Sprache: JavaScript, CSS, PHP, Java, .NET, … Multi-Language-Projects
  28. Jetzt kommt das große AAAAABER … Es besteht Gefahr bei falscher Nutzung von Metriken
  29. Viele der Konzepte / Kennzahlen auf andere Sprachen übertragbar! Bitte beachten: OOP, Funktionsorientiert, Prototyporientiert, etc. Einfache Portierung von Tools aus Java und C nicht möglich.
  30. foo-loop: Jeder for-in: Steigen die meisten aus .forEach: Selten -> yardstick
  31. Statische Code-Analyse Code wird nicht ausgeführt, sondern nur untersucht => Wissenschafter: v8 gehooked … Analyse beim ausführen Vorteile: Analyse zur Ausführung (dynamische Inhalte) Nachteil: Nicht der ganze Code
  32. Ein normaler Mensch: 1,80m groß. Normal? Groß? Klein? Gegenüber einem Baby: Groß Gegenüber einem Yeti: Klein
  33. Es kommt nicht nur auf die Sprache an, sondern auch auf den Kontext Was ist das für eine Software? => Library, Framework, Applikation? => Aus welchem Bereich? Medizin? Statische Code Analyse? etc.
  34. Welche Metriken sind wichtig?
  35. Wald vor lauter Bäumen nicht Eine Herausforderung. Wie ist die Fragestellung? Was will ich erreichen?
  36. Geklaut: http://de.slideshare.net/JarrodOverson/complexity-28214103?qid=597db38e-e335-46a8-9d53-d811d3f1b90d&v=default&b=&from_search=2 (Folie 6)
  37. Geklaut: Folie 19 (http://de.slideshare.net/JarrodOverson/complexity-28214103?qid=597db38e-e335-46a8-9d53-d811d3f1b90d&v=default&b=&from_search=2)
  38. Geklaut von http://manuel-pichler.de/stuff/slides/2009-09-12-phpunconf-softwaremetriken-verstehen-und-nutzen.pdf (Folie 4)
  39. Geklaut: http://manuel-pichler.de/stuff/slides/2009-09-12-phpunconf-softwaremetriken-verstehen-und-nutzen.pdf
  40. Geklaut: http://manuel-pichler.de/stuff/slides/2009-09-12-phpunconf-softwaremetriken-verstehen-und-nutzen.pdf http://jmikola.github.io/slides/beautiful_measurable_software/#/14/3
  41. Geklaut: http://manuel-pichler.de/stuff/slides/2009-09-12-phpunconf-softwaremetriken-verstehen-und-nutzen.pdf http://jmikola.github.io/slides/beautiful_measurable_software/#/14/3
  42. Geklaut: http://manuel-pichler.de/stuff/slides/2009-09-12-phpunconf-softwaremetriken-verstehen-und-nutzen.pdf
  43. Zitat von S. 11 von dem Object Oriented metrics buch
  44. Geklaut: http://jmikola.github.io/slides/beautiful_measurable_software/#/23/1
  45. Geklaut: http://de.slideshare.net/proofek/magic-behind-the-numbers-software-metrics-in-practice-11308143 (Folie 71)
  46. Geklaut: http://de.slideshare.net/ircmaxell/development-by-the-numbers-confoo
  47. Geklaut: http://de.slideshare.net/heavysixer/code-quality-29610071?qid=597db38e-e335-46a8-9d53-d811d3f1b90d&v=default&b=&from_search=6
  48. Geklaut: http://de.slideshare.net/heavysixer/code-quality-29610071?qid=597db38e-e335-46a8-9d53-d811d3f1b90d&v=default&b=&from_search=6
  49. Geklaut: http://de.slideshare.net/heavysixer/code-quality-29610071?qid=597db38e-e335-46a8-9d53-d811d3f1b90d&v=default&b=&from_search=6
  50. Geklaut: http://de.slideshare.net/heavysixer/code-quality-29610071?qid=597db38e-e335-46a8-9d53-d811d3f1b90d&v=default&b=&from_search=6
  51. Geklaut: http://de.slideshare.net/heavysixer/code-quality-29610071?qid=597db38e-e335-46a8-9d53-d811d3f1b90d&v=default&b=&from_search=6
  52. Geklaut: http://de.slideshare.net/heavysixer/code-quality-29610071?qid=597db38e-e335-46a8-9d53-d811d3f1b90d&v=default&b=&from_search=6
  53. Geklaut: http://de.slideshare.net/kiwankang76/code-metrics-32380341?qid=597db38e-e335-46a8-9d53-d811d3f1b90d&v=qf1&b=&from_search=36