SlideShare a Scribd company logo
1 of 80
Download to read offline
Spaß an der Nebenläufigkeit
Frank Müller
Oldenburg / Deutschland

Baujahr 1965

Software-Entwickler

Fachautor

mue@tideland.biz

@themue
Unsere Welt ist nebenläufig
Naturprinzip
• Individuen bevölkern diese Welt

• Sie agieren mal von einander
unabhängig, mal abhängig, mal
gemeinsam

• Kommunikation und Signale
ermöglichen ihr Zusammenleben
Pflanzenwelt
Tierwelt
Menschen im Alltag
Menschen im Hobby
Menschen bei der Arbeit
Menschen auf Konferenzen
Unser alltägliches Zusammenleben
Was bedeutet

Nebenläufigkeit

in der Software?
Moderne Multicore-Systeme

sind wie die

Vereinigung von Flüssen
Ihre Energie muss

effizient genutzt werden
Eine Motivation in der Hardware
• Rechnerarchitekturen verändern sich

• Wachstum über CPUs, Kerne und
Hyperthreads

• Manuelle Nutzung über Threads
komplex und fehlerträchtig

• Nebenläufig Laufzeitumgebungen
ermöglichen eine feingranulare Nutzung
Verteilung der Rechenleistung
CoreCoreCore Core
Laufzeitumgebung
Process Process Process ProcessProcess
Process Process Process ProcessProcess
Nebenläufige Prozesse können

ihre eigenen Wege

gehen ...
... oder auch gemeinsame
Motivation in der Struktur ist wichtiger
• Kapselung des Zustands im Prozess

• Kommunikation über Nachrichten

• Sequentielle Verarbeitung

• Atomare Zustandsänderungen

• OOP im eigentlichen Sinne
❝ Parallelverarbeitung
Programmierung als gleichzeitige
Ausführung möglicherweise
zusammen hängender Berechnungen.

Nebenläufigkeit
Programmierung als Komposition
unabhängig ausgeführter Prozesse.
–Rob Pike
Lange bekannte Ideen
Actor Model
1973

Carl Hewitt, Peter Bishop und Richard Steiger

Communicating Sequential Processes
1978

Tony Hoare
Actor Model
• Aktoren sind nebenläufige Prozesse mit
einer Adresse oder Kennung

• Kommunikation untereinander erfolgt
asynchron über einen
Nachrichtenversand an die Adresse

• Nachrichten werden sequentiell
verarbeitet

• Prozesszustände sind gekapselt
Actor Model
A C D
GFEB
E1 E2 E3
Communicating Sequential Processes
• Nebenläufige Prozesse kommunizieren
über einen oder mehrere Kanäle

• Prozesse sind im Gegensatz zu den
Kanälen anonym

• Daten werden erst versandt, wenn der
Empfänger bereit ist

• Eingehende Daten werden sequentiell
verarbeitet
Communicating Sequential Processes
A
B
C
D
E
CF G G H I
J
K
K
L
M
N
Technologien benötigen ihre Zeit
• Objektorientierung war lange bekannt

• Erste Implementierungen in Simula 67
und Smalltalk-76

• Breite Nutzung erst ab den 90ern
durch C++, Java und C#

• Nun gewinnen nebenläufige Sprachen
an Bedeutung
Einsatzsszenarien
Prozesse bieten Services an
Client
Client
Client
Server
get_this
do_that
set_something
return this
Prozesse verwalten zentrale Ressourcen
Client
Client
Client
Mana-
ger
A B
Prozesse dienen der Lastverteilung
Client
Client
Worker
Worker
Worker
Master
Prozesse verarbeiten Events
Client
Handler
Handler
Handler
Event
Server
Prozesse überwachen einander
Super-

visor
Server

A
Server

B'
Server

B
Startet und

überwacht
A und B
Registriert

Absturz von B und

startet B' neu
Prozesse sammeln und verteilen
Sender
Sender
Sender
In Out
Receiver
Receiver
Receiver
Prozesse arbeiten vernetzt
A C D
GFEB
E1 E2 E3
Beispiele nebenläufiger
Programmiersprachen
Erlang/OTP
• 1986 durch Ericsson entwickelt

• Joe Armstrong, Robert Virding und
Mike Williams

• Fokus auf Verteilung, Fehlertoleranz,
Hochverfügbarkeit, nahezu Echtzeit und
Non-Stop-Betrieb

• Eigene virtuelle Maschine
Erlang/OTP
• Nebenläufigkeit durch Actors

• Funktional und dynamisch typisiert

• Garbage Collections

• Pattern Matching und Guards

• Kommunikation über Rechnergrenzen
Erlang/OTP – Ping 1/2
-module(ping).
-export([start/0, ping/1]).
start() ->
spawn(?MODULE, loop, [1]).
ping(Pid) ->
Pid ! {ping, self()},
receive
{pong, _Loop, Count} -> {ok, Count}
after
5000 -> {error, no_pong}
end.
Erlang/OTP – Ping 2/2
stop(Pid) ->
Pid ! stop,
ok.
loop(Count) ->
receive
{ping, Sender} ->
Sender ! {pong, pid(), Count},
loop(Count + 1);
stop ->
done
end.
Erlang/OTP - Bedeutung der OTP
• Open Telecom Platform

• Ursprünglich Fokus auf
Telekommunikationsanlagen

• 1998 das System AXD301 mit einer
Verfügbarkeit von 99,9999999%
angekündigt
Erlang/OTP - Komponenten der OTP 1/5
• application
• Komponente / Service

• Kann eigenständig gestartet und
gestoppt werden

• Verwaltet Konfiguration für enthaltene
Module
Erlang/OTP - Komponenten der OTP 2/5
• supervisor
• Startet konfigurierte Prozesse

• Kann sie nach Abstürzen erneut
starten

• Verhalten konfigurierbar

• Hierarchien möglich
Erlang/OTP - Komponenten der OTP 3/5
• gen_server
• Registrierter oder anonymer Service

• Synchrone und asynchrone Requests

• Verhalten durch Behaviours bestimmt

• Unterstützt Code-Updates im
laufenden Betrieb
Erlang/OTP - Komponenten der OTP 4/5
• gen_event
• Registrierte oder anonyme
Ereignisverarbeitung

• Mehrere Behaviours gleichzeitig
möglich

• Unterstützt Code-Updates im
laufenden Betrieb
Erlang/OTP - Komponenten der OTP 5/5
• gen_fsm
• Registrierte oder anonyme
Zustandsautomaten

• Behaviour-Funktionen repräsentieren
Zustände

• Unterstützt Code-Updates im
laufenden Betrieb
Erlang/OTP – Behaviors 1/2
• Generische Module wie gen_server,
gen_event und geb_fsm bieten
Laufzeitfunktionalität

• Behaviour-Module definieren Callbacks
mit Geschäftslogik
Erlang/OTP – Behaviours 2/2
-module(my_calc).
-behaviour(gen_server).
% API.
add(A, B) ->
gen_server(?MODULE, {add, A, B}, 5000).
% Callbacks.
handle_call({add, A, B}, _From, State) ->
{reply, {ok, A + B}, State};
handle_call({mul, A, B}, _From, State) ->
{reply, {ok, A * B}, State}.
Google Go
• 2007 durch Google entwickelt

• Rob Pike, Ken Thompson und Robert
Griesemer

• Zielsetzung ist die
Systemprogrammierung

• Native Binaries
Google Go
• Nebenläufigkeit durch Goroutinen und
Channels

• Channels synchron und mit Puffer

• Imperative, objektorientierte, und
funktionale Aspekte

• Garbage Collection
Google Go – Ping 1/2
type pongChan chan int
type pingChan chan pongChan
type Ping stuct {
pingCh pingChan
count int
}
func New() *Ping {
p := &Ping{
pingCh: make(pingChan),
count: 0
}
go p.loop()
return p
}
Google Go – Ping 2/2
func (p*Ping) Ping() int {
pongCh := make(pongChan)
p.pingCh <- pongCh
return <-pongCh
}
func (p *Ping) loop() {
for {
select {
case pongCh := <-p.pingCh:
p.count++
pongCh <- count
}
}
}
Google Go – Kontrolle von Goroutinen 1/4
• Keine Referenzen auf Goroutinen

• Daher kein Monitoring wie in Erlang

• Steuerung und Überwachung durch
Open-Source-Bibliotheken

• github.com/tideland/golib/loop
Google Go – Kontrolle von Goroutinen 2/4
func (t *MyType) backendLoop(l loop.Loop) error {
	 for {
	 	 select {
	 	 case <-l.ShallStop():
	 	 	 return nil
	 	 case foo := <-t.fooChan:
	 	 	 if err := t.processFoo(foo); err != nil {
	 	 	 	 return err
	 	 	 }
	 	 case …:
	 	 	 …
	 	 }
	 }
}
Google Go – Kontrolle von Goroutinen 3/4
// Start der Goroutine in der Startfunktion.
t.loop = loop.Go(t.backendLoop)
// Dito mit Recover-Funktion.
t.loop = loop.GoRecoverable(t.backendLoop, t.recoverLoop)
// Schleife beenden.
err := t.loop.Stop()
// Schleife mit einem Fehler hart beenden und auf Ende warten.
t.loop.Kill(myError)
err := t.loop.Wait()
// Aktuellen Status und eventuellen Fehler abfragen.
status, err := t.loop.Error()
Google Go – Kontrolle von Goroutinen 4/4
// Deadlock im Aufruf vermeiden.
func (t *MyType) Foo(foo *Foo) error {
	 select {
	 case t.fooChan <- foo:
	 case <-t.loop.IsStopping():
	 	 return errors.New("not running anymore")
	 }
	 return nil
}
Pony
• 2015 durch Causality entwickelt

• Sylvan Clebsch, Sebastian Blessing,
Sophia Drossopoulou, Andrew Mc Neil 

• Fokus auf Sicherheit, Geschwindigkeit
und Einfachheit

• LLVM als Laufzeitumgebung
Pony
• Typ- und Speichersicher

• Keine Laufzeitfehler, Exceptions werden
immer behandelt

• Sicherstellung keiner Data Races

• Keine Deadlocks

• Garbage Collection
Pony – Capabilities gegen Data Races
• Isolated (iso) – verändern, weiterreichen

• Value (val) – unveränderlich

• Reference (ref) – veränderbar, nicht teilen

• Box (box) – sicheres lesen

• Transition (trn) – schreiben und anderen
Lesezugriff geben

• Tag (tag) – nur Identifikation
Pony – Ping 1/3
use "collections"
actor Ponger
var _env: Env
new create(env: Env) =>
_env = env
be pong(count: U64) =>
_env.out.print(count.string())
Pony – Ping 2/3
actor Pinger
var _count: U64
new create() =>
_count = 0
be ping(ponger: Ponger) =>
_count = _count + 1
ponger.pong(_count)
Pony – Ping 3/3
actor Main
let _ponger : Ponger
let _pinger : Pinger
new create(env : Env) =>
_ponger = Ponger(env)
_pinger = Pinger
for i in Range[U64](0, 5) do
pinger.ping(_ponger)
end
Fallstricke
Volle Message Queues bzw. Kanäle 1/5
Sender
Sender
Sender
Receiver
Volle Message Queues bzw. Kanäle 2/5
• Nicht wie bei OOP überschneidender
Zugriff

• Serialisierung eingehender Nachrichten

• Synchrone Zugriffe werden blockiert,
Queues laufen voll und blockieren
ebenso
Volle Message Queues bzw. Kanäle 3/5
• Last möglichst beim Aufrufer belassen

