Top Banner
PHP mit Paul Bocuse PHP World Kongress 2010
285

PHP mit Paul Bocuse

May 13, 2015

Download

Technology

Stephan Schmidt

Folien zum Workshop "PHP mit Paul Bocuse" auf der PHP World 2010 von Holger Rüprich und Stephan Schmidt
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: PHP mit Paul Bocuse

PHP mit Paul Bocuse PHP World Kongress 2010

Page 2: PHP mit Paul Bocuse

Stephan Schmidt

• Head of Web Sales Development bei der 1&1 Internet AG

• PHP seit 1999

• Autor von PHP Design Patterns, Co-Autor weiterer PHP Bücher

• Konferenzen seit 2001

• Open-Source-Aktivist

Page 3: PHP mit Paul Bocuse

Holger

• Head of Sales Processes Access bei der 1&1 Internet AG

• PHP seit 2000

• Gast-Dozent an der Berufs-Akademie Mosbach

• Autor für die Zeitschrift T3N

• Clean Code Aktivist

Page 4: PHP mit Paul Bocuse

Paul Bocuse

• Head of Nouvelle Cuisine

• Michelin Sterne seit 1965

• Autor von „Die neue Küche“, „Französisch Kochen mit dem Meister“ und weiterer Bücher

• Besitzer von fünf Restaurants

• „Koch des Jahrhunderts“

• Gewürz-Aktivist

Page 5: PHP mit Paul Bocuse

Kochen und PHP

WTF?

Page 6: PHP mit Paul Bocuse

Das mag ich...

Page 7: PHP mit Paul Bocuse

Das kuckt meine Frau...

Page 8: PHP mit Paul Bocuse

Nochmal:Kochen und PHP

WTF?

Page 9: PHP mit Paul Bocuse
Page 10: PHP mit Paul Bocuse
Page 11: PHP mit Paul Bocuse
Page 12: PHP mit Paul Bocuse

Kochen und PHP

FTW!

Page 13: PHP mit Paul Bocuse

Beispiele Für PHP im Unternehmenseinsatz

Page 14: PHP mit Paul Bocuse

Viele Entwickler

Montabaur

Karlsruhe

München

Bukarest

• Über 1.000 Entwickler sind bei der 1&1 Internet AG beschäftigt.

• Nicht nur PHP-Entwickler.

• Entwickler sind in verschiedenen organi-satorischen Teams.

• Entwickler sind über verschiedene Standorte verteilt.

Page 15: PHP mit Paul Bocuse

Hohe Komplexität

Page 16: PHP mit Paul Bocuse

Hohe Komplexität

Page 17: PHP mit Paul Bocuse

Hohe Komplexität

Page 18: PHP mit Paul Bocuse

Hohe Zugriffszahlen

500.000 Visits / Tag

Page 19: PHP mit Paul Bocuse

Hohe Zugriffszahlen

2.000.000 Page Impressions / Tag

Page 20: PHP mit Paul Bocuse

Viele Änderungen

3 - 5 Onlinegänge / Woche

Page 21: PHP mit Paul Bocuse

Viele Änderungen

Neue Produkte und Preisänderungen

Page 22: PHP mit Paul Bocuse

Viele Änderungen

Einbindung von neuen Services

Page 23: PHP mit Paul Bocuse

Viele Änderungen

Änderungen des Seitenablaufs

Page 24: PHP mit Paul Bocuse

Viele Änderungen

Kompletter Umbau des Portfolios

Page 25: PHP mit Paul Bocuse

Große Applikationen

Page 26: PHP mit Paul Bocuse

Große Applikationen

Page 27: PHP mit Paul Bocuse

an unternehmenskritische SoftwareAnforderungen

Page 28: PHP mit Paul Bocuse

„Ein Unternehmen ist ein spezieller Betriebstyp in marktwirtschaftlichen Systemen.Konstitutive Merkmale des Unternehmens sind nach Erich Gutenberg das erwerbswirtschaftliche Prinzip (Streben nach Gewinnmaximierung), das Prinzip des Privateigentums und das Autonomieprinzip (Selbstbestimmung des Wirtschaftsplans).“Wikipedia

Unternehmen

Page 29: PHP mit Paul Bocuse

Performance

Page 30: PHP mit Paul Bocuse

Skalierbarkeit

Page 31: PHP mit Paul Bocuse

Kosten

Page 32: PHP mit Paul Bocuse

Wartbarkeit

Page 33: PHP mit Paul Bocuse

Sicherheit & Verfügbarkeit

Page 34: PHP mit Paul Bocuse

Erweiterbarkeit

Page 35: PHP mit Paul Bocuse

Die Anforderungen im Überblick

Page 36: PHP mit Paul Bocuse

1. Der Code Wie finden Sie die richtigen Zutaten für

Ihre Applikation?

2. Das Team Wie schaffen Sie es, dass viele Köche nicht

den Brei verderben?

3. Die Methoden und Tools Wie rühren Sie die einzelnen Zutaten

zusammen und welche Küchengeräte

sollten Sie dazu einsetzen?

Empfehlung des Tages

Page 37: PHP mit Paul Bocuse

Das Salz in einer PHP-Applikation.Code

Page 38: PHP mit Paul Bocuse

Halten Sie Ihren Code sauber

Page 39: PHP mit Paul Bocuse

Sauberer Code

„Sauberer Code kann von anderen Entwicklern gelesen werden. Er verfügt über Unit- und Akzeptanz-Tests. Er enthält bedeutungsvolle Namen. Erst stellt zur Lösung einer Aufgabe nicht mehrere, sondern eine Lösung zur Verfügung. Er enthält minimale Abhängigkeiten, die ausdrücklich definiert sind, und stellt ein klares und minimales API zur Verfügung“Dave Thomas

Page 40: PHP mit Paul Bocuse

Verwende Namen die ihre Absicht aufdecken

• Namen von Variablen, Funktionen oder Klassen, sollten folgende Fragen beantworten:

• Warum existiert die Variable (Funktion oder Klasse)?

• Was macht sie?

• Wie wird sie verwendet?

• $d = 1; // elapsed time in days$elapsedTimeInDays = 1;

Page 41: PHP mit Paul Bocuse

Benennung

• Verwende aussprechbare Namen

• GMDB und XGMDB (eXtended Generic Message Driven Bean)

• Verwende ein Wort pro Konzept (z.B. fetch, retrieve oder get)

• fetchMeals, retrieveIngredients, getChefs

• Vermeide "Nerd Names" in Klassennamen

• ...Helper, ...Manager oder ...Util

Page 42: PHP mit Paul Bocuse

Benennung

Page 43: PHP mit Paul Bocuse

Benennung

Page 44: PHP mit Paul Bocuse

Benennung

Page 45: PHP mit Paul Bocuse

Kommentare

• Gute Kommentare

• @todo-Kommentare

• Informative Kommentare

• PHPDocs in öffentlichen APIs

• Schlechte Kommentare

• Redundante Kommentare

• Postionsmarkierungen

• Auskommentierter Code

Kommentare sind keine Ausrede für schlechten Code.

Page 46: PHP mit Paul Bocuse

Coding Standards

• Legen fest, wie lang eine Zeile sein darf, wie eingerückt wird, wo geklammert wird, wo Leerzeichen stehen, wann Großbuchstaben oder Kleinbuchstaben verwendet werden, wie eine Funktionsdefinition aussehen soll, wie eine Klassendefinition aussehen soll, wie eine Methodendefinition aussehen soll, wie und wo Includes verwendet werden sollen, und, und, und, …

• Haben religiöse Sprengkraft

• Sorgen dafür, dass der Code für alle Entwickler lesbar bleibt

• Entwickler haben dadurch Zeit, sich auf das Wesentliche zu fokussieren

Page 47: PHP mit Paul Bocuse

DRY - Don‘t Repeat Yourself

„Every piece of knowlege must have a single, unambiguous, authoritative representation within a system“

Andrew Hunt and Dave Thomas

Page 48: PHP mit Paul Bocuse

DRY - Don‘t Repeat Yourself

• Nichts ist einfacher als Copy & Paste

• „Nummer Eins der Gestanksparade“ in Refactoring von Martin Fowler

• Jede Doppelung von Code leistet Inkonsistenzen und Fehlern Vorschub

Page 49: PHP mit Paul Bocuse

Fehlerhandling

• Verwende Exceptions

• Reichere deine Exceptions mit sinnvollen Informationen an

• Exceptions sind für den Empfänger wichtig, nicht für den Sender

• Verwende Exceptions nicht als billige Alternative für goto

• Gib niemals null zurück

Page 50: PHP mit Paul Bocuse

Die Pfadfinder-Regel

„Leave the campground cleaner than you found it“

Robert C. Martin

Page 51: PHP mit Paul Bocuse

Die Pfadfinder-Regel

• „Don‘t live with Broken Windows“

• Fixe schlechte Designs, falsche Entscheidungen und schlechten Code sobald du ihn siehst

• Es muss nichts großes sein

• Ändere den Namen einer Variable in einen besserenBreche eine Funktion auf, die zu groß istEliminiere ein kleine Duplizierung

• Software muss dauerhaft sauber gehalten werden

Page 52: PHP mit Paul Bocuse

Die Pfandfinder-Regel

Page 53: PHP mit Paul Bocuse

Schmutziger Code führt zu unsauberem Design.Lass auch bei Detail-Fragen die gleiche Sorgfalt walten wie bei großen Design-Entscheidungen.

Page 54: PHP mit Paul Bocuse

You Ain‘t Gonna Need It (YAGNI)

Page 55: PHP mit Paul Bocuse

You Ain‘t Gonna Need It (YAGNI)

