SlideShare ist ein Scribd-Unternehmen logo
Den falschen Plan perfekt ausführen.
Den falschen
Plan perfekt
ausführen.
Nils Langner & Mike Lohmann
Den falschen Plan perfekt ausführen.Den falschen Plan perfekt ausführen.
Webentwickler seit 18 Jahren
Gründer www.leankoala.com
Head of Quality Management
Qualitätsmanager seit 10 Jahren
Blogger www.phphatesme.com
Seepferdchen seit 31 Jahren
@leankoala
Den falschen Plan perfekt ausführen.
Webentwickler seit 19 Jahren
Partner www.elbstack.com
Software Architect
Software Architect seit 10 Jahren
@elbstack
Den falschen Plan perfekt ausführen.
Das macht keinen Sinn!
Hä?
Klappt das auch für mich?
Sehe ich ganz anders!
Wieso liegt da eigentlich Stroh?!
Bei Fragen: fragen
Raus damit
WAS machen die da vorne eigentlich?
Den falschen Plan perfekt ausführen.
Wer seid ihr?
IPC 2017
Entwickler?
Qualitätsmanager / Tester?
PHP?
JavaScript?
Umbau auf Micro Services?
Den falschen Plan perfekt ausführen.
Gut, besser, am besten?
Was ist guter Code?
Den falschen Plan perfekt ausführen.
Drauflos-Stil - A
IPC 2017
Idee:
Office-Anwesenheits-Trigger
Brauche einen Trigger
Brauche einen Store für einen Counter
Brauche eine Komponente die Nachrichten verschickt
Brauche statistische Auswertungen
Den falschen Plan perfekt ausführen.
'use strict';
const DynamoDb = require('aws-sdk/clients/dynamodb');
const AWS = require('aws-sdk');
const Promise = require('bluebird');
const https = require('https');
const url = require('url');
AWS.config.setPromisesDependency(Promise);
const dynamoDb = new DynamoDb({
params: {
region: 'eu-central-1',
}
});
const tableName = process.env.DDB_TABLE;
function updateUsage(serialNumber, value) {
return dynamoDb.updateItem({
TableName: tableName,
Key: {
deviceId: {
S: serialNumber
}
},
ReturnValues: 'ALL_NEW',
AttributeUpdates: {
counter: {
Action: 'ADD',
Value: {
N: value.toString()
}
}
}
}).promise()
.then(data => {
console.log("DynamoDB update response", data);
return data;
})
}
function createSlackMessage(channel, value) {
return {
channel: channel,
username: 'OfficeNotificationBotIoT',
attachments: [{
text: `Momentan sind ${value} im Office.`,
color: 'good',
ts: new Date().getTime() / 1000,
}]
};
}
function notify(slackUrl, channel, value, callback) {
const message = JSON.stringify(createSlackMessage(channel, value));
const options = url.parse(slackUrl);
options.method = 'POST';
options.headers = {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(message),
};
const postReq = https.request(options, res => {
const chunks = [];
res.setEncoding('utf8');
res.on('data', chunk => {
return chunks.push(chunk);
});
res.on('end', () => {
const body = chunks.join('');
return callback(null, {
body: body,
statusCode: res.statusCode,
statusMessage: res.statusMessage
});
}).on('error', callback);
});
postReq.write(message);
postReq.end();
}
function handleUpdate(serialNumber, value, callback) {
return updateUsage(serialNumber, value)
.then(data => {
notify(
data.Attributes.hookUrl.S,
data.Attributes.channel.S,
data.Attributes.counter.N, callback
);
})
.catch(err => {
console.error('Error notifying channel');
return callback(err);
})
}
exports.handler = (event, context, callback) => {
console.log('Received event:', event.clickType);
if (event.clickType === "SINGLE") {
handleUpdate(event.serialNumber, 1, callback);
} else {
handleUpdate(event.serialNumber, -1, callback);
}
};
1 2 3Brauche einen Store für einen
Counter
Brauche eine Komponente die
Nachrichten verschickt
Brauche einen Trigger-(Handler)
Den falschen Plan perfekt ausführen.
require_once 'Spreadsheet_Excel_Writer.php';
class XLS {
private $workbook;
private $format_header;
function __construct() {
// Creating a workbook
$this->workbook = new Spreadsheet_Excel_Writer();
$this->format_header =& $this->workbook->addFormat();
$this->format_header->setBold();
$this->format_header->setFgColor('blue');
$this->format_header->setColor('white');
}
function add_sheet($sheetname='sheet', $data=array()) {
….
}
function send($filename) {
// Let's send the file - Hell Yeah!! Let's do it!!
// sending HTTP headers
if (!strpos(strtolower($filename),".xls")) { $filename .= ".xls"; }
$this->workbook->send($filename);
$this->workbook->close();
}
}
/**
* Send HTTP headers for the Excel file.
*
* @param string $filename The filename to use for HTTP headers
* @access public
*/
function send($filename)
{
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename="$filename"");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0,pre-check=0");
header("Pragma: public");
}
4 Brauche statistische
Auswertungen
Den falschen Plan perfekt ausführen.
resource "aws_lambda_function" "SlackOfficeNotification" {
description = "SlackOfficeNotification Dash Events"
filename = "../SlackOfficeNotification.zip"
source_code_hash = "${base64sha256(file("../SlackOfficeNotification.zip"))}"
function_name = "SlackOfficeNotification"
handler = "index.handler"
timeout = 10
runtime = "nodejs4.3"
role = "${aws_iam_role.iot_son_role.arn}”
environment {
variables = {
"DDB_TABLE" = "${aws_dynamodb_table.iot_son_dbtable.name}"
"REGION" = "${var.aws_region}"
}
}
}
resource "aws_lambda_permission" "allow_SlackOfficeNotifications" {
statement_id = "AllowExecutionFromEvents"
action = "lambda:InvokeFunction"
function_name = "${aws_lambda_function.SlackOfficeNotification.arn}"
principal = "sns.amazonaws.com"
source_arn = "${var.iot_son_source_arn}”
}
Semi-automatisches Deployment mit Terraform
Den falschen Plan perfekt ausführen.
Was ist mit Tests
Hardcoded Variablen
Gar nicht erweiterbar
Naja… Das geht doch einfach nicht!
100 Leute wurden gefragt: Was ist daran
schlecht?
Quiz
Den falschen Plan perfekt ausführen.
Den falschen Plan perfekt ausführen.
Jetzt besser machen
Was ist guter Code?
Den falschen Plan perfekt ausführen.
Professional-Stil - B
IPC 2017
Muss 100 Tsd Kunden verwalten können
Muss pro Kunde konfigurierbare Nachrichtenkanäle haben (Slack, SMS, you name it)
Verschiedene Nachrichten / Kunde / Location
85 % Unit-Testabdeckung
Funktionale Tests für 6 verschiedene Browser
Muss statistische Auswertung in einem Dashboard zeigen
Idee: Office-Anwesenheits-Trigger (diesmal professional!)
Den falschen Plan perfekt ausführen.
Den falschen Plan perfekt ausführen.
Jetzt perfekte Implementierung vorstellen.
Imagination.
Den falschen Plan perfekt ausführen.
Was ist besser? A oder B?
Raus damit
Nicht-funktionale Requirements alle beachtet
Klar B
Alles perfekt gebaut
Musterprojekt
Architektur durchdacht
Den falschen Plan perfekt ausführen.
Den falschen Plan perfekt ausführen.
Den falschen Plan perfekt ausführen.
A - ~ 3 Tage (eigentlich sogar nur 1 Tag, aber ein bisschen schön sollte es doch sein)
Auswertung
B - ~ 10 Wochen
Den falschen Plan perfekt ausführen.
Den falschen Plan perfekt ausführen.
Was ist besser? A oder B?
Raus damit
Klar A
Weniger Zeit investiert
Geringere Kosten
Den falschen Plan perfekt ausführen.
Eine kurze Geschichte der Zeit
Erfahrungsbericht
Den falschen Plan perfekt ausführen.
So viel verschwendete Zeit
Erfahrungsbericht
Polaris: ca. 2 Jahre amilio: 2 Jahre Freizeit
Den falschen Plan perfekt ausführen.
So viel verschwendete Zeit
Erfahrungsbericht
Jubii-Pages: ca. 2 Jahre abspielbar: 2 Jahre
Freizeit, 3 Jahre GmbH
bis zur Insolvenz
Den falschen Plan perfekt ausführen.
Fazit
Vision
Projekte schlagen fehl
Das Leben ist hart
Den falschen Plan perfekt ausführen.
Ein paar Fakten
100.000
Technikgründungen
pro Jahr in
Deutschland
(KFW 2016)
1 von 10
Startups überleben
das erste Jahr
80%
aller Features werden
kaum oder gar nicht
verwendet
(Chaos Report Standish
Group)
Den falschen Plan perfekt ausführen.
Ist Qualität unnötig?
Nein, doch, ohhh.
Qualität
Den falschen Plan perfekt ausführen.
Doing things right
Doing things
Doing the right thing
versus
Den falschen Plan perfekt ausführen.
Thoughtland
Doing the right thing
If you are not embarrassed by the first version of
your product, you’ve launched too late.
Den falschen Plan perfekt ausführen.
Wie baut elbstack Software?
Vision
Software muss nur den Anforderungen genügen
YAGNI - Prinzip
Den falschen Plan perfekt ausführen.
Anforderungen definieren
Vision
Anforderungen mit Kunde formulieren
Anforderungen in Komponenten gliedern
Features pro Komponente definieren
Den falschen Plan perfekt ausführen.
Anforderungen priorisieren - MVP
Vision
Welche Features müssen ins MVP*?
Tasks für Features definieren
*https://hackernoon.com/the-mvp-is-dead-long-live-the-rat-233d5d16ab02 (Riskiest Assumption Tests)
Den falschen Plan perfekt ausführen.
Technologie (für MVP) festlegen
Vision
Was kann das Team?
Was kann das Team schnell lernen?
Was wird noch gebraucht für MVP?
Den falschen Plan perfekt ausführen.
Kernkomponente(n) festlegen
Vision
Was sind Kernkomponenten?
Unit Tests für Kernkomponenten - Ist Dein Freund
Den falschen Plan perfekt ausführen.
MVP umsetzen
Vision
Möglichst einfach und schnell
“Dreckig” ist erlaubt! - Solange kein Core
Lean Testing - Ist Dein Freund
Den falschen Plan perfekt ausführen.
MVP deployen und am Markt testen
Vision
Möglichst so, dass man schnell Bugfixes einbauen kann
(Semi) automatisiertes Deployment - Ist Dein Freund
Den falschen Plan perfekt ausführen.
Feedback einarbeiten - Nächste Iteration
Vision
Und täglich grüßt das Murmeltier...
=> (Semi) automatisiertes Deployment - Ist Dein Freund
=> Unit Tests für Kernkomponenten - Ist Dein Freund
=> Lean Testing - Ist Dein Freund
Den falschen Plan perfekt ausführen.
Und wenn es doch groß wird?!
Vision
Refactorings
=> (Semi)automatisiertes Deployment - Ist Dein Freund
=> Unit Tests für Kernkomponenten - Ist Dein Freund
=> Lean Testing - Ist Dein Freund
Den falschen Plan perfekt ausführen.
Wie sollte ich Software testen?
Qualität
Den falschen Plan perfekt ausführen.
Projekte im Internet
Qualität
Den falschen Plan perfekt ausführen.
Was ist Qualität?
Qualität
„Grad, in dem ein Satz inhärenter Merkmale eines
Objekts Anforderungen erfüllt.
„Übereinstimmung von Leistungen
mit Ansprüchen.“
Norm DIN EN ISO 9000:2015-11
Gablers Wirtschaftslexikon
Den falschen Plan perfekt ausführen.
Was ist Risiko?
Qualität
Risiko = Eintrittswahrscheinlichkeit * Kosten
Den falschen Plan perfekt ausführen.
Wird mein Projekt ein Erfolg?
Qualität
90% aller Startups scheitern
80% aller Features werde nicht genutzt
NEIN, dein Projekt wird kein Erfolg
Den falschen Plan perfekt ausführen.
Was muss ich dann testen?
Qualität
niente
nichts
nada
nothing
Na gut, vielleicht ein wenig.
Den falschen Plan perfekt ausführen.
Testen muss schlank sein
Qualität
Lean Testing
Crowd Testing
Monitoring
based Testing
Den falschen Plan perfekt ausführen.
Lean Testing
Lean Testing
Semantischer Fehler im Controller
Datenbankprobleme
Fehler im Template
Syntaktische Fehler im Controller
Bug in Bibliothek
Fehlender Content
HTTP-Status-Code != 200
Ursachen Symptome
Den falschen Plan perfekt ausführen.
Nur was für Startups?
Lean Testing
Den falschen Plan perfekt ausführen.
Leankoala
Leankoala
www.leankoala.com
Den falschen Plan perfekt ausführen.
Leankoala - 4 Schritte zum Test-Setup
Leankoala
www.leankoala.com
www.bravo.de
Enter homepage url
1
Scanning for equivalency classes
2
65%
Scanning for 1.227 widgets
3
22%
Test Setup completed
we found 38 components
you are using 32 widgets
34 anomalies already found
4
Innovation // Alleinstellungsmerkmal
Den falschen Plan perfekt ausführen.
Fazit
Ende
Doing the right thing before doing things right
Dein Projekt wird kein Erfolg! Wahrscheinlich.
Den falschen Plan perfekt ausführen.
Kontaktiert uns.
Kontakt
Nils Langner
nils.langner@leankoala.com
@leankoala
Mike Lohmann
mike@elbstack.com
@elbstack