• Zentraler Prozess zur Datenverwaltung

• Weitere Last und Daten auf
Arbeitsprozesse verteilen

• ETS in Erlang und Strukturen mit
RWMutex in Go können ebenfalls helfen
Volle Message Queues bzw. Kanäle 4/5
Client Server
do_this
get_data
API
return data
set_data
work
Client Process
Volle Message Queues bzw. Kanäle 5/5
Client
B
Client
A
Worker
3
Worker
2
Worker
1
Server
do_this do_this
return result
Race Conditions 1/4
Client
A
Client
B
Server
get_amount
get_amount
set_amount
set_amount
return
amount
return
amount
Race Conditions 2/4
• Überlagerndes Lesen und Setzen

• Update durch Delta mit Rückgabe des
neuen Wertes

• Alternativ Rückgabe des Wertes mit
Handle für Aktualisierung
Race Conditions 3/4
Client
A
Client
B
Server
update_amount_by
update_amount_by
return
new amount
return
new amount
Race Conditions 4/4
Client
A
Client
B
Server
get_amount
get_amount
set_amount_with_handle
return amount
and handle
return
error "no handle"
Nicht-atomare Veränderungen 1/3
Client
A
Server
Client
B
set_street
set_city get_street
get_city
Nicht-atomare Veränderungen 2/3
• Auslöser sind zu granuläre Nachrichten
und nicht eingehaltene Protokolle

• Zusammenhängende Daten gleichzeitig
ändern beziehungsweise auslesen
Nicht-atomare Veränderungen 3/3
Client
A
Server
Client
B
set_address get_address
Blockaden durch Cycles 1/3
Process
A
Process
B
Process
C
get_foo
get_bar
get_yadda
return
return
Blockaden durch Cycles 2/3
• Auslöser sind synchrone Abfragen

• Timeouts zeigen Blockaden auf,
vermeiden jedoch nicht den Fehler

• Design auf Basis asynchroner
Kommunikation

• Zustandsänderungen in den Prozessen
müssen dies berücksichtigen
Blockaden durch Cycles 3/3
Process
A
Process
B
Process
C
get_foo 1
get_bar 1
get_yadda 1
set_bar 1
set_foo 1
set_yadda 1
Belohnung
Belohnung
• Natürliche Strukturen in der Software

• Elastisches Verhalten

• Problemlose Skalierung mit der
Hardware

• Hohe Sicherheit im Laufzeitverhalten
Bildquellen
123RF

Pexels

iStockphoto

Eigene Fotos

More Related Content

What's hot

Devs@Home - Einführung in Go
Devs@Home - Einführung in GoDevs@Home - Einführung in Go
Devs@Home - Einführung in GoFrank Müller
 
Twisted Eventloop Short Presentation
Twisted Eventloop Short PresentationTwisted Eventloop Short Presentation
Twisted Eventloop Short Presentationfrog32
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...NETWAYS
 
Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17remigius-stalder
 
Scalaz introduction for Java programmers
Scalaz introduction for Java programmersScalaz introduction for Java programmers
Scalaz introduction for Java programmersBernhard Huemer
 
Praesi C-Mesh
Praesi C-MeshPraesi C-Mesh
Praesi C-MeshelHornair
 
Powerful mostly unknown Javascript-Features
Powerful mostly unknown Javascript-FeaturesPowerful mostly unknown Javascript-Features
Powerful mostly unknown Javascript-FeaturesSascha Hameister
 
Mein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-EntwicklerMein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-Entwicklerjlink
 
2006 - NRW Conf: Asynchronous asp.net
2006 - NRW Conf: Asynchronous asp.net2006 - NRW Conf: Asynchronous asp.net
2006 - NRW Conf: Asynchronous asp.netDaniel Fisher
 
Praesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbasePraesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbaseStefan Frömken
 
Einführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureEinführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureSascha Koch
 
