24
e-movimento Software Design & Beratung GmbH 1030 Wien Marxergasse 7/26 www.e-movimento.com Mastering Architecture-, Design- and Code-Quality Unkonventionelle Ansätze zur Produktivitätssteigerung

Mastering architecture, design- and code-quality

Embed Size (px)

DESCRIPTION

"Unkonventionelle" Ideen zur dramatischen Steigerung der Produktivität von Softwareentwicklungsprojekten. Wieviel Produktivität bringt mir hohe Qualität? Wie die Qualität steigern? Wie die Qualität sichern? Wie Fehler von vornherein vermeiden? Vorstellung einiger unkonventioneller Ansätze wie: Besseres Verständnis durch weniger Dokumentation, bessere Qualität durch weniger Tests, schnellere Entwicklung durch mehr broken Builds

Citation preview

Page 1: Mastering architecture, design- and code-quality

e-movimento Software Design & Beratung GmbH

1030 Wien ● Marxergasse 7/26 ► www.e-movimento.com

Mastering Architecture-, Design- and

Code-Quality

Unkonventionelle Ansätze zur

Produktivitätssteigerung

Page 2: Mastering architecture, design- and code-quality

Vorstellung

Name: DI Sebastian Dietrich

Tätigkeiten:

Java-Softwareentwickler & Softwarearchitekt

Lead-Developer, Scrum-Master

Berater, Trainer

Überzeugungen & Leidenschaften:

Technische Qualität Produktivität

Praxiserfahrung & theoretischer Background

Agile Softwareentwicklung, Java, Android, Wikipedia

Kontakt:

mailto://[email protected]

http://managing-java.blogspot.co.at

http://de.wikipedia.org/wiki/Benutzer:Sebastian.Dietrich

► www.e-movimento.com, Sebastian Dietrich

2

Page 3: Mastering architecture, design- and code-quality

Technische Qualität vs. Produktivität

Frage:

Wieviel Zeit kostet hohe

technische Qualität in der

Softwareentwicklung?

Wieviel Zeit bringt hohe

technische Qualität in der

Wartungsphase?

Antwort: Die Frage ist falsch:

Wartung beginnt mit der Analyse

Technische Qualität spart (auch

während der Entwicklung) Zeit ein.

Richtige Frage:

Wieviel Zeit/Geld/Kunden kostet uns schlechte technische Qualität?

► www.e-movimento.com, Sebastian Dietrich

3

[DeMarco 82]

7%

67%

13%

5%

8%

Analyse

Design

Codierung

Testen

Wartung

Page 4: Mastering architecture, design- and code-quality

7%

67%

13%

5%

8%

Analyse

Design

Codierung

Testen

Wartung

7%

13%

5%

6%

53%

16%

Analyse

Design

Codierung

Testen

Wartung

Ersparnis

Kosten schlechter technischer Qualität = „Technische Schuld“

Technische Schuld =

„Zusätzlicher Aufwand, den man für

Änderungen und Erweiterungen an

schlecht geschriebener Software im

Vergleich zu gut geschriebener Software

einplanen muss.“

Kosten Technischer Schuld:

+ 5-10% Entwicklungsaufwand

+ 20-40% Test &

Fehlerbehebungsaufwand

+ 20% Wartungsaufwand

+ verlorene Umsätze & Kunden

[McConnel 2003], [Wiegers 2002], [Jones 2000],

[Gilb and Graham 1993], [Humphrey 1998],

[Fagan 1976]

► www.e-movimento.com, Sebastian Dietrich

4

[DeMarco 82]

Page 5: Mastering architecture, design- and code-quality

Technische Schuld Warum unkonventionelle Ansätze?

Personelle Ansätze:

„Bessere Entwickler“

„Bessere QS-Tools“

„Mehr Zeit für QS“

„Bessere PMs“

Klassische Ansätze:

Code-reviews

Statische Code-Analyse

„moderne“ Ansätze

Pair Programming

Test Driven Development

► www.e-movimento.com, Sebastian Dietrich

5

Hochsprung, Olympische Spiele 1928

„mo

re o

f th

e s

am

e“

„unkonventionell“

Page 6: Mastering architecture, design- and code-quality

Unkonventionelle Ansätze In der Architektur

► www.e-movimento.com, Sebastian Dietrich

6

Stein

Betonfundament

Eisen Stahl

Stahlbeton

Industrielle Fertigung (1-6 Jahre)

Page 7: Mastering architecture, design- and code-quality

Unkonventioneller Ansatz #1: „Arbeite professionell“

Frage: Wer ist Anfänger - Junior, wer ist Senior - Experte?

► www.e-movimento.com, Sebastian Dietrich

7

Page 8: Mastering architecture, design- and code-quality

Unkonventioneller Ansatz #1: „Arbeite professionell“

Traurige Realität in der Informatik:

► www.e-movimento.com, Sebastian Dietrich

8

Page 9: Mastering architecture, design- and code-quality

„Arbeite professionell“ Forderungen an professionelle Entwickler

Software Professionalism:

We will not ship shit

We will always be ready

Stable productivity

Inexpensive adaptability

Continuous improvement

Fearless competence

Extreme quality

QA will find nothing

We cover for each other

Honest estimates

Say „No“

Automation

Continuous Aggressive Learning

Mentoring

► www.e-movimento.com, Sebastian Dietrich

9

Robert C. Martin:

„Demanding Professionalism

in Software Development“

http://www.youtube.com/watch?v=p0O1VVqRSK0

Page 10: Mastering architecture, design- and code-quality

„Arbeite professionell“ Konsequenzen für professionelle Entwickler

1. Frage nicht, tue es!

Jesuitenprinzip nach Dave Burns:

„Um Verzeihung bitten ist einfacher,

als um Erlaubnis zu fragen“

Ein Professionist fragt nicht, ob er

professionell arbeiten darf!

2. Ignoriere diesbezüglich Projektleiter!

Projektleiter sind Projektleiter & keine

Nachhilfelehrer

Einmischung in Arbeitsweise =

Micromanagement = Antithese zu

Projektleitung

3. Ignoriere diesbezüglich Kunden!

Kunden sind nicht für das „wie“ verantwortlich

► www.e-movimento.com, Sebastian Dietrich

10

CCD Armbänder

Konsequenz genug?

Page 11: Mastering architecture, design- and code-quality

Typische Projektdokumente:

Warum dokumentieren wir?

Reflexion, Kommunikation, Absicherung

Dokumentation Warum dokumentieren wir?

► www.e-movimento.com, Sebastian Dietrich

11

Lastenheft

Pflichtenheft Funktionale Spezifikation

Nicht-Funktionale Spezifikation

Usecases

Stories

Objektmodelle Projektauftrag

Projektplanung Projektumweltanalyse

Projektrisikoanalsye

Projektfortschrittsbericht

Projekttagebuch

Projektstrukturplan

UML-Diagramme

Glossar Schnittstellendefinition

Architekturbeschreibung

Datenbankmodell

Code-Kommentare

Javadoc ToDos, FIXMEs, XXX

Tasks

Code-Reviews

CheckIn Kommentare

Schnittstellenbeschreibungen

Testpläne

Testdesign-Spezifikation

Testfälle

Testlog

Testabschlussberichte

Bug-Reports

Feature-Requests

Benutzerhandbücher

Anwender-Tutorials

Abnahmeprotokolle

Installationshandbuch

Betriebshandbuch

Projektabschlussbericht

Stundenlisten

Projektrollendefinition

Projektzieldefinition Arbeitspaketspezifikation

To-Do-Listen Meetingprotokolle

Meetingagenden

Projektfunktionendiagramm

Page 12: Mastering architecture, design- and code-quality

Dokumentation Nachteile von Dokumentation

Dokumentation ist sauteuer:

Kommerzielle Softwareprojekte:

28 - 66 Seiten / KLOC [Jones 99], [Boehm 88]

Typisches großes Softwareprojekt:

100 Personenjahre Entwicklung ~1.000 KLOC

~ 28.000 – 66.000 Seiten Dokumentation

~ 10 - 40 Personenjahre Dokumentation

Üblicherweise gilt:

Dokumentationskosten > Codierungskosten

Nachteile von Dokumentation:

Dokumentation ist immer veraltet

Dokumentation ist kaum auffindbar

Dokumentation wird meist nicht gelesen

► www.e-movimento.com, Sebastian Dietrich

12

Page 13: Mastering architecture, design- and code-quality

Unkonventioneller Ansatz #2: „Dokumentiere nichts – kommuniziere lieber“

► www.e-movimento.com, Sebastian Dietrich

13

Warum dokumentieren wir?

Reflexion, Kommunikation, Absicherung

Dafür gibt es geeignetere Techniken:

Brainstormings, Analyse-Sessions, CRC-Cards, Prototypen, …

echte face2face Kommunikation, Mentoring, Pair-Programming, …

Vertrauen, Collective Ownership, Tests,

Beispiel Code-Dokumentation: //fill Person from Database via Reflection

Object personFromDB = loadFromDB(id);

BeanUtils.copyProperties(person, personFromDB);

...

Warum nicht (Programming by Intention)?: fillPersonFromDatabase(person, id);

...

Page 14: Mastering architecture, design- and code-quality

„Dokumentiere nichts – kommuniziere lieber“ Beispiel JavaDoc

Beispiel (Klasse Mitarbeiter):

...

/**

* Sets the name of this person.

* @param name the name of this person

* @exception IllegalArgumentException

* when name is shorter than 3 characters

*/

public void setFirstName(String name) {

if (name.length <= 3)

throw new IllegalArgumentException();

...

Alternative (via BeanValidation 1.1):

public void setFirstName(@NotNull @Size(min=4) firstName) {

...

► www.e-movimento.com, Sebastian Dietrich

14

Page 15: Mastering architecture, design- and code-quality

„Dokumentiere nichts – kommuniziere lieber“ Konsequenzen für Entwickler

Erkenntnis:

Dokumentation ist sauteuer und bringt wenig

Es gibt bessere & günstiger Möglichkeiten fürs

Reflektieren, Kommunizieren, Absichern

Konsequenzen:

Guter Code benötigt keine Kommentare

Code Kommentare sind immer ein Smell &

Zeichen für zu hohe Komplexität [Fowler 99]

Schreibe Code der kommuniziert

Lesbarer Code, geringe Komplexität, kurze

Methoden, Programming by Intention

Gutes Design benötigt kein Javadoc

Signatur der Methoden ist Teil des Designs,

Javadoc ist nicht Teil der Signatur

► www.e-movimento.com, Sebastian Dietrich

15

Page 16: Mastering architecture, design- and code-quality

Testen Warum testen wir?

Warum testen wir?

Warum schreiben wir Unit-Test?

Warum schreiben wir

Integrationstests?

Warum schreiben wir Testfälle?

Warum führen wir Testfälle durch?

Um Kosten zu reduzieren

Entwicklungskosten, Wartungskosten

Fehlerbehebungskosten

Imagekosten

Wieviel darf uns daher der Test

kosten?

► www.e-movimento.com, Sebastian Dietrich

16

Performancetests

Securitytests

Penetrationtests

Integrationstests

Systemtests

Loadtests

Abnahmetests

Usablity Test

Unit-Tests

Lasttests

Regressiontests

Fehlertests

Schnittstellentests

Installationstests

Crashtests

Smoketests

Stresstests

Page 17: Mastering architecture, design- and code-quality

Systemtest Kosten – Nutzen Rechnung

Kosten Nutzen

Systemtestaufwand:

~ 1 PT / Testfall

Systemtest findet

~ 1 Fehler / Testfall

Fehlerbehebungsaufwand:

~ 1PT / Fehler

(10x wie während Entwicklung)

Je behobener Fehler:

0,5 – 0,8 neue (unentdeckte)

Fehler

80 – 150%

der Entwicklungskosten

Systemtest findet

max. 25 – 55% der Fehler

Systemtest:

Teststufe, bei der das gesamte System

gegen die gesamten Anforderungen getestet wird.

► www.e-movimento.com, Sebastian Dietrich

17

[Jones 86], [Jones 96a], [Jones 96b], [Shull 02], [McConnell 04]

Page 18: Mastering architecture, design- and code-quality

Unittest Kosten – Nutzen Rechnung

Kosten Nutzen

Unit-Testaufwand:

~ 2-3x Entwicklungsaufwand

„Code Coverage“ ?

„Refactoring“ ?

Fehlerbehebungsaufwand:

~ 1h / Fehler

(1/10 wie während Test)

Je behobener Fehler:

0,5 – 0,8 neue (unentdeckte)

Fehler

~ 50% der Entwicklungskosten Unit-Test findet

max. 15 – 70% der Fehler

Unit-Tests:

Teststufe, bei der funktionale Einzelteile (Module)

auf korrekte Funktionalität geprüft werden.

► www.e-movimento.com, Sebastian Dietrich

18

[Jones 01], [Humphrey 89], [Software Metrics 01]

Page 19: Mastering architecture, design- and code-quality

Unittests Warum gute Unittests so teuer sind

Gute Unittests (gilt auch für TDD):

Haben Assertions (die den Vertrag der Methoden testen):

Vorbedingungen (typische / untypische / extreme / unerlaubte)

Nachbedingungen (Rückgabewerte & Exceptions, State-Änderungen)

Invarianten (was sich nicht ändern darf)

Haben 100% Assertion-Coverage (Code-Coverage ist unwichtig)

Testen Units (& mocken Referenzen auf andere Units weg)

Berücksichtigen State (Quasimodale & Modale Klassen) und

Reihenfolge der Methodenaufrufe (Unimodale & Modale Klassen)

Hinterlassen das System, wie sie es vorgefunden haben

Laufen daher in beliebiger Reihenfolge

Sind Refactoring-Safe

Testen auch das Design (z.B. Liskovsches Substitutionsprinzip)

Laufen auf dem CI Server & geben rasches Feedback (< 1 min.)

► www.e-movimento.com, Sebastian Dietrich

19

Page 20: Mastering architecture, design- and code-quality

Unkonventioneller Ansatz #3: „Teste nichts – verhindere Fehler“

Wie technische Fehler verhindern?

Test Driven Development:

Designe mittels Tests

Keine weiteren Unit-Tests &

Integrationstests mehr nötig

Reduziere State & Abhängigkeiten auf

das absolut notwendigste

Wie fachliche Fehler verhindern?

Behavior Driven Development:

Analyse mittels Tests

Keine Systemtests und

Abnahmetests mehr nötig

Entwicklung (& TDD) wesentlich

einfacher & weniger Aufwand

► www.e-movimento.com, Sebastian Dietrich

20

Moskitonetz –

Verhindert Bugs

Page 21: Mastering architecture, design- and code-quality

„Teste nichts – verhindere Fehler“ Konsequenzen für Entwickler

Erkenntnis:

Testen ist sauteuer und bringt wenig

Es gibt bessere & günstiger Möglichkeiten um

Fehler zu verhindern

Konsequenzen:

Bestehe auf BDD Analysen (in Gherkin)

Schreibe Steps die gegen die BL testen

Definiere die Schnittstellen mittels TDD

Designe ein GUI ohne jedweder Logik

„QA will find nothing“

Konsequenzen für Tester:

Lerne Gherkin und werde Analytiker

► www.e-movimento.com, Sebastian Dietrich

21

Page 22: Mastering architecture, design- and code-quality

Continuous Integration Warum machen wir Continuous Integration?

Warum?

Geringerer Integrationsaufwand

Automatische QS auf CI-Server

(vs. „Runs on my Machine“)

Was testen die Tests am CI-Server?

Unit-Tests?

Integrationstests?

Systemtests = BDD Szenarien?

Technische Qualität?

Was, wenn die technische

Qualität nicht passt?

Wir nehmen Technische Schuld auf

► www.e-movimento.com, Sebastian Dietrich

22

Page 23: Mastering architecture, design- and code-quality

Unkonventioneller Ansatz #4: „Brich den Build – und nimm keine technische Schulden auf“

Brich den Build auch wenn die

technische Qualität nicht passt:

Architektur

Architekturverletzungen

Zyklen

Technisches Design:

Doppelter & Toter Code

Verletzung OO Designprinzipien

Wenn der Code nicht passts

Naming & Coding-Conventions

Code-Smells, mögliche Bugs

Komplexität

Wenn der Trend nicht passt

Metriken

► www.e-movimento.com, Sebastian Dietrich

23

PMD CPD

Checkstyle Sonargraph

Sotograph

Simian

JDepend

NDepend

Macker

FindBugs

Lint

CppCheck

FXCop

Axivion

NCSS

CMT

UCDetector

CRAP

Sonar Build Breaker Plugin

Page 24: Mastering architecture, design- and code-quality

► www.e-movimento.com, Sebastian Dietrich

24

Vielen Dank für Ihre Aufmerksamkeit!

Q&A [Sebastian Dietrich]

[email protected]

http://managing-java.blogspot.com