Code kwaliteit

De demo van mod4j gaf mij de indruk dat het vooral bedoeld is om de java ontwikkelaar te ontlasten. Je gebruikt hier een DSL en hoeft niet meer zelf de noodzakelijke java boilerplate code te schrijven voor zaken die toch vrij standaard zijn. Een oplossing voor een typisch java probleem.

Wat ik interessant vond was de stelling dat je de kwaliteit van de code waarborgt, doordat je met een DSL minder kan: je kunt alleen binnen de kaders van het specifieke domein mee ontwikkelen. Ontwikkelaars kunnen niet helemaal wild gaan als in een multi purpose programmeertaal.

Daar kan ik me wel in vinden. Waar ik me minder in kan vinden is dat dit een oplossing is voor het gebrek aan goede programmeurs. Gesteld werd dat je nu ook met minder goede programmeurs, waar er blijkbaar veel meer van zijn, aan de slag kunt.

Maar technologie is geen vervanging voor skills of ervaring. Er zijn simpelere oplossingen om kwaliteit te waarborgen. Bijvoorbeeld de code review of de extreme versie hiervan: pair programming.
Hiermee kun je ook een consistente kwaliteit afdwingen, maar wat veel belangrijker is: je gaat het gesprek aan en je leert van elkaar.

Overigens vind ik het goed en minder goed criterium een beetje arbitrair. Door het not-invented-here syndroom heb je al gauw de neiging om iemand anders code minder goed te vinden. Kreeg van de week van een klant te horen dat we haantjes gedrag vertoonden en dat het het project geen goed had gedaan.

Eigenlijk zou je als je de beste programmeur in het team bent moeten vertrekken en zoeken naar een beter team waarin je weer de slechtste bent. Het houd je bescheiden, en je blijft door leren.

Snow Leopard upgrade perikelen

De upgrade van Leopard naar Snow Leopard ging niet zonder problemen.
    Met Java ging het mis, omdat Snow Leopard alleen Java 6.0 meelevert en ons project Java 5.0 nodig heeft.
    Intellij start default in 64 bits mode op, waar de performance aanzienlijk minder van is dan de 32 bits mode.
    Mijn UMTS dongle werkte niet meer.

Hier volgen mijn fixes. Opstarten in 32 bits mode:
start-in-32-bits

Om terug te gaan naar java5 vond ik de volgende instructies op oneswarm:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cd /tmp/
curl -o java.1.5.0-leopard.tar.gz http://www.cs.washington.edu/homes/isdal/snow_leopard_workaround/java.1.5.0-leopard.tar.gz
tar -xvzf java.1.5.0-leopard.tar.gz
 
#Move it to your System java folder (password needed)
sudo mv 1.5.0 /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0-leopard
 
#Tell OS X that java 5 actually is java 5
cd /System/Library/Frameworks/JavaVM.framework/Versions/
sudo rm 1.5.0
sudo ln -s 1.5.0-leopard 1.5.0
sudo rm 1.5
sudo ln -s 1.5.0 1.5
 
#Open Java Preferences
open "/Applications/Utilities/Java Preferences.app"

java_preferences

Voor de UMTS dongle moest ik nieuwe drivers installeren, nadat ik de oude drivers eerst weggehaald had. De instructies daarvoor vond ik bij edziardo:

1
2
3
4
5
6
cd /Applications
sudo rm -rf MobileConnect.app
cd  /System/Library/Extensions/
sudo rm -rf MobileConnect\ power.app/
cd /Library/Modem\ Scripts/
rm -rf HUAWEI\ Mobile\ Connect\ -\ 3G\ Modem

En daarna pas de xs4all instructie volgen.

Installeren Git en Ruby op Solaris

Op een Solaris machine zonder internet connectie en zonder admin rechten.

De GNU tools in het path plaatsen:

1
export PATH=$PATH:/usr/sfw/bin:/usr/ccs/bin

Installeren Git:

1
2
3
4
gtar -xvzf /tmp/git-1.6.5.4.tar.gz 
cd git-1.6.5.4
MAKE=gmake ./configure --prefix=/apps/local --without-tcltk  --enable-pthreads=-pthreads
MAKE=gmake gmake install