Weitere ähnliche Inhalte

Ähnlich wie Den falschen plan perfekt ausführen

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
 
JavaScript und trotzdem Softwerker
JavaScript und trotzdem SoftwerkerJavaScript und trotzdem Softwerker
JavaScript und trotzdem Softwerker
Dennis Wilson
 
RoofTop Brains & BBQ: Ein Gästbuch für China
RoofTop Brains & BBQ: Ein Gästbuch für ChinaRoofTop Brains & BBQ: Ein Gästbuch für China
RoofTop Brains & BBQ: Ein Gästbuch für China
Johann-Peter Hartmann
 
Testing einer Angular App
Testing einer Angular AppTesting einer Angular App
Testing einer Angular App
Florian Bader
 
Codeception VisualCeption
Codeception VisualCeptionCodeception VisualCeption
Codeception VisualCeption
Sebastian Neubert
 
Advanced Continuous Integration
Advanced Continuous IntegrationAdvanced Continuous Integration
Advanced Continuous Integration
OPITZ CONSULTING Deutschland
 
Einfangen eines technisch kaputten projektes
Einfangen eines technisch kaputten projektesEinfangen eines technisch kaputten projektes
Einfangen eines technisch kaputten projektes
Johann-Peter Hartmann
 
Vom Projektleiter zum Product Owner
Vom Projektleiter zum Product OwnerVom Projektleiter zum Product Owner
Vom Projektleiter zum Product Owner
Gerrit Beine
 
