SlideShare ist ein Scribd-Unternehmen logo
Korrekte nebenläufige
Anwendungen mit
Koroutinen und TDD
Jörn Dinkla
1
Jörn Dinkla
● Entwickler und Berater
● Tech-Lead
● Vorträge und Artikel
jdinkla@thoughtworks.com
www.dinkla.net
2
https://github.com/jdinkla/2022_kkon
Das Problem
3
https://labs.openai.com/s/TC1Z805W2DgU2wHslIKDlDN9
“Was passiert,
wenn ich den Code
ändere?
Mir wird ganz
mulmig …”
Die Lösung
Koroutinen
und TDD
4
https://labs.openai.com/s/HYxmSVqguyiJslXMnT4GAtVo
“Sauberer und
änderbarer Code
der funktioniert”
Test driven development (TDD)
Geniale Idee
● Spezifikation des Verhaltens
● Automatisierte Überprüfung
Positive Effekte
● Schnelles Feedback
● “Embrace Change”
● Refaktorisieren ohne Stress
5
Automatisierte Tests
machen glücklich
6
Wirtschaftlicher Erfolg &
Entwicklerzufriedenheit
https://labs.openai.com/s/bHLWUoIHoksiCflksmryBZbm
Testpyramide
Tests sind unterschiedlich isoliert
7
TDD-Mantra für Unit-Tests
Rot
Schreibe einen Test und lasse ihn laufen (er ist rot)
Grün
Schreibe einfachsten Code, um ihn grün zu machen
Refaktorisiere
Z. B. Pattern, Clean Code, Performance, etc.
8
Beispiel für einfachen Test
9
Arrange
Act
Assert
Starten
https://kotest.io/ https://plugins.jetbrains.com/plugin/14080-kotest
Grün!
10
Der Test ist grün!
“Value Object”
Pattern
TDD ist also ganz einfach … ;-)
Dieses Beispiel ist einfach, denn …
● Rein funktional
● Keine Seiteneffekte, keine Exceptions, kein Zustand
Ist alles auf einfache Fälle reduzierbar?
11
Wichtig: Reine
Funktionen sind
einfach zu testen!
Art
#1
Und die Theorie …
12
https://labs.openai.com/s/WvacZqF8Ld7KSWRnHBg94hC8
Drei Arten des Testens
1. Ausgabe-basiert
2. Zustand-basiert
3. Kommunikations-basiert
13
“Shift up”
Funktional, “Immutable”, parallelisierbar
Vorsicht: Sichtbarkeit des Zustands, Thread-Safety
Kollaboration mit “Mocks” Drei
Arten
Ideal: Funktionale Architektur
1. Funktionaler Kern
Maximiere rein funktionalen Code (“immutable”)
Business-Logik, Domänen-Modell
Thread-Safe, einfach zu testen
2. “Mutable Shell”
Minimiere Seiteneffekte und Aktionen
14
Koroutinen
15
https://labs.openai.com/s/5UVRVYZ5Zsz6JY08odXrN19j
launch: “fire and forget”
Hello World mit Koroutinen
16
Hello
World
Structured Concurrency mit CoroutineScope
● launch {} erstellt Job
● Hierarchische Organisation
○ Wartet auf Beendigung aller Kinder
● Hat CoroutineContext
○ werden vererbt
○ “Dispatcher”
○ Thread-Pool
17
Job
Child
Child
…
https://kotlinlang.org/docs/coroutine-context-and-dispatchers.html
Hello World mit Zeitmessung und Sync
18
Fork
Join
JVM
Mehrere Jobs
19
5 mal
Suspension
point
Was ist mit sleep?
20
Kein
Suspension
point
non-blocking + blocking = blocking
Kooperatives Multitasking
suspend kennzeichnet
unterbrechbare und nicht-blockierende Funktionen
Geben freiwillig Kontrolle an Dispatcher ab, der andere
Koroutine aufrufen kann.
21
vs. präemptives Multitasking
Koroutinen sind Seiteneffekte
Koroutinen geben an
“wie” etwas berechnet wird, nicht “was”
Gegenteil der “deklarativen Programmierung”
Arrow benutzt unterbrechbare Funktionen als IO-Monade
Koroutinen in die “mutable Shell”!!!
22
https://en.wikipedia.org/wiki/Declarative_programming https://arrow-kt.io/docs/effects/io/
Eine Million Koroutinen ….
23
Suspension
point
Wie können
Koroutinen
getestet werden?
24
https://labs.openai.com/s/91GM4SYZZcdZNgNOoTmt2aZg
Testbarkeit herstellen
25
Eigene Funktion
Wie lange dauert der
Test? Unit-Tests sollten
schnell sein!
Wie soll man
Seiteneffekte testen?
Wichtig: TDD
erfordert modularen
Code, weil man
Abhängigkeiten
isolieren will
Echte und virtuelle Zeit
26
Virtuelle Zeit
Echtzeit
kotlinx-coroutines-test
Testbar machen durch Refaktorisieren
27
Seiteneffekte zu
“Effekten” machen
Synchronisation
zwischen Koroutinen
Hello
World
Channels
● Synchronisation zwischen m:n Koroutinen
● “Exactly once”, kein Publish-Subscribe möglich
28
https://play.kotlinlang.org/hands-on/Introduction%20to%20Coroutines%20and%20Channels/08_Channels
Der Test
29
Channel
List-Matcher
Virtuelle Zeit
Art
#2
Seiteneffekte zu “Effekten” machen
30
Wichtig: Bei Seiteneffekten
muss die Testbarkeit erst
hergestellt werden
Asynchrone APIs
31
https://labs.openai.com/s/axrhLWpEhpVV5bwLAXl9jCTb
SWAPI - The Star Wars API
{
"name": "Luke Skywalker",
"height": "172",
"mass": "77",
…
"films": [
"https://swapi.dev/api/films/1/",
"https://swapi.dev/api/films/2/",
"https://swapi.dev/api/films/3/",
"https://swapi.dev/api/films/6/"
],
…
}
32
https://swapi.dev/api/people/1/
Ein Aufruf für Luke
und
weitere Aufrufe für die
Filme
Paradebeispiel für
Asynchronität
Sequentielle
Implementierung ist
langsam
Domänenmodell
kotlinx.serialization
33
{
"name": "Luke Skywalker",
"height": "172",
"mass": "77",
…
"films": [
"https://swapi.dev/api/films/1/",
"https://swapi.dev/api/films/2/",
"https://swapi.dev/api/films/3/",
"https://swapi.dev/api/films/6/"
],
…
}
Test schreiben
34
Einfachste Lösung
Fassade für Http-Client
35
https://ktor.io/
Suspension
point
Nicht den Client testen!
36
Der Unit-Test sollte nicht vom
Internet abhängen!
Mocking mit mockk
“to mock” - etwas vortäuschen
Fokus auf “System under Test” (SUT)
Vorteile:
● Isolation
● Geschwindigkeit
● Reproduzierbarkeit
37
https://mockk.io
JVM
mockk<Client>()
38
https://mockk.io/
Der Mock wird zum Driver …
39
Muss aufgerufen
worden sein!
Ping - Pong ….
40
Einfachste
Implementierung
Neuer Fehler
Ping - Pong …
41
Muss Namen aus dto
verwenden
Verhalten definieren
Ping - Pong ….
42
Wichtig: Mocks bringen
enge Kopplung zwischen
Code und Test
Art
#3
… und der Unit-Test
43
Der “Happy Path”
Art
#3
Implementierung
44
Koroutinen?
Fork
Join
Geringer
Aufwand
Durch Kapselung nach
Außen nicht sichtbar!
Wie testen?
I. Korrektheit
II. Terminierung, Deadlock-Freiheit, Thread-Safety
III. Operativer Teil
Wie bei sequentiellem Code
Asynchronität der Koroutinen?
Structured Concurrency, Channel, Flow
Was sollte bei Nebenläufigkeit getestet werden?
45
Performance-Test?
kotlinx-coroutines-debug
46
https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-debug/
JVM
Kein
Testing-Tool
Trennung von Fork und Join
47
Fork
Join
Flows und
Reaktive
Programmierung
48
https://labs.openai.com/s/qi8SvDgsRWF9mAQeu7cP6qEL
Flows
49
Werte werden Schritt
für Schritt ermittelt
Operation auf Flow
Testen von Flows
Producer und Consumer
getrennt testen
Turbine-Hilfsbibliothek
https://github.com/cashapp/turbine
50
https://developer.android.com/kotlin/flow/test
“StepVerifier”
Exceptions und
Cancellation
51
https://labs.openai.com/s/YWEG72mbfHYE9PHcB8LGQj8c
Exception-Handling
52
Äußeres “catch”
Jedes “catch”
Assertions für Exceptions
Weitere: shouldThrowExactly, shouldThrowAny
53
launch erstellt Job
async erstellt Deferred<T> (erbt von Job)
Lebenszyklus eines Jobs
54
Cancelling
Completed
Cancelled
New Active Completing
start complete finish
finish
cancel fail
Cancellation als CancellationException
55
Job -
Sichtbarkeit …
Ermöglicht …
Status-Checks
Art
#2
Vortrag
56
Testen von UIs
57
https://labs.openai.com/s/aeof4voND2NgKnKHEpV9rDo9
UIs haben einen Main-Thread
Der Main-Thread
● stellt UI-Elemente dar (“zeichnet Bildschirm”)
● wenn blockiert, friert Bildschirm ein
Daher: Netzwerk-Requests als Koroutinen!
58
https://developer.android.com/kotlin/coroutines/test
Koroutinen mit Swing
App bleibt responsiv, weil der Zähler main-safe ist.
59
Start &
Stop
Thread-Confinement mit Dispatchers.Swing
Aus meinen Folien vom KKON Warmup 2021
60
https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-swing/
Nicht
testbar!
Extraktion in Klasse und Test
61
Virtuelle
Zeit
https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/
Kein UI
Testbarkeit durch Trennung von UI und Logik
62
Android
Model, View, ViewModel (MVVM)
ViewModel, Lifecycle, LiveData unterstützen Koroutinen
63
https://developer.android.com/kotlin/coroutines https://developer.android.com/topic/libraries/architecture/coroutines
Verschiedenes
64
https://labs.openai.com/s/1rwBlLVHQ3HsHioh4sRu5egx
kotest hat Matcher für Channels
65
https://kotest.io/docs/assertions/core-matchers.html
Art
#2
JVM
Android Matchers von kotest
66
https://kotest.io/docs/assertions/android-matchers.html
Data-Driven Testing
67
https://kotest.io/docs/framework/datatesting/data-driven-testing.html
Nichtdeterminismus und Zeitabhängigkeit
● eventually
● continually
● until
● retry
68
Aktoren: Koroutine + Channel
69
Was gibt es noch?
● Dispatchers.IO, Dispatchers.Default,
Dispatchers.Unconfined
● TestDispatcher https://developer.android.com/kotlin/coroutines/test#testdispatchers
● TimeOuts als TimeoutCancellationException
● withContext
● Mutex, Semaphore, select
● SupervisorJob
● SharedFlow, StateFlow
70
Fazit
71
https://labs.openai.com/s/sReDk7uBWkK9Bw6LL5ypCJ3k
Sorgenfreie nebenläufige Softwareentwicklung
Koroutinen
erlauben elegante Formulierung
Testgetriebene Entwicklung (TDD)
Sicherheit und schnelles Feedback
Funktionale Architektur
Erleichtert Testbarkeit und Wartbarkeit
72
Links
● Sourcecode https://github.com/jdinkla/2022_kkon
● Koroutinen https://kotlinlang.org/docs/coroutines-overview.html
● kotest https://kotest.io/
● mockk https://mockk.io/
● ktor https://ktor.io/
● kotlinx-coroutines-test
https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/
● kotlinx-coroutines-debug
https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-debug/
● SWAPI https://swapi.dev
73
Referenzen
Kent Beck. Extreme Programming explained.
Kent Beck. Test-Driven Development by Example.
Vladimir Khorikov. Unit Testing Principles, Practices, and
Patterns. Anm. verwendet C#
74
Q&A
75
https://labs.openai.com/s/yPF1QhC86bDbnFk7xZYpJTba
Vielen Dank
für Ihre
Aufmerksamkeit
Jörn Dinkla
jdinkla@thoughtworks.com
76
https://labs.openai.com/s/zMxI5JNIUL9YrQRMti13srla