Installeren Ruby

1
2
3
4
5
gtar -xvzf /tmp/ruby-1.9.1-p243.tar.gz 
cd ruby-1.9.1-p243/
MAKE=gmake ./configure --prefix=/apps/local
MAKE=gmake gmake
MAKE=gmake gmake install

Lessons learned in Smalltalk: Cascades

Ik werk nu een jaar professioneel als Smalltalk ontwikkelaar en het leek me wel handig om op een rijtje te zetten wat ik allemaal geleerd heb over Smalltalk. Te beginnen met cascades.

Cascades in Smalltalk zijn een beetje te vergelijken met de With statement in Visual Basic:

1
2
3
4
With aPoint
  .x = 10
  .y = 100
End With

In Smalltalk geef je met een punt komma (;) aan dat je nog een message naar dezelfde ontvanger wilt sturen. En in tegenstelling tot Visual Basic kan je de ontvanger ook teruggeven, want handig is bij het initializeren van een object:

1
aPoint := (Point new) x: 10; y: 100.

Je hebt ook minder tijdelijke variabelen nodig hebt. Het voorbeeld van Martin Fowler over fluent interfaces;

1
2
3
4
5
6
7
8
9
10
11
12
private void makeNormal(Customer customer) {
  Order o1 = new Order();
  customer.addOrder(o1);
  OrderLine line1 = new OrderLine(6, Product.find("TAL"));
  o1.addLine(line1);
  OrderLine line2 = new OrderLine(5, Product.find("HPK"));
  o1.addLine(line2);
  OrderLine line3 = new OrderLine(3, Product.find("LGV"));
  o1.addLine(line3);
  line2.setSkippable(true);
  o1.setRush(true);
}

kunnen we in Smalltalk schrijven als:

1
2
3
4
5
6
7
8
makeNormal: customer
 
  customer addOrder:
    (Order new)
      addLine: (OrderLine  withAmount: 6; product: (Product find: 'TAL'));
      addLine: ((OrderLine  withAmount: 5; product: (Product find: 'HPK')) skippable: true);
      addLine: (OrderLine  withAmount: 3; product: (Product find: 'LGV'));
      rush: true.

En dan komen we al aardig in de richting van de fluent interface oplossing van Fowler.

1
2
3
4
5
6
7
private void makeFluent(Customer customer) {
  customer.newOrder()
  .with(6, "TAL")
  .with(5, "HPK").skippable()
  .with(3, "LGV")
  .priorityRush();
}

Ik kan de Smalltalk code nog verder verfijnen en tot een simpele interne DSL komen. Het blijft dan nog steeds Smalltalk en gaat niet tegen de natuur van de taal in zoals de Java fluent interface oplossing.

Het gebruik van cascades is als pattern opgenomen in Smalltalk Best Practice Patterns van Kent Beck. Hij geeft aan een cascade alleen te gebruiken als de messages bij elkaar horen en niet als ze toevallig naar dezelfde ontvanger verstuurd moeten worden.

Fix pharo context menu

In het laatste pharo image werkt het context menu in de omnibrowser niet. Om dit te fixen moet je de volgende methodes implementeren in OBTextSelection:

1
2
3
4
5
isClassNode
	^ false
 
isMethodNode
	^ false

Kingsofcode 2009

Dit jaar weer eens langs kingsofcode.nl geweest een developers conferentie gericht op webdevelopers. Ik ben wel geen pure webdeveloper, maar ach. De dag begon wat vroeg en Aral Balkan moest ons wel even wakker maken, door ons mee te laten zingen met het Microsoft bashen. Of dat nodig was, het bashen, weet ik niet. Als mensen zich comfortabel voelen bij het gebruiken van windows, laat ze in hun waarde. Aan de andere kant zijn het webdevelopers die zich elke dag in allerlei bochten moeten wringen om hun website IE 6.0 compatible te maken. Ik kan me enige frustratie wel voorstellen. De rest van de dag was wel vrij Microsoft-loos.