objectiF extrem
objectiF extremobjectiF extrem
objectiF extrem
Olaf Lewitz
 
Definition of Ready
Definition of ReadyDefinition of Ready
Definition of Ready
Markus Unterauer
 
Projektportfoliomanagement: So steuern Sie Ihr Portfolio richtig mit Berichte...
Projektportfoliomanagement: So steuern Sie Ihr Portfolio richtig mit Berichte...Projektportfoliomanagement: So steuern Sie Ihr Portfolio richtig mit Berichte...
Projektportfoliomanagement: So steuern Sie Ihr Portfolio richtig mit Berichte...
AnnaPauels
 
Stay calm & keep shipping - iOS DevCon 2013
Stay calm & keep shipping - iOS DevCon 2013Stay calm & keep shipping - iOS DevCon 2013
Stay calm & keep shipping - iOS DevCon 2013
superflomo
 
Projektmanagement 200420
Projektmanagement 200420Projektmanagement 200420
Projektmanagement 200420
Claus Brell
 
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
 
Day CQ 5.3 WCM - Was ist neu
Day CQ 5.3 WCM - Was ist neuDay CQ 5.3 WCM - Was ist neu
Day CQ 5.3 WCM - Was ist neu
Cédric Hüsler
 
Agiles Schätzen im Team - Joachim Seibert, OBJEKTspektrum 5/2012
Agiles Schätzen im Team - Joachim Seibert, OBJEKTspektrum 5/2012Agiles Schätzen im Team - Joachim Seibert, OBJEKTspektrum 5/2012
Agiles Schätzen im Team - Joachim Seibert, OBJEKTspektrum 5/2012
Martin Seibert
 
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
 
