Montag, 31. Dezember 2007

Jahresrückblick 2007

Tja, was hat das Jahr 2007 gebracht? Viele, viele praktische Erfahrungen mit Scrum, an die 30 Sprints in 4 Projekten und damit verbunden ca. 30 mal Estimation und Retrospective. Zahlreiche User Stories, Features, Releases und viele neue Erkenntnisse, die nicht nur die Software Enwicklung betreffen. Rückblickend kann ich sagen, dass das gesamte Jahr mit agilem Arbeiten für mich persönlich eine absolute Bereicherung darstellt - job enrichment pur!
Meine Erfahrungen und Erkenntnisse, sowie einiges an Tool Know-How und sonstige gesammelte Werke habe ich auf meine Blog zusammengetragen - und so ist es angekommen ...

Hier die Top 10:
10: User Acceptance Testing, 73 Unique page views
9: iSBB - SBB Fahrplan auf dem iPod, 73 Unique page views
8: Stub vs. Mock, 76 Unique page views
7: Archiv von März 07,88 Unique page views
6: Label-Suche nach User Story, 100 Unique page views
5: Maven 2 Einführung, 111 Unique page views
4: Best practise: Daily Scrum mit Excel, 130 Unique page views
3: Scrum- Was ist Scrum? Wie funktioniert Scrum?, 169 Unique page views
2: 2-tier continuous integration testing, 196 Unique page views
1: Lotus Notes 8 auf Ubuntu installieren, 387 Unique page views

Mein Blog wird hautsächlich mit den Keywords: scrum, scrum user story, trac scrum, scrum excel, inside-scrum, scrum systemarchitektur und vielen mehr gesucht und gefunden.

Insgesamt gab es 4'784 Visits, 7'672 Pageviews, 1.6 Pages/Visit und 00:01:34h Avg. Time on Site.

Ganz besonders bemerkenswert fand ich allerdings, dass ich es mit meinem Gastbeitrag zum Thema Scrum auf dem Blog von Markus Tressl auf Platz 1 geschafft habe ...

Freitag, 7. Dezember 2007

Ajax in Action V

In meiner Serie "Ajax in Action" habe ich bereits beschrieben, wie man
  • modulare Seiten mit Spring MVC und DWR baut
  • mit DWR von einander abhängige GUI- Komponenten updated
  • locale spezfische Messages im JavaScript anzeigt.
In diesem Beitrag geht es um Validierung:

Wo wird valdiert? Beim Client, beim Server, bei beiden?

Klar ist, dass eine Hybrid-Lösung bei der Validierung nicht anzustreben ist, da man die Valdierungslogik auf Client und Server verteilt - nicht wartbar.

Auf dem Client mittels JavaScript valdieren hat viele Vorteile, aber auch Nachteile, wobei reine serverseitig Valdierung technisch zwar optimal, sich jedoch schlecht auf die user experience auswirkt.

Optimal wäre es, wenn man die Valdierung serverseitig erledigen könnte, diese allerdings mittels AJAX asynchron durchführen würde, um dem Benutzer lästige POSTBACK Szenarien zu ersparen.

Für Spring MVC gibt es hierfür eine sauber Lösung, basierend auf dem Validator Muster von Spring - der Artikel von Eric Spiegelberg "Ajax Form Validation Using Spring and DWR" erklärt, wie.

Ich möchte der Lösung allerdings eine Schwachstelle zugestehen - Locale Resolving! Der Ansatz von Eric Spiegelberg setzt voraus, dass bei der serverseitigen Validierung die Locale über den ThreadLocal geführt und mit LocaleContextHolder.getLocale() abgerufen wird, was in einem reinen Spring Container möglich ist.


Oft ist es allderings so, dass das Locale Resolving für Valdierungsfehler nicht am ThreadLocal aufgelöst werden kann, sondern nur im Client - der Server kennt die Locale des Clients nicht, beispielsweise bei folgendem DWR call:
./dwr/call/plaincall/cartManager.getCart.dwr

Ein mögliche Lösung wäre, das Locale Resovling nicht auf dem Server durchzuführen, sondern so wie meinen vorherigen Artikel per JavaScript.

Eine andere, vielleicht technisch optimaler Lösung wäre, das man beim DWR call die Language übermittelt um diese an den ThreadLocal zu heften.

Donnerstag, 6. Dezember 2007

SBB Fahrplan auf dem iPod als Kalendar

Ich habe vor gut einem halben Jahr hier auf meinem Blog eine Lösung präsentiert, wie man einen SBB Fahrplan auf einen iPod bringt.

Die SBB hat jetzt ein Feature auf der Online Fahrplansuche, mit dem man ein Kalendar File (iCal/ics) runterladen kann. Jetzt ist es demnach viel einfacher, als bei meiner umständlichen Lösung vom März, die sich bis heute bewährt hatte.

Jetzt kann man einen Verbindung suchen und mit als Kalendar runterladen und per iTunes auf den iPod synchronisieren. Nicht schlecht!

Und wenn man jetzt noch seinen persönlichen Fahrplan als Kalender runterladen könnte, dann wäre das grandios, denn als Pendler bin ich nicht an einer einzigen Verbindung interessiert, sondern an einem ganzen Verbindungsprogramm.

Noch ein persönlicher Tip: Wenn man den SBB Fahrplan Kalendar in Google Kalendar importiert, dann kann man sich per SMS (gratis) noch 5, 10, oder 15 min vorher benachrichtigen lassen - nie wieder einen Zug von hinten sehen!

Got a Mac!

Also gut, ich hab' mir einen Mac gekauft...

Vor ca. 3 Wochen hat Apple die MacBook 13" mit 2.2Ghz CPU's und Santa Rosa Chipsatz aufgerüstet, silent update - versteht sich. Dank diverser Blogs bekommt man das als potenzieller Mac Käufer dennoch mit ...

Naja, ich also schnell zu Letec, dem Apple Authorized Reseller in St.Gallen, und bestellen! Nach 7 Tagen war schon abholbereit und da ist er ...

Der Dell Latitude D620 auf meinen Tisch sieht ganz blass aus vor Neid und ist mal eben an die Tischkante verschwunden - er meldet sich auch nicht mehr. Ich glaub er ist bockig :-)

Was mach ich mit dem Mac: in erster Linie Software Entwicklung im Bereich von Webapplikationen, die mit Java, JavaScript, Ruby oder Groovy realisiert werden.

Tools, die ich verwende:
- Eclipse IDE for Java EE Developers (Europa Release) mit Subclipse Plug-in
- SVNClient/ Console
- CCMenu für Continuous Integration Server Status Info's
- Cisco VPN Client (4.9.01), wenn ich mal HomeOffice mache

und das war's auch schon. Bisher bin ich mehr als zufrieden -einfach eine andere Welt - einfach ein anderes Arbeiten, wobei Ubuntu (mein bisherigs OS auf dem Dell) nicht weit entfernt ist.

Ach ja, ich hab noch 4 GB Ram reingetan, denn mit 1 GB ist das Arbeiten mit Eclipse schon ziemlich mühsam.

Guten und günstigen RAM gibts hier.

CCMenu 1.0 released

Bevor ich vor ca. 2 Wochen von Ubuntu auf Mac umgestiegen bin, habe ich nach einem Tool gesucht, dass mir in irgend einer Form den Status des Continuous Integration Servers (CruiseControl) anzeigt, so wie bespielsweise CCTray für Windows.


Ich hatte bereits von CCMenu gehört und darüber geschrieben - jetzt ist CCMenu Release 1.0 raus und ist einfach empfehlenswert!

Der Entwicker ist übrigens Erik Doernenburg, den ich dieses Jahr auf TheServerSide Java Symposium Barcelona zum Thema "Test Driven Development" gehört habe.

Mittwoch, 5. Dezember 2007

namics Scrumbreakfast

Heute war das zweite Treffen der Scrum Community bei der namics in Zürich. Zu diesem Anlass habe ich auf meinem Blog zum Erstaunen festgestellt, dass das Timing von Goolge perfekt ist:


Diese Google Anzeige wurde heute auf mein Blog angezeigt!

Danke Google

Agiler Prozess

Gestern habe ich an einem Workshop teilgenommen, bei dem man der Frage nachgegangen ist, wie man den Designprozess agilier machen kann.

Hintergrund der Fragestellung ist die Annahme, dass der gesamte Entwicklungsprozess bei aller Agilität mitunter ein sequenzieller Prozess ist bezüglich der vor- und nachgelagerten Arbeiten.

Ein Beispiel aus der Automobile-Welt soll vernanschaulichen, welcher Problematik man auf den Grund gehen möchte: Jeder kennt die grossen Automobil Salons in Genf, Frankfurt, Japan und Chicago. Jeder weiss auch, dass dort die Hersteller um die Gunst der Kunden buhlen und daher mit ganz besonderen Exponaten ausstellen - ShowCar's oder ConceptCars.