De spreker had verder wel een goede boodschap. Technisch gezien zijn onze producten commodities geworden en waar je je mee kunt differentieren is user experience. Zorg ervoor dat de gebruikers een 'delightful' experience hebben. In de eerste plaats ervoor zorgen dat je gebruikers niet gefrustreerd raken bij gebruik van je applicatie en daarna nog een extra stap doen. Die extra stap kan heel subtiel zijn, zoals een logo dat een game of life patroon is en een webpagina met parallax effect bij resizen.

De stap verder is ook gewoon ontdekken wat we kunnen met de hedendaagse technologie en dan een stap verder nemen. De anologie met de film. Eerst was het gewoon een registratie van real life, wat voor de beginperiode van de film indrukwekkend genoeg was om mensen naar de theater te trekken. Maar daarna werd het kunst. Wat foto's gemaakt met Apple photobooth werden getoond. Blijkt dat je daar wel wat mooie dingen mee kunt maken. De kunstenares was duidelijk geinspireerd. Maar inspiratie alleen is niet genoeg, hard werken is ook belangrijk. De foto's heeft ze kunnen maken door duizenden foto's te maken, waardoor ze de mogelijkheden en beperkingen van haar tool heeft leren kennen.

In het tweede praatje van Francisco Tolmasky kwamen we wat meer down to earth, hoewel ook hier wat wow momenten waren. Het doel van Cappucino en Objective-J is om een desktop like experience te leveren met web applicaties. We hebben het dan over applicaties als googledocs. Wat men heeft gedaan is de Apple Cocoa api te pakken en deze voor het web te implementeren. Hierdoor kun je gewoon XCode interface builder gebruiken. Dit kan tricky zijn. Microsoft heeft ook winforms concepten gebruikt voor webforms, maar je zit altijd met het probleem van leaky abstractions. Na de demo in XCode haalde de spreker dat ook een beetje aan, hoewel hij er niet echt diep op inging. Maar als alternatief is er dus Atlas om interfaces te bouwen.

Jorn van Dijk had het over standaarden in webapplicaties. Iedereen bedenkt nu zelf zijn file upload interface, wat het voor de gebruiker niet makkelijker maakt. Er is een initatief om een zet van guidelines op te stellen naar voorbeeld van de Apple guidelines. Belangrijk is dat het guidelines zijn en geen wetten, waardoor mensen nog steeds hun creativiteit kwijt kunnen.

Praatje over couchdb is een beetje langs me heen gegaan. Nadeel van je macbook bij je hebben met wifi verbinding. Ging er een beetje vanuit dat ik wel alle informatie op internet of via anderen erover kan vinden als ik het nodig heb. Het koppel van Thomas Fuchs en Amy Hoy gaven een presentatie over javascript performance. Javascript is (nog) niet mijn ding, en ook hier kan ik ongetwijfeld de informatie wel elders vinden als ik het nodig heb.

Het praatje van een van Chris Wanstrath van Github lag wel meer in mijn straatje. Grappig is dat hij versiebeheer aan leken uitlegt al een soort wikipedia. Iedereen kan wat aanpassen en je kunt de wijzigingen van mensen bekijken. Versiebeheer vergelijkt hij dus meteen met een collaboration tool.
Daarna wat verteld over de groei van versiebeheer, van rcs, naar cvs, naar subversion en nu git. En daarna wat patronen opgenoemd om te werken met Git:
  • anarchy: iedere ontwikkelaar heeft zijn eigen versie van de repository
  • enlightened one: er is een canonical repository, iemand bepaald welke changes gepulled worden
  • luitenants: changes voor deelgebieden gaan eerst naar de trusted luitenants die bepalen wat erin komt
  • centrale server: de traditionele manier van werken met centrale server