Weitere ähnliche Inhalte

Ähnlich wie Korrekte nebenläufige Anwendungen mit Koroutinen und TDD

RPA 2024: Rollen, Lebenszyklus, Trends & Chancen
RPA 2024: Rollen, Lebenszyklus, Trends & ChancenRPA 2024: Rollen, Lebenszyklus, Trends & Chancen
RPA 2024: Rollen, Lebenszyklus, Trends & Chancen
FotiosKaramitsos
 
ROSIK Stammtisch „Clean Architecture“
ROSIK Stammtisch „Clean Architecture“ROSIK Stammtisch „Clean Architecture“
ROSIK Stammtisch „Clean Architecture“
QAware GmbH
 
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
Christian Mücke
 
Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)
Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)
Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)
Florian Wolters
 
Rails und Scrum in großen Projekten
Rails und Scrum in großen ProjektenRails und Scrum in großen Projekten
Rails und Scrum in großen Projekten
Phillip Oertel
 
Automatisiertes webauftritt testen
Automatisiertes webauftritt testenAutomatisiertes webauftritt testen
Automatisiertes webauftritt testen
mradamlacey
 
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
Christian Baranowski
 
DevDay 2016 Keynote - Die Evolution agiler Software Entwicklung
DevDay 2016 Keynote - Die Evolution agiler Software EntwicklungDevDay 2016 Keynote - Die Evolution agiler Software Entwicklung
DevDay 2016 Keynote - Die Evolution agiler Software Entwicklung
Marc Müller
 