Wie Sie Mit Design Sprints Echten Digitalen Wandel Schaffen
Wie Sie Mit Design Sprints Echten Digitalen Wandel SchaffenWie Sie Mit Design Sprints Echten Digitalen Wandel Schaffen
Wie Sie Mit Design Sprints Echten Digitalen Wandel Schaffen
iTiZZiMO
 
9 Tipps für die Modernisierung von PHP-Anwendungen
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
9 Tipps für die Modernisierung von PHP-Anwendungen
Ralf Eggert
 

Ähnlich wie Den falschen plan perfekt ausführen (20)

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
 
Agiles bpm
Agiles bpmAgiles bpm
Agiles bpm
 
JavaScript und trotzdem Softwerker
JavaScript und trotzdem SoftwerkerJavaScript und trotzdem Softwerker
JavaScript und trotzdem Softwerker
 
RoofTop Brains & BBQ: Ein Gästbuch für China
RoofTop Brains & BBQ: Ein Gästbuch für ChinaRoofTop Brains & BBQ: Ein Gästbuch für China
RoofTop Brains & BBQ: Ein Gästbuch für China
 
Testing einer Angular App
Testing einer Angular AppTesting einer Angular App
Testing einer Angular App
 
Codeception VisualCeption
Codeception VisualCeptionCodeception VisualCeption
Codeception VisualCeption
 