De tool dwingt je nergens toe, het zijn afspraken die je maakt met anderen. Opvallend vond ik het advies om voor elke issue een apart branch te maken en je repositories op meerdere plekken te verspreiden, niet alleen op github. Overigens is Chris nog te spreken in Amsterdam vandaag. Geoffrey Grosenbach was er ook voor een praatje over rails. Ik kan me daar geen echte highlights meer van herinneren, vermoeidheid begon toe te slaan. Praatje van een voormaligie CWI onderzoeker, die aan de bron stond van python, was op zich wel interessant als ook het praatje van voormalig digg architect, maar de stoelen in Tuschinsky waren een beetje te comfortabel geworden om nog goed op te letten.

koc

Naast de praatjes was er natuurlijk ook nog het sociaal gebeuren eromheen. Kingsofcode trekt ook buitenlanders naar Amsterdam en er schijnt vanaf zondagavond elke nacht wel door gefeest te zijn. Half slapend zag je mensen binnenkomen en vertellen in welke tenten ze allemaal zijn geweest en waar ze nog mee moeten 'experimenteren' while in Amsterdam. De hele buzz eromheen was natuurlijk te volgen op Twitter.

Exporteren file libraries in Seaside

In Seaside kunnen we stylesheets, javascripts en andere externe files als file library in de image plaatsen.
Dit is handig voor als je geen beschikking hebt tot een echte webserver in je ontwikkelomgeving.

Scriptje om file libraries naar filesysteem te exporteren:

1
2
3
JQDeploymentLibrary new deployFiles.
JQUiDeploymentLibrary new deployFiles.
...

De file libraries komen terecht in de image folder als folder en kunnen daarna verplaatst worden naar je webserver.

Uncle Bob’s keynote

Inspirerende praatje met een staande ovatie aan het eind. Wil meteen een IDE opstarten en wat gaan coderen, misschien zelfs in het dode Smalltalk.

Niet echt nieuwe inzichten over de ondergang van Smalltalk, maar eigenlijk gewoon een leuk praatje over waar we nu in ons vak staan.

Als Smalltalker's moeten we het ook niet te serieus nemen of willen verdedigen, dat is ook wat hij zegt in zijn praatje. Leuk ter vermaak al die verschillende technologie communities die de spot met elkaar drijven, het wordt pas een probleem als we er serieus in gaan geloven.

J-Spring 2009

Was de afgelopen week weer eens op een nljug-evenement en ik moet zeggen dat ik wel onder de indruk ben van wat het intussen is geworden. Het is wel een java evenement, maar daar hoef je je niet aan te storen. Het gaat al lang niet meer over java technologie alleen en ik vind de presentaties ook niet het belangrijkst. Voor een deel is het gewoon een reunie met mensen met wie ik ooit gewerkt heb. Leuk om even bij te kletsen en weer op de hoogte te zijn van wat iedereen doet. En je legt ook contacten, wat zeker niet onbelangrijk is als zzp'er.

De crisis en de gevolgen waren natuurlijk een hot topic. Het blijkt wel lastig te zijn als je nu op zoek bent naar een opdracht. Bij de vorige crisis verdwenen gewoon degenen die niet in de IT hoorden, maar nu hebben ook de goede mensen er behoorlijk last van.

De crisis maakte wel dat de sponsors niet zo in your face waren dit keer. Geen Sun of Adobe die daar hun technologie zaten te promoten. Dat maakt het wel weer meer een evenement van de deelnemers zelf.

Het belangrijkste dat ik uit de praatjes en met name de unconference haalde was dat het 'agile' werken de norm is. Er waren wat minder 'framework' en 'tools' presentatie's en meer conceptuele of best practices/lessons learned praatjes.

En als smalltalker voel ik me zeker geen indringer. Het eerste praatje dat ik volgde was van een ex-smalltalker dat ging over een paradigma mede bedacht door een andere smalltalker, en in het tweede praatje werd ook gewoon Kent Beck's Smalltalk patterns boek geplugged.

Men staat dus wel open voor andere technologien. Je hebt gauw de neiging om de flamewars van internet uit andere communities mee te nemen, maar uiteindelijk zijn we daar gewoon ontwikkelaars die hun brood verdienen met programmeren. En dat is de essentie van deze bijeenkomst.

1 april grappen

Wat werk van een paar collega's vandaag: