Life after Windows Vista

We weten nu dus wat hij is gaan doen na Windows Vista. Moest misschien wat frustratie kwijt.

Scrum Meetup

Tijdens wat research voor een blogpost, was ik gestuit op de scrum meetup. Uiteraard meteen aangemeld en gisteren dan voor het eerst een keer langs geweest. Het was opgezet volgens het open space concept, wat voor mij ook een first was. Xebia in Hilversum was de host en ze hebben aardig hun best gedaan.

Scrum meetup

De middag begon wel met een reguliere presentie over de toepassing van Scrum op een groot project bij een verzekeringsmaatschappij. Wat ik uit deze presentatie proefde en ook uit de gesprekken die avond dat het agile werken intussen wel geaccepteerd is. Mijn theorie daarvoor is dat de jonge honden die jaren geleden door o.a. Extreme Programming besmet zijn geraakt, intussen in posities zijn gekomen om het nu wel door te voeren.

Na het goed verzorgde eten begonnen de open space sessies. Omdat het nieuw was voor mij heb ik wat gewisseld tussen sessies. Het ging in beide een beetje om hoeveel architectuur je nodig had om met Scrum te beginnen. Wel mooi zo een discussie tussen architecten die wel kunnen programmeren. Cees de Groot was er ook bij en kon het niet nalaten even te mopperen over de keuze voor Java i.p.v. Smalltalk.

Bij de tweede ronde was ik zelf de host van een open space. De discussie ging over Scrum invoeren middels shock therapie of het organisch laten groeien in de organisatie. Uiteindelijk was de belangrijkste conclusie uiteraard: it depends. Wellicht een dooddoener als conclusie, maar vond de discussie wel leuk en was niet ontevreden over mijn eerste optreden als open space host.

De derde ronde maar wat rondgehangen en gewoon met mensen gesproken. Leerde zelfs weer iemand kennen die ook een beetje met Smalltalk gestoeid. Ik had in elk geval een leuke avond, interessante mensen leren kennen en ook nog wat opgepikt. Dit zijn van die avonden waar je weer energie van krijgt en dat je, ondanks wat er om je heen gebeurd, toch blij bent in dit vak te zitten. Heb ook inspiratie gekregen om een Smalltalk Open Space meetup te gaan beginnen.

Scrum(butt) op een onderhoudsklus invoeren

Het afgelopen jaar ben ik begonnen wat processen rond onderhoud van een systeem op te zetten. Als leidraad hiervoor heb ik Scrum gebruikt. Het systeem had een goede basis:
  • een duidelijke product owner die erg betrokken is en prioriteiten kan bepalen
  • een codebase dat TDD is gebouwd met goede code coverage en continuous integration
  • moderne project infrastructuur: OTAP omgevingen, project wiki, ticket systeem, versiebeheer, etc.
Op de werkvloer waren de 'agile' invloeden dus al duidelijk aanwezig, nu was het zaak om het door te trekken.

Het werken in iteraties was al bekend, maar het concept van een product backlog met  sprints om deze weg te werken nog niet. Het was niet moeilijk om dit te verkopen, het klinkt allemaal heel logisch. Overigens noemen we het geen Scrum sprints, maar gewoon een release.

De eerste focus was het bijhouden van de backlog. In het verleden hebben we verschillende tools gebruikt om issues te registreren:
  • een agile project management tool
  • een buglist op sharepoint
  • en ook nog de oude vertrouwde spreadsheet.
Ik heb besloten voor nog iets anders: het Trac ticket systeem Trac was al in gebruik als wiki en als webview over subversion, dus waarom ook niet het ticket systeem ervan gebruiken.

Klinkt logisch, alleen valt de gebruiksvriendelijkheid van Trac wel tegen, met name als je niet gewend bent aan wiki syntax. In het begin maakte ik zelf de tickets aan, maar intussen voert de product owner zelf ook tickets in. Er zijn echter nog genoeg issues nog niet ingevoerd en misschien moet ik maar een keer een sessie plannen om het samen allemaal in te voeren. De backlog geeft immers de werkvoorraad aan en ik heb er persoonlijk belang bij inzichtelijk te hebben dat er genoeg werk is.

Aan de hand van de backlog, plannen we dus de sprints. Tot nu toe heel simpel: we plaatsen de tickets die gedaan moeten worden in de huidige release en gaan aan de slag. Nog zonder timeboxing en tijd inschattingen, de sprint is klaar als het klaar is. Beetje open source instelling. Dit is wel een puntje dat ik nog moet oppakken, in elk geval het timeboxen. Inschattingen vind ik nog niet relevant, omdat de meeste taken toch ongeveer even groot lijken te zijn.

Ik ben nog niet tevreden hoe het gaat met de sprints. Er is nog geen goed ritme van vaste releases. Ik hoop dat het time-boxen dit gaat fixen.

Het blijkt ook best wel moeilijk de focus vast te houden en in een goed ritme te komen. Een reden is dat ik het maar twee dagen in de week doe. Dat op zichzelf is nog niet zo een probleem, maar in die twee dagen moet ik ook nieuwe teamleden zien in te werken.

Dit is ook iets waar je even over na moet denken. Afhankelijk van de instelling van de persoon kan dit energie kosten of juist energie opleveren. En dan merk je dat software ontwikkeling best wel een teamsport is, het gaat om de samenwerking. Dat zit nu wel goed. Doe nu vaker pair programming en merk dat het echt sneller gaat. Veel sneller dan als ik alleen zou werken, terwijl ik tegelijk toch ook iemand aan het inwerken ben. De 'high performance team' dat scrum belooft is met dit team echt binnen handbereik. Nu maar hopen dat het team lang genoeg bij elkaar blijft om het voor elkaar te krijgen en er van te genieten.