Die Designer solcher Automobile möchten bewusst neue, andere Wege beschreiten, um ein Auto zu entwickeln, dass die Zukunftsvisionen abbildet und das Mögliche und Machbare aufzeigt und die Message einer Marke nachhaltig unterstreicht. Niemand würde ernsthaft annehmen, dass ein solches Show oder Concept Car so produziert wird, denn sie sind lange nicht produktionsreif.

Wie dem auch sei, der Zulauf am Stand X auf dem Genfer Autosalon der Marke Y ist so hoch, dass man sich bei der Marke Y doch entscheidet, den ausgestellten Wagen zu bauen, denn viele potenzielle Kunden haben danach gefragt: "Wow, der Wagen ist grandios - wann kann man ihn kaufen?"

Der Rest ist Geschichte: nach mindestens 7 Jahren Entwicklungsarbeit kommt am Ende ein Wagen auf den Markt, der technischen, gesetzlichen, ökonomischen und ökologischen Gesichtspunkten und vielem mehr Rechnung tragen muss.

"Das ist nicht der Wagen, denn ich kaufen wollte. Wo ist der tolle Wagen den man damals präsentiert hat?"

Was ist passiert? Wie bei der Automobilproduktion ist auch die Softwarentwicklung letztendlich ein sequentieller Prozess, bei dem die Experten erst in der jeweiligen Produktentwicklungsphase in Spiel kommen. Die Ingenieure der Marke Y werden zahlreiche Veränderungen am Design vornehmen müssen.

Der Prozess bei der Entwicklung einer Webapplikation ist oftmal dieser:
Usability-> Design-> HMTL-Produktion-> Software Entwicklung-> Consulting.
Ein Wasserfall eben, bei dem zwischen jeder Prozssphase Iterationen an der Tagesordnung stehen. Bei einigen Phasen ist der Kunde anwesend, bei anderen nicht. So kann es vorkommen, dass auch hier sehr spät in der Realisierung erkannt wird, dass die Vorgaben von Usability nicht umsetzbar sind. Beim Kunden wird sich häufig der selbe Effekt einstellen, wie bei den Automobil-Kunden aus dem geannten Beispiel.

Wie können wir der Lage Herr werden? Im Workshop wurde erarbeitet, dass man zunächst zu Begin eines agilen Projektes alle Prozessbeteiligten für einen Tag an einen Tisch bringt und dort auf die Vorgehensweise und Arbeitsinhalte der jeweiligen Kernkompetenz eingeht und an einem Muster durchspielt. Ziel ist es, so Verständins für vor- und nachgelagerte Prozesse zu erlangen und die Kommunkiation und damit die Zusammenarbeit zu fördern.

Dienstag, 4. Dezember 2007

Scrum - Agiles Projektmanagement von Kerstin Bücher

Frau Bücher hat auf der Seite gfwm - Gesellschaft für Wissensmanagement - den Artikel "Scrum - Agiles Projektmanagement" veröffentlicht, der auf die Geschichte von Scrum, Funktionsweise und Kursangebote eingeht.

Bei der Recherche hat Frau Bücher meinen Blog aufgesucht, bei del.icio.us getaggt und inside-scrum unter "Weitere Informationen" genannt.

Vielen Dank!

Ajax in Action IV

Im vorherigen Post in der Serie Ajax in Action habe ich beschrieben, wie man mit AJAX in GUI Komponenten nachladen kann.

In diesem Beitrag geht es darum, locale spezifische Messages im Client auszugeben. In vielen Büchern, z.B. Ajax in Action, findet man immer wieder ein Kapitel Exception Handling, was aber nur das Handling ansich aufzeigt, nicht aber, wie man lokalisierte Messages realisert.

Beispiel: Ajax in Action, Seite 464, Listing 1:

handleError: function(request) {
 if (this.options.messageSpanId) {
  document.getElementById(this.options.messageSpanId).innerHTML=
   "Opps! Server error. Please try again later.";

Soweit - so gut. Aber wie realisert man jetzt, dass die Message in DE/FR/IT/EN lokalisiert wird?

Ich persönlich schau immer gern was Microsoft so macht, denn die Lösungen sind meistens sehr gut durchdacht und funktionieren auch!

Gesagt - getan - gegoogled: Adding Localized Resources to a JavaScript File.

Ich hab die Idee ein bischen verändert und komme zu folgendem Lösungsansatz:

Die Seiten, die eine JavaScript Message lokalisieren müssen bekommen einen script include, z.B:

<script type='text/javascript' src='/myapp/js/resources.js'></script>

Im JavaScript wird folgendes definiert:

Error={
"InputNotValid":"Sie haben ein ungültigen Wert eingegeben.",
"ServerError": "Der Service ist momentan nicht verfügbar."
};
Message={
"Loading":"Bitte warten…"
};

Dieses resources.js steht die Default Locale bereit. Zusätzlich wird im HMTL Code weiter unten noch das sprachspezifische resource.js geladen. Da JavaScript überladen unterstützt, können im sprachspezifischen File die Werte neu definiert werden. Werden sie nicht definiert, greift die Default Language:

<script type='text/javascript' src='/myapp/js/resources.en-GB.js'></script>

Das JavaScript sieht dann so aus:

Error={
"InputNotValid":"Your entered value is not valid."
};

Message={
"Loading":"Loading…"
};

In diesem Fall würde das englische Resource File den Error.ServerError nicht definieren und somit den Default aus resources.js verwendet.

Wie wird das nun verwendet? Am Beispiel vom "Loading" wird die Message.Loading im div loadingMsg so verwendet:

<script type="text/javascript">
function addItemToCart() {
 document.getElementById('loadingMsg').style.display = 'block';
 document.getElementById('loadingMsg').innerHTML = Message.Loading;
 var id = dwr.util.getValue("id");
 var q = dwr.util.getValue("quantity");
 cartManager.addItemToCart(id,q);
 return;
}
</script>


Lokalisierte Messages im JavaScript - gelöst!

Ajax in Action III

Im vorherigen Post aus der Serie Ajax in Action habe ich verschiedene Lösungsalternativen für module Ansätze mit Spring MVC beschrieben und die Lösung favorisiert, die mittels AJAX a la DWR GUI-Komponenten nachlädt.

In diesem Artikel wird Lösungsalternative 3 genauer beschrieben und kritisch hinterfragt.

Wir möchten folgende GUI Komponente per DWR an den Server schicken:

Artikelnummer: 12-38872662

Artikelbeschreibung, Grösse, Farbe, Preis. etc.




Anschliessend soll sich der Warenkorb im GUI neu auszeichnen und den/die neuen Artikel anzeigen, alles ohne POSTBACK. Wir brauchen also einen DWR Bean, was den ASYNC Call abarbeitet: CartManagerAdapter.

public class CartManagerAdapter {
public void addItemToCart(String pk, int quantity) {
// call service to add the item
}
}

Und eine Spring-enabled DWR Konfiguration hierzu:

<dwr>
<allow>
<create creator="spring" javascript="cartManager">
<param name="beanName" value="cartManagerAdapter" />
</create>
</allow>
</dwr>

Dazu hängen wir eine eine JavaScript Methode an den submit Event:

<input type="button" name="submit" value='add to cart' onclick="addItemToCart()" />

und definieren folgende JS Funktionen:

<script type="text/javascript">
function addItemToCart() {
document.getElementById('loadingMsg').style.display = 'block';
var id = dwr.util.getValue("id");
var q = dwr.util.getValue("quantity");
cartManager.addItemToCart(id,q,addItemToCartCallback);
return;
}

var addItemToCartCallback = function() {
getCart();
document.getElementById('loadingMsg').style.display = 'none';
}
</script>

Damit unser Warenkorb sich nach dem callback neu auszeichnet, rufen wir getCart() auf um folgendes zu tun:

function getCart() {
cartManager.getCart(getCartCallback);
return;
}

var getCartCallback = function(cartBean) {
var text = '<ul>';
for(i = 0; i < cartBean.cartBeanEntries.length; i++) {
text += '<li>';
text += cartBean.cartBeanEntries[i].quantity;
text += 'x ';
text += cartBean.cartBeanEntries[i].name;
text += '</li>';
}
text += '</ul>';
document.getElementById('cart').innerHTML = text;
}

Die CartManagerAdatper Klasse wurde dafür um die Methode getCart() erweitert:

public class CartManagerAdapter {
...
public CartBean getCart() {
return getCartService().getCart();
}
}

Wenn man diesen Prototyp nun kritisch hinterfragt kommt man zu folgenden Punkten:

  • Man umgeht Spring MVC durch den Einsatz von DWR

  • Es gibt kein Binding + Validation durch Spring -> man muss das selbst veranlassen

  • Viel JS Scripting

  • Validation und sonstiges Error-Handling muss gescripted werden

  • Serverseitige Zustandsinformationen müssen bei jedem Roundtrip über die AJAX Engine geliefert werden, z.B. authentiated principal

  • MVC besteht nicht mehr - Paradigmawechsel!


Man muss ich sich sehr gut überlegen, wo und in welchem Umfang man AJAX einsetzen möchte. In diesem Prototyp kommen wir zur Erkenntnis, dass man MVC aushebelt und damit Kernfunktionen, die Spring MVC mitbringt nicht nutzen kann, d.h. man muss diese selbst implementieren. Am Ende baut man viel um Infrastukturprobleme zu lösen, nicht aber das Business Problem.

Trotzdem soll der Prototyp weiter untersucht werden, denn es ist noch nicht klar, wie ein Exception Handling abgebildet werden soll. Dazu mehr im kommenden Post.

Ajax in Action II

In Ajax in Action Teil I habe ich die Problematik des Seitenaufbaus mit Spring MVC + JSP's angesprochen.

Hier soll das Problem und der Lösungsansatz genauer aufgezeigt werden.

Problem:

Mit JSP 1.2 gib es kein Komponenten-Model im GUI, was sich auch mit Spring MVC nicht lösen lässt. Grundsätzlich besteht ein Seite immer aus mehreren, logisch unabhängigen, Modulen.
Beispiele: User-Informationen, Navigation, Warenkorb und ein Produktdetail mit Add to cart Funktion.














Natürlich kann man eine solche Seite in Fragmenten zerlegen, z.B. mit Apache Tiles. Das löst jedoch nicht das Problem, sondern schaft lediglich eine Möglichkeit der Wiederverwendung auf HTML Ebene. Problematisch ist nämlich, wie man das Model (JavaBean) baut und wann und wie man es an die View bindet.

Nehmen wir an, es gibt ein UserBean:

public class UserBean implements Serializable {
private String name,lastname,email;
...
}

und ein CartBean:

public class CartBean implements Serializable {
private long subTotal;
private Collection cartItems;
...
}

und ein ProductDetailBean:

public class ProductBean implements Serializable {
private String id, name, code, description;
...

Dazu gibt es eine Tiles2 View-Defintion:

<definition name="productDetail" extends="publicPage/template">
<put-attribute name="content" value="/WEB-INF/views/productdetail.jsp" />
<put-attribute name="pagetitle" value="Product Detail" type="string" />
</definition>

Nun die eigentliche Frage: Wie sieht der Controller aus und wie das ViewBean?
Da wir kein submit nach MVC auslösen wollen gibt es einen simplen AbstractController:

public class ProductDetailController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception
Map refData = new HashMap();
// call service to get the model object
refData.put("command", service.getProductDetail());
return new ModelAndView(getFormView()).addAllObjects(refData);
}

Bisher haben wir folgendes: Ein Controller, der ein Model lädt und an die View "productDetail" übergibt. Die View wird per Tiles zusammengebaut. Jedes Tile in Form einer JSP hat nun Zugriff auf unser Model unter dem Namen "command". Demnach muss unser Controller ein Model liefern, dass allen Tiles Fragementen gerecht wird.

Wie sieht nun das Model aus?

1. Lösung:

Man baut ein Model pro View in Verbindung mit einem Controller - ProductDetailViewBean + ProductDetailController für "productDetail" View. Das ProductDetailViewBean ist ein Composite aus folgenden Objekten: UserBean, ProductDetailBean und CartBean. In den jeweiligen Tiles wird wie folgt zugriffen:

Guten Tag ${command.userBean.name} + ${command.userBean.lastname}!
Sie haben ${command.cartBean.items.count} Produkte im Warenkorb.

Nachteile:
  • Der Controller muss unter Umständen mehrere Serviceaufrufe tätigen, bis er das ViewBean korrekt erzeugt hat.
  • Der Controller + ViewBean kennen den Context ihrer Existenz in der View.
  • Der GUI Entwickler kann auf jedem Tile in jedem JSP direkt alle Attribute des command Objects zugreifen.
  • Eingeschränkt wiederverwendbar.

2. Lösung:

Man gibt der View "productDetail" nur das ProductDetailBean als command Object zurück und alle anderen referencing data unter einem anderen Key, z.B.

refData.put("user",userBean).


Nachteile:
  • Der Controller ebenso mehrere Serviceaufrufe tätigen.
  • Der Controller kennt den Context und muss alle notwendigen Beans als referencing data bereitstellen.

3. Lösung:

Der Controller liefert nur das command Object ProductDetailBean an die View zurück. Die anderen Komponenten, z.B. User-Informationen, Warenkorb etc. laden sich selbst mittels AJAX/DWR nach.

Diese Lösung entkoppelt den ProductDetailController, sodass dieser keine contextspezifischen Beans in die View reichen muss.

In diesem Fall ist Lösung 3 zu empfehlen.

Montag, 3. Dezember 2007

Ajax in Action

Ich arbeitet gerade in einem Projekt, wo man noch nicht genau weiss, mit welcher Technologie man die Anforderungen implementieren wird.

Es geht darum einen Web-Shop zu implementieren, der sich anfühlt und aussieht wie eine Desktop-Applikation. Man möchte Funktionen des Shops weitestgehend ohne klassischem POSTBACK abbilden. Bisher gehen wir von folgendem Technology-Stack aus:
  • Backend: Springbasiert Java Applikation (Services und Datenbankanbindung in 2 Schichten: Service und DAO Layer)
  • Frontend: Spring MVC (RESTful) mit JSP's, DWR
Um sicherzustellen, dass der Technlogy-Stack so zusammengesetzt werden kann, haben wir ein Feature ausgewählt und in einem Prototyp implementiert:

"Der Benutzer kann ein Produkt in den Warenkorb legen." (Constraint: Anzahl muss angeben werden.)

Da wir in erster Linie eine desktopähnliche Oberfläche gestalten wollen, haben wir diese Funktion per asynchroner Kommunikation vorgesehen. Die Seite soll sich so verhalten: Beim Klick auf den "In den Warenkorb" Button wird asynchron ein Submit ausgelöst und anschliessend der Warenkorb neu ausgezeichnet - alles ohne POSTBACK.

Nach kurzer Überlegung wurden schnell folgende Punkte als Probleme erkannt:
  • Mit Spring MVC + JSP gibt es kein GUI Komponentenmodell, also wie wird eine Seite zusammengebaut?
  • Kann und wird uns Spring MVC bei Validierung, Binding, ResourceResolving und Exception Handling in Verbindung mit DWR behilflich sein?
  • Spring MVC + DWR + RESTful ??? Wiederspricht sich das nicht grundsätzlich?
In den kommenden Tagen werde ich die Ansätze dokumentieren und kritisch hinterfragen. Input ist gern willkommen ...

Scrumbreakfast: Projektverwaltung mit Target Process

Der Scrumbreakfast ist ein regelmässiges Treffen für CIOs, strategischen und operativen Projektleitern, die entweder Scrum einsezten oder Scrum einsetzen wollen.

Der erster Scrum Breakfast fand in November bei namics in Zürich statt. Wir waren 10 Teilnehmer, etwa 50/50 geteilt zwischen aktuellen Scrumnutzer und möchte gern Scrumnutzer. Nach einem (mehr oder minder kurzem) Vortrag haben wir dann auch untereinander Erfahrungen und Informationen rund um Scrum und Softwareentwicklungs-Projekte austauschen können.

Nächster Anlass:
Jean-Pierre König, Senior Software Engineer bei namics ag und Verfasser von Inside Scrum gibt uns eine Hands-On Einblick in Target Process. TP wird seit etwa 3/4 Jahr bei namics für die Verwaltung von agilen Projekte eingesetzt. Damit kann der Scrum-Master sämtliche Aufgaben rund um ein Scrumprojekt verwalten und Team-Mitglieder können ebenfalls ihre eigene Aufgaben im Projekt pflegen.

Themen:
  • Estimation
  • Planning
  • Daily Scrum
Anschliessend gibt es Fragen, Diskussion und Erfahrungsaustausch.

  • Wann: 05 Dec 2007, 08:00 am -- 10:00 am (Vortrag 8.35 bis 9.00)
  • Wo: City/Location Konradstrasse 12, 8005 Zürich
    2 minutes from Zürich HB near Tram stop Sihlquai/HB

Anmeldung per E-mail an peter.stevens@namics.com oder per Xing Event.

Project Zero Videos

ProjectZero bringt Video's auf YouTube!



* Installing Project Zero for Eclipse
* Installing Project Zero For Command Line Usage
* Hello World: Building a Simple Application
* Getting started with Zero Assemble Flow
* Creating a simple RSS Aggregation flow
* Assemble Store Demo

Samstag, 10. November 2007

Impi Linux - Ubuntu for Africa

Impi Linux ist ein Südafrikanisches Unternehmen, dass ImpiLinux als entwickelt, releases, supported und wartet.

Impi Linux ist offizieller Ubuntu Support Partner für Afrika und bietet die Software für Privat- und Geschäftspersonen an.













Es gibt sehr viele Hilfsaktionen für Afrika, bei denen auf Basis von Linux mit einfachen Laptops und PC's die Bildung der Kinder in Schulen unterstützen wird, z.B. "One Laptop per Child".

Nicolas Negroponte vom MIT in Boston hatte die Idee für eine visionäre Initiative namens "One Laptop per Child": ein Laptop für die Kinder in Entwicklungsländern, dessen Kosten zwischen 100 und 150 Dollar nicht überschreiten sollten.

Das kann man nur begrüssen! Find' ich eine gute Idee!

Montag, 5. November 2007

Scrumbreakfast - Scrum in the Enterprise

Am Mittwoch, 7.11.07 ist das erste Scrumbreakfast von 08:30h bis 09:30h bei der namics ag in der Konradstrasse 12, 8005 Zürich.

Thema am Mittwoch:

You will come if you have either adopted Scrum in your team, want your company to adopt Scrum or are considering Scrum. We are here today to share information and experience about Scrum in the Enterprise. Should a company adopt Scrum and if so, how?

To answer this question, we'll look at three issues:

  • How to decide whether your company needs Scrum?
  • What is Scrum and how is it different from traditional methodologies?
  • How to get Scrum deployed in an organization?

Weitere Details gibt's auf den namics Blog.

Mittwoch, 31. Oktober 2007

Erfahrungsaustausch

Gestern hab' ich mich mit einem Bekannten unterhalten, der Web-Projekte leitet, eigentlich aber aus der Ecke der Software Entwickler kommt. Die Probleme, Erkenntnisse und Eskalationen in Bezug auf Zeit und Budget in seinen Projekten lassen mich nur Schmunzeln ... "go agile" denke ich und versuche ihn davon zu überzeugen.

Ich:
Wie sehen denn die Rahmenbedingungen bei den Projekte aus?

Er:
Zeit, Budget und Ressourcen werden vorgeben. Die technische Lösung hat damit bereits Nebenbedingungen, die sich bei der Realisierung zeigen.

Ich:
Du hast also keinen Einfluss auf die Resourcenverteilung in deinen Projekten. Wie hoch ist denn die Fluktuation während des Projekts?

Er:
Ja, das ist immer problematisch. Die Ressourcenzuteilung ist nicht garantiert. Es werden oft Leute abgezogen, für die man nicht immer einen adäquaten Ersatz bekommt. Sobald jemand als freie Ressourcen ausgemacht wird, bekommt man wieder ein neues Teammitglied.

Ich:
Wie erfolgreich sind den diese Projekte?

Er:
Sehr erfolgreich. Wir haben nur selten Budget oder Zeitüberschreitungen bis zum Projektabschluss.


Ok, seltsam. Noch ein paar Fragen und ich war am "Kern". Er eröffnet mir, dass bei vielen Projekten dann nach dem Abschluss erst die grosse Überraschung kommt. Der Kunde hat dann oft noch Change Requests, die allerdings eher Bugs sind und möchte nachträglich die Spezifikation ändern. Da man den Kunden halten möchte, arbeitet man auch nach Projektabschluss noch am Projekt, ohne Aufwandsverrechnung und oft nur mit halbem Team. Was am Ende dann rauskommt, möchte keiner mehr Warten, meint er ...

Nochmal: "go agile"
Ich würde mal unterstellen, dass man das bei agilem Vorgehen besser hinbekommt!

Dienstag, 30. Oktober 2007

WebTest vs Selenium: WebTest gewinnt 13 zu 5

Am 29.10.07 wurde auf TheServerSide.com ein Artikel gepostet, der sich mit Tools zum automatisierten Testen von WebApplikationen auseinander setzt - es wurde WebTest (Canoo) mit Selenium (OpenQA) verglichen.

Insbesondere das aufzeichnen von Tests ist offensichtlich ein Bedürfnis, z.B. mit dem WebTest Recorder von Canoo. Ausserdem wird Element von PragmaticQA angesprochen, was auf Ruby & Watir basiert.

Andere sprechen davon, JUnit performanter zu machen, indem man auf Grid Computing setzt.

Ich setzte auf Selenium, wobei die Testbarkeit von AJAX Anwendung sich als schwierig erweist. Der Selenium IDE Recorder ist hier etwas schwach ...

Mittwoch, 24. Oktober 2007

CruiseControl im Mac Menü

Mit CCMenu kann man bei einem Mac die CruiceControl Server Task/Results in der Mac Menüleiste darstellen.

Erik Doernenburg von ThoughtWorks schreibt mit seinem Team auf Sourceforge über CCMenu.

CCMenu wurden auf der CITCON (Continuous Integration and Testing Conference) 2007 in Brüssel erstmals vorgestellt.

Noch 2 Tage, dann gibts Leopard und dann .....

... gibts bald ein Mac!

Dienstag, 23. Oktober 2007

Ubuntu upgraded

Gutsy Gibbon 7.10, die neueste Version von Ubuntu ist installiert.

Der Update Manger hat mir heute morgen direkt angeboten, meine Version 7.04 Feisty Fawn abzugraden - ein, zwei Klicks - root Password eingeben und ca. 2.5h warten, dann ist Gutsy Gibbon installiert! Ubuntu läuft bei mir auf einem Notebook von Dell - D620 Latitude.

Eine Update Guide in englisch gibts hier, das deutsche Ubuntu Forum gibt sicher auch Auskunft bei Problemen - aber es gibt ja keine Probleme, nur anspruchsvolle Aufgaben ,-)

Go and get it!

Nach dem Restart und dem Login gab's dann noch ne böse Überraschung, die mich dann einen Tag beschäftigt hat - "failed to initialize HAL", ein Bug, der bekannt ist .....

Montag, 22. Oktober 2007

Working in Project Zero

Da Project Zero offensichtlich agile entwickelt wird, habe ich mal nachgefragt:

Man geht iterativ vor, pro Iteration wird ein Milestone entwickelt. Einen Milestone gibt es alle 6 Wochen, das entspricht einer Interation. Aktuell arbeitet man gerade am Milestone 2 (M2). Backlog, ProductOwner, Teammembers und Kommunikation wird Bugzilla eingesetzt.

Am kommenden Mittwoch, 24.10.07 wird ein Branch gezogen, der dann bis Freitag 26.10.07 in den Test geht, also nur zwei Tage. Demnach wird sicher automatisiert getestet. Ich werde weiter fragen ...

ProjectZero publiziert den gesamten agile Prozess in einem öffentlichen Kalendar, den man mit Goolge Calendar lesen kann. Ausserdem gibts drei interessante Blogs:

Google grouplet

Julie Bick schreibt unter der Rubrik “Preoccupations” Artikel für die New York Times. Gestern, 21. Oktober hat Bharat Mediratta von Goolge in einem Interview Julie Bick darüber berichtet, wie man bei Google den Engineers 20% der Zeit überlässt, persönlichen Interessen nachzugehen, die nicht unbedingt von Interesse für das Unternehmen sind, um eventuell etwas Neues zu entwicklen.

Bharat Mediratta berichtet, dass Gmail, Google News und google shuttle busses aus eben diesen 20% als Idee entwickelt worden sind und umgesetzt wurden. Die Personen hinter solchen Ideen so motiviert, dass man nicht um Personal zur Realisierung "werben" muss, wenn man eine neue Geschäftsidee präsentiert.

Da nicht unmittelbar alle 20% Ideen zu einem Produkt führen und die restliche Zeit für die "normale" Arbeit verbleiben sollte, setzt Google auf "grouplets" - ein Board quer durch die gesamte Organisation.

Grouplets haben kein Budget und keine Entscheidungskompetenz. Sie haben ein paar Leute die einer Idee nachgehen und bereit sind, das Unternehmen mit der Idee zu überzeugen und mitzureissen.

Freitag, 19. Oktober 2007

Agile und Offshore - geht das?

Neben content-driven Community Portalen, Blogs, Photo Sharing, Syndication Feeds, MashUps und Google Tools wie GMail, Picasa, Docs and Spreadsheets und vielem mehr hat sich beim Web 2.0 Hype noch etwas gravierent geändert -

die Geschwindigkeit!

Plötzlich "lebt" man RAD (rapid application development). Buzzword von heute, wie Time-to-market, Feature-driven, Beta, Usability, desktop-behavior, rich interface etc ... endlich! Aus der Technologie Ecke gibts die zugehörigen Tools wie Rails, Groovy und AJAX - alles nach dem Motto:
"Whatever tools are necessary, we provide them, and then get the hell out of the way of the developers so that they can do their jobs."
Werner Vogel, CTO amazon.com
Vorbei die Zeit der endlosen Spezifikationen und Pflichtenhefte, vorbei endlose und kostspielige Analyse Phasen, nie wieder "Sorry, it's much to late to change your mind" ......

... und: Offshore ade!

Selbstorgansiert, selbstregulierend, hoch motiviert, interdisziplinär, kommunikativ, flexibel, schnell, iterativ und mit einer nie gekannten Portion job-enrichment arbeiten Teams von 3-8 Leuten an der Realisierung einer Applikation.

Während immer mehr Firmen bei der schnellen Umsetzung ihrer Internetstrategien auf agile setzen, bleiben andere ihrer Strategie treu und setzen auf Offshore.

Rein monetär betrachtet mag das zunächst günstiger sein, nur kann man es sich leisten, der Konkurenz einen Vorsprung im Internet zu gewähren?

Donnerstag, 18. Oktober 2007

Ubnuntu 7.10 ist da! jetzt auch auf Dell


Der Hersteller Dell möchte noch dieses Jahr das neue Betriebssystem Ubuntu 7.10 auf seinen PC's in den Handel bringen.

"We will offer Ubuntu 7.10 preinstalled on our systems soon," said Anne Camden of Dell corporate communications, in an e-mail interview. "For customers who are interested in updating their existing Ubuntu systems, we advise them to visit the Ubuntu 7.10 page on our wiki, which will go live [Oct. 18] after the official launch."


Die ganze Geschichte lesen ...

Mittwoch, 17. Oktober 2007

Best Practice: TDD und JSF managed beans bei agilem Vorgehen

"Änderungen werden erwartet, sie sind willkommen!" Das ist eine zentraler Gedanke bei agilem Vorgehen.

Was aber bedeutet das für die Vorgehensweise bei der Software Entwicklung? TDD! Am Beispiel von JSF möchte ich kurz zeigen, welcher klassische Fehler immer wieder gemacht wird, welche Konsequenzen daraus enstehen und wie man es besser machen kann. Im folgenden geht es um dieses Beispiel:

public class ChangePasswordBean
{
   private String password, passwordRepeat;

   public String doChangePassword() {
      // ...
   }

   public String getPassword() {
      return password;
   }

   public void setPassword(String password) {
      this.password = password;
   }

   public String getPasswordRepeat() {
      return passwordRepeat;
   }

   public void setPasswordRepeat(String passwordRepeat) {
      this.passwordRepeat = passwordRepeat;
   }
}

1# Managed Bean's und deren Abhängigkeiten

Bei JSF werden properties und action's in Managed Bean's zusammengefasst. Of braucht man innerhalb der action Methoden eine Reference zu einem Manager oder einem Service, dem die Verarbeitung delegiert wird. Das ist nicht problematisch, aber wie macht man das, damit das Managed Bean auch ohne Container testbar bleibt?

Nicht gut ist das hier: (faces-config.xml)

<managed-bean>
   <managed-bean-name>changePasswordBean</managed-bean-name>
   <managed-bean-class>example.ChangePasswordBean</managed-bean-class>
   <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

... in Verbindung mit folgender Implementierung:

public String doChangePassword() {
   UserManager.getInstance().changePassword(uid, password);
}

Besser ist, den UserManager per Dependency Injection zu setzen und dann zur Verarbeitung die bean-interne Referenz zu verwenden:

<managed-bean>
   <managed-bean-name>changePasswordBean</managed-bean-name>
   <managed-bean-class>example.ChangePasswordBean</managed-bean-class>
   <managed-bean-scope>request</managed-bean-scope>
   <managed-property>
      <property-name>userManager</property-name>
      <value>#{userManager}</value>
   </managed-property>
</managed-bean>

... in Verbindung mit folgender Implementierung:

public String doChangePassword() {
   this.userManager.changePassword(uid, password);
}

Somit kann man eine Unit Test statt einem Integrationstest schreiben. Der UserManager in diesem Beispiel kann mittels JMock im Unit Test injected werden um State und Behavior des ChangePasswordBean sicherzustellen.

The Future of Software Development



Alex Iskold, einer der Writer bei Read/WriteWeb, schreibt in seinem Artikel "The Future of Software Development" warum der Wasserfall Ansatz bei Software Entwicklungsprojekten nicht funktioniert und wie agile Vorgehensweise die Entwicklung belebt, warum Umdenken Sinn macht und wie man generell mittels Testing den wechselnden Heraus- und Anforderungen bei agilem Vorgehen gerecht wird.

Danke an dieser Stelle an Markus, der mich auf diesen interessanten Artikel hingewiesen hat ...

Montag, 15. Oktober 2007

InfoQ: Werner Vogels über Availability & Consistency

Werner Vogels, CTO Amazon.com, über die Prinzipien einer skalierbaren Service Landschaft, Architektur ein solchen, klassische Probleme wie Transaktionen und State Management und nicht zuletzt Testing ...

Interessant ist an der Stelle, dass Vogels auf die Vorgehensweise eingeht. Er erwähnt, dass es bei Amazon eine 2 Pizza Regel gibt:

Ein Team ist maximal so gross, dass man es mit 2 Pizzen ernähren kann. Wenn das nicht gegeben ist, dann ist das Team zu gross.

Services bei Amazon werden auf teambasis von 8 bis 12 Leuten entwickelt.

Der SOA Ansatz bei Amazon - agile?

Am 28./29. September 2007 habe ich auf dem T.Camp der namics ag einen Vortrag zum Thema SOA gehalten. Primär ging es darum zu erläutern, wie das Buzzword SOA zu vestehen ist, wie sich SOA entwickelt hat, was man heute darunter versteht und wie SOA sich langsam von einem technischen zu einem business Thema verlagert, Stichwort JBI, der zweite Teil meines Vortrags.

Im Anschluss an den Vortrag wurde ich von Tristian Woerth, ein Ruby on Rails Spezialist aus der Schweiz, angesprochen - er hat mich gefragt, ob ich den service-orientierten Ansatz von Amazon kenne ...

Zu meiner Schande, kannt ich ihn nicht. Heute, gut 3 Wochen später und um einige Erkenntnisse reicher habe ich mit Amazon beschäftigt - sehr interessant, sowohl technisch als auch methodisch.

Interessant in diesem Zusammenhang fand ich diese Aussage von Werner Vogels, CTO Amazon.com:

"There is another lesson here: Giving developers operational responsibilities has greatly enhanced the quality of the services, both from a customer and a technology point of view. ... This brings developers into contact with the day-to-day operation of their software. It also brings them into day-to-day contact with the customer. This customer feedback loop is essential for improving the quality of the service. "

und

"Whatever tools are necessary, we provide them, and then get the hell out of the way of the developers so that they can do their jobs."


Klingt nach agile, wird auch agile sein -ich weiss es leider nicht! Würd' mich aber interessieren, besonders weil Herr Vogels die Problematik des testens anspricht - sicher nicht trivial bei einer verteilten Service Landschaft ...

Mittwoch, 10. Oktober 2007

Das Scrum Team

Zentrales Element für den Erfolg bei agiler Vorgehensweise in der Softwarentwicklung ist das Team - es ist selbstorganisierend und bezüglich Disziplin selbstregulierend.

Zweifellos braucht man dafür das "richtige" Team. Agile kann und wird nur funktionieren, wenn jeder im Team mit den agilen Prinzipien vertraut ist, diese achtet, sie stehts befolgt und weiterentwickelt.

Kritik ist gut, zu viel davon ist kontra-produktiv!

Wenn man es schaft, die Skepsis und Kritik in Neugier und Verbesserung zu überführen, dann hat man ein Team!

Nebenbei glaube ich persönlich, dass es unerlässlich ist, die *besten* im Team zu haben. Man mag sich vorstellen, dass ein Team wenn es dem agilen Manifest folgt noch lange nicht erfolgreich ist - man braucht auch das Know-How zur Umsetzung der eigentlichen Aufgabe. Ich verstehe die Projekt Methode als solche als Meta Problem. Eigentlich geht es doch darum, das Problem des Kunden/Auftraggebers zu lösen - dafür nur die *Besten*...

Maven 2 Einführung

Immer wieder ist man bei Softwarentwicklung mit der Tatsache konfrontiert, dass man sich 70% der Zeit mit Infrastruktur, Entwicklungsumgebung, Applikationsserver und Co. beschäftigt. Man investiert nur 30% der Zeit für die Lösung des eigentlichen Business-Problems. Das eingesetzte Projekt-Budget fliesst demnach mehrheitlich in Dinge, die keinen Mehrwert und keinen direkten ROI zur Folge haben.

Um einen Teil der Infrastruktur-Problem zu minimieren wurde Maven2 entwickelt - ein Build und Projekt-Management Werkzeug.

Die Top 5 Punkte, die für Maven2 sprechen:
  • Einfaches, einheitliches Projekt-Setup, IDE unabhängig
  • keine JAR Files mehr im Source Code Repo
  • keine Ant-Scripts mehr schreiben
  • Einfaches Dependency Management (externe JAR Abhängigkeiten)
  • zentrales Company-Repository zur Wiedervendung von Komponenten
Ein Maven2 Projekt hat man in weniger als 5 Minuten eingerichtet und zwar mit compile, clean, package, test etc. ohne dass mein eine Zeile Ant-Script geschrieben hat. Maven2 basiert auf einen POM.xml File, in welchem das Projekt definiert wird. Durch dieses POM.xml wird die Umgebnung für Maven2 eingerichtet.

Ein sehr gutes Buch (PDF) zum Thema Maven2 ist "Better Builds with Maven" (DevZuz), sehr emfpfehlenswert!

Dienstag, 9. Oktober 2007

"State of Agile Development" Umrageergebnisse von VisionOne





Zum zweiten Mal hat VisionOne eine Umfrage in 71 Ländern zum Thema "State of Agile Development" durchgeführt, an der 1.700 Unternehmen teilgenommen haben.

Ein paar Highlights:
  • agile Teams werden grösser und sind häufiger auch physisch verteilter
    • 31% der Umfrageteilnehmer berichten von agilen Teams mit > 250 Mitglider
    • 74% er Umfrageteilnehmer berichten von agilen Teams mit > 20 Mitglider
  • agile Entwicklung liefert aussagekräftige und messbare Ergebnisse für das Business
... alle Umfrageergebnisse

Lotus Notes 8 auf Ubuntu installieren

Lotus Notes 8 auf Ubuntu zu installieren ist vergleichsweise zu früheren Version von Lotus Notes recht einfach.

Zunächst mal runterladen (C13NCEN.tar), dann:

me@ubuntu:/tmp$ sudo tar xvf C13NCEN.tar
me@ubuntu:/tmp$ sudo C13NCEN/setup.sh

Hinweis: Es sollten vorher die Desktop Effekte ausgeschalten werden, da sonst das JAVA Intallationswindow von Lotus Notes nicht richtig dargestellt wird!

Installation laufen lassen und anschliessend X server mit Ctrl+Alt+Backspace restarten, damit Lotus Notes im Menü (Gnome/KDE) erscheint.

Hinweis: Der Launcher konnte nach meiner Installation nicht ausgeführt werden, da die Rechte nicht korrekt gesetzt waren:

sudo chmod +x /opt/ibm/lotus/notes/notes

Im Home-Verzeichnis gibts nach der Installation ein "lotus" Verzeichnis: Löschen oder Umbennenen. Lotus erzeugt beim Starten ein gleichnamiges Verzeichnis "lotus" was dann zu Problemen führt.

So, jetzt der erste Start von Lotus Notes 8 auf Ubuntu 7.04: Failed to login CLFRJ0010E: Notes initialization failed!

Im Notes/Domino 8 Forum gibts Abhilfe ;-)

