-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
199 lines (188 loc) · 7.85 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
<html>
<head>
<link rel="stylesheet" href="css/reveal.css">
<link rel="stylesheet" href="css/theme/league.css" id="theme">
</head>
<script>
if( window.location.search.match( /print-pdf/gi ) ) {
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = 'pdf.css'; // Notice: I changed the path
document.getElementsByTagName( 'head' )[0].appendChild( link );
}
</script>
<body>
<div class="reveal">
<div class="slides">
<!-- section data-background="src/bg2.jpg" -->
<section>
<h1>Reclaim Your Architecture!</h1>
<p>Tools und Techniken um deine Software Architektur zurück zu erobern!</p>
</section>
<section data-background="src/uhr.jpg">
<ul>
<li class="fragment">Begriffsdefinition</li>
<li class="fragment">Die Feinde der Architektur</li>
<li class="fragment">Unsere Waffen (aka Tools und Techniken)</li>
<li class="fragment">Beispiele und Code</li>
</ul>
</section>
<section>
<p>Rational Unified Process, 1999</p>
<blockquote cite="http://www.sei.cmu.edu/architecture/start/glossary/classicdefs.cfm">“the highest level concept of a system in its environment. The architecture of a software system (at a given point in time) is its <span class="fragment highlight-blue">organization or structure of significant components interacting through interfaces</span>, those components being composed of successively smaller components and interfaces“</blockquote>
</section>
<section>
<p>Martin Fowler, 2003</p>
<blockquote cite="http://martinfowler.com/ieeeSoftware/whoNeedsArchitect.pdf">“Stuff that's hard to change later“</blockquote>
</section>
<section>
<section>
<h1>Know your enemy!</h1>
</section>
<section>
<p>Technische Schuld</p>
<blockquote>“doing things the <span class="fragment highlight-blue" data-fragment-index="1">quick and dirty</span> way sets us up with a <span class="fragment highlight-blue" data-fragment-index="1">technical debt</span>, which is similar to a financial debt. Like a financial debt, the technical debt incurs <span class="fragment highlight-blue" data-fragment-index="2">interest payments</span>, which come in the form of the <span class="fragment highlight-blue" data-fragment-index="2">extra effort</span> that we have to do in future development because of the quick and dirty design choice.“</blockquote>
<p class="fragment">Bewußte Entscheidung!</p>
</section>
<section>
<p class="fragment highlight-blue" data-fragment-index="2">Entropie (phys.)</p>
<blockquote>“Tendenz in der unbelebten Welt zu immer größerer Unordnung.“</blockquote>
<p class="fragment" data-fragment-index="1">Unbewußte Entwicklung!</p>
</section>
</section>
<section>
<section>
<h1>Symptome der Entropie</h1>
</section>
<section data-transition="fade" data-transition-speed="slow">
<h2>Schlecht zu warten</h2>
<aside class="notes">Änderungen an einer Stelle im System, ziehen Änderungen an vielen anderen Stellen nach sich.</aside>
</section>
<section data-transition="fade" data-transition-speed="slow">
<h2>Schwer zu erweitern</h2>
<aside class="notes">Flexible Architektur sollte Open-Closed sein. Viele Abhängigkeiten entstehen durch fehlende Abstraktion und durch viele Abhängigkeiten ist ein System schwer zu erweitern.</aside>
</section>
<section data-transition="fade" data-transition-speed="slow">
<h2>Mangelnde Wiederverwendbarkeit</h2>
<aside class="notes">Eine hohe Zahl an Abhängigkeiten zwischen Packages senken die Wahrscheinlichkeit zum Reuse.</aside>
</section>
<section data-transition="fade" data-transition-speed="slow">
<h2>Schwer zu testen</h2>
<aside class="notes">Fehlende Abstraktion erschwert die Testbarkeit, da es zu komplex wird.</aside>
</section>
<section data-transition="fade" data-transition-speed="slow">
<h2>Zunehmende Unverständlichkeit</h2>
</section>
</section>
<section>
<section>
<h1>Ursachen</h1>
</section>
<section>
<h2>Zirkuläre Abhängigkeiten</h2>
<p>Zwischen Klasse, Packages, Modulen etc.</p>
<img src="src/circular.png"/>
</section>
<section>
<h2>Fehlende Abstraktion</h2>
<p>Klassen, Packages, Module haben sehr viele Abhängigkeiten</p>
<img src="src/abstraktion.png"/>
</section>
<section>
<h2>Keine oder mangelhafte Umsetzung von Architekturregeln</h2>
<p>Unerlaubte Abhängigkeiten</p>
<img src="src/architektur.png"/>
</section>
<section>
<h2>Niedrige Kohäsion, hohe Kopplung</h2>
<p>Kohäsion bezeichnet den Zusammenhalt innerhalb einer Komponente, Kopplung die äußere Bindung</p>
<img src="src/coupling.jpg"/>
</section>
<section>
<h2>Code smells</h2>
<p>Zyklomatische Komplexität, Duplizierter Code, Große Klassen / Methoden, ...</p>
<img src="src/yoda.jpg"/>
</section>
</section>
<section data-background="src/gloves.jpg">
<h1>Fight back!</h1>
</section>
<section>
<section>
<h2>Schritt 1: Bestandsaufnahme</h2>
<blockquote>“If you can't measure it, you can't manage it.“</blockquote>
</section>
<section>
<ul>
<li>Bestehende Architektur ermitteln</li>
<li class="fragment">Dependency Structure Matrix (DSM) Analyse</li>
<li class="fragment">Zirkuläre Abhängigkeiten aufdecken</li>
<li class="fragment">Metriken sammeln</li>
</ul>
</section>
<section>
<img src="src/wtf.png"/>
</section>
</section>
<section>
<section>
<h2>Schritt 2: Definition der Zielparameter</h2>
</section>
<section>
<ul>
<li>Zielarchitektur bestimmen</li>
<li class="fragment">Ziel-Code-Coverage definieren</li>
<li class="fragment">Realistische Boundaries für Metriken definieren</li>
</ul>
</section>
</section>
<section>
<section>
<h2>Schritt 3: Zielparameter kontinuierlich überprüfen</h2>
</section>
<section>
<ul>
<li>Degraph (oder JDepend)</li>
<li class="fragment">Jenkins + SonarQube</li>
<li class="fragment">Structure101</li>
</ul>
</section>
</section>
<section>
<h2>Links und weiterführende Informationen</h2>
<ul>
<li>http://schauder.github.io/degraph/</li>
<li>http://docs.sonarqube.org/display/HOME/Spaghetti+Design</li>
<li>http://erik.doernenburg.com/2010/04/dependency-structure-matrix/</li>
<li>http://www.ndepend.com/docs/dependency-structure-matrix-dsm</li>
<li>http://structure101.com/resources/</li>
<li>http://www.martinfowler.com/ieeeSoftware/coupling.pdf</li>
<li>Java Application Architecture, Kirk Knoernschild</li>
</ul>
</section>
</div>
</div>
<script src="js/reveal.js"></script>
<script src="js/head.min.js"></script>
<script>
Reveal.initialize({
dependencies: [
// Zoom in and out with Alt+click
{ src: 'plugin/zoom-js/zoom.js', async: true },
// Speaker notes
{ src: 'plugin/notes/notes.js', async: true }
]
});
Reveal.addEventListener( 'slidechanged', function( event ) {
// event.previousSlide, event.currentSlide, event.indexh, event.indexv
//if(event.indexh >= 4) {
// document.getElementById('theme').setAttribute('href','css/theme/blood.css');
//}
//else {
// document.getElementById('theme').setAttribute('href','css/theme/league.css');
//}
} );
</script>
</body>
</html>