Dieses Blog durchsuchen

Samstag, 16. Oktober 2010

Warum Software agil entwickelt werden sollte

In meinem Studium habe ich gelernt, dass Software-Entwicklung mit dem Bau eines Hauses vergleichbar sei. Die Anforderungen werden aufgenommen, das Haus wird bis ins Detail spezifiziert und nach den Vorgaben des Architekten gebaut. Komplexe Software ließe sich nach genau dieser Vorgehensweise implementieren.

Einige Unternehmen entwickeln Software genauso. Die vermeintlichen Vorteile liegen auf der Hand:
  • Die für das Projekt notwendigen Resourcen und die damit verundenen Kosten lassen sich über Jahre hinweg planen und einteilen.
  • Die Entwicklung kann als Paket an günstige Entwickler in anderen Ländern vergeben werden.
  • Die Entwickler können die Software planen und anschließend nach Plan entwickeln; größere Refactoring-Maßnahmen sind vermeidbar
Bei diesen Vorteilen fällt eines sofort ins Auge: es sind Vorteile für den Verantwortlichen, der das Projekt bezahlt und für die Entwickler. Alle können sich bequem zurücklehnen und dem Kunden (bzw. der Fachabteilung)  sagen: "Na, genauso wolltet ihr es doch haben, es steht doch so in der Spezifikation. Lasst uns doch bitte in Ruhe weiterentwickeln." Der ITIL-Manager sagt dann: "Wir können gerne auf eure Wünsche eingehen. Aber dazu müsst ihr natürlich erstmal einen Change beantragen und diesen auch bezahlen. Ob der Change-Manager dies genehmigt, ist aber eine ganz andere Frage." Nach langer Zeit bekommt der Kunde dann genau das, was er spezifiziert hat - aber leider oftmals nicht das, was er wirklich braucht.

Dies hat m. E. nach hauptsächlich folgende Ursachen:
  • Software ist sehr komplex und lässt sich nur sehr schwer von vornherein bis ins Detail planen
  • Anforderungen und gute Ideen entstehen oft erst, wenn mit der Software tatsächlich gearbeitet wird
  • Rahmenbedingungen ändern sich mit der Zeit
Die agile Software-Entwicklung hat diesen Sachverhalt erkannt und daraus eine Reihe von Konsequenzen gezogen. Eine wichtige Maßnahme ist die iterative Vorgehensweise. Iterativ meint den Zyklus von Anforderungsanalyse, Spezifikation, Implementierung und Test, der sich ständig wiederholt. Software wird nicht komplett geplant und dann Schicht für Schicht von der Datenbank bis zum UI entwickelt, sondern in einzelne Funktionen aufgeteilt. Diese Funktionen werden dem Anforderer dann nach und nach iterativ zur Verfügung gestellt. Aus dieser verblüffend einfachen Vorgehensweise ergeben sich eine ganze Reihe von Vorteilen:
  • Der Anforderer bekommt ein schnelles Feedback und kann entscheiden, ob die Funktion seinen Vorstellungen entspricht
  • Die am höchsten priorisierten Funktionen stehen am schnellsten zur Verfügung.
  • Es kann ständig (nämlich vor jeder Iteration) auf veränderte Rahmenbedingungen eingegangen werden
  • Die Planung wird vereinfacht, da die Komplexität innerhalb einer Iteration reduziert wird
Natürlich gehört zur agilen Software-Entwicklung noch einiges mehr. Um den iterativen und flexiblen Entwicklungsprozess zu optimieren wurden viele wichtige Vorschläge gemacht, wie z. B. die Verwendung von Unit Tests (oder gar die testgetriebene Entwicklung), ständige Refaktorisierungen und der Einsatz eines Vorgehensmodells wie beispielsweise SCRUM, worauf ich an dieser Stelle aber nicht weiter eingehen möchte.

Ich würde mir jedoch für die Zukunft wünschen, dass gerade die Entscheider in den Chef-Etagen der Unternehmen vermehrt die Vorteile der agilen Software-Entwicklung erkennen und nicht auf einer bürokratischen und wenig kundenorientierten, klassischen Software-Entwicklung bestehen.

Sonntag, 3. Oktober 2010

Java Server Faces und HTTP-Get-Anfragen

JSF ist ein wunderbares Framework zur Erstellung von Rich-Client Anwendungen, die auf Web-Technologieen basieren. Die große Stärke von JSF ist die komponentenbasierte Architektur. Dritthersteller wie JBoss (www.jboss.org/richfaces) und Oracle (Oracle ADF) stellen mächtige Komponenten zur Erstellung von AJAX-unterstützten Web-Anwendungen bereit.

Leider jedoch ist es sehr schwierig, Get-Anfragen mit Hilfe von JSF zu implementieren. In Version 1.2 gibt es überhaut keine Unterstützung dafür. In JSF 2.0 werden endlich zwei Komponenten für Get-Anfragen eingeführt:

<h:link> und <h:button>

Zur Zeit ist JSF 2.0 jedoch oft noch nicht wirklich eine Alternative, da weder die finale Version des JBoss 6 draußen ist noch darauf basierende Bibliotheken wie Rich Faces 4.0 finalisiert wurden.

Aber warum sind denn Get-Anfragen überhaupt notwendig? Nun, die beiden wichtigsten HTTP-Anfragen sind Post und Get. Mit Post werden Daten üblicherweise an den Server gesendet (im HTTP-Body) und mit Get Daten abgerufen. Dass JSF nun ausschließlich über Post mit dem Server kommuniziert, hat hauptsächlich zwei Nachteile:

-Es lassen sich keine Bookmarks auf Post-Anfragen setzen
Dies ist jedoch oft eine wichtige Anforderung an Software. Ein Nutzer möchte sich bestimmte Artikel oder Informationen gerne als Bookmark merken oder einfach als Link verschicken.

-Die Browser Navigation funktioniert nicht wie gewünscht
Betätigt ein Nutzer den Zurück-Button des Browsers oder den Refresh-Button, kommt es zu einer Nachfrage des Browsers, z. B. im Firefox:
Um diese Seite anzuzeigen, müssen die von Firefox gesendeten Daten erneut gesendet werden, wodurch alle zuvor durchgeführten Aktionen wiederholt werden (wie eine Suche oder eine Bestellungsaufgabe)
Dieses Verhalten ist natürlich nach abgeschickten Formularen durchaus gewünscht, wer möchte zum Beispiel den gleichen Artikel mehrmals bestellen, nur weil der den Refresh Button betätigt? Bei einem reinen Abruf von Informationen ist diese Meldung aber eher verwirrend.

Letzerer Punkt lässt sich dadurch beheben, dass in der faces-config.xml ein <redirect> in die Navigation eingetragen wird. Somit wird nach der Post Anfrage über einen Redirect eine Get Anfrage abgeschickt. (mehr zu dem Thema gibts unter dem Schlagwort PRG-Pattern nachzulesen, z. B. hier: http://en.wikipedia.org/wiki/Post/Redirect/Get) Dies funktioniert allerdings auch nur vernünftig bei Managed-Beans, die in der Session liegen, sonst gehen nach dem Redirect die HTTP-Query Parameter verloren.

Ersterer Punkt lässt sich z. B. dadurch umgehen, dass über einen <h:outputLink> ein gewöhnlicher Link mit Get-Parametern aufgebaut wird, der auf eine JSF-View zeigt. (s. auch http://entwickler-forum.de/archive/index.php/t-41706.html) Nachteil an dieser Lösung: Es wird keine Action-Methode einer Managed-Bean aufgerufen. Das bedeutet, dass sämtliche Logik, die für die JSF-View benötigt wird, in die get-Methoden der Managed Bean untergebracht werden muss. Bei Seiten, die ausschließlich Informationen darstellen, ein Kompromiss der m. E. nach ok ist.

Es gibt also durchaus Möglichkeiten, auch mit JSF 1.2 GET-Anfragen zu berücksichtigen. Dennoch freue ich mich schon sehr auf Version 2.0, in der anscheinend honoriert wurde, dass Get-Anfragen einfach ein wichtiger Bestandteil einer Web-Anwendung sein können. Dies wird auch durch den Trend von Rest, s. hierzu auch mein Artikel bei ORDIX (http://www.ordix.de/ORDIXNews/1_2009/IT-Strategie/SOA_restful_web_services.html) untermauert wird.

An dieser Stelle möchte ich noch auf ein interessantes Framework hinweisen: http://ocpsoft.com/prettyfaces/. Wer bereit ist, ein weiteres Framework zur Lösung dieser Problematik einzubeziehen, wird hier fündig. Leider hatte ich so meine Probleme, Pretty Faces im aktuellen Projekt zum Laufen zu bekommen, aber das Feedback anderer Entwickler war durchaus positiv und in einem kleinen Testprojekt funktionierte es einwandfrei.