Gute Anleitungen von Lotus Notes 8 auf Ubuntu in EN gibts noch hier:
Viel Spass.

Ubuntu 7.04 auf Dell Latitude D620 installieren




Dank Wubi ist es einfach und schnell möglich, Ubuntu 7.04 neben Windows auf einer Maschine zu installieren. Nach gut 1.5h runterladen der Pakete durch die Installationsroutine ist das System auch schon betriebsbereit - booten und fertig.

Doch was ist das?! Der Widescreen 1440x900 des Dell Latitude D620 wird nur mit 1024x768 angefahren. Auch ein erneutes XServer konfigurieren hilft nicht:
sudo dpkg-reconfigure xserver-xorg.

Mit Hilfe von Google ist auch das Problem schnell gelöst - 915resolution muss nachinstalliert werden:
sudo apt-get install 915resolution

Anschliessend X Server neu staten (Ctrl+Alt+Backspace) und 1440x900 Widescreen Auflösung einstellen, fertig ;-)

Die nächste Herausforderung steht schon an: Lotus Notes 8 (GOLD) auf Ubuntu installieren ...

Donnerstag, 4. Oktober 2007

Was heisst agiles Vorgehen?

Nach dem agilen Manifest gilt das Prinzip, dass man dem Kunden in regelmässigen Intervallen funktionsfähige, getestet, dokumentierte und brauchbare Artefakte liefert, die einen Mehrwert darstellen.

