SlideShare ist ein Scribd-Unternehmen logo
A/B-Testing mit Node
Wolfgang Dirscherl / pixelio.de
Basti
• Sebastian Springer
• aus München
• arbeite bei MaibornWolff GmbH
• https://github.com/sspringer82
• @basti_springer
• JavaScript Entwickler
A/B-Testing
Frontend-Testing
ExpressAB
Feature Flags
Sixpack
Agenda
Rainer Sturm / pixelio.de
Thommy Weiss / pixelio.de
A/B-Testing?
A/B-Testing?
Von einem bestimmten Feature werden zwei
unterschiedliche Versionen an Benutzer ausgespielt, um zu
sehen, welche Variante das gewünschte Ziel besser erfüllt.
A/B Testing mit Node.js
Multivarianten-Testing
Beim Multivarianten-Testing werden parallel mehrere
Versionen und eine Kontrollversion ausgespielt, um zu
prüfen, welche besser performt.
Vorteil: Das Ergebnis liegt wesentlich schneller vor als beim
A/B-Testing
Nachteil: es werden mehr Nutzer benötigt, um aussagekräftig
zu sein
Was kann man testen?
lichtkunst.73 / pixelio.de
Was kann man testen?
Grundsätzlich kann nahezu jeder Aspekt einer Applikation
getestet werden. Die Spanne reicht von angepassten
Layouts über eine veränderte Seitenstruktur bis hin zu
unterschiedlichen Workflows.
Je nachdem, wie tief in die Applikation eingegriffen werden
soll, müssen unterschiedliche Werkzeuge verwendet
werden.
Vorgehensweise
1. Hypothese(n)
2. Umfang des Experiments festlegen
3. Unterschiedliche Varianten implementieren
4. Ausspielen
5. Tracken
6. Auswerten
7. Die bessere Version verwenden
Die Hypothese
Wenn wir unsere Registrierung von einem großen Formular
in mehrere Tabs aufteilen, werden innerhalb von 4 Wochen
20% mehr Felder ausgefüllt.
Die Hypothese
Die Hypothese muss möglichst klar und messbar formuliert
werden. Damit kann der Erfolg des Experiments gemessen
werden.
Multivarianten
Manchmal kann man keine konkrete Hypothese formulieren,
sondern muss beispielsweise die Positionierung eines Buttons
oder Formulars einfach ausprobieren.
Hier kommen Multivarianten-Tests zum Einsatz.
Umfang festlegen
Peter Reinäcker / pixelio.de
Den Umfang festlegen
Experimente sollten immer zeitlich begrenzt werden.
Je mehr parallele Tests laufen, desto unübersichtlicher wird
die Situation. Außerdem können sich Experimente gegenseitig
beeinflussen.
Der Umfang muss so gewählt werden, dass aussagekräftige
Daten geliefert werden.
Implementieren
w.r.wagner / pixelio.de
Frontendbasierte Tests
Frontendbasierte Tests
Die Seitenstruktur wird mit einem JavaScript-Framework
entsprechend des Tests angepasst.
Was kann ich damit testen?
Diese Art von Tests beschränkt sich vor allem auf strukturelle
Manipulationen der Seite.
Serverseitige Strukturen oder Datenbankanpassungen sind
nicht möglich.
A/B Testing mit Node.js
Optimizely
Optimizely ist ein klassisches frontendbasiertes Werkzeug
für A/B- und multivarianten-Tests. Es gibt sowohl eine
(eingeschränkte) freie als auch eine kostenpflichtige
Version.
Mittlerweile gibt es auch Erweiterungen für andere
Plattformen wie Node
Verteilung
• Prozentuale Verteilung
• Browser
• Sources
• Cookies
• Request Parameters
• Geo/Language
Arbeitsweise
https://help.optimizely.com/Build_Campaigns_and_Experiments/How_Optimizely_Works%3A_Snippet_order_of_execution_and_JavaScript_evaluation_timing
Code Snippet
function callbackFn(activate, options) {
var utils = window.optimizely.get('utils');
var $ = window.optimizely.get('jquery');
utils.waitForElement('button').then(function(el) {
if ($('button').length > 0) {
activate();
}
});
}
Optimizely
Vorteile
Leichtgewichtig und
schnell umzusetzen
Kann auch von Frontend-
Entwicklern

