Den falschen plan perfekt ausführen

Post on 22-Jan-2018

174 views 2 download

transcript

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 Langnernils.langner@leankoala.com@leankoala

Mike Lohmannmike@elbstack.com@elbstack