Date post: | 22-Jan-2018 |
Category: |
Internet |
Upload: | nils-langner |
View: | 174 times |
Download: | 2 times |
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
@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: fragenRaus 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 machenWas ist guter Code?
Den falschen Plan perfekt ausführen.
Professional-Stil - BIPC 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 ZeitErfahrungsbericht
Den falschen Plan perfekt ausführen.
So viel verschwendete ZeitErfahrungsbericht
Polaris: ca. 2 Jahre amilio: 2 Jahre Freizeit
Den falschen Plan perfekt ausführen.
So viel verschwendete ZeitErfahrungsbericht
Jubii-Pages: ca. 2 Jahre abspielbar: 2 Jahre Freizeit, 3 Jahre GmbH bis zur Insolvenz
Den falschen Plan perfekt ausführen.
FazitVision
Projekte schlagen fehl
Das Leben ist hart
Den falschen Plan perfekt ausführen.
Ein paar Fakten
100.000
Technikgründungenpro 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 rightDoing things
Doing the right thing
versus
Den falschen Plan perfekt ausführen.
ThoughtlandDoing 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 definierenVision
Anforderungen mit Kunde formulieren
Anforderungen in Komponenten gliedern
Features pro Komponente definieren
Den falschen Plan perfekt ausführen.
Anforderungen priorisieren - MVPVision
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) festlegenVision
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) festlegenVision
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 InternetQualitä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 seinQualität
Lean Testing
Crowd TestingMonitoring based Testing
Den falschen Plan perfekt ausführen.
Lean TestingLean 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.
LeankoalaLeankoala
www.leankoala.com
Den falschen Plan perfekt ausführen.
Leankoala - 4 Schritte zum Test-SetupLeankoala
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.
FazitEnde
Doing the right thing before doing things right
Dein Projekt wird kein Erfolg! Wahrscheinlich.
Den falschen Plan perfekt ausführen.
Kontaktiert uns.Kontakt
Nils [email protected]@leankoala
Mike [email protected]@elbstack