„Always implement things when you actually need them, never when you just foresee that you need them“

Ronald E Jeffries

Page 56: PHP mit Paul Bocuse

You Ain‘t Gonna Need It (YAGNI)

• Anforderungen sind in der Software-Entwicklung notorisch ungenau oder wechselnd

• Ungenaue Anforderungen werden oft durch möglichst flexible und funktionsfähige Software kompensiert

• Es werden Features entwickelt die keine Anwendung finden

• Dinge die niemand braucht, haben keinen Wert.

Page 57: PHP mit Paul Bocuse

Do the simplest thing that could possibly work.

• YAGNI kann als Ergänzung des XP-Prinzips "Do the simplest thing that could possibly work." verstanden werden

• Wann ist ein Design am einfachsten?

• Es verkörpert die Absicht des Entwicklers und besteht alle Tests.

• Es enthält kein Duplizierungen.

• Es enthält das Minimum an Klassen und Methoden

Page 58: PHP mit Paul Bocuse

Emergenz

„Emergenz ist die spontane Herausbildung von komplexen Systemen und Strukturen durch eine Vielzahl von relativ einfachen Interaktionen.“

Wikipedia

Page 59: PHP mit Paul Bocuse

Saubere Software durch emergentes Design

• Alle Tests bestehen

• Software muss in erster Linie den gewollten Zweck erfüllen.

• Software, die nicht testbar ist, kann nicht verifiziert werden.

• Klassen die dem Single Responsibility Prinzip folgen sind leichter zu testen.

• Je mehr Tests wir schreiben, desto mehr bemühen wir uns Code zu schreiben, der einfacher zu testen ist.

Page 60: PHP mit Paul Bocuse

Saubere Software durch emergentes Design

• Alle Tests bestehen

• Eine starke Kopplung erschwert das Schreiben von Tests

• Je mehr Tests wir schreiben, desto mehr bemühen wir uns, die Kopplung zu minimieren

Page 61: PHP mit Paul Bocuse

Saubere Software durch emergentes Design

• Refactoring nach dem Bestehen eines Tests

• Duplizierten Code eliminieren

• Ausdrucksstärke des Codes verbessern

• Anzahl der Klassen und Methoden minimieren

• Tests sichern das bisherige Ergebnis ab

Page 62: PHP mit Paul Bocuse

Vorsicht: Perfekt ist der Feind von "Gut genug"

• Entwickler tendieren dazu Lösungen danach zu analysieren wie elegant und optimal sie für die Problemstellung sind.

• Software Entwicklung ist kein Schönheitswettbewerb

• Der Code ist klar, ausdrucksstark, gut dokumentiert und getestet. Geht es noch besser?

• Klar. Aber es er ist gut genug.

• Verschwende keine Zeit auf der Suche nach dem perfekten Design

Page 63: PHP mit Paul Bocuse

Mit kleinen Schritten zum großen Ziel.Mach es nicht perfekt, mach es gut genug. Je länger Entscheidungen aufgeschoben werden, desto mehr Wissen hat man darüber

Page 64: PHP mit Paul Bocuse

Design Patterns

Page 65: PHP mit Paul Bocuse

Konkretes Problem

„Ich möchte Debug-Meldungen auf verschiedene Arten verarbeiten und diese auswechseln können, ohne den Code der MicroWave Klasse anpassen zu müssen.“

Paul

Page 66: PHP mit Paul Bocuse

Abstraktes Problem

„Ich möchte eine Aufgabe mit verschiedenen Algorithmen lösen können. Jede der Lösungen soll gekapselt sein und nichts von den anderen wissen. Die einzelnen Lösungen sollen gegeneinander austauschbar sein, ohne den nutzenden Client anzupassen.“

Abstract Paul

Page 67: PHP mit Paul Bocuse

Konkret vs Abstrakt

Abstrakt Konkret

AufgabeVerarbeiten von Debug-

Meldungen

AlgorithmenAusgeben per print(), Schreiben

eines Logfiles

Client Die Klasse MicroWave

Page 68: PHP mit Paul Bocuse

Konkret vs Abstrakt

Abstrakt Konkret

AufgabePersistieren von

Gästebucheinträgen

AlgorithmenSpeichern in Datenbank, Speichern in XML-Datei

Client Die Klasse Guestbook

Page 69: PHP mit Paul Bocuse

Einsatz von Interfaces

class MicroWave { ... Eigenschaften der Klasse ...

public function __construct(Debugger $debugger) { $this->debugger = $debugger; }

... weitere Methoden der Klasse ...}

interface Debugger { public function debug($message);}

class DebuggerEcho implements Debugger { public function debug($message) { echo $message . "\n"; }}

Page 70: PHP mit Paul Bocuse

Einsatz von Interfaces

$debugger = new DebuggerEcho();$microWave = new MicroWave($debugger);

class DebuggerLog implements Debugger { public function debug($message) { error_log("{$message}\n", 3, './MicroWave.log'); }}

$debugger = new DebuggerLog();$microWave = new MicroWave($debugger);

• Debugger einsetzen

• Debugger austauschen

Page 71: PHP mit Paul Bocuse

Pauls erstes Design Pattern

Strategy-Pattern

Page 72: PHP mit Paul Bocuse

Design Patterns

• Lösungsmuster für häufig auftretende Entwurfsaufgaben in der Software- Entwicklung

• Keine Code-Bibliothek

• Organisiert in Pattern-Katalogen (z.B. Gang-of-Four Buch)

• Verschiedene Kategorien: Erzeugungsmuster, Strukturmuster, Verhaltensmuster, Enterprise-Patterns

• Verhindern, dass Ihr Code so aussieht.

Page 73: PHP mit Paul Bocuse

Design Patterns

• Lösungsmuster für häufig auftretende Entwurfsaufgaben in der Software- Entwicklung

• Keine Code-Bibliothek

• Organisiert in Pattern-Katalogen (z.B. Gang-of-Four Buch)

• Verschiedene Kategorien: Erzeugungsmuster, Strukturmuster, Verhaltensmuster, Enterprise-Patterns

• Verhindern, dass Ihr Code so aussieht.

Page 74: PHP mit Paul Bocuse

Erzeugungsmuster

• Erzeugungsmuster werden verwendet, um Objekte zu konstruieren.

• Zu den Erzeugungsmustern gehören unter anderem

• Singleton-Pattern

• Factory-Method-Pattern

• Prototype-Pattern

• Abstract-Factory-Pattern

Page 75: PHP mit Paul Bocuse

Factory-Method-Pattern

• Definiert eine Schnittstelle zur Erzeugung von Objekten

• Verlagert die eigentliche Instanziierung in Unterklassen

• Lässt Unterklassen entscheiden, welche konkrete Implementierung verwendet wird

Page 76: PHP mit Paul Bocuse

Factory-Method-Pattern