realtime audio on ze web @ hhjs
realtime audio on ze web @ hhjsrealtime audio on ze web @ hhjs
realtime audio on ze web @ hhjsjan_mindmatters
 
Automatisierte infrastruktur mit ansible
Automatisierte infrastruktur mit ansibleAutomatisierte infrastruktur mit ansible
Automatisierte infrastruktur mit ansibleStephan Hochhaus
 
DevOpsCon - Verteilte Entwicklung in Go
DevOpsCon - Verteilte Entwicklung in GoDevOpsCon - Verteilte Entwicklung in Go
DevOpsCon - Verteilte Entwicklung in GoFrank Müller
 
digitalSTROM Developer Day 2011: digitalSTROM-Server-Apps
digitalSTROM Developer Day 2011: digitalSTROM-Server-AppsdigitalSTROM Developer Day 2011: digitalSTROM-Server-Apps
digitalSTROM Developer Day 2011: digitalSTROM-Server-AppsdigitalSTROM.org
 

What's hot (20)

Devs@Home - Einführung in Go
Devs@Home - Einführung in GoDevs@Home - Einführung in Go
Devs@Home - Einführung in Go
 
Node.js Security
Node.js SecurityNode.js Security
Node.js Security
 
Twisted Eventloop Short Presentation
Twisted Eventloop Short PresentationTwisted Eventloop Short Presentation
Twisted Eventloop Short Presentation
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
 
Ein Gopher im Netz
Ein Gopher im NetzEin Gopher im Netz
Ein Gopher im Netz
 
Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17
 
Scalaz introduction for Java programmers
Scalaz introduction for Java programmersScalaz introduction for Java programmers
Scalaz introduction for Java programmers
 
Praesi C-Mesh
Praesi C-MeshPraesi C-Mesh
Praesi C-Mesh
 
Powerful mostly unknown Javascript-Features
Powerful mostly unknown Javascript-FeaturesPowerful mostly unknown Javascript-Features
Powerful mostly unknown Javascript-Features
 
Mein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-EntwicklerMein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-Entwickler
 
2006 - NRW Conf: Asynchronous asp.net
2006 - NRW Conf: Asynchronous asp.net2006 - NRW Conf: Asynchronous asp.net
2006 - NRW Conf: Asynchronous asp.net
 
Praesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbasePraesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit Extbase
 
Einführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureEinführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit Clojure
 
realtime audio on ze web @ hhjs
realtime audio on ze web @ hhjsrealtime audio on ze web @ hhjs
realtime audio on ze web @ hhjs
 
Automatisierte infrastruktur mit ansible
Automatisierte infrastruktur mit ansibleAutomatisierte infrastruktur mit ansible
Automatisierte infrastruktur mit ansible
 
DevOpsCon - Verteilte Entwicklung in Go
DevOpsCon - Verteilte Entwicklung in GoDevOpsCon - Verteilte Entwicklung in Go
DevOpsCon - Verteilte Entwicklung in Go
 
Hooks
HooksHooks
Hooks
 
Node.js
Node.jsNode.js
Node.js
 
TypeScript
TypeScriptTypeScript
TypeScript
 
digitalSTROM Developer Day 2011: digitalSTROM-Server-Apps
digitalSTROM Developer Day 2011: digitalSTROM-Server-AppsdigitalSTROM Developer Day 2011: digitalSTROM-Server-Apps
digitalSTROM Developer Day 2011: digitalSTROM-Server-Apps
 

Similar to Spaß an der Nebenläufigkeit

OSMC 2011 | Monitoring at large - die Welt ist nicht genug by Thomas Gelf
OSMC 2011 | Monitoring at large - die Welt ist nicht genug by Thomas GelfOSMC 2011 | Monitoring at large - die Welt ist nicht genug by Thomas Gelf
OSMC 2011 | Monitoring at large - die Welt ist nicht genug by Thomas GelfNETWAYS
 