Continuous Integration für PHP
Continuous Integration für PHPContinuous Integration für PHP
Continuous Integration für PHP
Sebastian Bauer
 
Continous Deployment - Schneller entwickeln
Continous Deployment - Schneller entwickelnContinous Deployment - Schneller entwickeln
Continous Deployment - Schneller entwickeln
Martin Seibert
 
objectiF extrem
objectiF extremobjectiF extrem
objectiF extrem
Olaf Lewitz
 
How to speed up Spring Integration Tests
How to speed up Spring Integration TestsHow to speed up Spring Integration Tests
How to speed up Spring Integration Tests
QAware GmbH
 
BED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerBED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als Entwickler
Patrick Baumgartner
 
Das funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPagesDas funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPages
Christian Güdemann
 
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
Odilo Oehmichen
 
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
Patrick Baumgartner
 
Iks Sonderdruck Eclipse Magazin Mai 2010: Automatisierte SWTBot-Tests
Iks Sonderdruck Eclipse Magazin Mai 2010: Automatisierte SWTBot-TestsIks Sonderdruck Eclipse Magazin Mai 2010: Automatisierte SWTBot-Tests
Iks Sonderdruck Eclipse Magazin Mai 2010: Automatisierte SWTBot-Tests
IKS Gesellschaft für Informations- und Kommunikationssysteme mbH
 