Wie kommt man von einem klassischen Wasserfall zum agilen Projekt?
Ein Praxisbericht: Schritt 1: man macht den Wasserfall zunächst iterativ.

Bei einem interativen Wasserfall werden pro Iteration Artefakte erarbeitet, die in der kommenden Iteration weiterverarbeitet oder verfeinert werden (Bild oben). Damit bleiben alle Nachteile von phasen- orientiertem Projektvorgehen erhalten: Abkapseln von Anaytikern, Kunden, Testern und Entwicklern sowie Behinderung der direkten Kommunikation aller Beteiligten. (A=Analyse,D=Design,P=Produktion,T=Test)

Da man mit dem iterativen Wasserfall jedoch keine funtionstüchtigen Artefakte mit einem Mehrwert für den Kunden liefert, kommt man zwangsläufig zum Schritt 2: der iterative Mini-Wasserfall (Bild unten).

Um dem agilen Manifest gerecht zu werden und die klassische Vorgehensweise beizubehalten, macht man alle Phasen pro Iteration.
Auch hier gewinnt man nicht viel, denn erfahrungsgemäss ist die Zeit am Ende einer Iteration sehr knapp und Testing fast unmöglich. Dazu kommt, dass die Teammitglieder so noch immer entkoppelt arbeiten und wichtige Kommunikation ausbleibt.