Warum Python?
Warum Python?Warum Python?
Warum Python?tharwan
 
Javascript done right
Javascript done rightJavascript done right
Javascript done rightDirk Ginader
 
Schweine latein-vortrag
Schweine latein-vortragSchweine latein-vortrag
Schweine latein-vortragRamon Wartala
 
Streaming Plattformen und die Qual der Wahl
Streaming Plattformen und die Qual der WahlStreaming Plattformen und die Qual der Wahl
Streaming Plattformen und die Qual der WahlMatthias Niehoff
 
Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)GEEKcon
 
Azure Notebooks
Azure NotebooksAzure Notebooks
Azure NotebooksTEitelberg
 
Lean SW-Development mit Scrum und Kanban
Lean SW-Development mit Scrum und KanbanLean SW-Development mit Scrum und Kanban
Lean SW-Development mit Scrum und Kanbanfoobar2605
 
Grundlagen postgresql
Grundlagen postgresqlGrundlagen postgresql
Grundlagen postgresqlinovex GmbH
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im VergleichQAware GmbH
 
iOS Testautomation bei mobile.de
iOS Testautomation bei mobile.deiOS Testautomation bei mobile.de
iOS Testautomation bei mobile.deHolger Hammel
 
OSMC 2010 | Verwendung von Puppet in verteilten Monitoring Umgebungen by Birg...
OSMC 2010 | Verwendung von Puppet in verteilten Monitoring Umgebungen by Birg...OSMC 2010 | Verwendung von Puppet in verteilten Monitoring Umgebungen by Birg...
OSMC 2010 | Verwendung von Puppet in verteilten Monitoring Umgebungen by Birg...NETWAYS
 
20121008 io-performance
20121008 io-performance20121008 io-performance
20121008 io-performanceWerner Fischer
 
Rex - Infrastruktur als Code
Rex - Infrastruktur als CodeRex - Infrastruktur als Code
Rex - Infrastruktur als CodeJan Gehring
 
Wieso Informatiker bei der Informationssicherheit scheitern
Wieso Informatiker bei der Informationssicherheit scheiternWieso Informatiker bei der Informationssicherheit scheitern
Wieso Informatiker bei der Informationssicherheit scheiternDigicomp Academy AG
 

Similar to Spaß an der Nebenläufigkeit (20)

OSMC 2011 | Monitoring at large - die Welt ist nicht genug by Thomas Gelf
OSMC 2011 | Monitoring at large - die Welt ist nicht genug by Thomas GelfOSMC 2011 | Monitoring at large - die Welt ist nicht genug by Thomas Gelf
OSMC 2011 | Monitoring at large - die Welt ist nicht genug by Thomas Gelf
 
Warum Python?
Warum Python?Warum Python?
Warum Python?
 
openHAB @ rheinJUG Düsseldorf
openHAB @ rheinJUG DüsseldorfopenHAB @ rheinJUG Düsseldorf
openHAB @ rheinJUG Düsseldorf
 
Javascript done right
Javascript done rightJavascript done right
Javascript done right
 
Schweine latein-vortrag
Schweine latein-vortragSchweine latein-vortrag
Schweine latein-vortrag
 
Windows Powershell
Windows PowershellWindows Powershell
Windows Powershell
 
Dev + Ops = Go
Dev + Ops = GoDev + Ops = Go
Dev + Ops = Go
 
Streaming Plattformen und die Qual der Wahl
Streaming Plattformen und die Qual der WahlStreaming Plattformen und die Qual der Wahl
Streaming Plattformen und die Qual der Wahl
 
Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)
 
Azure Notebooks
Azure NotebooksAzure Notebooks
Azure Notebooks
 
Lean SW-Development mit Scrum und Kanban
Lean SW-Development mit Scrum und KanbanLean SW-Development mit Scrum und Kanban
Lean SW-Development mit Scrum und Kanban
 