oVirt 3.5 - Einführung und Evaluierungsergebnisse
oVirt 3.5 - Einführung und EvaluierungsergebnisseoVirt 3.5 - Einführung und Evaluierungsergebnisse
oVirt 3.5 - Einführung und Evaluierungsergebnisse
inovex GmbH
 
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
Sebastian Springer
 
A Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragen
A Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragenA Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragen
A Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragen
Roland Ewald
 

Ähnlich wie Korrekte nebenläufige Anwendungen mit Koroutinen und TDD (20)

RPA 2024: Rollen, Lebenszyklus, Trends & Chancen
RPA 2024: Rollen, Lebenszyklus, Trends & ChancenRPA 2024: Rollen, Lebenszyklus, Trends & Chancen
RPA 2024: Rollen, Lebenszyklus, Trends & Chancen
 
ROSIK Stammtisch „Clean Architecture“
ROSIK Stammtisch „Clean Architecture“ROSIK Stammtisch „Clean Architecture“
ROSIK Stammtisch „Clean Architecture“
 
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
 
Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)
Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)
Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)
 
Rails und Scrum in großen Projekten
Rails und Scrum in großen ProjektenRails und Scrum in großen Projekten
Rails und Scrum in großen Projekten
 
Automatisiertes webauftritt testen
Automatisiertes webauftritt testenAutomatisiertes webauftritt testen
Automatisiertes webauftritt testen
 
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
 
DevDay 2016 Keynote - Die Evolution agiler Software Entwicklung
DevDay 2016 Keynote - Die Evolution agiler Software EntwicklungDevDay 2016 Keynote - Die Evolution agiler Software Entwicklung
DevDay 2016 Keynote - Die Evolution agiler Software Entwicklung
 
Continuous Integration für PHP
Continuous Integration für PHPContinuous Integration für PHP
Continuous Integration für PHP
 