Advanced Continuous Integration
Advanced Continuous IntegrationAdvanced Continuous Integration
Advanced Continuous Integration
 
Einfangen eines technisch kaputten projektes
Einfangen eines technisch kaputten projektesEinfangen eines technisch kaputten projektes
Einfangen eines technisch kaputten projektes
 
Vom Projektleiter zum Product Owner
Vom Projektleiter zum Product OwnerVom Projektleiter zum Product Owner
Vom Projektleiter zum Product Owner
 
objectiF extrem
objectiF extremobjectiF extrem
objectiF extrem
 
Definition of Ready
Definition of ReadyDefinition of Ready
Definition of Ready
 
Projektportfoliomanagement: So steuern Sie Ihr Portfolio richtig mit Berichte...
Projektportfoliomanagement: So steuern Sie Ihr Portfolio richtig mit Berichte...Projektportfoliomanagement: So steuern Sie Ihr Portfolio richtig mit Berichte...
Projektportfoliomanagement: So steuern Sie Ihr Portfolio richtig mit Berichte...
 
Stay calm & keep shipping - iOS DevCon 2013
Stay calm & keep shipping - iOS DevCon 2013Stay calm & keep shipping - iOS DevCon 2013
Stay calm & keep shipping - iOS DevCon 2013
 
Projektmanagement 200420
Projektmanagement 200420Projektmanagement 200420
Projektmanagement 200420
 
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
 
Day CQ 5.3 WCM - Was ist neu
Day CQ 5.3 WCM - Was ist neuDay CQ 5.3 WCM - Was ist neu
Day CQ 5.3 WCM - Was ist neu
 
Agiles Schätzen im Team - Joachim Seibert, OBJEKTspektrum 5/2012
Agiles Schätzen im Team - Joachim Seibert, OBJEKTspektrum 5/2012Agiles Schätzen im Team - Joachim Seibert, OBJEKTspektrum 5/2012
Agiles Schätzen im Team - Joachim Seibert, OBJEKTspektrum 5/2012
 
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
 
Wie Sie Mit Design Sprints Echten Digitalen Wandel Schaffen
Wie Sie Mit Design Sprints Echten Digitalen Wandel SchaffenWie Sie Mit Design Sprints Echten Digitalen Wandel Schaffen
Wie Sie Mit Design Sprints Echten Digitalen Wandel Schaffen
 
9 Tipps für die Modernisierung von PHP-Anwendungen
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
9 Tipps für die Modernisierung von PHP-Anwendungen
 