Ik heb het woord Scrum nog niet gebruikt in de organisatie. Ik wilde gewoon iets dat werkte en van Scrum pik ik gewoon wat goede ideeen, eigenlijk dus gewoon Scrumbutt. Ik wilde ook niet meteen de aandacht vestigen op wat ik doe en in alle rust dingen uitproberen. Maar nu ik het gevoel heb dat het kan werken is het misschien tijd om wel wat stricter Scrum te gaan volgen. Misschien beginnen met mensen vertellen wat Scrum is en enthousiast krijgen hiervoor.

Continuous Integration met Teamcity

Ons project had een Cruisecontrol installatie voor de automatische builds en deployments. Werkte op zich prima, maar het was elke keer weer uitzoeken hoe je het moest configureren. Teamcity leek een goed alternatief, zeker omdat het vrij te gebruiken is tot 20 gebruikers.

Het belangrijkste verschil tussen Cruisecontrol en Teamcity is het gebruik van build agents. Met cruisecontrol draait het buildproces op dezelfde machine als cruisecontrol zelf. Met Teamcity kan de build ook op andere machines draaien die je speciaal voor dit doel kunt inrichten. Dit is vooral handig als je een multi tier applicatie hebt met verschillende builds elk met specifieke eisen, bijvoorbeeld een Unix of juist een Windows omgeving. Teamcity kan detecteren of een build agent aan de eisen van de build configuratie voldoet en deze dan wel of niet gebruiken.

Als je een pool van buildagents gebruikt, hoef je ook niet te wachten tot een vorige build klaar is en kun je eerder feedback krijgen.

Builds zijn eenvoudig te configureren via de webinterface. Ik heb hier gemengde gevoelens bij, omdat ik bij builds automatisch aan scripts denk. Mijn ervaring met GUI's is dat ze moeilijker repeatable zijn te maken. Toch valt dit wel mee met Teamcity doordat je configuraties en delen van configuraties kunt hergebruiken. In wezen moet je 4 dingen configureren:
  • de code repository
  • het build script
  • de rapportages
  • de agents

En daarna kun je als gebruiker per project je notifications configureren. Je kunt per e-mail op de hoogte gehouden worden, via een plugin in Eclipse of Intellij of een systray icon. Je kunt zien welke testen draaien en je hoeft niet te wachten tot de build klaar is, wat zeker bij lange builds wel handig is.

Ik gebruik het bij de klant intussen al een jaartje in combinatie met maven en de combinatie bevalt me wel. Voor mijn eigen projecten wacht ik nog even op Git support.

On 2009-03-07

  • finished installing new macbook, restore from time capsule took 6 hours #

Kapotte macbook

Na wat haperingen gisteren, heeft mijn macbook pro het vanochtend dan echt begeven. Het is crisis, dus zat ik te denken aan een gewone pc laptop met linux erop. Kant en klaar kon ik er geen vinden en ik had niet zo een zin om uit te zoeken welke hardware het meest linux vriendelijk is. Uiteindelijk moet ik maandag gewoon weer een werkende computer hebben bij de klant.

Dus toch maar weer een macbook. De 15 inch vond ik best wel zwaar en een kleinere laptop leek me wel wat. Ik heb maar het instapmodel unibody macbook gehaald met 4GB geheugen.

Installeren was weer vrij simpel, hoewel het wel erg lang duurde. Bij het opstarten kon ik mijn timecapsule backup kiezen en zes uur later kon ik weer op mijn oude account inloggen. Intussen kon ik gewoon andere dingen doen en had er geen omkijken naar. Vlak voor de macbook pro het begaf was er nog een timemachine backup gemaakt, dus had ik niet veel verloren. Alleen mijn downloads folder ben ik kwijt, maar daar van kan ik per definitie weer alles op het internet vinden.

Werk nu net weer een uurtje op deze macbook en het lagere gewicht bevalt me wel. Aan het kleine scherm moet ik nog wennen en misschien moet ik nu wel vaker een extern scherm gebruiken. Ik heb nu wel een grotere harddisk, dus hoef ik de VMware machines niet meer van een externe schijf te gebruiken. Scheelt ook weer in gewicht dat ik mee moet sjouwen. En ook de nieuwe touchpad vind ik wel prettig werken.

Anyway, aan de ene kant wel balen dat de macbook pro het begeven heeft. Gelukkig gebeurde het aan het eind van de week en had ik de zaterdag om alles weer op orde te krijgen. De komende week laat ik de oude macbook pro wel repareren en zet ik het op marktplaats of hou het als reserve aan.

On 2009-03-06

  • wondering why it is so hard to find a linux laptop, guess it will be another macbook #

Array literals in Java

Tijdens een smalltalk code review werd ik gewezen op mijn gebruik van OR:

1
(value = #one) :or (value = #two) ifTrue: [doIt]

Een betere manier is om een array literal te creeren en dan includes te gebruiken:

1
(#(#one #two) includes: value) ifTrue: [doIt]

In java is de OR versie als volgt:

1
2
3
if  ("one".equals(value) || "two".equals(value)	) {
   doIt();
}

Er is niet zo een simpele manier om arrays in java te definieren, maar wel een array list:

1
2
3
if (Arrays.asList("one", "two").contains(value)) {
 doIt();
}

Met een static import:

1
2
3
if (asList("one", "two").contains(value)) {
  doIt();
}

De array list oplossing kost wel wat performance, maar het is in mijn ogen leesbaarder, zeker als je nog meer cases toevoegt. En met een een introduce variable refactoring kun je het zelfs nog duidelijker maken:

1
2
3
4
String[] numbersToProcess = asList("one", "two");
if (numbersToProcess.contains(value)) {
  doIt();
}

Probeer eens de versie met || luidop te lezen en vervolgens de laatste versie.