Untersuchen Sie genau Ihre Vorgehensweise. Finden Sie sich teilweise in diesen Aussagen wieder, dann haben Sie kein agiles Vorgehen!

Grundsätze für agile Projekte

Oft stehen im Zusammenhang mit agile Software Entwicklung viele Fehlannahmen im Raum. 5 Punkte, wie man agile Grundsätze interpretieren sollte.

Agile heisst nicht, es herrscht Chaos und Anarchie, vielmehr setzt man Eigenverantwortung und Selbstdisziplin jedes Teammitglieds voraus, gepaart mit Selbstregulierung des gesamten Teams.

Planung ist bei agiler Vorgehensweise keine Aktivität bei Projektbeginn, sondern ein Dauerzustand. Man setzt sich kontinuierlich mit Zielen und deren Erreichbarkeit ausseinander, passt diese der Realität an, um mit den verfügbaren Ressourcen, Budget und Zeit das bestmögliche Ziel zu erreichen.

Es wird dokumentiert, was wichtig ist, nicht Dokumentation des Prozesses wegen. Man spricht von "lebender" Doku, da sich gesamte Dokumenation während des Projekts Veränderung erfährt.

Aus Erfahrungen lernen und diese einfliessen lassen. Prozesse/Abläufe/Wege verbessern, weglassen oder optimieren, nicht alles präzise und exakt immer wieder aufs Neue wiederholen und hier und da was weglassen, um das ganze repetierbar zu machen.

Man setzt konstante Veränderung bei agilen Methodiken voraus. Die Methode ist nur ein Rahmenwerk - jedes Team, jede Organisation und jedes Projekt hat unterschiedliche Bedingungen, die es zu adaptieren gilt.

Mittwoch, 3. Oktober 2007

Braucht ein agiles Team einen agilen Kunden?

Auch bei einem agilen Projekt gibt es einen Kunden, in aller Regel is das der Product Owner. Wie agile muss der sein?

Der Kunde in einem agilen Team hat wichtige Aufgaben, ober will oder nicht! Dazu gehören:
  • schnelles Feedback liefern und schnell Entscheidungen treffen
  • fortlaufend Projekt-Situation beurteilen und ggf. Korrekturen vornehmen
  • Realität im Auge behalten: Markt, Kunden und Trends nicht ignorieren
  • Team vertrauen
... kurz: er gibt die Richtung an!

Wie man sieht, ist der Kunde bei einem agilen Projekt weitaus stärker gefordert als bei traditionellen Entwicklungsprozessen. Wie wichtig die Rolle des Kunden letztendlich ist, kann man gut am Beispiel einer Rudermannschaft versinnbildlichen: der Steuerman ist der Kunde - und der ist der einzige, der in Fahrtrichtung blickt, er bringt das Boot ins Ziel ....

ProjectZero - Zero complexity. Zero overhead. Zero obstacles