abstract class AbstractManufacturer {

protected $name;

public function __construct($name) { $this->name = $name; }

public function sellOven() { $oven = $this->manufactureOven(); // weitere Operationen möglich return $oven; }

public abstract function manufactureOven();

}

Page 77: PHP mit Paul Bocuse

Factory-Method-Pattern

class MicroWaveOvenManufacturer extends AbstractManufacturer {

public function manufactureOven() { return new MicroWave($this->name); }

}

$mwManufacturer = new MicroWaveOvenManufacturer('Bosch'); $microWave = $mwManufacturer->sellOven();

Page 78: PHP mit Paul Bocuse

Factory-Method-Pattern

Das Factory-Method-Pattern definiert eine Schnittstelle zur Erzeugung von Objekten. Es verlagert aber die eigentliche Instanziierung in Unterklassen; es lässt die Unterklassen entscheiden, welche konkreten Implementierungen verwendet werden.

Page 79: PHP mit Paul Bocuse

Factory-Method-Pattern

Page 80: PHP mit Paul Bocuse

Prototype-Pattern

• Das Prototype-Pattern erzeugt Objekte durch das Kopieren eines prototypischen Exemplars

• Es ermöglicht das Hinzufügen neuer "Klassen" zur Laufzeit ohne Programmierung

• Es hält die Anzahl der benötigten Klassen klein

Page 81: PHP mit Paul Bocuse

Prototype-Pattern

class SandwichMaker {

protected $prototypes = array();

public function addRecipe($recipe, Sandwich $prototype) { $this->prototypes[$recipe] = $prototype; }

public function makeSandwich($recipe) { if (!isset($this->prototypes[$recipe])) { throw new UnknownRecipeException( 'No prototype for sandwich ' . $recipe . ' registered'); } return clone $this->prototypes[$recipe]; }

}

Page 82: PHP mit Paul Bocuse

Prototype-Pattern

interface Sandwich { ... }class Melt implements Sandwich { ... }class Reuben implements Sandwich { ... }

$swMaker = new SandwichMaker();

$blt = new Reuben();$blt->addIngredient('Bacon');$blt->addIngredient('Lettuce');$blt->addIngredient('Tomato'); $swMaker->addRecipe('Tomato', $blt);

$cheese = new Melt();$cheese->addIngredient('Blue Cheese');$cheese->addIngredient('Swiss Cheese'); $swMaker->addRecipe('Cheese', $cheese);

Page 83: PHP mit Paul Bocuse

Prototype-Pattern

Das Prototyp-Muster bestimmt die Arten der zu erzeugenden Objekte durch die Verwendung eines prototypischen Exemplars, das zur Erzeugung neuer Instanzen kopiert wird.

Page 84: PHP mit Paul Bocuse

Prototype-Pattern

Page 85: PHP mit Paul Bocuse

Strukturmuster

• Strukturmuster befassen sich mit der Komposition von Objekten

• Zu den Strukturmustern gehören unter anderem

• Composite-Pattern

• Proxy-Pattern

• Adapter-Pattern

• Facade-Pattern

Page 86: PHP mit Paul Bocuse

Composite-Pattern

• Lässt mehrere Instanzen eines Typs nach außen wie eine Instanz aussehen

• Implementieren einer neuen Klasse, die die einzelnen Instanzen aufnimmt

• Muss die selbe Schnittstelle implementieren wie die entsprechenden Instanzen

Page 87: PHP mit Paul Bocuse

Composite-Pattern

interface Debugger { public function debug($message);}

// Implementierungenclass DebuggerLog implements Debugger { public function debug($message) { error_log($mssage, 3, 'debug.log'); }}

class DebuggerMail implements Debugger { public function debug($message) { mail('[email protected]', 'Error happened', $message); }}

Page 88: PHP mit Paul Bocuse

Composite-Pattern

class DebuggerComposite implements Debugger {

protected $debuggers = array();

public function addDebugger(Debugger $debugger) { $this->debuggers[] = $debugger; }

public function debug($message) { foreach ($this->debuggers as $debugger) { $debugger->debug($message); } }

}

$debuggerComposite = new DebuggerComposite(); $debuggerComposite->addDebugger(new DebuggerLog()); $debuggerComposite->addDebugger(new DebuggerMail());

Page 89: PHP mit Paul Bocuse

Composite-Pattern

Das Composite-Pattern fügt mehrere Objekte zu einer Baumstruktur zusammen und ermöglicht es, diese von außen wie ein einzelnes zu verwenden.

Page 90: PHP mit Paul Bocuse

Composite-Pattern

Page 91: PHP mit Paul Bocuse

Adapter-Pattern

• Das Adapter-Pattern passt die Schnittstelle eines Objekts an die vom Client erwartete Schnittstelle.

• Es erleichtert die Nutzung von Fremdcode in eigenen Systemen.

• Das Adapter-Pattern arbeitet ähnlich wie ein Adapter für Steckdosen.

Page 92: PHP mit Paul Bocuse

Adapter-Pattern

class TwitterWarningSender {

protected $tweet;

public function prepareTweet($tweet) { $this->tweet = $tweet; } public function sendTweet() { // Code, der die Nachricht an Twitter verschickt. }

}

Page 93: PHP mit Paul Bocuse

Adapter-Pattern

class TwitterWarningSenderAdapter implements Debugger {

protected $warningSender;

public function __construct(TwitterWarningSender $warningSender) { $this->warningSender = $warningSender; }

...

public function debug($message) { $this->warningSender->prepareTweet($message); $this->warningSender->sendTweet(); }}

$warningSender = new TwitterWarningSender();

$debugger = new TwitterWarningSenderAdapter($warningSender);$microWave = new MicroWave($debugger);

Page 94: PHP mit Paul Bocuse

Adapter-Pattern

Das Adapter-Muster passt die Schnittstelle einer Klasse an die vom Client erwartete Schnittstelle an. Es ermöglicht die Zusammenarbeit von Klassen, die eigentlich aufgrund inkompatibler Schnittstellen nicht zusammenarbeiten können.

Page 95: PHP mit Paul Bocuse

Adapter-Pattern

Page 96: PHP mit Paul Bocuse

Verhaltensmuster

• Verhaltensmuster beschreiben die Interaktion zwischen Objekten.

• Zu den Verhaltensmustern gehören unter anderem

• Subject/Observer-Pattern

• Template-Method-Pattern

• Command-Pattern

• Iterator-Pattern

Page 97: PHP mit Paul Bocuse

Template-Method-Pattern

• Definiert die Schritte eines Algorithmus in einer Methode

• Implementierung der einzelnen Schritte bleibt Unterklassen vorbehalten

• Gemeinsames Verhalten muss nur einmal implementiert werden: Änderungen am Algorithmus nur an einer Stelle notwendig

• Neue Unterklassen müssen nur die konkreten Schritte implementieren

Page 98: PHP mit Paul Bocuse

Template-Method-Pattern

abstract class AbstractSandwichMaker { ...

final public function makeSandwich() { print "Butter auf‘s Brot\n"; $this->addButter(); $this->addCheese(); if ($this->isMeltedSandwich()) { $this->melt(); } }

abstract protected function addButter(); abstract protected function addCheese(); abstract protected function isMeltedSandwich();

protected function melt() { print "Überbacke den Sandwich.\n"; }

}

Page 99: PHP mit Paul Bocuse

Template-Method-Pattern

class SwissCheeseSandwichMaker extends SandwichMaker {

protected function addButter() { print "Füge Butter hinzu.\n"; }

protected function addCheese() { print "Füge Swiss Cheese hinzu.\n"; }

protected function isMelted() { return true; }

}

Page 100: PHP mit Paul Bocuse

Template-Method-Pattern

Das Template-Method-Pattern definiert die Schritte eines Algorithmus in einer Methode und überlässt die Implementierung der einzelnen Schritte den Unterklassen. Diese können somit Teile des Algorithmus modifizieren, ohne dessen Struktur zu verändern.

Page 101: PHP mit Paul Bocuse

Template-Method-Pattern

Page 102: PHP mit Paul Bocuse

Command-Pattern

• Kapselt einen Auftrag als Objekt.

• Aufträge (Objekte) sind parametrisierbar

• Aufträge können in einer Queue nacheinander abgearbeitet werden

• Aufträge können rückgängig gemacht werden.

Page 103: PHP mit Paul Bocuse

Command-Pattern

interface DishWasherCommand { public function execute(Dishes $dishes); }

class DishWaherSimpleWashCommand implements DishWasherCommand { public function execute(Dishes $dishes) { echo "Das Geschirr wird gewaschen"; }}

class DishWasherDryingCommand implements DishWasherCommand { public function execute(Dishes $dishes) { echo "Das Geschirr wird getrocknet"; }}

Page 104: PHP mit Paul Bocuse

Command-Pattern

class DishWasher {

protected $programmes = array();

public function addProgramme($name, array $commands) { $this->programmes[$name] = $commands; }

public function wash($prog, Dishes $dishes) { foreach ($this->programmes[$prog] as $command) { $command->execute($dishes); } }

}

Page 105: PHP mit Paul Bocuse

Command-Pattern

$wash = new DishWasher();

$wash->addProgramme('standard', array( new DishWasherSimpleWashCommand(), new DishWasherDryingCommand()));

$wash->wash('standard', $dishes);

Page 106: PHP mit Paul Bocuse

Command-Pattern

Das Command-Pattern kapselt einen Auftrag als Objekt. Dadurch wird ermöglicht, andere Objekte mit Aufträgen zu parametrisieren, Aufträge in eine Queue zu stellen oder diese rückgängig zu machen.

Page 107: PHP mit Paul Bocuse

Command-Pattern

Page 108: PHP mit Paul Bocuse

• Kommen aus der Java Welt

• Stark geprägt durch Martin Fowler

• Meistens komplexer als die Gang-of-Four Patterns

• Deswegen ab hier keine Beispiele mehr

• Mehr zu Enterprise Patterns in PHP imBuch "PHP Design Patterns"

http://www.phpdesignpatterns.de

Enterprise Patterns

Page 109: PHP mit Paul Bocuse

Verteilte Architekturen

Page 110: PHP mit Paul Bocuse

Klassische PHP Architektur

Client

Alle Logik und alle Daten in einer Applikation auf einem Server

HTTP

Page 111: PHP mit Paul Bocuse
Page 112: PHP mit Paul Bocuse

Client

Verteilte Architektur

Frontend

Service Layer

Business Logic

Storage

HTTP

Page 113: PHP mit Paul Bocuse

Frontend FrontendFrontend

Storage Storage Storage Storage

Client

Verteilte Architektur

Service Layer

Business Logic

HTTP

Page 114: PHP mit Paul Bocuse

Vor- und Nachteile verteilter Architekturen

+ -• Skaliert besser als monolithische

Architekturen.

• Verschiedene Schichten können leichter erweitert werden.

• Einzelne Schichten können getrennt voneinander entwickelt und gewartet werden.

• Komplexität steigt an

• Sie brauchen klare Deployment-Prozesse und Versionierung der einzelnen Schichten.

• Gesteigerter Testaufwand

Page 115: PHP mit Paul Bocuse

Fallbeispiel: 1und1.de

Client

Frontend und Business Logik

HTTP

Storage Storage Storage

Session

Frontend und Business Logik

Session

Session

Session

Telnet

Page 116: PHP mit Paul Bocuse

Fallbeispiel: 1und1.de

• Cluster mit vier Frontend-Rechnern

• Daten werden in MySQL-Cluster gehalten

• Sessions werden in einem Session-Cluster verwaltet

• IP des Rechners, der die Session hält ist in Session-Id verschlüsselt

• Beliebige zustandslose Frontend-Rechner greifen dadurch immer auf den korrekten Session-Host zu

• Einfaches Telnet-Protokoll zum Abrufen der serialisierten Session-Daten

Page 117: PHP mit Paul Bocuse

Fallbeispiel: United-Internet.de

Client

Frontend

HTTP

Services Services Services

CDS

FrontendCDS

CDS

HTTP

Page 118: PHP mit Paul Bocuse

Fallbeispiel: United-Internet.de

• Cluster mit zwei Frontend-Rechnern

• Größter Teil der Business-Logik und Daten werden über Services (RMI, REST & SOAP) von verschiedensten Middleware-Systemen bereit gestellt.

• Statische Ressourcen werden beim Deployment auf Content-Delivery-Server übertragen.

• Content-Delivery-Server verwenden Light HTTPD

• Statische Ressourcen werden performant ausgeliefert

• Requests auf Frontend-Rechner kann um bis zu 75% reduziert werden.

Page 119: PHP mit Paul Bocuse

Caching

Page 120: PHP mit Paul Bocuse

Premature Optimization

„Premature optimization is the root of all evil“Donald Knuth

Page 121: PHP mit Paul Bocuse

Premature Optimization

• Premature Optimization beschreibt die Situation in der Design Entscheidungen aufgrund von Performance-Optimierungen getroffen werden

• Solche Optimierungen resultieren oft in unleserlicherem Code

Page 122: PHP mit Paul Bocuse

Michael Jackson über Premature Optimization

„Don't do it!”

Page 123: PHP mit Paul Bocuse

Michael A. Jackson über Premature Optimization

„Don't do it!

For experts:Don't do it yet.”

Page 124: PHP mit Paul Bocuse

Premature Optimization

• Was wenn Performance-Optimierung unumgänglich ist?

• Anwendung & Design entwickeln

• Profiler / Benchmarks einsetzen

• Flaschenhälse identifizieren

• Ein einfaches und elegantes Design ist oft leichter zu optimieren

Page 125: PHP mit Paul Bocuse

• Caching und Optimierungen können in verschiedenen Schichten Ihrer Applikation Sinn machen.

• Verwenden Sie einen Profiler oder Logging, um zu analysieren, wo Ihre Performance Probleme liegen.

Caching und Optimierungen

Client

Logik

Dateisystem

Page 126: PHP mit Paul Bocuse

HTTP-Caching

• PHP ermöglicht Ihnen, HTTP-Header zu setzen, die das Caching des Clients beeinflussen:

• Expires-Header

• ETag-Header

• Reduziert die Load auf dem Server und beschleunigt den Aufbau Ihrer Website.

Page 127: PHP mit Paul Bocuse

Caching der Logik

• Cachen Sie komplexe Operationen, die nicht für jeden Request neu ausgeführt werden müssen.

• Parsen von XML-Dateien

• Datenbank-Abfragen

• Generierung von XSL-Stylesheets

• Legen Sie Daten im serialize-Format von PHP ab.

Page 128: PHP mit Paul Bocuse

Caching des Dateisystems

• Abfragen auf das Dateisystem kosten Zeit.

• Können zum Bottleneck werden.

• APC ist eine Alternative, Caching ist jedoch lokal pro Server.

• memcached kann auch von mehreren Servern eingesetzt werden.

Page 129: PHP mit Paul Bocuse

PHP Caching

• Opcode-Caches verhindern, dass Ihre Skripte bei jedem Request neu interpretiert werden müssen.

• Alternative PHP Cache (http://pecl.php.net/package/APC)

• eAccelerator (http://eaccelerator.net/)

• XCache (http://xcache.lighttpd.net/)

• Zend Server (http://www.zend.com/de/products/server/)

Page 130: PHP mit Paul Bocuse

Don't reinvent the wheel ...

Page 131: PHP mit Paul Bocuse

... unless you plan learning more about wheels

• "Reinventing the wheel" ist eines der bekanntesten Anti-Patterns in der Software Entwicklung

• Stetige Neuerstellung von Software ohne bestehende Lösungen oder Frameworks zu nutzen

• Verhindert Wiederverwendung und führt zu instabiler, unreifer, teurer Software

• Sie sind nicht alleine

• Irgendwo auf der Welt kämpft immer jemand an den gleichen Software Design Problemen wie Sie

Page 132: PHP mit Paul Bocuse

Vorteile von Frameworks

• Bringen fertige Komponenten und Lösungen für typische Probleme mit:

• Cross-Cutting-Concerns werden vom Framework gelöst.

• Fokussieren Sie Ihren Entwicklungsaufwand auf die Business-Logik anstatt auf das Schreiben von Glue-Code.

• Standardisieren Ihre Architektur und Ihren Entwicklungsprozess:

• Durch Inversion-of-Control wird die Steuerung des Ablaufs an das Framework übergeben.

• Ihr Team implementiert Standard-Interfaces des Frameworks.

Page 133: PHP mit Paul Bocuse

• Komponenten-orientiertes Framework für PHP 5

• Fokusiert auf Web 2.0 Anwendungen

• Viele Komponenten wie z.B. MVC-System, Lokalisierung, PDF-Erstellung oder Suchfunktionen

• http://framework.zend.com

• Einige der Merkmale

• Flex Integration

• LDAP Interface

• REST Interface

• Caching

• Google Apps Integration

Zend Framework

Page 134: PHP mit Paul Bocuse

• MVC Framework für PHP 5

• Wird seit 2005 entwickelt

• Basiert auf den Prinzipien von Ruby on Rails

• Fokusiert für die Entwicklung von Enterprise-Level Anwendungen (wie z.B. Askeet und Yahoo)

• http://www.symfony-project.org

• Einige der Merkmale

• Template Engine mit PHP Syntax

• Scaffolding von CRUD-Interfaces

• Request Dispatcher für "saubere" URLs

• Mehrsprachigkeit

Symfony

Page 135: PHP mit Paul Bocuse

CakePHP

• MVC Framework für PHP 4 und 5, dass seit 2005 entwickelt wird

• Basiert auf den Prinzipien von Ruby on Rails

• Fokussiert auf Einfachheit und schneller Entwicklung

• Geeignet für Websites und Kommandozeilen-Tool

• http://cakephp.org

• Einige der Merkmale

• Application Scaffolding

• Code Generation

• Authentifizierung

• Helper für AJAX, XML, RSS, JavaScript und mehr

Page 136: PHP mit Paul Bocuse

CodeIgniter

• Leichtgewichtiges auf Einfachheit und Schnelligkeit fokussiertes Framework für PHP 4

• Erste öffentliche Version seit 2006

• Gut geeignet für Shared Hosting Accounts

• Gute Dokumentation mit vielen Video Tutorials, einem User Guide und einem Wiki

http://codeigniter.com

• Einige der Merkmale

• Bild-Manipulation

• FTP-Support

• Verschlüsselung

• Filtern von Eingaben und Ausgaben

Page 137: PHP mit Paul Bocuse

Apache Zeta Components

• Besser bekannt als eZ Components

• Seit Juli 2010 bei Apache

• Modulare Komponentenbibliothek für PHP 5

• http://incubator.apache.org/zetacomponents

• Einige der Merkmale

• Template Engine

• Unterstützung für RSS-Feeds

• Generierung von Graphen

• WebDAV Server

• Validierung von Benutzereingaben

Page 138: PHP mit Paul Bocuse

Und viele Weitere

Page 139: PHP mit Paul Bocuse

Der Code

Clean Code

Verteilte Architekturen Don‘t Reinvent

Design PatternsYAGNI

Caching

Page 140: PHP mit Paul Bocuse

Buchempfehlungen

Page 141: PHP mit Paul Bocuse

Viele Köche verderben nicht immer den Brei.Das Team

Page 142: PHP mit Paul Bocuse

Kommunikation

Page 143: PHP mit Paul Bocuse

Communication is King!

• Verstehen die Entwickler, was der Kunde möchte?

• Versteht der Kunde, was der Entwickler liefern kann?

• Verstehen die Entwickler gegenseitig wirklich, wie die Schnittstellen aussehen?

• Verstehen die Entwickler, was die Qualitätssicherung braucht?

• Verstehen Sie, was ich damit sagen will?

Page 144: PHP mit Paul Bocuse

Kommunikationswege

• Treffen von Angesicht zu Angesicht.

• Treffen von Angesicht zu Angesicht.

• Treffen von Angesicht zu Angesicht.

• Videokonferenzen.

• Telefonkonferenzen.

• E-Mails und Instant Messenger.

• Projekt-Blogs und Microblogging.

Page 145: PHP mit Paul Bocuse

Kreative Kommunikations-wege

Page 146: PHP mit Paul Bocuse

Vertrauen

Forming

Storming

Norming

Performing

„Das Vertrauen gibt dem Gespräch mehr

Stoff als Geist.“

François Duc de La Rochefoucauld

Page 147: PHP mit Paul Bocuse

Teambildung

• Gemeinsame private Erlebnisse stärken das Teamgefühl und fördern die Zusammenarbeit.

• Das gilt nicht nur für gemeinsame Essen, jedoch ist der Effekt dabei besonders groß.

• Schaffen Sie Rituale.

Page 148: PHP mit Paul Bocuse

Tod durch Meeting

• Team-Meetings sind oft unstruktiert und werden von vielen als verschenkte Zeit empfunden.

• Machen Sie sich Gedanken über die Struktur und das Ziel der Meetings.

• Richten Sie verschiedene Meetings mit verschiedenen Zielen ein, statt alles in einem Meeting zu besprechen.

• Strategie-Meeting, Status-Meeting, ...

• Es gibt kein Rezept für die richtigen Meetings.

Richten Sie die richtigen Meetings für Ihr Team ein.

Page 149: PHP mit Paul Bocuse

Beat the Meeting

Be...scheiden

Erfolgreich

AbgehaktT

odo 60s pro

Thema

Jedes Team-Mitglied erzählt 60 Sekunden zu jedem Thema.

Ein Thema geht reihum, bevor das nächste

Thema drankommt.

Page 150: PHP mit Paul Bocuse

Vorteile von BEAT

• Die Meetings erhalten eine klare Struktur.

• Jeder weiß, was von ihm erwartet wird und kann sich vorbereiten.

• Die vorangegangene Woche wird reflektiert und sowohl über positive als auch negative Erlebnisse nachgedacht.

Page 151: PHP mit Paul Bocuse

Planning Poker

Page 152: PHP mit Paul Bocuse

Organisation und Struktur

Page 153: PHP mit Paul Bocuse

Die richtige Team-Zusammensetzung

Senior vs. Junior Entwickler

Kreative Köpfe vs. Analytiker

Kommunikative Mitarbeiter vs. Zuhörer

Führungspersönlichkeiten

Page 154: PHP mit Paul Bocuse

Verantwortung

• Teilen Sie die Verantwortung im Team auf und vermeiden Sie, dass diese sich an wenigen Stellen konzentriert.

• Etablieren Sie Collective Code Ownership.

• Ermöglichen Sie einen konstruktiven Umgang mit Fehlern im Team, ansonsten wird niemand Verantwortung übernehmen.

• Zu Verantwortung gehört auch die Möglichkeit, Entscheidungen treffen zu dürfen.

Page 155: PHP mit Paul Bocuse

Kultur der Angst

„Was wären wir sündigen Kreaturen dann ohne die Angst, diese vielleicht wohltätigste und gnädigste Gabe Gottes?“Umberto Eco, „Der Name der Rose“

Page 156: PHP mit Paul Bocuse

Sie leben in einer Kultur der Angst, wenn...

• …es gefährlich ist, bestimmte Dinge auszusprechen.

• …Zielvorgaben so aggressiv sind, dass diese unmöglich erreicht werden können.

• …Macht über gesunden Menschenverstand triumphieren darf.

• …die Leute, die gehen müssen, sind im Durchschnitt kompetenter als die, die bleiben.

Aus "Spielräume" von Tom DeMarco

Page 157: PHP mit Paul Bocuse

Matrixorganisation

PHP Entwickler 1

PHP Entwickler 2

PHP Entwickler 3

PHP Entwickler 4

PHP Entwickler 5

Frontend Entwickler 1

Frontend Entwickler 2

Frontend Entwickler 3

Frontend Entwickler 4

Frontend Entwickler 5

Tester 1

Tester 2

Tester 3

Tester 4

Projektleiter A

Projektleiter B

Projektleiter C

Teamleiter PHPTeamleiter Frontend

Teamleiter QA

Organisatorische EinheitProjekteinheit

Page 158: PHP mit Paul Bocuse

Vor- und Nachteile der Matrixorganisation

+ -• Kürzere Kommunikationswege

• Spezialisierung der Teamleiter, sie müssen nicht parallel noch Projektmanager sein

• permanenter Ansprechpartner für den Mitarbeiter, der sich um dessen Weiterentwicklung kümmern kann.

• Kompetenzkonflikte können auftreten

• Langsame Entscheidungsfindung

• Hoher Kommunikationsaufwand

• Unsicherheit bei den Mitarbeitern(„Zwei Herren“)

Page 159: PHP mit Paul Bocuse

Das Team

Kommunikation Organisation & Struktur

Page 160: PHP mit Paul Bocuse

Buchempfehlungen

Page 161: PHP mit Paul Bocuse

Schneiden, mixen, rühren und der richtige Ofen.Methoden und Tools

Page 162: PHP mit Paul Bocuse

Versionsverwaltung

Page 163: PHP mit Paul Bocuse

Versionsverwaltung

• Ermöglicht parallele Änderungen an einem Projekt

• Es gibt viele Variationen von Versionsverwaltungssystemen - alle teilen die gleichen Konzepte: Checkouts, Commits, Merges und Nebenläufigkeit

• Es ist egal, welches System Sie einsetzen, aber tun Sie's!

Page 164: PHP mit Paul Bocuse

Richtlinien für die Versionsverwaltung

• Einigen Sie sich auf gemeinsame Richtlinien

• Checkins von Zwischenschritten (nicht funktionierenden)?

• Wo sollte der Code eingechecked werden?

• Gibt es Orte die weniger kontrolliert werden?

• Wie gelangen die Änderungen in Releases?

• Wie werden Tags, Branches und der Trunk verwendet?

Page 165: PHP mit Paul Bocuse

Branching Patterns

• Gängige Patterns

• Release Branches

• Feature Branches

Page 166: PHP mit Paul Bocuse

Release Branch

• Ist die Entwicklung einer neuen Version der Anwendung abgeschlossen, wird ein Release Branch erzeugt

• Dieser Branch wird anschließend getestet, getagged und deployed

/trunk

/branches/v1.0 /branches/v2.0

/tags/v1.0.0 /tags/v2.0.0

Page 167: PHP mit Paul Bocuse

Aktualisierung des Release Branch

• Entwicklung im Branch direkt sollte generell vermieden werden

• Bugs werden im Trunk gefixt und anschließend in den Branch gemerged

• Ansonsten besteht die Gefahr, dass Änderungen nicht in den Trunk übernommen werden und beim nächsten Release-Branch fehlen

• Ausnahmen sind Änderungen, die für den Trunk nicht mehr nötig oder nicht möglich sind

Page 168: PHP mit Paul Bocuse

Feature Branch

• Umfasst eine Neuentwicklung mehrere Commits die den Trunk in einen instabilen Zustand versetzen, wird ein Feature Branch angelegt

• Nach abgeschlossener Test-Phase wird der Branch zurück in den Trunk gemerged und von dort deployed

/trunk

/branches/feature-1

/branches/feature-2

Page 169: PHP mit Paul Bocuse

Aktualisierung des Feature Branch

• Ein Feature Branch sollte stets aktuell gehalten werden

• Im Idealfall wird der Trunk ein bis zwei mal pro Woche in den Branch gemerged

• Je älter ein Branch ist, desto schwieriger wird der Merge zurück in den Trunk

• Sobald der Branch zurück in den Trunk gemerged wurde ist die Entwicklung darin abgeschlossen

Page 170: PHP mit Paul Bocuse

Tools zur Versionsverwaltung

GIT

Page 171: PHP mit Paul Bocuse

Tools zur Versionsverwaltung

Subversion

Page 172: PHP mit Paul Bocuse

Tools zur Versionsverwaltung

CVS

Page 173: PHP mit Paul Bocuse

Tools zur Versionsverwaltung

Mercurial

Page 174: PHP mit Paul Bocuse

Tools zur Versionsverwaltung

Bazaar

Page 175: PHP mit Paul Bocuse

Tools zur Versionsverwaltung

LibreSource

Page 176: PHP mit Paul Bocuse

Es ist egal welches Tool Sie einsetzen, aber tun Sie's

Tools zur Versionsverwaltung

Page 177: PHP mit Paul Bocuse

Hosting Optionen

Page 178: PHP mit Paul Bocuse

Hosting Optionen

Page 179: PHP mit Paul Bocuse

Hosting Optionen

Page 180: PHP mit Paul Bocuse

Hosting Optionen

Page 181: PHP mit Paul Bocuse

Entwicklungsumgebung

Page 182: PHP mit Paul Bocuse

Entwicklungsumgebung

Page 183: PHP mit Paul Bocuse

Entwicklungsumgebung

• Eclipse PDThttp://www.eclipse.org/pdt/

• Komodo IDEhttp://www.activestate.com/komodo-ide

• PHPEdithttp://www.phpedit.com

• Netbeanshttp://netbeans.org

• phpDesignerhttp://www.mpsoftware.dk

• Zend Studiohttp://www.zend.com/de/products/studio/

• Aptana Studiohttp://www.aptana.com/products/studio3

• Codelobsterhttp://www.codelobster.com

• NuSphere PhpEDhttp://www.nusphere.com

• Dreamweaverhttp://www.adobe.com/de/products/dreamweaver/

• E-Texteditorhttp://www.e-texteditor.com

• Codahttp://www.panic.com/coda/

• Textmatehttp://macromates.com

• ...

Page 184: PHP mit Paul Bocuse

Syntax Highlighting

Page 185: PHP mit Paul Bocuse

Code Completion

Page 186: PHP mit Paul Bocuse

Code Snippets

Page 187: PHP mit Paul Bocuse

Code Folding

Page 188: PHP mit Paul Bocuse

Navigation

Page 189: PHP mit Paul Bocuse

Debugging

Page 190: PHP mit Paul Bocuse

Integrierte Versionsverwaltung

Page 191: PHP mit Paul Bocuse

Fehler- und Warnhinweise

Page 192: PHP mit Paul Bocuse

Refactoring und Code Generierung

Page 193: PHP mit Paul Bocuse

Unterstützung für HTML, CSS & JavaScript

Page 194: PHP mit Paul Bocuse

Unit Tests

Page 195: PHP mit Paul Bocuse

Die Qual der Wahl

• Schnell einsatzbereit oder möglichst "feature complete"?

• Kostenlos oder kostenpflichtig?

• Tipps zur Entscheidungsfindung

• Testen Sie die kostenlosen IDEs zuerst

• Wenn Sie eine IDE gefunden haben, die Ihre gewünschten Funktionen bietet, prüfen Sie ob diese korrekt in der IDE funktionieren

• Wenn nur wenige Funktionen fehlen, testen Sie dafür spezifische Tools

Page 196: PHP mit Paul Bocuse

Statische Code Analyse

Page 197: PHP mit Paul Bocuse

Statische Code Analyse

• White-Box-Test Verfahren - man benötigt den Quelltext

• Der Quelltext wird dabei einer Reihe formaler Prüfungen unterzogen

• Statische Code Analyse ermöglicht unter anderem

• das werkzeuggestützte oder automatisierte Erkennen von Fehlern

• die Abdeckung von zusätzlichen Qualitätsaspekten wie Wartbarkeit und Analysierbarkeit

• eine einfache Vergleichbarkeit der Messergebnisse mit anderen Systemen

Page 198: PHP mit Paul Bocuse

• Misst mithilfe unterschiedlicher Ausprägungen den Umfang eines PHP Projekts anhand der Lines of Code (LOC)

• Darüber hinaus wird die Anzahl der Namensräume, Klassen, Methoden und Funktionen gezählt

• https://github.com/sebastianbergmann/phploc

phploc

Page 201: PHP mit Paul Bocuse

PHP Depend

• Ein an JDepend angelehntes Tool das eine Vielzahl an Software-Metriken für PHP Projekte berechnet und visualisiert

• Zyklomatische Komplexität

• NPath-Komplexität

• http://pdepend.org

Page 202: PHP mit Paul Bocuse

PHP Depend

• Ein an JDepend angelehntes Tool das eine Vielzahl an Software-Metriken für PHP Projekte berechnet und visualisiert

• Zyklomatische Komplexität

• NPath-Komplexität

• http://pdepend.org

Page 203: PHP mit Paul Bocuse

PHP Mess Detector

• An das Java Tool PMD angelehntes Tool, dass auf PHP_Depend aufsetzt und Warnungen bzw. Fehler auslöst wenn vorgegebene Schwellenwerte für einzelne Software-Metriken überschritten werden

• http://phpmd.org

Page 204: PHP mit Paul Bocuse

PHP_CodeSniffer

• Durchsucht PHP Projekte nach "übel riechenden Codes" (Code Smells) wie beispielsweise

• Formatierungsregeln

• Software-Metriken

• Erkennung von potentiellen Fehlern

• Performance Problemen

• http://pear.php.net/package/PHP_CodeSniffer/

Page 205: PHP mit Paul Bocuse

Testing & Integration

Page 206: PHP mit Paul Bocuse

Test

• Es gibt viele Arten von Tests

• Unit TestsEin Test auf der tiefsten Ebene bei dem einzelne Komponenten auf korrekte Funktionalität getestet werden

• IntegrationstestsTesten die Zusammenarbeit voneinander abhängigen Komponenten

• AkzeptanztestsEin Test der gelieferten Software durch den Kunden

• SystemtestsDas gesamte System wird gegen die gesamten Anforderungen (funktionale und nicht funktionale Anforderungen) getestet

Page 207: PHP mit Paul Bocuse

Unit Tests

„Im Unit Test werden kleinere Programmteile in Isolation von anderen Programmteilen getestet.“

Frank Westphal

Page 208: PHP mit Paul Bocuse

Unit Tests

• Testen eine einzelne Codeeinheit isoliert.

• Die Granularität der Codeeinheit kann von Methoden über Klassen bis hin zu Komponenten reichen.

• Unit Test-Frameworks für PHP

• PHPUnit - JUnit Portierung für PHP von Sebastian Bergmann

• SimpleTest - von Marcus Baker

Page 209: PHP mit Paul Bocuse

Unit Tests

require_once 'OvenCompany.php';

class OvenCompanyTest extends PHPUnit_Framework_TestCase {

protected $ovenCompany;

protected function setUp() { $this->ovenCompany = new OvenCompany(); }

public function testAddToInventory() { $this->ovenCompany->addToInventory(new MicroWave('Bosch', 'silber')); $ovenCount = $this->ovenCompany->countOvensInInventory(); $this->assertEquals(1, $ovenCount); }

}

Page 210: PHP mit Paul Bocuse

Unit Tests

$ phpunit OvenCompanyTestPHPUnit 3.4.2 by Sebastian Bergmann.

.

Time: 0 seconds

OK (1 test, 1 assertion)

Page 211: PHP mit Paul Bocuse

Integrations- und Akzeptanztests

„There is a vast gulf between the process mappers who model business systems pictorially, and the programmers who grind out the C++ or Java or .Net services that support those business systems. Between the two camps lies a fertile land of opportunity. It's time to jointly explore it.“

Ward Cunningham

Page 212: PHP mit Paul Bocuse

FIT - Framework for Integrated Tests

• Framework für Integrations- und Akzeptanz-Tests

• Der Kunde schreibt die Testfälle in HTML, Word oder Excel

• Bezieht den Kunden in den Entwicklungsprozess ein und fördert agiles Vorgehen

• Mittlerweile für sehr viele Sprachen verfügbar, für PHP innerhalb von PEAR

Page 213: PHP mit Paul Bocuse

Funktionsweise

• Kunde erstellt eine Tabelle mit Eingabe-Parametern und erwarteten Rückgabe-Werten

• FIT parst die HTML-Tabelle und interpretiert diese als Testfälle

• FIT reicht die Eingabeparameter an den Testcode (Fixture) weiter

• Der Testcode führt den zu testenden Code aus

• FIT holt die das Ergebnis aus dem Testcode

• FIT markiert Abweichungen in der HTML-Tabelle

Page 214: PHP mit Paul Bocuse

Funktionsweise

Page 215: PHP mit Paul Bocuse

Webtests mit Selenium

• Dem Kunden sind Unit-Tests egal, wenn die Website nicht funktioniert

• Selenium prüft die Anwendung auf der Ebene, die der Kunde sieht

• Steuert den Browser fern und prüft gegen das erwartete Verhalten

• Funktioniert in allen großen Browsern, auch im IE6

• Tests können über Firefox-Extension aufgezeichnet werden

• Selenium RC ermöglicht Fernsteuerung aus PHPUnit Tests

Page 216: PHP mit Paul Bocuse

Selenium in Bildern

Page 217: PHP mit Paul Bocuse

Selenium in Bildern

Page 218: PHP mit Paul Bocuse

Continuous Integration

• Beschreibt den Prozess des regelmäßigen, vollständigen Builds und Testens einer Anwendung

• Vorteile durch den Einsatz von CI

• Integrations-Probleme werden frühzeitig entdeckt

• Fehler werden nicht verschleppt

• Code Qualität ist über den gesamten Entwicklungsprozess sichtbar

Page 219: PHP mit Paul Bocuse

Continuous Integration

SVN Repository CI Server

Page 220: PHP mit Paul Bocuse

phpUnderControl

Page 221: PHP mit Paul Bocuse

Mehr Tools

Page 222: PHP mit Paul Bocuse

Better safe than sorry.Schaffe dir Sicherheitsnetze durch automatisierte Tests auf verschiedenen Ebenen deiner Applikation.

Integriere regelmäßig und stelle Fehlerfrühzeitig fest.

Page 223: PHP mit Paul Bocuse

Build-Systeme

Page 224: PHP mit Paul Bocuse

Build-System

• Erleichtern Setup eines Projekts in neuen Umgebungen.

• Führen wiederkehrende Aufgaben aus, die nötig sind, um eine Applikation zu starten.

• Kopieren, Löschen, Verschieben

• Dependencies ermitteln

• Source-Code transformieren

• In PHP noch nicht so weit verbreitet, da meistens kein Code kompiliert werden muss.

Page 225: PHP mit Paul Bocuse

Apache Ant

• Java basiert, aber universell einsetzbar.

• Plattform unabhängig.

• Build-Skripte werden in XML geschrieben und dann ausgeführt.

• Bereits seit Jahren in vielen Java-Projekten im Einsatz.

• Bereits für viele Aufgaben schon „Tasks“ vorhanden, die diese ausführen.

• Eigene Tasks werden in Java implementiert.

Page 226: PHP mit Paul Bocuse

Typisches Ant Build-Skript

<project name="MyProject" default="build" basedir="."> <description>simple example build file</description> <!-- set global properties for this build --> <property name="src" location="src"/> <property name="build" location="build"/>

<target name="init"> <!-- Create the build directory structure --> <mkdir dir="${build}"/> <echo message="Directory ${build}"/> </target>

<target name="build" depends="init"> <copy todir="${build}"> <fileset dir="${src}"/> </copy> </target></project>

• Default-Dateiname ist „build.xml“

• Ausführen durch Aufruf von „ant“, optional abweichender Dateiname

Page 227: PHP mit Paul Bocuse

Typisches Ant Build-Skript

<project name="MyProject" default="build" basedir="."> <description>simple example build file</description> <!-- set global properties for this build --> <property name="src" location="src"/> <property name="build" location="build"/>

<target name="init"> <!-- Create the build directory structure --> <mkdir dir="${build}"/> <echo message="Directory ${build}"/> </target>

<target name="build" depends="init"> <copy todir="${build}"> <fileset dir="${src}"/> </copy> </target></project>

• <project> gibt Projektname, Default-Target und Build-Verzeichnis an

• Optional Projektbeschreibung über <description>

Page 228: PHP mit Paul Bocuse

Typisches Ant Build-Skript

<project name="MyProject" default="build" basedir="."> <description>simple example build file</description> <!-- set global properties for this build --> <property name="src" location="src"/> <property name="build" location="build"/>

<target name="init"> <!-- Create the build directory structure --> <mkdir dir="${build}"/> <echo message="Directory ${build}"/> </target>

<target name="build" depends="init"> <copy todir="${build}"> <fileset dir="${src}"/> </copy> </target></project>

• Häufig verwendete Werte, wie Ordner-Namen, Versionen in Properties

• Können auch einfach aus einer „.properties“ Datei gelesen werden

Page 229: PHP mit Paul Bocuse

Typisches Ant Build-Skript

<project name="MyProject" default="build" basedir="."> <description>simple example build file</description> <!-- set global properties for this build --> <property name="src" location="src"/> <property name="build" location="build"/>

<target name="init"> <!-- Create the build directory structure --> <mkdir dir="${build}"/> <echo message="Directory ${build}"/> </target>

<target name="build" depends="init"> <copy todir="${build}"> <fileset dir="${src}"/> </copy> </target></project>

• „build“-Target hängt vom „init“-Target ab

• Kopiert alle Dateien von „src“ nach „build“

Page 230: PHP mit Paul Bocuse

Typisches Ant Build-Skript

<project name="MyProject" default="build" basedir="."> <description>simple example build file</description> <!-- set global properties for this build --> <property name="src" location="src"/> <property name="build" location="build"/>

<target name="init"> <!-- Create the build directory structure --> <mkdir dir="${build}"/> <echo message="Directory ${build}"/> </target>

<target name="build" depends="init"> <copy todir="${build}"> <fileset dir="${src}"/> </copy> </target></project>

• „init“-Stellt sicher, dass der „build“-Ordner existiert.

• Gibt mit <echo> eine Meldung nach STDOUT

Page 231: PHP mit Paul Bocuse

Ausführen des Build-Files

$ antBuildfile: build.xml

init: [mkdir] Created dir: /Users/schst/tests/ant/build [echo] Directory /Users/schst/tests/ant/build

build: [copy] Copying 1 file to /Users/schst/tests/ant/build

BUILD SUCCESSFULTotal time: 0 seconds

• Aufruf von „ant“ genügt

Page 232: PHP mit Paul Bocuse

Informationen zum Build-File

$ ant -pBuildfile: build.xmlsimple example build fileMain targets:

Other targets:

build initDefault target: build

• Aufruf von „ant -p“

Page 233: PHP mit Paul Bocuse

Features von ant

• Alle File-Tasks, die man sich vorstellen kann.

• Archive-Tasks, Pre-Processing Tasks (ANTLR, XSLT, etc.)

• Java kompilieren, JARs erstellen, etc.

• SCM-Tasks, Testautomatisierung, Code-Coverage

• Mails, Logging, SQL, FTP, SSH,...

• Als letzter Fallback einfach <exec/>

Page 234: PHP mit Paul Bocuse

Phing

• PHP Port von Apache Ant.

• Konzept und Großteil der XML-Struktur übernommen.

• Leider nicht zu 100% kompatibel.

• Weniger vordefinierte Tasks als Ant, dafür mehr PHP-verwandte Tasks

• Neue Tasks werden in PHP geschrieben

Page 235: PHP mit Paul Bocuse

Typisches Phing Build-Skript

<project name="MyProject" description="simple example build file" default="build" basedir="."> <!-- set global properties for this build --> <property name="src" value="src"/> <property name="build" value="build"/>

<target name="init"> <!-- Create the build directory structure --> <mkdir dir="${build}"/> <echo message="Directory ${build}"/> </target>

<target name="build" depends="init"> <copy todir="${build}"> <fileset dir="${src}"/> </copy> </target></project>

• Default-Dateiname ist „build.xml“

• Ausführen durch Aufruf von „phing“, optional abweichender Dateiname

Page 236: PHP mit Paul Bocuse

Unterschiede zum ant Build-Skript

<project name="MyProject" description="simple example build file" default="build" basedir="."> <!-- set global properties for this build --> <property name="src" value="src"/> <property name="build" value="build"/>

<target name="init"> <!-- Create the build directory structure --> <mkdir dir="${build}"/> <echo message="Directory ${build}"/> </target>

<target name="build" depends="init"> <copy todir="${build}"> <fileset dir="${src}"/> </copy> </target></project>

• Beschreibung ist ein Attribut, kein Element.

• <property/> kennt nur „value“, keine „location“

Page 237: PHP mit Paul Bocuse

Ausführen des Build-Files

$ phingBuildfile: /Users/schst/tests/phing/build.xml

MyProject > init:

[echo] Directory build

MyProject > build:

[copy] Copying 1 file to /Users/schst/tests/phing/build

BUILD FINISHED

Total time: 0.0642 seconds

• Aufruf von „phing“ genügt

Page 238: PHP mit Paul Bocuse

Informationen zum Build-File

$ phing -pBuildfile: /Users/schst/tests/phing/build.xmlsimple example build fileDefault target:------------------------------------------------------------------------------- build

Subtargets:------------------------------------------------------------------------------- build init

• Aufruf von „phing -p“

Page 239: PHP mit Paul Bocuse

phing oder ant?

Verfügbare Tasks Sehr viele Tasks vorhanden, da jahrelang im Einsatz

Weniger Tasks als ant, die Wichtigsten sind vorhanden

Arten der TasksBreit gefächtert, allerdings keine PHP-spezifischen

Tasks

Sehr PHP-spezifische Tasks, wie PHPUnit,

phpDocumentor, phpCodeSniffer

Erweitern Kann einfach erweitert werden, Java-Wissen nötig

Kann einfach erweitert werden, PHP-Wissen reicht

aus

Page 240: PHP mit Paul Bocuse

Apache Maven

• Java-basiertes Build-System.

• Setzt auf „Convention over Configuration“.

• Verwendet einen deklarativen Ansatz.

• Alle Informationen zu einem Projekt werden in einem „Project Object Model“ (pom.xml) definiert.

• Build-Prozess wird nicht mehr programmatisch beschrieben, sondern standardisiert.

• Sehr mächtiges Dependency-Management.

Page 241: PHP mit Paul Bocuse

Typisches Maven POM

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>de.paul-bocuse</groupId> <artifactId>mvn-app</artifactId> <name>PHP mit Paul Bocuse</name> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies></project>

• Beschreibt das Projekt und dessen Dependencies

• Beschreibt nicht, wie der Build aussieht

Page 242: PHP mit Paul Bocuse

Typisches Maven POM

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>de.paul-bocuse</groupId> <artifactId>mvn-app</artifactId> <name>PHP mit Paul Bocuse</name> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies></project>

• Maven verwendet XML-Namespaces

• Jedes Projekt hat eine Group- und Artefakt-Id, optional einen Namen

Page 243: PHP mit Paul Bocuse

Typisches Maven POM

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>de.paul-bocuse</groupId> <artifactId>mvn-app</artifactId> <name>PHP mit Paul Bocuse</name> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies></project>

• Packaging Mechanismus ist JAR, kann auch WAR, EAR, etc. sein.

• Plugins können neue Packaging Mechanismen hinzufügen.

Page 244: PHP mit Paul Bocuse

Typisches Maven POM

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>de.paul-bocuse</groupId> <artifactId>mvn-app</artifactId> <name>PHP mit Paul Bocuse</name> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies></project>

• Dependencies werden über Maven-Koordination definiert

• Group-Id, Artefact-Id und Version (bzw. Range)

Page 245: PHP mit Paul Bocuse

Ausführen des Builds

• „mvn package“ startet den Build

$ mvn package[INFO] Scanning for projects...[INFO] ------------------------------------------------------------------------[INFO] Building PHP mit Paul Bocus[INFO] task-segment: [package][INFO] ------------------------------------------------------------------------[INFO] [resources:resources {execution: default-resources}][WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent![INFO] skip non existing resourceDirectory /Users/schst/tests/mvn/src/main/resources[INFO] [compiler:compile {execution: default-compile}][INFO] No sources to compile...[INFO] [jar:jar {execution: default-jar}][WARNING] JAR will be empty - no content was marked for inclusion![INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESSFUL[INFO] ------------------------------------------------------------------------[INFO] Total time: 4 seconds[INFO] Final Memory: 15M/81M[INFO] ------------------------------------------------------------------------

Page 246: PHP mit Paul Bocuse

Maven Repositories

Developer 2Local Repository

Developer 3Local Repository

Developer 1Local Repository

Company Repository

PublicRepository

Page 247: PHP mit Paul Bocuse

Der Maven Build-Lifecycle

generate-sources

compile

test-compile

test

package

integration-test

install

deploy

POM

archetype

compile

surefire

jar

install

mvn compile

mvn install

mvn test

Page 248: PHP mit Paul Bocuse

Sind wir noch beim PHP World Kongress?

Page 249: PHP mit Paul Bocuse

Maven mit PHP

• Maven Plugin

• PHPUnit Integration

• Generiert Dokumentation über DoxyGen (statt JavaDoc)

• Installation über Hinzufügen von neuen Repositories in der settings.xml

• http://www.php-maven.org/

Page 250: PHP mit Paul Bocuse

Erstellen eines neuen Projekts

• maven-php liefert einen eigenen „Archetype“

$ mvn archetype:generate -DarchetypeGroupId=org.phpmaven -DarchetypeArtifactId=php5-lib-archetype -DarchetypeVersion=1.1 -DgroupId=de.paul-bocuse -DartifactId=mvn-app[INFO] Scanning for projects...[INFO] Searching repository for plugin with prefix: 'archetype'.[INFO] ------------------------------------------------------------------------[INFO] Building Maven Default Project[INFO] task-segment: [archetype:generate] (aggregator-style)[INFO] ------------------------------------------------------------------------....[INFO] Using property: package = de.paul-bocuseConfirm properties configuration:groupId: de.paul-bocuseartifactId: mvn-appversion: 1.0-SNAPSHOTpackage: de.paul-bocuse[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESSFUL[INFO] ------------------------------------------------------------------------[INFO] Total time: 5 seconds

Page 251: PHP mit Paul Bocuse

Typisches PHP Maven POM

<project> <modelVersion>4.0.0</modelVersion> <groupId>de.paul-bocuse</groupId> <artifactId>mvn-app-2</artifactId> <packaging>php</packaging> <name>Sample PHP 5 library project</name> <version>1.0-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.phpmaven</groupId> <artifactId>maven-php-plugin</artifactId> <extensions>true</extensions> </plugin> </plugins> </build> ...</project>

• Basisdaten wie bei Java-Projekten, aber <packaging> ist „php“

• maven-php-plugin wird für den Build benötigt

Page 252: PHP mit Paul Bocuse

Typisches PHP Maven POM

<project> ... <dependencies> <dependency> <groupId>org.phpunit</groupId> <artifactId>phpunit5</artifactId> <version>3.3.9</version> <scope>test</scope> </dependency> </dependencies> ...</project>

• PHPunit wird als Dependency benötigt

• Wird automatisch aus dem Maven PHP Repository geladen

Page 253: PHP mit Paul Bocuse

Typisches PHP Maven POM

<project> ... <reporting> <plugins> <plugin> <groupId>org.phpmaven</groupId> <artifactId>maven-php-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-report-plugin</artifactId> <version>2.4</version> <reportSets> <reportSet> <reports> <report>report-only</report> </reports> </reportSet> </reportSets> </plugin> </plugins> </reporting></project>

• Im Reporting wird das maven-php-plugin eingebunden

Page 254: PHP mit Paul Bocuse

Ausführen des PHP Builds

• „mvn package“ startet den Build auch mit PHP

$ $ mvn package[INFO] Scanning for projects...[INFO] ------------------------------------------------------------------------[INFO] Building Sample PHP 5 library project[INFO] task-segment: [package][INFO] ------------------------------------------------------------------------...[INFO] [php:php-validate {execution: default-php-validate}]...[INFO] [php:phpunit {execution: default-phpunit}][INFO] Surefire report directory: /Users/schst/tests/mvn-php/mvn-app-2/target/surefire-reports-------------------------------------------------------T E S T S-------------------------------------------------------Running AppTestTests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.001016Results :Tests run: 1, Failures: 0, Errors: 0[INFO] [jar:jar {execution: default-jar}][INFO] Building jar: /Users/schst/tests/mvn-php/mvn-app-2/target/mvn-app-2-1.0-SNAPSHOT.jar[INFO] [plugin:addPluginArtifactMetadata {execution: default-addPluginArtifactMetadata}][INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESSFUL[INFO] ------------------------------------------------------------------------

Page 255: PHP mit Paul Bocuse

Der Maven Build-Lifecycle mit PHP

generate-sources

compile

test-compile

test

package

integration-test

install

deploy

POM

archetype

php-compile

PHPUnit

jar

install

mvn compile

mvn install

mvn test

Page 256: PHP mit Paul Bocuse

Maven vs. Ant/phing

• Maven hat einen großen Vorteil beim Dependeny-Management und Deployment.

• Maven generiert automatisch eine Website mit Dokumentation, Testergebnissen, Übersicht über die Abhängigkeiten, etc.

• Maven gibt einen Standard für den Build-Prozess vor.

• In PHP bislang nicht verbreitet, für das Dependency-Management wird PEAR verwendet.

• In den meisten Projekten ist es (noch) sinnvoller, Ant oder Phing einzusetzen.

Page 257: PHP mit Paul Bocuse

Weitere Build-Systeme

• make

• install.php oder setup.php

• pake (http://github.com/indeyets/pake)

Page 258: PHP mit Paul Bocuse

Projektmanagement

Page 259: PHP mit Paul Bocuse

Henry Gantt

Der Paul Bocuse des Projektmanagements.

Page 260: PHP mit Paul Bocuse

Wasserfall-Modell

Initialisierung

Analyse

Entwurf

Realisierung

Einführung

Nutzung

„Jetzt wo ich das sehe, würde ich

gerne nochmal was ändern...“

„Das hätten wir hier wissen

müssen!“

Page 261: PHP mit Paul Bocuse

Software-Entwicklung ähnelt eher dem Kochen als dem Hausbau.Wenn man die Software abgeschmeckt hat, möchte man gerne auch mal nachwürzen.

Page 262: PHP mit Paul Bocuse

Agiles Projektmanagement und agile Entwicklung

Initialisierung Analyse

Entwurf

Realisierung

Test

Nutzung

„Jetzt wo ich das sehe, würde ich gerne nochmal

was ändern...“

„Kein Problem, machen wir in der

nächsten Iteration.“

Page 263: PHP mit Paul Bocuse

Vorteile des agilen Projektmanagements

• Kosten für Änderungen steigen mit dem Projektfortschritt nicht so stark an, wie bei klassischen Vorgehensmodellen.

• Ergebnisse werden früher sichtbar und die Geschwindigkeit ist höher. Es wird eine bessere Transparenz über die Teamperformance geschaffen.

• Durch regelmäßige Priorisierung wird sichergestellt, dass die wichtigsten Anforderungen umgesetzt werden.

• Fehlentwicklungen werden früher erkannt und das Team kann gegensteuern.

• Das Team ist bei der Planung involviert und trägt somit die Verantwortung mit.

Page 264: PHP mit Paul Bocuse

Verschiedene Methoden

• SCRUM

• Crystal

• Adaptive Software Development (ASD)

• Extreme Programming (XP)

• Feature Driven Development (FDD)

• Kanban

Page 265: PHP mit Paul Bocuse

SCRUM

Daily Scrum24 Stunden

Iterationen1-4 WochenProduct

BacklogSprint

Backlog lauffähigesProdukt

inkrementell verbessertpriorisiertAlle Anforderungen

Page 266: PHP mit Paul Bocuse

Scrum Charakteristika

• Scrum ist eine teambasierte, iterative und inkrementelle Entwicklungsmethode.

• Die Entwicklung wird in Zyklen, sog. Sprints organisiert.

• Der Kunde priorisiert seine Anforderungen im sog. Product Backlog vor jedem Sprint.

• Nach jedem Sprint findet ein Review statt und die Entwicklung wird angepasst.

Page 267: PHP mit Paul Bocuse

Kanban

• Kombiniert Erkenntnisse aus der Lean Production mit Ergebnissen der Engpasstehorie und der Fluss-basierten Produktentwicklung.

• Setzt den Fokus auf die gesamte Wertschöpfungskette, nicht nur auf die Entwicklung.

• Beschränkt die Menge der parallelen Arbeit (Work-in-progress) durch Limits und verkürzt damit die Durchlaufzeit der wertschöpfenden Anforderungen.

• Für jede erledigte Anforderungen wird eine neue Anforderung in das System gegeben.

Page 268: PHP mit Paul Bocuse

Kanban-Board

Anforderungs-Definition

Anforderungs-Definition fertig Entwicklung Entwicklung

fertig Test Test fertig Betrieb

2 2 4 2 3 1

Page 269: PHP mit Paul Bocuse

Kommerziell Frei

Desktop

Webbasiert

Projektmanagent-Tools

Page 270: PHP mit Paul Bocuse

MS Project

• Die Mutter aller Gantt-Diagramme.

• Geeignet für Projekte, die nach dem Wasserfall-Modell geplant werden.

• Anbindung an Project Server erfüllt die meisten Anforderungen an Enterprise Project Management.

Page 271: PHP mit Paul Bocuse

Task Juggler

Page 272: PHP mit Paul Bocuse

Task Juggler

• Projektmanagement Software für Linux.

• Aufgaben werden in einer Beschreibungssprache definiert.

• Taskjuggler „errechnet“ dann den Projektplan.

• Achtet darauf, dass keine Überlastung stattfindet.

• Eher für Wasserfall-Projekte geeignet.

Page 273: PHP mit Paul Bocuse

Basecamp

• Produkt der 37signals.

• Online Kollaborationslösung mit allen benötigten Features.

• Verwaltet Dokumente, Aufgaben, Meilensteine, etc.

• Jede Menge Add-Ons und Integration anderer Systeme.

• Für agile Projekte geeignet.

Page 274: PHP mit Paul Bocuse

Dashboard

Basecamp

Page 275: PHP mit Paul Bocuse

Basecamp

Milestones

Page 276: PHP mit Paul Bocuse

JIRA & GreenHopper

• Eigentlich „nur“ eine Aufgabenverwaltung.

• Sehr mächtiges Workflow-Management, somit auch zum Prozessmanagement gut geeignet.

• Greenhopper-Plugin bringt alles mit, was für agile Projekte benötigt wird.

• Aktuell 225 JIRA-Plugins verfügbar

Page 277: PHP mit Paul Bocuse

Burndown Charts in Greenhopper

Page 278: PHP mit Paul Bocuse

Kanban Tool

• Kostenloses und simples online Kanban-Board.

• Sehr flexibel konfigurierbar.

• Liefert Auswertungen zu den einzelnen Aufgaben und Stationen mit.

• Kann Aufgaben in Projekte organisieren.

Page 279: PHP mit Paul Bocuse

Kanban Tool

Kanban Board

Page 280: PHP mit Paul Bocuse

Kanban Workflow Editor

Kanban Tool

Page 281: PHP mit Paul Bocuse

• Der Klassiker

• Reines Bug- und Aufgabentracking

• Sicher und stabil, wenig fancy Effekte

• Issue Tracker mit Standard-Funktionalität

• Wiki, CI-Server, Source-Browser, Code-Metriken

• Gute Unterstützung für PHP, da aus PHP Community entwickelt

• Issue Tracker mit Standard-Funktionalität

• Wiki, Source-Browser, Roadmap, Timeline

• Sehr viele Plugins verfügbar (Python)

Tasktracker - Projektmanagement im Kleinen

Page 282: PHP mit Paul Bocuse

Methoden und Tools

Versionsverwaltung

ProjektmanagementBuild & MonitoringTesting & Integration

Code AnalyseEntwicklungsumgebung

Page 283: PHP mit Paul Bocuse

Buchempfehlungen

Page 284: PHP mit Paul Bocuse

Fragen?

Page 285: PHP mit Paul Bocuse

Fragen?

Vielen Dank für Ihre Aufmerksamkeit.

Bildquellen © iStockphoto.com

[email protected]@1und1.de