Den falschen plan perfekt ausführen

  • 1. Den falschen Plan perfekt ausführen. Den falschen Plan perfekt ausführen. Nils Langner & Mike Lohmann
  • 2. Den falschen Plan perfekt ausführen.Den falschen Plan perfekt ausführen. Webentwickler seit 18 Jahren Gründer www.leankoala.com Head of Quality Management Qualitätsmanager seit 10 Jahren Blogger www.phphatesme.com Seepferdchen seit 31 Jahren @leankoala
  • 3. Den falschen Plan perfekt ausführen. Webentwickler seit 19 Jahren Partner www.elbstack.com Software Architect Software Architect seit 10 Jahren @elbstack
  • 4. Den falschen Plan perfekt ausführen. Das macht keinen Sinn! Hä? Klappt das auch für mich? Sehe ich ganz anders! Wieso liegt da eigentlich Stroh?! Bei Fragen: fragen Raus damit WAS machen die da vorne eigentlich?
  • 5. Den falschen Plan perfekt ausführen. Wer seid ihr? IPC 2017 Entwickler? Qualitätsmanager / Tester? PHP? JavaScript? Umbau auf Micro Services?
  • 6. Den falschen Plan perfekt ausführen. Gut, besser, am besten? Was ist guter Code?
  • 7. Den falschen Plan perfekt ausführen. Drauflos-Stil - A IPC 2017 Idee: Office-Anwesenheits-Trigger Brauche einen Trigger Brauche einen Store für einen Counter Brauche eine Komponente die Nachrichten verschickt Brauche statistische Auswertungen
  • 8. Den falschen Plan perfekt ausführen. 'use strict'; const DynamoDb = require('aws-sdk/clients/dynamodb'); const AWS = require('aws-sdk'); const Promise = require('bluebird'); const https = require('https'); const url = require('url'); AWS.config.setPromisesDependency(Promise); const dynamoDb = new DynamoDb({ params: { region: 'eu-central-1', } }); const tableName = process.env.DDB_TABLE; function updateUsage(serialNumber, value) { return dynamoDb.updateItem({ TableName: tableName, Key: { deviceId: { S: serialNumber } }, ReturnValues: 'ALL_NEW', AttributeUpdates: { counter: { Action: 'ADD', Value: { N: value.toString() } } } }).promise() .then(data => { console.log("DynamoDB update response", data); return data; }) } function createSlackMessage(channel, value) { return { channel: channel, username: 'OfficeNotificationBotIoT', attachments: [{ text: `Momentan sind ${value} im Office.`, color: 'good', ts: new Date().getTime() / 1000, }] }; } function notify(slackUrl, channel, value, callback) { const message = JSON.stringify(createSlackMessage(channel, value)); const options = url.parse(slackUrl); options.method = 'POST'; options.headers = { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(message), }; const postReq = https.request(options, res => { const chunks = []; res.setEncoding('utf8'); res.on('data', chunk => { return chunks.push(chunk); }); res.on('end', () => { const body = chunks.join(''); return callback(null, { body: body, statusCode: res.statusCode, statusMessage: res.statusMessage }); }).on('error', callback); }); postReq.write(message); postReq.end(); } function handleUpdate(serialNumber, value, callback) { return updateUsage(serialNumber, value) .then(data => { notify( data.Attributes.hookUrl.S, data.Attributes.channel.S, data.Attributes.counter.N, callback ); }) .catch(err => { console.error('Error notifying channel'); return callback(err); }) } exports.handler = (event, context, callback) => { console.log('Received event:', event.clickType); if (event.clickType === "SINGLE") { handleUpdate(event.serialNumber, 1, callback); } else { handleUpdate(event.serialNumber, -1, callback); } }; 1 2 3Brauche einen Store für einen Counter Brauche eine Komponente die Nachrichten verschickt Brauche einen Trigger-(Handler)
  • 9. Den falschen Plan perfekt ausführen. require_once 'Spreadsheet_Excel_Writer.php'; class XLS { private $workbook; private $format_header; function __construct() { // Creating a workbook $this->workbook = new Spreadsheet_Excel_Writer(); $this->format_header =& $this->workbook->addFormat(); $this->format_header->setBold(); $this->format_header->setFgColor('blue'); $this->format_header->setColor('white'); } function add_sheet($sheetname='sheet', $data=array()) { …. } function send($filename) { // Let's send the file - Hell Yeah!! Let's do it!! // sending HTTP headers if (!strpos(strtolower($filename),".xls")) { $filename .= ".xls"; } $this->workbook->send($filename); $this->workbook->close(); } } /** * Send HTTP headers for the Excel file. * * @param string $filename The filename to use for HTTP headers * @access public */ function send($filename) { header("Content-type: application/vnd.ms-excel"); header("Content-Disposition: attachment; filename="$filename""); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0,pre-check=0"); header("Pragma: public"); } 4 Brauche statistische Auswertungen
  • 10. Den falschen Plan perfekt ausführen. resource "aws_lambda_function" "SlackOfficeNotification" { description = "SlackOfficeNotification Dash Events" filename = "../SlackOfficeNotification.zip" source_code_hash = "${base64sha256(file("../SlackOfficeNotification.zip"))}" function_name = "SlackOfficeNotification" handler = "index.handler" timeout = 10 runtime = "nodejs4.3" role = "${aws_iam_role.iot_son_role.arn}” environment { variables = { "DDB_TABLE" = "${aws_dynamodb_table.iot_son_dbtable.name}" "REGION" = "${var.aws_region}" } } } resource "aws_lambda_permission" "allow_SlackOfficeNotifications" { statement_id = "AllowExecutionFromEvents" action = "lambda:InvokeFunction" function_name = "${aws_lambda_function.SlackOfficeNotification.arn}" principal = "sns.amazonaws.com" source_arn = "${var.iot_son_source_arn}” } Semi-automatisches Deployment mit Terraform
  • 11. Den falschen Plan perfekt ausführen. Was ist mit Tests Hardcoded Variablen Gar nicht erweiterbar Naja… Das geht doch einfach nicht! 100 Leute wurden gefragt: Was ist daran schlecht? Quiz
  • 12. Den falschen Plan perfekt ausführen.
  • 13. Den falschen Plan perfekt ausführen. Jetzt besser machen Was ist guter Code?
  • 14. Den falschen Plan perfekt ausführen. Professional-Stil - B IPC 2017 Muss 100 Tsd Kunden verwalten können Muss pro Kunde konfigurierbare Nachrichtenkanäle haben (Slack, SMS, you name it) Verschiedene Nachrichten / Kunde / Location 85 % Unit-Testabdeckung Funktionale Tests für 6 verschiedene Browser Muss statistische Auswertung in einem Dashboard zeigen Idee: Office-Anwesenheits-Trigger (diesmal professional!)
  • 15. Den falschen Plan perfekt ausführen.
  • 16. Den falschen Plan perfekt ausführen. Jetzt perfekte Implementierung vorstellen. Imagination.
  • 17. Den falschen Plan perfekt ausführen. Was ist besser? A oder B? Raus damit Nicht-funktionale Requirements alle beachtet Klar B Alles perfekt gebaut Musterprojekt Architektur durchdacht
  • 18. Den falschen Plan perfekt ausführen.
  • 19. Den falschen Plan perfekt ausführen.
  • 20. Den falschen Plan perfekt ausführen. A - ~ 3 Tage (eigentlich sogar nur 1 Tag, aber ein bisschen schön sollte es doch sein) Auswertung B - ~ 10 Wochen
  • 21. Den falschen Plan perfekt ausführen.
  • 22. Den falschen Plan perfekt ausführen. Was ist besser? A oder B? Raus damit Klar A Weniger Zeit investiert Geringere Kosten
  • 23. Den falschen Plan perfekt ausführen. Eine kurze Geschichte der Zeit Erfahrungsbericht
  • 24. Den falschen Plan perfekt ausführen. So viel verschwendete Zeit Erfahrungsbericht Polaris: ca. 2 Jahre amilio: 2 Jahre Freizeit
  • 25. Den falschen Plan perfekt ausführen. So viel verschwendete Zeit Erfahrungsbericht Jubii-Pages: ca. 2 Jahre abspielbar: 2 Jahre Freizeit, 3 Jahre GmbH bis zur Insolvenz
  • 26. Den falschen Plan perfekt ausführen. Fazit Vision Projekte schlagen fehl Das Leben ist hart
  • 27. Den falschen Plan perfekt ausführen. Ein paar Fakten 100.000 Technikgründungen pro Jahr in Deutschland (KFW 2016) 1 von 10 Startups überleben das erste Jahr 80% aller Features werden kaum oder gar nicht verwendet (Chaos Report Standish Group)
  • 28. Den falschen Plan perfekt ausführen. Ist Qualität unnötig? Nein, doch, ohhh. Qualität
  • 29. Den falschen Plan perfekt ausführen. Doing things right Doing things Doing the right thing versus
  • 30. Den falschen Plan perfekt ausführen. Thoughtland Doing the right thing If you are not embarrassed by the first version of your product, you’ve launched too late.
  • 31. Den falschen Plan perfekt ausführen. Wie baut elbstack Software? Vision Software muss nur den Anforderungen genügen YAGNI - Prinzip
  • 32. Den falschen Plan perfekt ausführen. Anforderungen definieren Vision Anforderungen mit Kunde formulieren Anforderungen in Komponenten gliedern Features pro Komponente definieren
  • 33. Den falschen Plan perfekt ausführen. Anforderungen priorisieren - MVP Vision Welche Features müssen ins MVP*? Tasks für Features definieren *https://hackernoon.com/the-mvp-is-dead-long-live-the-rat-233d5d16ab02 (Riskiest Assumption Tests)
  • 34. Den falschen Plan perfekt ausführen. Technologie (für MVP) festlegen Vision Was kann das Team? Was kann das Team schnell lernen? Was wird noch gebraucht für MVP?
  • 35. Den falschen Plan perfekt ausführen. Kernkomponente(n) festlegen Vision Was sind Kernkomponenten? Unit Tests für Kernkomponenten - Ist Dein Freund
  • 36. Den falschen Plan perfekt ausführen. MVP umsetzen Vision Möglichst einfach und schnell “Dreckig” ist erlaubt! - Solange kein Core Lean Testing - Ist Dein Freund
  • 37. Den falschen Plan perfekt ausführen. MVP deployen und am Markt testen Vision Möglichst so, dass man schnell Bugfixes einbauen kann (Semi) automatisiertes Deployment - Ist Dein Freund
  • 38. Den falschen Plan perfekt ausführen. Feedback einarbeiten - Nächste Iteration Vision Und täglich grüßt das Murmeltier... => (Semi) automatisiertes Deployment - Ist Dein Freund => Unit Tests für Kernkomponenten - Ist Dein Freund => Lean Testing - Ist Dein Freund
  • 39. Den falschen Plan perfekt ausführen. Und wenn es doch groß wird?! Vision Refactorings => (Semi)automatisiertes Deployment - Ist Dein Freund => Unit Tests für Kernkomponenten - Ist Dein Freund => Lean Testing - Ist Dein Freund
  • 40. Den falschen Plan perfekt ausführen. Wie sollte ich Software testen? Qualität
  • 41. Den falschen Plan perfekt ausführen. Projekte im Internet Qualität
  • 42. Den falschen Plan perfekt ausführen. Was ist Qualität? Qualität „Grad, in dem ein Satz inhärenter Merkmale eines Objekts Anforderungen erfüllt. „Übereinstimmung von Leistungen mit Ansprüchen.“ Norm DIN EN ISO 9000:2015-11 Gablers Wirtschaftslexikon
  • 43. Den falschen Plan perfekt ausführen. Was ist Risiko? Qualität Risiko = Eintrittswahrscheinlichkeit * Kosten
  • 44. Den falschen Plan perfekt ausführen. Wird mein Projekt ein Erfolg? Qualität 90% aller Startups scheitern 80% aller Features werde nicht genutzt NEIN, dein Projekt wird kein Erfolg
  • 45. Den falschen Plan perfekt ausführen. Was muss ich dann testen? Qualität niente nichts nada nothing Na gut, vielleicht ein wenig.
  • 46. Den falschen Plan perfekt ausführen. Testen muss schlank sein Qualität Lean Testing Crowd Testing Monitoring based Testing
  • 47. Den falschen Plan perfekt ausführen. Lean Testing Lean Testing Semantischer Fehler im Controller Datenbankprobleme Fehler im Template Syntaktische Fehler im Controller Bug in Bibliothek Fehlender Content HTTP-Status-Code != 200 Ursachen Symptome
  • 48. Den falschen Plan perfekt ausführen. Nur was für Startups? Lean Testing
  • 49. Den falschen Plan perfekt ausführen. Leankoala Leankoala www.leankoala.com
  • 50. Den falschen Plan perfekt ausführen. Leankoala - 4 Schritte zum Test-Setup Leankoala www.leankoala.com www.bravo.de Enter homepage url 1 Scanning for equivalency classes 2 65% Scanning for 1.227 widgets 3 22% Test Setup completed we found 38 components you are using 32 widgets 34 anomalies already found 4 Innovation // Alleinstellungsmerkmal
  • 51. Den falschen Plan perfekt ausführen. Fazit Ende Doing the right thing before doing things right Dein Projekt wird kein Erfolg! Wahrscheinlich.
  • 52. Den falschen Plan perfekt ausführen. Kontaktiert uns. Kontakt Nils Langner nils.langner@leankoala.com @leankoala Mike Lohmann mike@elbstack.com @elbstack