Project Zero ist ein einfache Entwicklungs- umgebung mit Applikationserver (WAD CE), Dependency Management, Packaging, Installing, Deployment und Laufzeitumgebung zur Erstellung ein RESTful Applikation nach CRUD Prinzipien. Das ganze basiert auf JAVA plus Groovy bzw. PHP als Scripting Sprachen und wird in Eclipse als Plug-In installiert.

Hinter Project Zero steckt die IBM, die Project Zero zunächst als Incubator Projekt mit dem Fokus auf agile development für zukünftige Generationen von dynamischen Webprojekten vorangetrieben hat. Project Zero ist kein open source Projekt, sondern IBM nennt das Community-Driven Commercial Development - will heissen: jeder kann mitentwickeln - IBM hat die alleinigen Vertriebs- udn Vermarktungsrechte.

Die Community organisiert sich durch Foren, Blogs und einen public Calendar.

Zero complexity. Zero overhead. Zero obstacles - Klingt vielversprechend!

Spring-On-Rails: RESTfull Applikationen mit Spring


Spring-on-Rails Release 1.0 ist seit dem 01.Oktober auf Google Code verfügbar steht unter der Apache License 2.0.
Spring-on-Rails ist ein J2EE Framework für RAD, rapid application development und damit in der agilen Entwicklungs-Szene zu hause. Mit Spring-On-Rails kann man auf einfache Weise RESTfull Applikationen bauen (CRUD), wobei man mit Spring-On-Rails trotz allem eine J2EE Applikation baut - ohne Scripting. Das ganz basiert auf dem Sprint Framework.

Spring-on-Rails wird auf TheServerSide.com heftig kritisiert, es verdiene den Namen "Spring" und "Rails" nicht und vieles mehr...

Montag, 24. September 2007

Scrumbreakfast - Scrum in the Enterprise

Mein Arbeitskollege Peter Stevens, Principal Consultant bei der namics ag und zertifizierter Scrum Master, ist Initiator eines neuen, monatlichen Scrum Erfahrungsaustausches in Zürich - The Scrum Breakfast.

Hinter dem Scrum Breakfast steht die Idee, regelmässig mit CIO's, strategischen und operativen Projektleitern nützliche Informationen, Erfahrungen und Best Practices zum Thema Scrum auszutauschen. Die Events sind in Deutsch und finden im namics Office/Zürich statt. Der Eintritt ist frei - namics bietet Kaffee, Gipfeli und Säfte an.

Das Programm startet am 03.10.2007 mit einer kurzen Einführung von Peter, gefolgt von einer moderierten Diskussion.

Datum: 3.10.2007, 8.30 - 9.30h
Ort: namics ag, Konradstrasse 12, CH-8005 Zürich

Weitere Details zum Event können bei xing.com abgerufen werden.

Montag, 3. September 2007

Automatisierter Build und Deployment III

Um automatisch den letzten Stand auf dem Trunk und Release zu bauen und zu deployen verwende ich ein Shell Script, dass auf einer Linux Maschine mit Hilfe von crontab automatisiert wird. Ich richte auf der Linux Maschine jeweils ein User pro Projekt ein, somit ist es einfacher die Projekte sauber voneinander zu trennen.

Beispiel crontab:
[myproject@linux ~]$ crontab -l
45 5,12 * * * /home/myproject/build.sh all


Wenn man es noch ganz schön machen möchte, dann man mit maven eine Site generieren lassen, die man dann auf dem www-Root ablegt. Diese Site liefert dann Informationen zum Projekt, dem Team und der Source-Code Anbindung.

Donnerstag, 30. August 2007

Automatisierter Build und Deployment II

Um auf einem Apache und einem Tomcat den trunk, release und tag parallel laufen lassen zu können, empfielt es sicht, mit viruellen Host zu arbeiten. Dafür sollte man den Apache per DNS auf die Staging Maschine zeigen lassen, z.B.
nslookup staging.myproject.company.com
Server:  dns.company.home
Address:  192.168.1.12

Non-authoritative answer:
Name:    linux.company.com
Address:  192.168.1.2
Aliases:  staging.myproject.company.com

Im Apache werden dann 3 virtuelle Hosts definiert: trunk, release und tag, z.B.:

VirtualHost  trunk.myproject.company.com:80 trunk.myproject.company.com:443>
 ServerAlias trunk.myproject.company.com
 ServerName trunk.myproject.company.com
 ServerAdmin sysadmin@company.com
 DocumentRoot /var/www/myproject/trunk
 ...
>
Analog wird das gleiche noch für release und tag definiert.

Der Tomcat bekommt pro Entwicklungsstand einen eigenen CATALINA_HOME. Dort wird die jeweilige Version deployed, z.B. das WAR file für Release 3.
Per Apache Rewrite Regeln kann man Requests auf ein einen Applikationskontext vom Apache an den Tomcat weiterleiten. 

Fertig! Jetzt kann man auf der gleichen Maschine drei unterschiedliche Entwicklungsstände zeigen. 

Im kommenden Post beschreibe ich, wie man das automatisiseren kann.

Automatisierter Build und Deployment

Bei agiler Vorgehensweise ist es sehr wichtig, dass sowohl der Kunde als auch das Team immer eine lauffähige Version der Software in einer dedizierten Umgebung einsehen kann, wobei ich mich hier auf Web Applikationen beziehe. Oft kommt noch hinzu, dass man nicht nur den aktuellen Entwicklungsstand, sondern auch den aktuellen und manchmal parallel auch den vorherigen Release plus Tag Version einsehen möchte. 

Wie macht man das?

Es gibt Tools, die einen unterstützten, z.B. Buildix - was allerdings gleich mit dem gesamten Projektmanagement auffährt. Neben Buildix gibt es noch andere Tools, auf die ich hier nicht weiter eingehen möchte.

Es geht auch ohne Tools ganz einfach. Ich bevorzuge für die Staging Umgebung eine Linux Maschine, z.B. CentOS. Hier werden folgende Infrastruktur Tools installiert:
- subversion/cvs client
- maven/ant

Um den Build das Deployment zu automatisieren, schreit man ein Shell-script, z.B.:

#!/bin/bash
REPO="https://svn.company.com/myproject"
ARTIFACTID="webapplication_xyz"
CURRENT_RELEASE=branches/release_1
CURRENT_TAG=tags/release_1-0-0

source $HOME/.bashrc

function deploy_static {
 rm -rf /var/www/myproject
 svn co ${REPO}/${ARTIFACTID}/${CURRENT_RELEASE} /var/www/myproject/release
 svn co ${REPO}/${ARTIFACTID}/${CURRENT_TAG} /var/www/myproject/tag
 svn co ${REPO}/${ARTIFACTID}/trunk /var/www/myproject/trunk
}

if [ "$1" = "" ]; then
 echo "$0 [deploy_static ]"
else
$1 $2
fi

Dieses Script can dann je nach Bedürfnissen so angepasst werden, dass z.B. der JAVA Code compiliert wird und ein WAR file auf dem Tomcat deployed wird. In meinem Beispiel wird lediglich statischer Content auf den Apache deployed.

Im nächsten Post beschreibe ich, wie man das ganze noch automatisiert.

Montag, 20. August 2007

Konstanzer Linie 908 für den iPod


Mal wieder mit dem Bus unterwegs durch Konstanz stellte sich heute bei mir erneut die Frage: "Mit welchem Bus muss ich fahren?" und "Wann fährt ein Bus zurück?"...

Dank des Online-Auftritts der Stadtwerke Konstanz kann man sich gut auf die Reise vorbereiten und alles rund um den "Roten Arnold" erfahren und sogar als PDF runterladen, OK.
Da ich unterwegs nicht immer einen Internetzugang habe, kein Papier ausdrucken und rumtragen möchte und meinen iPod eh immer bei mir trage und gern mit nützlichen Daten füttere, habe ich mal wieder Fahrpläne digitalisiert und aufbereitet - Linie 908.

Einfach runterladen, entpacken und als Photo's auf den iPod G5 synchronisien.

Wer gern noch andere Linien abbilden möchte, hier die Anleitung und Vorlage ...

Viel Spass

Donnerstag, 2. August 2007

TargetProcess 2.5 released


TargetProcess kommt bei der neuen Version 2.5 mit einem sehr guten HelpDesk Adapter daher.

Oft gibt es während der Iterationen Anfragen, neue Requirements, Verbesserungen und sonstigen Feedback (auch von nicht Scrum Mitgliedern), die aber nicht klar als User Story identifizierbar sind, dennoch aber im System verwaltet werden sollten - HelpDesk. Man kann den HelpDesk Adapter per Excel, Email oder einem externen HelpDesk Portal verwenden - nicht schlecht. Wir werden das mal probieren, denn die Zusammenarbeit mit Excel ist immer noch üblich, auch wenn es unschön ist.

Donnerstag, 26. Juli 2007

Wie viel ist zu viel?