Grundlagen postgresql
Grundlagen postgresqlGrundlagen postgresql
Grundlagen postgresql
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im Vergleich
 
iOS Testautomation bei mobile.de
iOS Testautomation bei mobile.deiOS Testautomation bei mobile.de
iOS Testautomation bei mobile.de
 
OSMC 2010 | Verwendung von Puppet in verteilten Monitoring Umgebungen by Birg...
OSMC 2010 | Verwendung von Puppet in verteilten Monitoring Umgebungen by Birg...OSMC 2010 | Verwendung von Puppet in verteilten Monitoring Umgebungen by Birg...
OSMC 2010 | Verwendung von Puppet in verteilten Monitoring Umgebungen by Birg...
 
Bit wisem 2015-wieners-sitzung-09_Software-Entwicklung
Bit wisem 2015-wieners-sitzung-09_Software-EntwicklungBit wisem 2015-wieners-sitzung-09_Software-Entwicklung
Bit wisem 2015-wieners-sitzung-09_Software-Entwicklung
 
20121008 io-performance
20121008 io-performance20121008 io-performance
20121008 io-performance
 
Rex - Infrastruktur als Code
Rex - Infrastruktur als CodeRex - Infrastruktur als Code
Rex - Infrastruktur als Code
 
Wieso Informatiker bei der Informationssicherheit scheitern
Wieso Informatiker bei der Informationssicherheit scheiternWieso Informatiker bei der Informationssicherheit scheitern
Wieso Informatiker bei der Informationssicherheit scheitern
 
Ant im Detail
Ant im DetailAnt im Detail
Ant im Detail
 

More from Frank Müller

JAX 2023 - Cloud Provider APIs
JAX 2023 - Cloud Provider APIsJAX 2023 - Cloud Provider APIs
JAX 2023 - Cloud Provider APIsFrank Müller
 
JAX 2023 - Generics in Go
JAX 2023 - Generics in GoJAX 2023 - Generics in Go
JAX 2023 - Generics in GoFrank Müller
 
Let The Computer Do It
Let The Computer Do ItLet The Computer Do It
Let The Computer Do ItFrank Müller
 
2021 OOP - Kubernetes Operatoren
2021   OOP - Kubernetes Operatoren2021   OOP - Kubernetes Operatoren
2021 OOP - Kubernetes OperatorenFrank Müller
 
Blockchains - Mehr als nur digitale Währungen
Blockchains - Mehr als nur digitale WährungenBlockchains - Mehr als nur digitale Währungen
Blockchains - Mehr als nur digitale WährungenFrank Müller
 
Juju - Scalable Software with Google Go
Juju - Scalable Software with Google GoJuju - Scalable Software with Google Go
Juju - Scalable Software with Google GoFrank Müller
 
RESTful Web Applications with Google Go
RESTful Web Applications with Google GoRESTful Web Applications with Google Go
RESTful Web Applications with Google GoFrank Müller
 
Clouds, leicht beherrschbar
Clouds, leicht beherrschbarClouds, leicht beherrschbar
Clouds, leicht beherrschbarFrank Müller
 
WTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
WTC 2013 - Juju - Mit etwas Magie zur perfekten CloudWTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
WTC 2013 - Juju - Mit etwas Magie zur perfekten CloudFrank Müller
 
Juju - Google Go in a scalable Environment
Juju - Google Go in a scalable EnvironmentJuju - Google Go in a scalable Environment
Juju - Google Go in a scalable EnvironmentFrank Müller
 
OOP 2013 - Weltweite Entwicklung von Open Source Software
OOP 2013 - Weltweite Entwicklung von Open Source SoftwareOOP 2013 - Weltweite Entwicklung von Open Source Software
OOP 2013 - Weltweite Entwicklung von Open Source SoftwareFrank Müller
 
Beauty and Power of Go
Beauty and Power of GoBeauty and Power of Go
Beauty and Power of GoFrank Müller
 
