PHP-Entwicklung im Team

  • Collaboration-Software%
  • Enterprise Portals%
  • Lifecycle-Management30%
  • Interface-Design30%
  • Web Applications40%

Sobald Projekt- und Teamgröße steigen, spielen neben einen gutem Team, definierten Prozessen, Software zum Projektmanagement - wie Trac, Redmine –  vor allem ein sorgsam ausgewählter Entwicklungs-Stack eine entscheidende Rolle für den Erfolg oder Misserfolg eines PHP-Projektes. Daher möchten wir im Folgenden die Hilfsmittel aus unserer Arbeit bei Taktsoft vorstellen, die eine professionelle Teamarbeit ermöglichen.

Inkrementelle Datenbank-Entwicklung mit Ruckusing

Ein vielfach unbehandeltes Thema ist die Entwicklung der Datenbank unter Versionskontrolle. Während der Source Code bereits im Repository liegt, wie z.B. Subversion oder CVS, arbeiten viele Teams mit einem gemeinsamen Datenbankserver oder einem regelmäßig erneuerten Datenbank-Dump im Repository. Ein sehr schöner Ansatz – bekannt geworden aus Ruby on Rails – ist das Schreiben von Migrations. Eine Migration ist ein Skript mit einer Versionsnummer, das die nötigen Änderungen in der Datenbank enthält, sowie die Informationen, um diese wieder rückgängig zu machen. Die Migration wird dann im Repository in einem speziellen Ordner abgelegt. Sobald ein Entwickler das aktuelle Repository auscheckt, führt er mit einem Befehl alle Migrations aus, sodass seine lokale Datenbank wieder auf dem neuesten Stand ist. Dieser Ansatz ermöglicht dem gesamten Team das inkrementelle Entwickeln einer Datenbank, ohne sich dabei gegenseitig zu behindern, da jeder auf seiner eigenen, lokalen Datenbank arbeitet. Konflikte entstehen selten, sind aber wenn sie auftreten zumindest nachvollziehbar und meist leicht zu korrigieren. Das Tool Ruckusing [1] realisiert diesen Ansatz in PHP. Achtet man beim Schreiben der Migrations darauf, dass diese die Daten in den existierenden Tabellen nicht destruktiv verändern, kann man das Konzept perfekt dafür nutzen, um Datenbankänderungen in ein Produktivsystem zu deployen.

Sicherheit bei Code-Änderungen mit PHP-Unit

Ein wichtiger Punkt – nicht nur um die Qualität zu gewährleisten – sind Unit-Tests: Unit-Tests garantieren einem Entwickler, dass er durch sein Refactoring keine Seiteneffekte an anderen Stellen einbaut. So wird es dem Entwickler möglich, auch zwischendurch schnell einmal an anderen Abschnitten der Software zu arbeiten. Das Ergebnis ist ein „Collective Ownership of Code“. Gute Erfahrung haben wir bisher in PHP, vor allem mit dem Testing Framework PHP-Unit [2] von Sebastian Bergmann gemacht.

Automatisieren mit Phing und Capistrano

Ein anderer „Arbeitszeitfresser“ in größeren Projekten ist das Projektsetup: Meistens von einer Person initial durchgeführt, muss jeder Entwickler hier die selben Schritte wiederholen, um das Projekt auf seinem Arbeitsplatz-PC aufzusetzen. Leider kostet dies viel Zeit und führt schnell zu Fehlern und oft auch noch zu späteren Folgefehlern, welche schließlich noch mehr Zeit kosten. Stößt später ein neuer Entwickler ins Team, oder fällt ein Computer aus, muss dieser Vorgang wiederholt werden. Dann macht sich der initiale Aufwand eines Phing-Skriptes schnell bezahlt und spart den Entwicklern einiges an Nerven. Phing [3] ist ein Projekt-Build-System, ähnlich wie Apache Ant für Java. Es nutzt einfache XML-Skripte um Tasks zu spezifizieren und ist leicht durch eigene PHP-Klassen erweiterbar. Für viele übliche Aufgaben wie zum Beispiel das Durchführen von UnitTest, CoverageAnalyse, Datei Manipulationen, Dateisystemoperation, SQL, CVS/SVN Operationen gibt es bereits vordefinierte Tasks. So automatisieren wir weitere, sich ständig wiederholende Task in der Entwicklung mittels Phing. Dazu gehört das Entfernen und Neu-Einspielen von Datenbanken und Demodaten, das Durchführen von Tests und Code-Coverage-Analyse sowie das Anwenden der Migrations. Für das automatisierte Deployment gibt es mit Capistrano [4] ein spezialisiertes Tool, das man mit wenig Mühe für PHP anpassen kann.

MVC Architektur des Zend Frameworks – geschicktes konfigurieren

Für die eigentliche Softwarearchitektur empfehlen wir als Grundlage die MVC-Komponente des Zend-Frameworks [5]. Das Zend-Framework zeichnet sich zusätzlich auch über seine umfangreiche Klassenbibliothek aus, in der einige Enterprise-Application-Pattern wie FrontController und ActiveRecord zum Einsatz kommen. In einem größeren Team sollte besonderes Augenmerk auf ein frühzeitiges und geschicktes Bootstrapping des FrontController gerichtet werden. Das Bootstrap-File ist die Datei, auf die jedes Request der Anwendung per Apache Konfiguration umgeleitet wird. In dieser Datei werden unter anderem die Konfigurationsdateien verarbeitet, den Datenbank Handler und der FrontController instanziert, oder die Session üblicherweise gestartet. Der FrontController ist zum Beispiel für das Routing und Dispatching verantwortlich. Dabei führt ein Aufruf einer exemplarischen URL wie http://application/hallo/welt zum Instanzieren des HalloController Objektes und auf diesem Objekt zum Aufruf der weltAction(). Gute Erfahrung haben wir beim Bootstrapping mit einer, in Development, Production und Test aufgegliederten Konfiguration gemacht. Es empfiehlt sich Entwicklern die Environment-Konfiguration durch eine lokale Konfigurationsdatei überschreibbar zu machen. Die lokale Konfigurationsdatei sollte vom Repository ignoriert werden. Damit kein Entwickler aus Versehen die Environment-Konfigurationen bearbeitet und anschließend commitet.

Ein "Sandkasten" für Entwickler – die PHP-Shell

Als weiteres kleines, praktisches Tool hat sich die PHP-Shell [6] von Jan Kneschke erwiesen. Damit laden wir beim Starten der PHP-Shell das Bootstrapping der Zend-Framework Applikation – allerdings ohne CLI-inkompatible Komponenten wie Sessions. Dadurch haben wir eine Art „Sandkasten“ für unsichere oder neue Entwickler, die mal eben mit den Objekten innerhalb der Anwendung „spielen“ wollen. Auch zum Debuggen ist es hervorragend geeignet. Ein sinnvoll zusammengestellter Stack aus Tools und Frameworks hilft die Entwicklung mit größeren Teams erheblich zu vereinfachen. So kann man sich auf die eigentliche Arbeit konzentrieren: Das Entwickeln von guter Software!

[1] http://code.google.com/p/ruckusing/
[2] http://www.phpunit.de/
[3] http://phing.info/
[4] http://www.capify.org/
[5] http://framework.zend.com/
[6] http://jan.kneschke.de/projects/php-shell/

Informationen

Datum:

Freitag 25. September 2009

Autor:

Dominik Bors

Email:

bors [at] taktsoft [dot] com