Welchen Ansatz wählt man, um das Business Problem des Kunden zu lösen? Nicht unbedingt eine Frage der agile Vorgehensweise, aber dennoch - immer wieder interessant, welche Weg es gibt und wie die Argumente lauten ...

Momentan arbeite ich gerade an einem grösseren IT Projekt mit einem Partnerunternehmen zusammen. Dieses Unternehmen wurde vor Jahren outgesourced und ist heute der alleinige IT Dienstleister für den Kunden. Mein Aufgabe besteht darin, Know-How in das Projekt zu bringen, damit eine optimale Lösung für die Bedürfnisse des Kunden gefunden wird - technisches Consulting, quasi.

In der Analyse-Phase fallen nun die letzten Vorhänge und die Vorgehensweisen liegen auf dem Tisch - kurzer Eindruck:

- Architektur braucht man nicht zu Beginn, die "findet" sich dann auf dem Weg zum Ziel
- egal was man macht, es muss "jeder" Entwickler verstehen können
- wir machen alles selbst, keine "fremden", externen Abhängigkeiten - Stichwort: open-source
- der Betrieb und das Integrationsteam stellen 80% der Anforderungen an das Entwicklerteam
..... und, wir machen das so, wie wir das immer machen!

Yeah, Right! Wer ist noch mal der Kunde und was sollten wir Lösen?

Die IT - reiner Selbstzweck! Der Kunde legitimiert uns, uns unabkömmlich zu machen.

I'm out ...

Mittwoch, 25. Juli 2007

Wann sollte man "Nein" sagen? - Teil III

Oft gewinnt man ein Projekt, hat aber nicht gerade die richtigen Resourcen beisammen. Sie, als erfahrener Scrum Master, sollen das Projekt übernehmen und bekommen ein Team zusammengestellt ...

"If we get the right people on the bus, the right people in the right seats, and the wrong people off the bus, then we’ll figure out how to take it someplace great."
Jim Collins, Unternehmensberater

Sagen Sie "Nein"

Wann sollte man "Nein" sagen? - Teil II

Sie haben ein scrum Projekt, bei dem ein Team firmenübergreifend zusammenarbeitet, weil der Kunde da so wünsch?

Der Kunde A möchte, dass Sie als IT Dienstleister B mit der internen IT von A zusammenarbeitet, um ein gemeinsames Projekt zum Erfolg zu bringen...

Sie haben das Gefühl, der Partner im Projekt spricht nicht die gleiche Sprache, komplett andere Vorgehensweise hat, eigentlich nicht mit Ihnen zusammenarbeiten möchte , künstliche Hürden aufbaut, bla, bla, bla

"The team will make or break the project"

Sagen Sie "Nein"

Wann sollte man "Nein" sagen? - Teil 1

Aus gegebenem Anlass schnell ein gutes Argument, wenn man vor der Entscheidung steht, einem agilen Projekt zu- oder abzusagen:

" Good trial lawyers don't take bad cases"

Akutell arbeite ich gerade an einem agilen Projekt mit einem Partner-Unternehmen, wo man ausdrücklich agile arbeiten möchte - die Knwo-how-, Methodik und Erfahrungsunterschiede aber so gross sind, dass man besser "Nein" sagt ...

10 Gründe, warum agile Projekte schief gehen

Wenn ein agiles Softwarentwicklungsprojekt schief geht, ist in erster Line immer die Methode schuld, nicht die Personen, die die agile Methode eingeführt bzw. umgesetzt haben. Oft eine falsche Annahme. 10 Gründe, warum agile Projekte scheitern:

#10 Gerüchten glauben, z.B.
  • agile ist besonders gut für kleine Projekte
  • totale Kostenkontrolle
  • Dokumentation ist nicht notwendig
  • agile Vorgehensweise braucht keine Analysten und Tester
  • "jeder" kann "alles" Grundsatz
  • wir machen Scrum, wir sind agile!
#9 Widersprüchliche Terminologie

Wir sagen - der Kunde versteht/interpretiert:
  • extreme - riskant
  • agile - ungenau, unbestimmt, locker
  • pair programming - doppelte Kosten
  • refactor - unnötiger Code
  • unit testing - extra Code
Wenn man es nicht erwähnt, hat man es nicht gehört - jetzt ist man agile!

# 8 Keine Schlüsselfiguren

man fokussiert auf die Entwicklung von Features, ABER es braucht einen
  • Sprint Manger
  • (Business) Analysten
  • Tester
  • Designer
  • WAI Experten
#7 Übertreibung

Beispiele:
  • Sicherstellen, das Dokumente für jemanden bestimmt sind
  • Sicherstellen, dass jede Implementierung ein Problem löst
  • Alles weglassen, was keinen Business-Value hat
  • Kein Micromanagement
  • Keine Statusdiagramme oder ähnliches
#6 Spitzfindigkeiten
  • Man braucht ne Menge Erfahrung
  • Entscheidungsträger sind nur involvierte Personen
  • "Nach Lehrbuch" Vorgehensweise
  • Alles mindestens 3 Interationen ausprobieren
  • Jede Änderung min. 3 Interationen verifizieren
  • Keine Angst, Änderungen rückgängig zu machen
#5 Mangelnde Disziplin & Schleifen lassen
  • Angst Dinge zu ändern oder Änderungen einzufordern
  • Tun und Handeln wird unterschieden - ist man wirklich agile?
  • Rituale vernachlässigen
#4 Nicht das richtige Team
  • es braucht erfahrene Führungspersonen
  • es braucht ein erfahrenes Team
  • es braucht erfahrene Mentoren für jede Rolle
  • man braucht mehr als einen "Plan"
  • Externe Epertentips einholen - und zuhören!
#3 Zu lange Interationen
  • nicht länger als 2 Wochen
  • klarer Rythmus ist erwünscht -> Dienstag -> Dienstag
  • Schneller Teams sollten kürzere Zyklen haben
  • Keine Zeit verliehren
#2 Kein guter "Sponsor"
  • der Kunde muss zum agilen Prozess passen
  • man braucht jemanden, der genug politischen Einfluss ausüben kann, um agile ein Chance zu geben
  • Überzeugung und Begeisterung für agile schaffen
  • Aus Fehlern lernen
#1 Dem Team keine Erholen lassen
  • das Team gewinnt oder verliehrt das Projekt
  • die Führungsperson ist ein wunder Punkt
  • die Umgebung/Arbeitsumfeld ist ein wunder Punkt
  • die (externe) Unterstütztung ist ein wunder Punkt
  • Personalfluktion ist ein wunder Punkt

Montag, 2. Juli 2007

Stub vs. Mock

In einem anderen Post habe ich die vier Test Doubles beschrieben und deren Verwendung abgegrenzt. Da Mocks und Stubs immer wieder verwechselt werden, hier ein Beispiel, um deren unterschiedliche Verwendung aufzuzeigen:

Nehmen wir an, es gibt eine Funktion um das Password zu ändern. Wenn man diese aufruft, soll automatisch ein re-login mit den neuen Credentials durchgeführt werden.


public interface LoginService {
   public boolean login (String login, String password);
}


public class LoginServiceStub implements LoginService {
   private Map currentSessions = new HashMap();
   public boolean login (String login, String password) {
      currentSessions.put(login, password);
      return true;
   }
   public int numberOfCurrentSessions() {
      return currentSessions.size();
   }
}


Beim ChangePassword kann man wie folgt testen, ob login aufgerufen wird (state verification):

class ChangePasswordStateTester...
   public void testReLoginAfterPasswordChanged() {
      LoginService loginService = new LoginServiceStub();
      ChangePasswordService systemUnderTest = new ChangePasswordServiceImpl(loginService);
      systemUnderTest.changePassword("accountId", "oldPassword", "newPassword");
      assertEquals(1, loginService.numberOfCurrentSessions());
   }


Der Mock Test dazu sieht folgendermassen aus:

class ChangePasswordInteractionTester...
   public void testReLoginAfterPasswordChanged() {
      Mock loginService = mock(LoginService.class);
      ChangePasswordService systemUnderTest = new ChangePasswordServiceImpl(
         (LoginService) loginService.proxy());

      loginService.expects(once()).method("login")
         .withAnyArguments()
         .will(returnValue(true));

      systemUnderTest.changePassword("accountId",
         "oldPassword", "newPassword");
   }
}


Bei beiden Beispielen wurden Test Doubles verwendet, nicht der "echte" Login Service, wobei der Stub ein state verfication und der Mock eine behaviour verfication durchführt.

Man muss sich bewusst sein, dass man bei Stubs in aller Regel zusätzliche Methoden hinzufügen muss, um den Status zu prüfen. Das bedeutet, dass die Code Basis wächst und dieser Code wird zunehmens anfälliger und muss gewartet werden. Nicht zuletzt eine Frage der Kosten.