durchgeführt werden
Unabhängig vom
Backend
Änderungen sind
nicht persistent
Nicht versioniert
Quellcode wird nach der
Auslieferung manipuliert
Zusätzlicher Overhead
Nachteile
A/B Testing mit Node.js
Tests mit Node.js
In einer Node.js-Webapplikation können A/B-Tests direkt
integriert werden. Das hat den Vorteil dass bereits auf dem
Server entschieden werden kann, welche Variante
ausgespielt wird.
A/B-Tests mit Express
https://github.com/omichelsen/express-ab
Für das Web Application Framework Express gibt es eine
Middleware, die die Steuerung der Experimente übernimmt.
Diese Experimente basieren auf den Routen der Applikation.
A/B-Tests mit Express
npm install express express-ab cookie-parser
Als Middleware kann express-ab jederzeit auch in eine
bestehende Express-Applikation integriert werden.
const express = require('express');
const cookieParser = require('cookie-parser');
const ab = require('express-ab');
const app = express();
app.use(cookieParser());
const profileTest = ab.test('Profile Test');
app.get('/', profileTest(), (req, res) => {
res.send('variant A');
});
app.get('/', profileTest(), (req, res) => {
res.send('variant B');
});
app.listen(8080);
Express-ab
Über die Informationen im Cookie des Benutzers wird die
jeweilige Variante zugeordnet, sodass ein Benutzer stets die
selbe Variante erhält.
Verteilung
Die Varianten eines Experiments können unterschiedlich
gewichtet werden:
profileTest(null, 0.2)
Dieses Experiment wird in 20% der Anfragen ausgespielt.
Insgesamt sollte die Summe der Varianten 1 Ergeben.
Experiments
Google Experiments
Express-ab kann auch mit Google Experiments verwendet
werden. Dabei handelt es sich um einen Teil von Google
Analytics, der dazu verwendet werden kann Multivarianten-
Tests durchzuführen.
Mit express-ab kann man sowohl auf die Experiment-ID als
auch auf die jeweilige Variante zugreifen und diese auch an
den Browser fürs Tracking weiterreichen.
Google Experiments
Google Experiments
const profileTest = ab.test('Profile Test', { id:
'123456789' });
app.get('/', profileTest(), (req, res) => {
// res.locals.ab.name - 'Profile Test'
// res.locals.ab.id - '123456789'
// res.locals.ab.variantId - 0
res.send('variant A');
});
Tiefere Integration
Mit den Informationen, welche Variante ausgespielt wird,
können auch innerhalb der Applikationslogik umgesetzt
werden.
Unterschiedliche Models
class Controller {
getProfile(req, res) {
let model;
switch (res.locals.ab.variantId ) {
case 0:
model = new RefProfileModel();
break;
case 1:
model = new PerfProfileModel();
break;
default:
model = new ProfileModel();
break;
}
res.render('profile', model);
}
}
Im Template
res.render('profile', {variant: res.locals.ab.variantId});
<% if (variant === 0) { %>
<a href="javascript:void(0)" id="submit">Submit</a>
<% } else if (variant === 1) {%>
<button id="submit">Submit</button>
<% } %>
Feature Flags
S. Hofschlaeger / pixelio.de
Feature Flags
Feature Flags sind eine weitere Variante, um unter anderem A/
B-Tests durchzuführen.
Im einfachsten Fall ist ein solches Feature-Flag eine Abfrage
im Code, die anhand einer Konfiguration den Code-Block
ausführt oder nicht.
Feature Flags
app.get('/profile', async (req, res) => {
const data = {};
if (await config.isEnabled('newConfig')) {
res.render('newProfile.ejs', data);
} else {
res.render('profile.ejs', data);
}
});
Feature Flags
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
module.exports = {
async isEnabled(feature) {
const content = await readFile('config.json',
'utf-8');
const contentObj = JSON.parse(content);
return contentObj.hasOwnProperty(feature) &&
contentObj[feature];
}
}
Feature Flags
Nachdem ein Feature Flag nicht mehr benötigt wird, sollte
zumindest die Abfrage entfernt werden.
Aufräumen
Sixpack
Alexander Klaus / pixelio.de
Sixpack
Sixpack ist ein Open Source A/B-Testing-Framework das
unabhängig von Sprache und Plattform ist. Die Server-
Komponente ist in Python geschrieben. Es gibt Client-
Bibliotheken unter anderem auch für Node.
Sixpack Web UI
Sixpack
const sixpack = require('sixpack-client');
const session = new sixpack.Session();
session.participate('test-exp', ['alt-one', 'alt-two'],
(err, res) => {
if (err) {
throw err;
}
let alt = res.alternative.name
if (alt === 'alt-one') {
console.log('default: ' + alt);
} else {
console.log(alt);
}
});
A/B Testing mit Node.js
Optimizely
Optimizely bietet nicht nur die Möglichkeit das Frontend zu
“verbiegen”, sondern stellt auch APIs für verschiedene
Sprachen und Plattformen wie Node.js zur Verfügung.
npm install optimizely-server-sdk
Optimizely
const optimizely = require('optimizely-server-sdk');
const optimizelyClient = optimizely.createInstance({ datafile:
datafile });
const variation = optimizelyClient.activate(‘profile', userId);
if (variation === 'variant A') {
// Execute code for variation A
} else if (variation === 'variant B') {
// Execute code for variation B
} else {
// Execute default code
}
optimizelyClient.track("my_conversion", userId);
Auswertung
S. Hofschlaeger / pixelio.de
Tracking und Auswertung
Der mitunter wichtigste Teil eines Experiments ist seine
Auswertung. Zu diesem Zweck bieten die verschiedenen
Werkzeuge Möglichkeiten zur Auswertung. Sowohl
Optimizely als auch Sixpack und Google Experiments
verfügen über eine grafische Oberfläche.
A/B Testing mit Node.js
Fallstricke
Kurt Michel / pixelio.de
Fallstricke
Komplexität
Laufzeit
Teilnehmer
Zeitraum
Komplexität
Einzelne A/B- oder Multivarianten-Tests sind relativ gut
kontrollierbar.
Sind viele Experimente in einer großen Applikation parallel
aktiv, sollten diese an einer zentralen Stelle verwaltet werden.
Wenn möglich sollten verschachtelte Experimente vermieden
werden. Derartige Konstellationen können sich gegenseitig
beeinflussen und verfälschen unter Umständen die
Ergebnisse.
Laufzeit
Die Laufzeit muss so gewählt werden, dass die Ergebnisse
aussagekräftig sind.
Werden mehrere Experimente hintereinander geschaltet,
sollten Sie auch über die gleiche Laufzeit verfügen.
Teilnehmer
Damit ein Experiment ausgewertet werden kann, müssen
genügend Benutzer die an den verschiedenen Varianten
teilnehmen.
Dies ist wichtig, damit nicht wenige Teilnehmer das Ergebnis
verfälschen.
Zeitraum
Experimente sollten in einem möglichst neutralen Zeitraum
stattfinden.
In einem Online-Shop ist der Traffic in der Weihnachtszeit am
höchsten. Diese Zeit ist auch nicht immer repräsentativ.
Fragen?
Rainer Sturm / pixelio.de
KONTAKT
Sebastian Springer
sebastian.springer@maibornwolff.de
MaibornWolff GmbH
Theresienhöhe 13
80339 München
@basti_springer
https://github.com/sspringer82

Weitere ähnliche Inhalte

Ähnlich wie A/B Testing mit Node.js

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
 
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
Marc Müller
 
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
Marc Müller
 
Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro
Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetproTest-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro
Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro
IKS Gesellschaft für Informations- und Kommunikationssysteme mbH
 
Automatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit SeleniumAutomatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit Selenium
Benjamin Schmid
 
PHPUnit - Eine kurze Einführung
PHPUnit - Eine kurze EinführungPHPUnit - Eine kurze Einführung
PHPUnit - Eine kurze Einführung
frankstaude
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTdd
jlink
 
Real Application Testing - DOAG SIG Database 2010 - Simon Dickmeiß
Real Application Testing - DOAG SIG Database 2010 - Simon DickmeißReal Application Testing - DOAG SIG Database 2010 - Simon Dickmeiß
Real Application Testing - DOAG SIG Database 2010 - Simon Dickmeiß
OPITZ CONSULTING Deutschland
 
Testgetriebene Softwareentwicklung
Testgetriebene SoftwareentwicklungTestgetriebene Softwareentwicklung
Testgetriebene Softwareentwicklung
jlink
 
TDD für Testmuffel
TDD für TestmuffelTDD für Testmuffel
TDD für Testmuffel
Hendrik Lösch
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Gregor Biswanger
 
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
Marc Müller
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJS
Sebastian Springer
 
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Ralf Sigmund
 
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
Marc Müller
 
Whitepaper QF-Test: GUI Testautomatisierung macht Spaß
Whitepaper QF-Test: GUI Testautomatisierung macht SpaßWhitepaper QF-Test: GUI Testautomatisierung macht Spaß
Whitepaper QF-Test: GUI Testautomatisierung macht Spaß
Claudia Baur
 
Test-getriebene Entwicklung in ABAP – Das Entwicklungsmodell der Zukunft
Test-getriebene Entwicklung in ABAP – Das Entwicklungsmodell der ZukunftTest-getriebene Entwicklung in ABAP – Das Entwicklungsmodell der Zukunft
Test-getriebene Entwicklung in ABAP – Das Entwicklungsmodell der Zukunft
Christian Drumm
 
Legacy Code refaktorisieren
Legacy Code refaktorisierenLegacy Code refaktorisieren
Legacy Code refaktorisieren
Hendrik Lösch
 
Modell der Zusammenarbeit. Migration von Progress 4GL nach C#.NET
Modell der Zusammenarbeit. Migration von Progress 4GL nach C#.NET Modell der Zusammenarbeit. Migration von Progress 4GL nach C#.NET
Modell der Zusammenarbeit. Migration von Progress 4GL nach C#.NET
Куранкова Татьяна
 
dotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile Servicesdotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile Services
Sascha Dittmann
 

Ähnlich wie A/B Testing mit Node.js (20)

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
 
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
 
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
 
Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro
Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetproTest-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro
Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro
 
Automatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit SeleniumAutomatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit Selenium
 
PHPUnit - Eine kurze Einführung
PHPUnit - Eine kurze EinführungPHPUnit - Eine kurze Einführung
PHPUnit - Eine kurze Einführung
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTdd
 
Real Application Testing - DOAG SIG Database 2010 - Simon Dickmeiß
Real Application Testing - DOAG SIG Database 2010 - Simon DickmeißReal Application Testing - DOAG SIG Database 2010 - Simon Dickmeiß
Real Application Testing - DOAG SIG Database 2010 - Simon Dickmeiß
 
Testgetriebene Softwareentwicklung
Testgetriebene SoftwareentwicklungTestgetriebene Softwareentwicklung
Testgetriebene Softwareentwicklung
 
TDD für Testmuffel
TDD für TestmuffelTDD für Testmuffel
TDD für Testmuffel
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
 
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJS
 
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
 
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
 
Whitepaper QF-Test: GUI Testautomatisierung macht Spaß
Whitepaper QF-Test: GUI Testautomatisierung macht SpaßWhitepaper QF-Test: GUI Testautomatisierung macht Spaß
Whitepaper QF-Test: GUI Testautomatisierung macht Spaß
 
Test-getriebene Entwicklung in ABAP – Das Entwicklungsmodell der Zukunft
Test-getriebene Entwicklung in ABAP – Das Entwicklungsmodell der ZukunftTest-getriebene Entwicklung in ABAP – Das Entwicklungsmodell der Zukunft
Test-getriebene Entwicklung in ABAP – Das Entwicklungsmodell der Zukunft
 
Legacy Code refaktorisieren
Legacy Code refaktorisierenLegacy Code refaktorisieren
Legacy Code refaktorisieren
 
Modell der Zusammenarbeit. Migration von Progress 4GL nach C#.NET
Modell der Zusammenarbeit. Migration von Progress 4GL nach C#.NET Modell der Zusammenarbeit. Migration von Progress 4GL nach C#.NET
Modell der Zusammenarbeit. Migration von Progress 4GL nach C#.NET
 
dotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile Servicesdotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile Services
 

Mehr von Sebastian Springer

HTMX - ist das die nächste Revolution im Web?
HTMX - ist das die nächste Revolution im Web?HTMX - ist das die nächste Revolution im Web?
HTMX - ist das die nächste Revolution im Web?
Sebastian Springer
 
Schnelleinstieg in Angular
Schnelleinstieg in AngularSchnelleinstieg in Angular
Schnelleinstieg in Angular
Sebastian Springer
 
Creating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.jsCreating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.js
Sebastian Springer
 
Divide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.jsDivide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.js
Sebastian Springer
 
From Zero to Hero – Web Performance
From Zero to Hero – Web PerformanceFrom Zero to Hero – Web Performance
From Zero to Hero – Web Performance
Sebastian Springer
 
Von 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im WebVon 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im Web
Sebastian Springer
 
Angular2
Angular2Angular2
Einführung in React
Einführung in ReactEinführung in React
Einführung in React
Sebastian Springer
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
Sebastian Springer
 
ECMAScript 6 im Produktivbetrieb
ECMAScript 6 im ProduktivbetriebECMAScript 6 im Produktivbetrieb
ECMAScript 6 im Produktivbetrieb
Sebastian Springer
 
Streams in Node.js
Streams in Node.jsStreams in Node.js
Streams in Node.js
Sebastian Springer
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
Sebastian Springer
 
Node.js Security
Node.js SecurityNode.js Security
Node.js Security
Sebastian Springer
 
Typescript
TypescriptTypescript
Typescript
Sebastian Springer
 
Reactive Programming
Reactive ProgrammingReactive Programming
Reactive Programming
Sebastian Springer
 
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtWarum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Sebastian Springer
 
Lean Startup mit JavaScript
Lean Startup mit JavaScriptLean Startup mit JavaScript
Lean Startup mit JavaScript
Sebastian Springer
 
Webapplikationen mit Node.js
Webapplikationen mit Node.jsWebapplikationen mit Node.js
Webapplikationen mit Node.js
Sebastian Springer
 
Debugging und Profiling
Debugging und ProfilingDebugging und Profiling
Debugging und Profiling
Sebastian Springer
 

Mehr von Sebastian Springer (20)

HTMX - ist das die nächste Revolution im Web?
HTMX - ist das die nächste Revolution im Web?HTMX - ist das die nächste Revolution im Web?
HTMX - ist das die nächste Revolution im Web?
 
Schnelleinstieg in Angular
Schnelleinstieg in AngularSchnelleinstieg in Angular
Schnelleinstieg in Angular
 
Creating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.jsCreating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.js
 
Divide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.jsDivide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.js
 
From Zero to Hero – Web Performance
From Zero to Hero – Web PerformanceFrom Zero to Hero – Web Performance
From Zero to Hero – Web Performance
 
Von 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im WebVon 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im Web
 
Angular2
Angular2Angular2
Angular2
 
Einführung in React
Einführung in ReactEinführung in React
Einführung in React
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
ECMAScript 6 im Produktivbetrieb
ECMAScript 6 im ProduktivbetriebECMAScript 6 im Produktivbetrieb
ECMAScript 6 im Produktivbetrieb
 
Streams in Node.js
Streams in Node.jsStreams in Node.js
Streams in Node.js
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
Node.js Security
Node.js SecurityNode.js Security
Node.js Security
 
Typescript
TypescriptTypescript
Typescript
 
Reactive Programming
Reactive ProgrammingReactive Programming
Reactive Programming
 
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtWarum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser macht
 
Lean Startup mit JavaScript
Lean Startup mit JavaScriptLean Startup mit JavaScript
Lean Startup mit JavaScript
 
Webapplikationen mit Node.js
Webapplikationen mit Node.jsWebapplikationen mit Node.js
Webapplikationen mit Node.js
 
Node.js für Webapplikationen
Node.js für WebapplikationenNode.js für Webapplikationen
Node.js für Webapplikationen
 
Debugging und Profiling
Debugging und ProfilingDebugging und Profiling
Debugging und Profiling
 

Kürzlich hochgeladen

dachnug51 - NIS2_DORA - Was steckt konkret dahinter.pdf
dachnug51 - NIS2_DORA - Was steckt konkret dahinter.pdfdachnug51 - NIS2_DORA - Was steckt konkret dahinter.pdf
dachnug51 - NIS2_DORA - Was steckt konkret dahinter.pdf
DNUG e.V.
 
dachnug51 - Keynote Airbus Defence and Space - Service Management and Collabo...
dachnug51 - Keynote Airbus Defence and Space - Service Management and Collabo...dachnug51 - Keynote Airbus Defence and Space - Service Management and Collabo...
dachnug51 - Keynote Airbus Defence and Space - Service Management and Collabo...
DNUG e.V.
 
dachnug51 - Keynote A1 Austria AG - HCL Domino alias Business Notes verbindet...
dachnug51 - Keynote A1 Austria AG - HCL Domino alias Business Notes verbindet...dachnug51 - Keynote A1 Austria AG - HCL Domino alias Business Notes verbindet...
dachnug51 - Keynote A1 Austria AG - HCL Domino alias Business Notes verbindet...
DNUG e.V.
 
dachnug51 - Sametime 12 Deployment .pdf
dachnug51 - Sametime 12 Deployment  .pdfdachnug51 - Sametime 12 Deployment  .pdf
dachnug51 - Sametime 12 Deployment .pdf
DNUG e.V.
 
dachnug51 - HCL Volt MX Go Services in Domino Apps.pdf
dachnug51 - HCL Volt MX Go Services in Domino Apps.pdfdachnug51 - HCL Volt MX Go Services in Domino Apps.pdf
dachnug51 - HCL Volt MX Go Services in Domino Apps.pdf
DNUG e.V.
 
Headless WordPress beim WordPress Meetup Potsdam im Mai 2024
Headless WordPress beim WordPress Meetup Potsdam im Mai 2024Headless WordPress beim WordPress Meetup Potsdam im Mai 2024
Headless WordPress beim WordPress Meetup Potsdam im Mai 2024
VCAT Consulting GmbH
 

Kürzlich hochgeladen (6)

dachnug51 - NIS2_DORA - Was steckt konkret dahinter.pdf
dachnug51 - NIS2_DORA - Was steckt konkret dahinter.pdfdachnug51 - NIS2_DORA - Was steckt konkret dahinter.pdf
dachnug51 - NIS2_DORA - Was steckt konkret dahinter.pdf
 
dachnug51 - Keynote Airbus Defence and Space - Service Management and Collabo...
dachnug51 - Keynote Airbus Defence and Space - Service Management and Collabo...dachnug51 - Keynote Airbus Defence and Space - Service Management and Collabo...
dachnug51 - Keynote Airbus Defence and Space - Service Management and Collabo...
 
dachnug51 - Keynote A1 Austria AG - HCL Domino alias Business Notes verbindet...
dachnug51 - Keynote A1 Austria AG - HCL Domino alias Business Notes verbindet...dachnug51 - Keynote A1 Austria AG - HCL Domino alias Business Notes verbindet...
dachnug51 - Keynote A1 Austria AG - HCL Domino alias Business Notes verbindet...
 
dachnug51 - Sametime 12 Deployment .pdf
dachnug51 - Sametime 12 Deployment  .pdfdachnug51 - Sametime 12 Deployment  .pdf
dachnug51 - Sametime 12 Deployment .pdf
 
dachnug51 - HCL Volt MX Go Services in Domino Apps.pdf
dachnug51 - HCL Volt MX Go Services in Domino Apps.pdfdachnug51 - HCL Volt MX Go Services in Domino Apps.pdf
dachnug51 - HCL Volt MX Go Services in Domino Apps.pdf
 
Headless WordPress beim WordPress Meetup Potsdam im Mai 2024
Headless WordPress beim WordPress Meetup Potsdam im Mai 2024Headless WordPress beim WordPress Meetup Potsdam im Mai 2024
Headless WordPress beim WordPress Meetup Potsdam im Mai 2024
 

A/B Testing mit Node.js