Pecha Kucha: Nebenläufigkeit als natürliches Paradigma
Pecha Kucha: Nebenläufigkeit als natürliches ParadigmaPecha Kucha: Nebenläufigkeit als natürliches Paradigma
Pecha Kucha: Nebenläufigkeit als natürliches ParadigmaFrank Müller
 
On Event-Driven Architecture
On Event-Driven ArchitectureOn Event-Driven Architecture
On Event-Driven ArchitectureFrank Müller
 
Google Go - Good artists borrow, great artists steal.
Google Go - Good artists borrow, great artists steal.Google Go - Good artists borrow, great artists steal.
Google Go - Good artists borrow, great artists steal.Frank Müller
 
Agility And The Way To SOA
Agility And The Way To SOAAgility And The Way To SOA
Agility And The Way To SOAFrank Müller
 

More from Frank Müller (19)

JAX 2023 - Cloud Provider APIs
JAX 2023 - Cloud Provider APIsJAX 2023 - Cloud Provider APIs
JAX 2023 - Cloud Provider APIs
 
JAX 2023 - Generics in Go
JAX 2023 - Generics in GoJAX 2023 - Generics in Go
JAX 2023 - Generics in Go
 
Let The Computer Do It
Let The Computer Do ItLet The Computer Do It
Let The Computer Do It
 
Concurrency with Go
Concurrency with GoConcurrency with Go
Concurrency with Go
 
2021 OOP - Kubernetes Operatoren
2021   OOP - Kubernetes Operatoren2021   OOP - Kubernetes Operatoren
2021 OOP - Kubernetes Operatoren
 
Fun with functions
Fun with functionsFun with functions
Fun with functions
 
Blockchains - Mehr als nur digitale Währungen
Blockchains - Mehr als nur digitale WährungenBlockchains - Mehr als nur digitale Währungen
Blockchains - Mehr als nur digitale Währungen
 
Juju - Scalable Software with Google Go
Juju - Scalable Software with Google GoJuju - Scalable Software with Google Go
Juju - Scalable Software with Google Go
 
RESTful Web Applications with Google Go
RESTful Web Applications with Google GoRESTful Web Applications with Google Go
RESTful Web Applications with Google Go
 
Clouds, leicht beherrschbar
Clouds, leicht beherrschbarClouds, leicht beherrschbar
Clouds, leicht beherrschbar
 
WTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
WTC 2013 - Juju - Mit etwas Magie zur perfekten CloudWTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
WTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
 
Juju - Google Go in a scalable Environment
Juju - Google Go in a scalable EnvironmentJuju - Google Go in a scalable Environment
Juju - Google Go in a scalable Environment
 
OOP 2013 - Weltweite Entwicklung von Open Source Software
OOP 2013 - Weltweite Entwicklung von Open Source SoftwareOOP 2013 - Weltweite Entwicklung von Open Source Software
OOP 2013 - Weltweite Entwicklung von Open Source Software
 
Beauty and Power of Go
Beauty and Power of GoBeauty and Power of Go
Beauty and Power of Go
 
Pecha Kucha: Nebenläufigkeit als natürliches Paradigma
Pecha Kucha: Nebenläufigkeit als natürliches ParadigmaPecha Kucha: Nebenläufigkeit als natürliches Paradigma
Pecha Kucha: Nebenläufigkeit als natürliches Paradigma
 
Go to the Cloud
Go to the CloudGo to the Cloud
Go to the Cloud
 
On Event-Driven Architecture
On Event-Driven ArchitectureOn Event-Driven Architecture
On Event-Driven Architecture
 
Google Go - Good artists borrow, great artists steal.
Google Go - Good artists borrow, great artists steal.Google Go - Good artists borrow, great artists steal.
Google Go - Good artists borrow, great artists steal.
 
Agility And The Way To SOA
Agility And The Way To SOAAgility And The Way To SOA
Agility And The Way To SOA
 

Spaß an der Nebenläufigkeit