Montag, 31. Dezember 2007
Jahresrückblick 2007
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
- modulare Seiten mit Spring MVC und DWR baut
- mit DWR von einander abhängige GUI- Komponenten updated
- locale spezfische Messages im JavaScript anzeigt.
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
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!
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
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
Agiler Prozess
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
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
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
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
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
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
"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?
Scrumbreakfast: Projektverwaltung mit Target Process
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
- 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
* 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 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
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
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
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ü
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
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
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
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?
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."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" ......
Werner Vogel, CTO amazon.com
... 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
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
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.
Der SOA Ansatz bei Amazon - agile?
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
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
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 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
Lotus Notes 8 auf Ubuntu installieren
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?
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
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?
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
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
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
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
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
Automatisierter Build und Deployment
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?
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
"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
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
" 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
#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!
Wir sagen - der Kunde versteht/interpretiert:
- extreme - riskant
- agile - ungenau, unbestimmt, locker
- pair programming - doppelte Kosten
- refactor - unnötiger Code
- unit testing - extra Code
# 8 Keine Schlüsselfiguren
man fokussiert auf die Entwicklung von Features, ABER es braucht einen
- Sprint Manger
- (Business) Analysten
- Tester
- Designer
- WAI Experten
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
- 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
- Angst Dinge zu ändern oder Änderungen einzufordern
- Tun und Handeln wird unterschieden - ist man wirklich agile?
- Rituale vernachlässigen
- 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!
- nicht länger als 2 Wochen
- klarer Rythmus ist erwünscht -> Dienstag -> Dienstag
- Schneller Teams sollten kürzere Zyklen haben
- Keine Zeit verliehren
- 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
- 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
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
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.