Continous Deployment - Schneller entwickeln
Continous Deployment - Schneller entwickelnContinous Deployment - Schneller entwickeln
Continous Deployment - Schneller entwickeln
 
objectiF extrem
objectiF extremobjectiF extrem
objectiF extrem
 
How to speed up Spring Integration Tests
How to speed up Spring Integration TestsHow to speed up Spring Integration Tests
How to speed up Spring Integration Tests
 
BED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerBED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als Entwickler
 
Das funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPagesDas funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPages
 
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
 
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
 
Iks Sonderdruck Eclipse Magazin Mai 2010: Automatisierte SWTBot-Tests
Iks Sonderdruck Eclipse Magazin Mai 2010: Automatisierte SWTBot-TestsIks Sonderdruck Eclipse Magazin Mai 2010: Automatisierte SWTBot-Tests
Iks Sonderdruck Eclipse Magazin Mai 2010: Automatisierte SWTBot-Tests
 
oVirt 3.5 - Einführung und Evaluierungsergebnisse
oVirt 3.5 - Einführung und EvaluierungsergebnisseoVirt 3.5 - Einführung und Evaluierungsergebnisse
oVirt 3.5 - Einführung und Evaluierungsergebnisse
 
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
 
A Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragen
A Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragenA Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragen
A Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragen
 

Mehr von Jörn Dinkla

Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"
Jörn Dinkla
 
Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?
Jörn Dinkla
 
A short introduction to Kotlin
A short introduction to KotlinA short introduction to Kotlin
A short introduction to Kotlin
Jörn Dinkla
 
Concurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutinesConcurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutines
Jörn Dinkla
 
Nebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins KoroutinenNebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins Koroutinen
Jörn Dinkla
 
GPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCLGPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCL
Jörn Dinkla
 
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDASchulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Jörn Dinkla
 
Die ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale WirtschaftDie ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Jörn Dinkla
 
Geschäftsmodelle - Ein kurzer Überblick
Geschäftsmodelle -Ein kurzer ÜberblickGeschäftsmodelle -Ein kurzer Überblick
Geschäftsmodelle - Ein kurzer Überblick
Jörn Dinkla
 
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard CaseyBuchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Jörn Dinkla
 
Multi-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz vieleMulti-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz viele
Jörn Dinkla
 
Tipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-ComputingTipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Jörn Dinkla
 
GPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der PraxisGPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der Praxis
Jörn Dinkla
 
Introduction To Parallel Computing
Introduction To Parallel ComputingIntroduction To Parallel Computing
Introduction To Parallel Computing
Jörn Dinkla
 
Subversion Schulung
Subversion SchulungSubversion Schulung
Subversion Schulung
Jörn Dinkla
 
Test-Driven-Development mit JUnit 4
Test-Driven-Development mit JUnit 4Test-Driven-Development mit JUnit 4
Test-Driven-Development mit JUnit 4
Jörn Dinkla
 
Ant im Detail
Ant im DetailAnt im Detail
Ant im Detail
Jörn Dinkla
 

Mehr von Jörn Dinkla (17)

Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"
 
Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?
 
A short introduction to Kotlin
A short introduction to KotlinA short introduction to Kotlin
A short introduction to Kotlin
 
Concurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutinesConcurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutines
 
Nebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins KoroutinenNebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins Koroutinen
 
GPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCLGPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCL
 
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDASchulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
 
Die ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale WirtschaftDie ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
 
Geschäftsmodelle - Ein kurzer Überblick
Geschäftsmodelle -Ein kurzer ÜberblickGeschäftsmodelle -Ein kurzer Überblick
Geschäftsmodelle - Ein kurzer Überblick
 
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard CaseyBuchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
 
Multi-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz vieleMulti-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz viele
 
Tipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-ComputingTipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
 
GPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der PraxisGPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der Praxis
 
Introduction To Parallel Computing
Introduction To Parallel ComputingIntroduction To Parallel Computing
Introduction To Parallel Computing
 
Subversion Schulung
Subversion SchulungSubversion Schulung
Subversion Schulung
 
Test-Driven-Development mit JUnit 4
Test-Driven-Development mit JUnit 4Test-Driven-Development mit JUnit 4
Test-Driven-Development mit JUnit 4
 
Ant im Detail
Ant im DetailAnt im Detail
Ant im Detail
 

Korrekte nebenläufige Anwendungen mit Koroutinen und TDD